|
|
|
@ -43,6 +43,15 @@ bool SerialWifiInterface::isWriteBusy() const { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
bool SerialWifiInterface::hasReceivedFrameHeader() { |
|
|
|
return received_frame_header.type != 0 && received_frame_header.length != 0; |
|
|
|
} |
|
|
|
|
|
|
|
void SerialWifiInterface::resetReceivedFrameHeader() { |
|
|
|
received_frame_header.type = 0; |
|
|
|
received_frame_header.length = 0; |
|
|
|
} |
|
|
|
|
|
|
|
size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) { |
|
|
|
// check if new client connected
|
|
|
|
auto newClient = server.available(); |
|
|
|
@ -54,6 +63,9 @@ size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) { |
|
|
|
|
|
|
|
// switch active connection to new client
|
|
|
|
client = newClient; |
|
|
|
|
|
|
|
// forget received frame header
|
|
|
|
resetReceivedFrameHeader(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@ -86,13 +98,69 @@ size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) { |
|
|
|
send_queue[i] = send_queue[i + 1]; |
|
|
|
} |
|
|
|
} else { |
|
|
|
int len = client.available(); |
|
|
|
if (len > 0) { |
|
|
|
uint8_t buf[MAX_FRAME_SIZE + 4]; |
|
|
|
client.readBytes(buf, len); |
|
|
|
memcpy(dest, buf+3, len-3); // remove header (don't even check ... problems are on the other dir)
|
|
|
|
return len-3; |
|
|
|
|
|
|
|
// check if we are waiting for a frame header
|
|
|
|
if(!hasReceivedFrameHeader()){ |
|
|
|
|
|
|
|
// make sure we have received enough bytes for a frame header
|
|
|
|
// 3 bytes frame header = (1 byte frame type) + (2 bytes frame length as unsigned 16-bit little endian)
|
|
|
|
int frame_header_length = 3; |
|
|
|
if(client.available() >= frame_header_length){ |
|
|
|
|
|
|
|
// read frame header
|
|
|
|
client.readBytes(&received_frame_header.type, 1); |
|
|
|
client.readBytes((uint8_t*)&received_frame_header.length, 2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// check if we have received a frame header
|
|
|
|
if(hasReceivedFrameHeader()){ |
|
|
|
|
|
|
|
// make sure we have received enough bytes for the required frame length
|
|
|
|
int available = client.available(); |
|
|
|
int frame_type = received_frame_header.type; |
|
|
|
int frame_length = received_frame_header.length; |
|
|
|
if(frame_length > available){ |
|
|
|
WIFI_DEBUG_PRINTLN("Waiting for %d more bytes", frame_length - available); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
// skip frames that are larger than MAX_FRAME_SIZE
|
|
|
|
if(frame_length > MAX_FRAME_SIZE){ |
|
|
|
WIFI_DEBUG_PRINTLN("Skipping frame: length=%d is larger than MAX_FRAME_SIZE=%d", frame_length, MAX_FRAME_SIZE); |
|
|
|
while(frame_length > 0){ |
|
|
|
uint8_t skip[1]; |
|
|
|
int skipped = client.read(skip, 1); |
|
|
|
frame_length -= skipped; |
|
|
|
} |
|
|
|
resetReceivedFrameHeader(); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
// skip frames that are not expected type
|
|
|
|
// '<' is 0x3c which indicates a frame sent from app to radio
|
|
|
|
if(frame_type != '<'){ |
|
|
|
WIFI_DEBUG_PRINTLN("Skipping frame: type=0x%x is unexpected", frame_type); |
|
|
|
while(frame_length > 0){ |
|
|
|
uint8_t skip[1]; |
|
|
|
int skipped = client.read(skip, 1); |
|
|
|
frame_length -= skipped; |
|
|
|
} |
|
|
|
resetReceivedFrameHeader(); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
// read frame data to provided buffer
|
|
|
|
client.readBytes(dest, frame_length); |
|
|
|
|
|
|
|
// ready for next frame
|
|
|
|
resetReceivedFrameHeader(); |
|
|
|
return frame_length; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|