Machine Vision Status TCP Server
Dependencies: C12832 EthernetInterface mbed-rtos mbed ConfigFile
Diff: TcpDaemon.cpp
- Revision:
- 2:a8eebf64cd3e
- Parent:
- 1:8efef658d90b
- Child:
- 3:254a2671a8e3
--- a/TcpDaemon.cpp Thu Mar 05 13:18:28 2015 +0000 +++ b/TcpDaemon.cpp Thu Mar 05 15:32:22 2015 +0000 @@ -1,7 +1,7 @@ #include "TcpDaemon.h" #include "Log.h" -// Incomming message end +// Incoming message end #define END_MSG_SEQUENCE "\r\n" namespace MachineVision{ @@ -10,9 +10,11 @@ * * @server_port the port the daemon will be listening on */ - TcpDaemon::TcpDaemon(int server_port) { + TcpDaemon::TcpDaemon(int server_port, PinName receive_led_pin) + : receive_led(receive_led_pin) { this->server_port = server_port; this->keepListening = true; + this->receive_led = 0; } /* @@ -67,35 +69,40 @@ int read_size = 0; int total_read_size = 0; char * end = NULL; + int i_read = 0; - while((read_size = client.receive(buffer, BUFFER_SIZE)) > 0) { - total_read_size = read_size; + int buffer_size = BUFFER_SIZE; + char * buffer_offset = buffer; + + // Read full message from client + Log::v("Waiting for message\r\n"); + do { + read_size = client.receive(buffer_offset, buffer_size); + receive_led = !receive_led; - // Null-terminate string - this->buffer[total_read_size] = '\0'; - Log::v("Received partial: %s\r\n", this->buffer); + if (read_size > 0) { + total_read_size += read_size; + + // Null-terminate string + buffer[total_read_size] = '\0'; + Log::v("Received partial: %s\r\n", buffer); + + // Search for END + end = strstr(buffer, END_MSG_SEQUENCE); + + buffer_size = BUFFER_SIZE-total_read_size; + buffer_offset = buffer+total_read_size; + } else if (total_read_size > 0) { // Increment i_read (max timeouts for message) + i_read++; + } + } while (total_read_size < BUFFER_SIZE && end == NULL && i_read < MAX_READ_TIMEOUTS); - // Keep reading until full message is received - end = strstr(this->buffer, END_MSG_SEQUENCE); // Find END_MSG_SEQUENCE - while (total_read_size < BUFFER_SIZE && end == NULL) { - read_size = client.receive(this->buffer+total_read_size, BUFFER_SIZE-total_read_size); - if (read_size != -1) { - total_read_size += read_size; - end = strstr(this->buffer, END_MSG_SEQUENCE); - } - Log::v("Waiting for rest of message\r\n"); - } - } - - if (total_read_size > 0) { + if (total_read_size > 0 && i_read < MAX_READ_TIMEOUTS) { if (end == NULL) { Log::w("Buffer full\r\n"); - } else { - // Null-terminate string - this->buffer[total_read_size] = '\0'; - + } else { // Full string received, lets do our thing - Log::v("Received: %s", this->buffer); + Log::v("Received: %s\r\n", buffer); } } }