W5500 from SeeedStudio on NUCLEO-L476RG

Dependents:   coap-example Borsch coap-example

Fork of W5500Interface by AMETEK Powervar

Revision:
4:80e302a610fd
Parent:
3:61ff27ed8355
Child:
5:41393623ead4
--- a/W5500Interface.cpp	Wed Jul 05 18:37:40 2017 +0000
+++ b/W5500Interface.cpp	Thu Jul 06 04:51:34 2017 +0000
@@ -34,8 +34,9 @@
 DigitalOut led1(LED1);
 
 #define SKT(h) ((w5500_socket*)h)
-#define w5500_WAIT_TIMEOUT   1500
+#define w5500_WAIT_TIMEOUT   5000
 #define w5500_ACCEPT_TIMEOUT 3000
+#define w5500_INTF_DBG 1
 
 /* Interface implementation */
 
@@ -205,12 +206,17 @@
    
     //new up an int to store the socket fd 
     *handle = h;
-    
+#ifdef w5500_INTF_DBG
+    debug("[socket_open] fd: %d\n", sock_fd);
+#endif
     return 0;
 }
 
 void W5500Interface::signal_event(nsapi_socket_t handle)
 {
+#ifdef w5500_INTF_DBG
+    debug("[signal_event] fd: %d\n", SKT(handle)->fd);
+#endif
     if (SKT(handle)->callback != NULL) {
         SKT(handle)->callback(SKT(handle)->callback_data);
     }
@@ -219,6 +225,9 @@
 nsapi_error_t W5500Interface::socket_close(nsapi_socket_t handle)
 {
     if (handle == NULL) return 0;
+#ifdef w5500_INTF_DBG
+    debug("[socket_close] fd: %d\n", SKT(handle)->fd);
+#endif
     WIZnet_Chip::close(SKT(handle)->fd);
     
     SKT(handle)->fd = -1;
@@ -231,6 +240,9 @@
     if (handle < 0) {
         return NSAPI_ERROR_DEVICE_ERROR;
     }
+#ifdef w5500_INTF_DBG
+    debug("[socket_bind] fd: %d, port: %d\n", SKT(handle)->fd, address.get_port());
+#endif
 
     switch (SKT(handle)->proto) {
         case NSAPI_UDP:
@@ -261,6 +273,9 @@
 
 nsapi_error_t W5500Interface::socket_listen(nsapi_socket_t handle, int backlog)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_listen] fd: %d\n", SKT(handle)->fd);
+#endif
     if (SKT(handle)->fd < 0) {
         return NSAPI_ERROR_NO_SOCKET;
     }
@@ -273,6 +288,9 @@
 
 nsapi_size_or_error_t W5500Interface::socket_connect(nsapi_socket_t handle, const SocketAddress &address)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_connect] fd: %d\n", SKT(handle)->fd);
+#endif
     //check for a valid socket
     if (SKT(handle)->fd < 0) {
         return NSAPI_ERROR_NO_SOCKET;
@@ -294,6 +312,9 @@
 
 nsapi_error_t W5500Interface::socket_accept(nsapi_socket_t server, nsapi_socket_t *handle, SocketAddress *address)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_accept] fd: %d\n", SKT(handle)->fd);
+#endif
     if (SKT(server)->fd < 0) {
         return NSAPI_ERROR_NO_SOCKET;
     }
@@ -344,7 +365,7 @@
     
     // and then, for the next connection, server socket should be assigned new one.
     if (socket_bind(server, _addr) < 0) {
-        error("No more socketa for binding");
+        error("No more sockets for binding");
         return NSAPI_ERROR_NO_SOCKET;
     }
     
@@ -368,6 +389,9 @@
 
 nsapi_size_or_error_t W5500Interface::socket_send(nsapi_socket_t handle, const void *data, nsapi_size_t size)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_send] fd: %d\n", SKT(handle)->fd);
+#endif
     int writtenLen = 0;
     while (writtenLen < size) {
         int _size =  WIZnet_Chip::wait_writeable(SKT(handle)->fd, w5500_WAIT_TIMEOUT);
@@ -379,6 +403,7 @@
         }
         int ret = WIZnet_Chip::send(SKT(handle)->fd, (char*)data, (int)_size);
         if (ret < 0) {
+            debug("[socket_send] returned error -1\n");
             return -1;
         }
         writtenLen += ret;
@@ -388,6 +413,9 @@
 
 nsapi_size_or_error_t W5500Interface::socket_recv(nsapi_socket_t handle, void *data, nsapi_size_t size)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_recv] fd: %d\n", SKT(handle)->fd);
+#endif
     // add to cover exception.
     if ((SKT(handle)->fd < 0) || !SKT(handle)->connected) {
         return -1;
@@ -408,9 +436,23 @@
 nsapi_size_or_error_t W5500Interface::socket_sendto(nsapi_socket_t handle, const SocketAddress &address,
             const void *data, nsapi_size_t size)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_sendto] fd: %d\n", SKT(handle)->fd);
