iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

Files at this revision

API Documentation at this revision

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

SPWFInterface.cpp Show annotated file Show diff for this revision Revisions of this file
SPWFInterface.h Show annotated file Show diff for this revision Revisions of this file
Spwf/wifi_interface.c Show annotated file Show diff for this revision Revisions of this file
Spwf/wifi_module.c Show annotated file Show diff for this revision Revisions of this file
Spwf_API/SpwfSADevice.cpp Show annotated file Show diff for this revision Revisions of this file
Spwf_API/SpwfSADevice.h Show annotated file Show diff for this revision Revisions of this file
--- 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;