iowfehu;gdbjwHJAOPIHO?L
Fork of X_NUCLEO_IDW01M1 by
Revision 7:0fdd186a7d90, committed 2016-05-11
- Comitter:
- mridup
- Date:
- Wed May 11 06:12:16 2016 +0000
- Parent:
- 6:e7a3fca2df10
- Child:
- 8:0f302a13e21b
- Commit message:
- fix recv, server sock, \r\n..\r\n issue in FW.
Changed in this revision
--- a/SPWFInterface.cpp Mon May 09 10:38:22 2016 +0000 +++ b/SPWFInterface.cpp Wed May 11 06:12:16 2016 +0000 @@ -19,7 +19,7 @@ // Various timeouts for different SPWF operations #define SPWF_CONNECT_TIMEOUT 20000 #define SPWF_SEND_TIMEOUT 500 -#define SPWF_RECV_TIMEOUT 2000 +#define SPWF_RECV_TIMEOUT 1000 #define SPWF_MISC_TIMEOUT 15000 // Handle structure for socket @@ -133,8 +133,7 @@ int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address) { - struct spwf_socket *socket = (struct spwf_socket *)handle; - socket->id = SERVER_SOCKET_NO;//Special socket ID number for Server Socket + struct spwf_socket *socket = (struct spwf_socket *)handle; socket->server_port = address.get_port(); return 0; } @@ -153,6 +152,7 @@ if(err==0) { + socket->id = SERVER_SOCKET_NO;//Special socket ID number for Server Socket isListening = true; } else @@ -176,46 +176,38 @@ */ int SpwfSAInterface::socket_accept(void **handle, void *server) { - char debug_str[10]; struct spwf_socket *server_socket = (struct spwf_socket *)server; - int id = -1; if(server_socket->server_port==-1 || !isListening) return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening - while(true) - { - if(_spwf.get_wait_for_incoming_client()) + if(_spwf.get_wait_for_incoming_client()) + { + server_socket->connected = true; + struct spwf_socket *socket = new struct spwf_socket;//create new network socket + if (!socket) { + return NSAPI_ERROR_NO_SOCKET; + } + + memset(socket, 0, sizeof (struct spwf_socket)); + /* + if(get_network_socket(&temp_socket)!=0) { - server_socket->connected = true; - - //struct spwf_socket *temp_socket;// = new struct spwf_socket;//create new network socket - struct spwf_socket *socket = new struct spwf_socket;//create new network socket - if (!socket) { - return NSAPI_ERROR_NO_SOCKET; - } - - memset(socket, 0, sizeof (struct spwf_socket)); - /* - if(get_network_socket(&temp_socket)!=0) - { - return NSAPI_ERROR_NO_SOCKET; - }*/ - - socket->id = server_socket->id; - socket->server_port = server_socket->server_port; - socket->proto = server_socket->proto; - socket->connected = true; - - *handle = socket; - socket = 0; - _spwf.set_wait_for_incoming_client(false);//reset - wait_ms(50);//CHECK:TODO:Why do we need this? - break; - } - } - - return 0; + return NSAPI_ERROR_NO_SOCKET; + }*/ + + socket->id = server_socket->id; + socket->server_port = server_socket->server_port; + socket->proto = server_socket->proto; + socket->connected = true; + + *handle = socket; + socket = 0; + _spwf.set_wait_for_incoming_client(false);//reset + wait_ms(50);//CHECK:TODO:Why do we need this? + return 0; + } + return NSAPI_ERROR_WOULD_BLOCK; } /* @@ -237,7 +229,7 @@ { struct spwf_socket *socket = (struct spwf_socket *)handle; int err = 0; - //_spwf.setTimeout(SPWF_MISC_TIMEOUT); + _spwf.setTimeout(SPWF_MISC_TIMEOUT); if(socket->id!=-1) { @@ -268,6 +260,9 @@ if(socket->id==SERVER_SOCKET_NO) { + if(socket->server_port==-1 || !isListening) + return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening + err = _spwf.socket_server_write((uint16_t)size, (char*)data); } else @@ -284,6 +279,7 @@ struct spwf_socket *socket = (struct spwf_socket *)handle; int32_t recv; + if(!socket->connected) return NSAPI_ERROR_NO_SOCKET; _spwf.setTimeout(SPWF_RECV_TIMEOUT); //CHECK:Receive for both Client and Server Sockets same?
--- a/SPWFInterface.h Mon May 09 10:38:22 2016 +0000 +++ b/SPWFInterface.h Wed May 11 06:12:16 2016 +0000 @@ -63,8 +63,8 @@ virtual void socket_attach(void *handle, void (*callback)(void *), void *data); private: - int init(void); - //int get_network_socket(struct spwf_socket **handle); + int init(void); + //int get_network_socket(struct spwf_socket **handle); SpwfSADevice _spwf; bool _ids[SPWFSA_SOCKET_COUNT];
--- a/Spwf/wifi_interface.c Mon May 09 10:38:22 2016 +0000 +++ b/Spwf/wifi_interface.c Wed May 11 06:12:16 2016 +0000 @@ -612,6 +612,11 @@ WiFi_Status_t wifi_socket_server_open(uint32_t port_number, uint8_t * protocol) { WiFi_Status_t status = WiFi_MODULE_SUCCESS; + +//Wait till all queued events are executed +while(!event_empty(&event_buff)); +Wait_For_Sock_Read_To_Complete(); + Reset_AT_CMD_Buffer(); /* AT+S.SOCKD=portNo,t<cr> */ @@ -635,6 +640,11 @@ WiFi_Status_t wifi_socket_server_close() { WiFi_Status_t status = WiFi_MODULE_SUCCESS; + +//Wait till all queued events are executed +while(!event_empty(&event_buff)); +Wait_For_Sock_Read_To_Complete(); + Reset_AT_CMD_Buffer(); /* AT+S.SOCKD=portNo,t<cr> */
--- a/Spwf/wifi_module.c Mon May 09 10:38:22 2016 +0000 +++ b/Spwf/wifi_module.c Wed May 11 06:12:16 2016 +0000 @@ -1332,11 +1332,19 @@ { if(status_flag.enable_sock_read && status_flag.Q_Contains_Message && !status_flag.message_pending) { - printf((const char*)&process_buffer[0]); - status_flag.Q_Contains_Message = WIFI_FALSE; - status_flag.Q_Contains_Data = WIFI_TRUE; - //status_flag.enable_sock_read = WIFI_FALSE; - //status_flag.stop_event_dequeue= WIFI_FALSE; + //printf((const char*)&process_buffer[0]); + status_flag.Q_Contains_Message = WIFI_FALSE; + message_size = SockON_Data_Length;//Total size + chunk_size = Fillptr; + memcpy(UserDataBuff, process_buffer, Fillptr); + Fillptr = 0; + SockON_Data_Length = SockON_Data_Length - Fillptr; + process_buffer_index = 5; + pop_queue_length = 0; + Stop_Dequeue(); + memset(process_buffer, 0x00, Fillptr); + status_flag.Pending_SockON_Callback = WIFI_TRUE; //set this to callback to user with User Buffer pointer + } //if in data mode, reset on \r\n @@ -1375,7 +1383,7 @@ //Check Process Buffer for any pending message if(status_flag.enable_receive_data_chunk) { - if(!status_flag.Q_Contains_Data && pop_buffer_size) + if(pop_buffer_size) { pop_queue_length = pop_buffer_size; if(Fillptr + pop_queue_length > 511) @@ -1404,7 +1412,7 @@ { if(process_buffer[0]!='\0') { - if(((process_buffer[0]==0xD) && (process_buffer[1]==0xA)) && process_buffer[2] != 0xD) + if(((process_buffer[0]==0xD) && (process_buffer[1]==0xA)) && process_buffer[2] != 0xD && SockON_Data_Length != 2) { status_flag.message_pending = WIFI_TRUE; if((pStr = (strstr((const char *)process_buffer+2,"\r\n"))) != NULL)
--- a/Spwf_API/SpwfSADevice.cpp Mon May 09 10:38:22 2016 +0000 +++ b/Spwf_API/SpwfSADevice.cpp Wed May 11 06:12:16 2016 +0000 @@ -61,6 +61,7 @@ setSpwfSADevice(this); sync_wait_signal = false; wait_for_incoming_client = false; + wait_for_socket_data = false; } SpwfSADevice::~SpwfSADevice(void) @@ -186,7 +187,7 @@ status = wifi_socket_client_open(hostname, port_number, protocol, sock_id); if(status!=WiFi_MODULE_SUCCESS) { - *sock_id = 9;//make sure socket id is not set(set to out of bounds of SPWFSA_SOCKET_COUNT range) + *sock_id = 99;//make sure socket id is not set(set to out of bounds of SPWFSA_SOCKET_COUNT range) return -1; } @@ -211,34 +212,40 @@ int SpwfSADevice::socket_client_recv(uint8_t sock_id, uint16_t RecvLength,char * pData) { - Timer timer; - //char debug_str[10]; - timer.start(); - bytes_to_read = RecvLength; - - __disable_irq(); - bytes_read=0; - sync_wait_signal = false; - recv_buff = (uint8_t*)pData; - __enable_irq(); - - while(!sync_wait_signal) + static Timer recv_timer; + //char debug_str[10]; + static bool recv_call = true; + + if(recv_call) { - if (timer.read_ms() > _timeout) { - //debug_print("\r\n SpwfSADevice:: Timeout!\r\n"); - sync_wait_signal = true; - //if(bytes_read==0) return -1;//return error if no bytes are read! - //sprintf((char*)debug_str,"bytes_read: %d\r\n",bytes_read); - //debug_print(debug_str); + __disable_irq(); + wait_for_socket_data = false; + if(_timeout>0) + recv_timer.start(); + recv_call = false; + bytes_to_read = RecvLength; + bytes_read=0; + recv_buff = (uint8_t*)pData; + __enable_irq(); + } + + + if(wait_for_socket_data || recv_timer.read_ms() >= _timeout) + { + recv_call = true; + _timeout = 0; + wait_for_socket_data = true; + recv_timer.stop(); + recv_timer.reset(); + if(bytes_read == 0) //<bytes_to_read?? + return -1;//return error if no bytes are read! + else return bytes_read;//return amount of data arrived so far - //when do we return NS_ERROR_WOULD_BLOCK?? - } - __NOP(); } + + return -1; +} - return bytes_read; - -} void SpwfSADevice::network_scan(wifi_scan *scan_result, uint16_t max_scan_number) { @@ -280,7 +287,7 @@ //Copy data to pData //sprintf((char*)debug_str,"sock_id: %d, size: %d\r\n",socket_id, message_size); - if(recv_buff && !sync_wait_signal) + if(recv_buff && !wait_for_socket_data) { if((bytes_read + message_size)<= bytes_to_read) { @@ -297,7 +304,7 @@ if(bytes_read >= bytes_to_read) { __disable_irq(); - sync_wait_signal = true; + wait_for_socket_data = true; __enable_irq(); } } @@ -307,7 +314,7 @@ sprintf((char*)debug_str,"%d\r\n",message_size); debug_print(debug_str); __disable_irq(); - sync_wait_signal = true; + wait_for_socket_data = true; __enable_irq(); }
--- a/Spwf_API/SpwfSADevice.h Mon May 09 10:38:22 2016 +0000 +++ b/Spwf_API/SpwfSADevice.h Wed May 11 06:12:16 2016 +0000 @@ -106,6 +106,7 @@ wifi_config config; bool sync_wait_signal; bool wait_for_incoming_client; + bool wait_for_socket_data; uint16_t bytes_read; uint16_t bytes_to_read; uint8_t * recv_buff;