+#endif
+#ifdef w5500_INTF_DBG
+    debug("[socket_sendto] to ip: %s:%d\n", address.get_ip_address(), address.get_port());
+#endif
+    if (WIZnet_Chip::is_closed(SKT(handle)->fd)) {
+        nsapi_error_t err = socket_bind(handle, address);
+        if (err < 0) {
+            debug("[socket_sendto] failed to bind socket: %d\n", err);
+            return err;
+        }
+    }
     //compare with original: int size = eth->wait_writeable(_sock_fd, _blocking ? -1 : _timeout, length-1); 
     int len = WIZnet_Chip::wait_writeable(SKT(handle)->fd, w5500_WAIT_TIMEOUT, size-1);
     if (len < 0) {
+        debug("[socket_sendto] error: NSAPI_ERROR_WOULD_BLOCK\n");
         return NSAPI_ERROR_WOULD_BLOCK;;
     }
     
@@ -419,18 +461,42 @@
     // set remote port
     WIZnet_Chip::sreg<uint16_t>(SKT(handle)->fd, Sn_DPORT, address.get_port());
     
-    return WIZnet_Chip::send(SKT(handle)->fd, (const char*)data, size);
+    nsapi_size_or_error_t err = WIZnet_Chip::send(SKT(handle)->fd, (const char*)data, size);
+    debug("[socket_sendto] rv: %d, size: %d\n", err, size);
+    if (err > 0) {
+        debug("[socket_sendto] data: ");
+        for(int i = 0; i < err; i++) {
+            if ((i%16) == 0) {
+                debug("\n");
+            }
+            uint8_t* buf = (uint8_t*)data;
+            debug(" %02x", buf[i]);
+        }
+        if ((err-1%16) != 0) {
+            debug("\n");
+        }
+    }
+    return err;
 }
 
 nsapi_size_or_error_t W5500Interface::socket_recvfrom(nsapi_socket_t handle, SocketAddress *address,
             void *buffer, nsapi_size_t size)
 {
+#ifdef w5500_INTF_DBG
+    debug("[socket_recvfrom] fd: %d\n", SKT(handle)->fd);
+#endif
     //check for null pointers
-    if (address == NULL || buffer == NULL) return -1;
-    
+    if (buffer == NULL) {
+#ifdef w5500_INTF_DBG
+        debug("[socket_recvfrom] buffer is NULL; receive is ABORTED\n");
+#endif        
+        return -1;
+    }
+   
     uint8_t info[8];
     int len = WIZnet_Chip::wait_readable(SKT(handle)->fd, w5500_WAIT_TIMEOUT, sizeof(info));
     if (len < 0) {
+        debug("[socket_recvfrom] error: NSAPI_ERROR_WOULD_BLOCK\n");
         return NSAPI_ERROR_WOULD_BLOCK;
     }
 
@@ -440,23 +506,45 @@
     char addr[17];
     snprintf(addr, sizeof(addr), "%d.%d.%d.%d", info[0], info[1], info[2], info[3]);
     uint16_t port = info[4]<<8|info[5];
-    address->set_ip_address(addr);
-    address->set_port(port);
+    // original behavior was to terminate execution if address is NULL
+    if (address != NULL) {
+        //debug("[socket_recvfrom] warn: addressis NULL");
+        address->set_ip_address(addr);
+        address->set_port(port);
+    }
    
     int udp_size = info[6]<<8|info[7];
 
     if (udp_size > (len-sizeof(info))) {
+        debug("[socket_recvfrom] error: udp_size > (len-sizeof(info))\n");
         return -1;
     }
     
     //receive from socket
-    return WIZnet_Chip::recv(SKT(handle)->fd, (char*)buffer, udp_size);
+    nsapi_size_or_error_t err = WIZnet_Chip::recv(SKT(handle)->fd, (char*)buffer, udp_size);
+    debug("[socket_recvfrom] rv: %d\n", err);
+    if (err > 0) {
+        debug("[socket_recvfrom] buffer:");
+        for(int i = 0; i < err; i++) {
+            if ((i%16) == 0) {
+                debug("\n");
+            }
+            uint8_t* buf = (uint8_t*)buffer;
+            debug(" %02x", buf[i]);
+        }
+        if ((err-1%16) != 0) {
+            debug("\n");
+        }
+    }
+    return  err;
 }
 
 void W5500Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
 {
     if (handle == NULL) return;
-    
+#ifdef w5500_INTF_DBG
+    debug("[socket_attach] fd: %d, callback: %p\n", SKT(handle)->fd, callback);
+#endif
     SKT(handle)->callback       = callback;
     SKT(handle)->callback_data  = data;
 }
\ No newline at end of file