iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

Revision:
6:e7a3fca2df10
Parent:
5:c83ffd44f40a
Child:
7:0fdd186a7d90
--- a/SPWFInterface.cpp	Wed May 04 12:16:20 2016 +0000
+++ b/SPWFInterface.cpp	Mon May 09 10:38:22 2016 +0000
@@ -25,6 +25,7 @@
 // Handle structure for socket
 struct spwf_socket {
     int id;
+    int server_port;
     nsapi_protocol_t proto;
     bool connected;
 };
@@ -35,6 +36,7 @@
 {
     memset(_ids, 0, sizeof(_ids));
     isInitialized = false;
+    isListening = false;
 }
  
 SpwfSAInterface::~SpwfSAInterface()
@@ -96,6 +98,7 @@
     }
 
     socket->id = id;
+    socket->server_port = id;
     socket->proto = proto;
     socket->connected = false;
     *handle = socket;
@@ -104,7 +107,7 @@
 
 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
 {
-    uint8_t sock_id = 9;
+    uint8_t sock_id = 99;
     struct spwf_socket *socket = (struct spwf_socket *)handle;
     
     const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";//"s" for secure socket?
@@ -130,19 +133,106 @@
 
 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
 {
-    return NSAPI_ERROR_UNSUPPORTED;
+    struct spwf_socket *socket = (struct spwf_socket *)handle;
+    socket->id = SERVER_SOCKET_NO;//Special socket ID number for Server Socket
+    socket->server_port = address.get_port();
+    return 0;
 }
 
 int SpwfSAInterface::socket_listen(void *handle, int backlog)
 {
-    return NSAPI_ERROR_UNSUPPORTED;
+    struct spwf_socket *socket = (struct spwf_socket *)handle;
+    int err;
+    
+    if(socket->server_port==-1 || isListening) 
+        return NSAPI_ERROR_NO_SOCKET; //server socket not bound or already listening
+    
+    const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";
+    
+    err = _spwf.socket_server_open((uint32_t)socket->server_port, (uint8_t *)proto);
+    
+    if(err==0)
+    {
+        isListening = true;
+    }
+    else 
+        return NSAPI_ERROR_DEVICE_ERROR;
+        
+    return err;
 }
 
+/** Accepts a connection on a TCP socket
+     *
+     *  The server socket must be bound and set to listen for connections.
+     *  On a new connection, creates a network socket using the specified
+     *  socket instance.
+     *
+     *  By default, accept blocks until data is sent. If socket is set to
+     *  non-blocking or times out, NSAPI_ERROR_WOULD_BLOCK is returned
+     *  immediately.
+     *
+     *  @param socket   TCPSocket instance that will handle the incoming connection.
+     *  @return         0 on success, negative error code on failure
+     */
 int SpwfSAInterface::socket_accept(void **handle, void *server)
 {
-    return NSAPI_ERROR_UNSUPPORTED;
+    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())
+        {
+            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;
 }
 
+/*
+int SpwfSAInterface::get_network_socket(struct spwf_socket **handle)
+{
+    struct spwf_socket *__socket = new struct spwf_socket;//create new network socket
+    __socket = new struct spwf_socket;//create new network socket
+    if (!__socket) {
+        return NSAPI_ERROR_NO_SOCKET;
+    }
+    
+    memset(__socket, 0, sizeof (struct spwf_socket));
+    *handle = __socket;
+    return 0;
+}
+*/
+
 int SpwfSAInterface::socket_close(void *handle)
 {
     struct spwf_socket *socket = (struct spwf_socket *)handle;
@@ -151,10 +241,20 @@
     
     if(socket->id!=-1)
     {
-        if (_spwf.socket_client_close(socket->id)==-1) {
-            err = NSAPI_ERROR_DEVICE_ERROR;
+        if(socket->id==SERVER_SOCKET_NO)
+        {
+            if (_spwf.socket_server_close()==-1) {
+                err = NSAPI_ERROR_DEVICE_ERROR;
+            }
+            isListening = false;
         }
-        _ids[socket->id] = false;
+        else
+        {
+            if (_spwf.socket_client_close(socket->id)==-1) {
+                err = NSAPI_ERROR_DEVICE_ERROR;
+            }
+            _ids[socket->id] = false;
+        }
     }
 
     delete socket;
@@ -166,7 +266,14 @@
     struct spwf_socket *socket = (struct spwf_socket *)handle;
     int err;
     
-    err = _spwf.socket_client_write((uint8_t)socket->id, (uint16_t)size, (char*)data);
+    if(socket->id==SERVER_SOCKET_NO)
+        {
+            err = _spwf.socket_server_write((uint16_t)size, (char*)data);
+        }
+    else
+        {
+            err = _spwf.socket_client_write((uint8_t)socket->id, (uint16_t)size, (char*)data);
+        }
     
     return err;
 }
@@ -179,6 +286,7 @@
     
     _spwf.setTimeout(SPWF_RECV_TIMEOUT);
     
+    //CHECK:Receive for both Client and Server Sockets same?
     recv = _spwf.socket_client_recv((uint8_t)socket->id, (uint16_t)size, (char*)data);    
     if (recv < 0) {
         return NSAPI_ERROR_WOULD_BLOCK;