Socket interface for C027Interface. Implements the NetworkSocketAPI

Dependencies:   C027_Support

Dependents:   HelloC027Interface U_Blox_DeviceConnector U_Blox_DeviceConnector U-Blox_Client

Fork of LWIPInterface by NetworkSocketAPI

Revision:
21:0c4d90bc84af
Parent:
19:fed715eb9c83
Child:
22:69ea34ad7fc6
--- a/C027Interface.cpp	Mon Mar 27 15:57:50 2017 +0000
+++ b/C027Interface.cpp	Mon Mar 27 14:10:06 2017 -0500
@@ -26,7 +26,25 @@
     running = false;
 }
 
-int C027Interface::connect(const char *apn, const char *username, const char *password)
+C027Interface::~C027Interface()
+{
+	_thread.join();
+}
+
+nsapi_error_t C027Interface::set_credentials(const char *apn, const char *username, const char *password)
+{
+    memset(_apn, 0, sizeof(_apn));
+    strncpy(_apn, apn, sizeof(_apn));
+ 
+    memset(_username, 0, sizeof(_username));
+    strncpy(_username, username, sizeof(_username));
+    
+    memset(_password, 0, sizeof(_password));
+    strncpy(_password, password, sizeof(_password));
+    return 0;
+}
+
+nsapi_error_t C027Interface::connect()
 {
     // create the modem
     _mdm = new MDMSerial;
@@ -54,13 +72,20 @@
     
     if (mdmOk) {
         // join the internet connection 
-        MDMParser::IP ip = _mdm->join(apn, username, password);
+        MDMParser::IP ip = _mdm->join(_apn, _username, _password);
         _ip_address.set_ip_bytes(&ip, NSAPI_IPv4);
         mdmOk = (ip != NOIP);
     }
     
     return mdmOk ? 0 : NSAPI_ERROR_DEVICE_ERROR;
 }
+ 
+nsapi_error_t C027Interface::connect(const char *apn, const char *username, const char *password)
+{
+    
+    set_credentials(apn, username, password);
+    return connect();
+}
 
 int C027Interface::disconnect()
 {
@@ -138,7 +163,8 @@
     return 0;
 }
 
-int C027Interface::socket_accept(void **handle, void *server)
+nsapi_error_t C027Interface::socket_accept(nsapi_socket_t server,
+            nsapi_socket_t *handle, SocketAddress *address)
 {
     return NSAPI_ERROR_UNSUPPORTED;
 }
@@ -158,7 +184,8 @@
 int C027Interface::socket_recv(void *handle, void *data, unsigned size)
 {
     struct c027_socket *socket = (struct c027_socket *)handle;
-    if (!_mdm->socketReadable(socket->socket)) {
+    
+		if (!_mdm->socketReadable(socket->socket)) {
         return NSAPI_ERROR_WOULD_BLOCK;
     }
     
@@ -210,27 +237,32 @@
 
 void C027Interface::socket_check()
 {
-    struct c027_socket *socket = (struct c027_socket *)_handle;
     while(running){
-            if (_mdm->socketReadable(socket->socket)) {
-                    event();
-                    break;
+        for (int i = 0; i < NUMSOCKETS; i++){
+            int readable = _mdm->socketReadable(i);
+            if (readable != 1) {
+                event();        
             }
-            wait(1);
         }
-        running = false;
+        wait(1);
+    }
+    running = false;
 }
     
 
 void C027Interface::event(){
-    _callback(_data);
+    for (int i = 0; i < NUMSOCKETS; i++){
+        if (_cbs[i].callback) {
+            _cbs[i].callback(_cbs[i].data);
+        }
+    }
 }
 
 void C027Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
 {
-    _callback = callback;
-    _data = data;
-    _handle = &handle;
+    struct c027_socket *socket = (struct c027_socket *)handle;   
+    _cbs[socket->socket].callback = callback;
+    _cbs[socket->socket].data = data;
     if(!running){
         running = true;
         _thread.start(this, &C027Interface::socket_check);