GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Dependents:   GSwifi_httpd GSwifi_websocket GSwifi_tcpclient GSwifi_tcpserver ... more

Fork of GSwifi by gs fan

GainSpan Wi-Fi library

The GS1011 is an ultra low power 802.11b wireless module from GainSpan.

see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

/media/uploads/gsfan/gs_im_002.jpg /media/uploads/gsfan/gs1011m_2.jpg

ゲインスパン Wi-Fi モジュール ライブラリ

ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。

解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Revision:
35:515ec79792d3
Parent:
33:b5a5a1e6325f
Child:
36:a70b11e1560f
--- a/GSwifi.cpp	Fri Mar 29 14:58:07 2013 +0000
+++ b/GSwifi.cpp	Fri Jun 21 06:08:37 2013 +0000
@@ -36,11 +36,12 @@
 
     _reset.output(); // low
     _reset = 0;
-    _gs.baud(baud);
+    _baud = baud;
+    if (_baud) _gs.baud(_baud);
     _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
     _rts = false;
 
-    wait_ms(500);
+    wait_ms(100);
     reset();
 }
 
@@ -56,7 +57,8 @@
 
     _reset.output(); // low
     _reset = 0;
-    _gs.baud(baud);
+    _baud = baud;
+    if (_baud) _gs.baud(_baud);
     _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
     _rts = false;
 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
@@ -85,7 +87,7 @@
     }
 #endif
 
-    wait_ms(500);
+    wait_ms(100);
     reset();
 }
 
@@ -102,6 +104,8 @@
     _reset.output(); // low
     _reset = 0;
 
+    memset(&_gs_sock, 0, sizeof(_gs_sock));
+    memset(&_mac, 0, sizeof(_mac));
     _connect = false;
     _status = GSSTAT_READY;
     _escape = 0;
@@ -110,15 +114,49 @@
     _ssid = NULL;
     _pass = NULL;
     _reconnect = 0;
-    _reconnect_count = 0;
     _buf_cmd.flush();
 
     wait_ms(100);
+    if (! _baud) autobaud(0);
     _reset.input(); // high
     _reset.mode(PullUp);
+    if (! _baud) autobaud(1);
     wait_ms(500);
 }
 
+int GSwifi::autobaud (int flg) {
+    int i;
+
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+    if (flg == 0) {
+        LPC_UART1->ACR = (1<<2)|(1<<0); // auto-baud mode 0
+        return 0;
+    } else {
+        for (i = 0; i < 50; i ++) {
+            if (! (LPC_UART1->ACR & (1<<0))) {
+                return 0;
+            }
+            wait_ms(10);
+        }
+        LPC_UART1->ACR = 0;
+    }
+#elif defined(TARGET_LPC11U24)
+    if (flg == 0) {
+        LPC_USART->ACR = (1<<2)|(1<<0); // auto-baud mode 0
+        return 0;
+    } else {
+        for (i = 0; i < 50; i ++) {
+            if (! (LPC_USART->ACR & (1<<0))) {
+                return 0;
+            }
+            wait_ms(10);
+        }
+        LPC_USART->ACR = 0;
+    }
+#endif
+    return -1;
+}
+
 // uart interrupt
 void GSwifi::isr_recv () {
     static int len, mode;
@@ -394,7 +432,7 @@
     return -1;
 }
 
-int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect) {
+int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect, char *name) {
     int r;
     char cmd[GS_CMD_SIZE];
     
@@ -405,7 +443,7 @@
     if (_rts) {
         command("AT&R1", GSRES_NORMAL);
     }
-    command("AT+NMAC=?", GSRES_MACADDRESS);
+    if (getMacAddress(_mac)) return -1;
 #ifdef GS_BULK
     command("AT+BDATA=1", GSRES_NORMAL);
 #endif
@@ -414,7 +452,12 @@
     command("AT+WM=0", GSRES_NORMAL); // infrastructure
     wait_ms(100);
     if (dhcp && sec != GSSEC_WPS_BUTTON) {
-        command("AT+NDHCP=1", GSRES_NORMAL);
+        if (name) {
+            sprintf(cmd, "AT+NDHCP=1,%s", name);
+        } else {
+            strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME);
+        }
+        command(cmd, GSRES_NORMAL);
     } else {
         command("AT+NDHCP=0", GSRES_NORMAL);
     }
@@ -460,7 +503,7 @@
         r = command("AT+WWPS=1", GSRES_WPS, GS_TIMEOUT2);
         if (r) break;
         if (dhcp) {
-            r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2);
+            r = setAddress(name);
         }
         break;
     case GSSEC_WPS_PIN:
@@ -469,7 +512,7 @@
         r = command(cmd, GSRES_WPS, GS_TIMEOUT2);
         if (r) break;
         if (dhcp) {
-            r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2);
+            r = setAddress(name);
         }
         break;
     default:
@@ -489,12 +532,12 @@
         _reconnect = reconnect;
         _reconnect_count = 0;
         _sec = sec;
-        if (ssid) {
-            if (!_ssid) _ssid = new char[strlen(ssid) + 1];
+        if (_reconnect && ssid) {
+            if (!_ssid) _ssid = (char*)malloc(strlen(ssid) + 1);
             strcpy(_ssid, ssid);
         }
-        if (pass) {
-            if (!_pass) _pass = new char[strlen(pass) + 1];
+        if (_reconnect && pass) {
+            if (!_pass) _pass = (char*)malloc(strlen(pass) + 1);
             strcpy(_pass, pass);
         }
     }
@@ -512,12 +555,12 @@
     if (_rts) {
         command("AT&R1", GSRES_NORMAL);
     }
-    disconnect();
-    command("AT+NMAC=?", GSRES_MACADDRESS);
+    if (getMacAddress(_mac)) return -1;
 #ifdef GS_BULK
     command("AT+BDATA=1", GSRES_NORMAL);
 #endif
 
+    disconnect();
     command("AT+WM=1", GSRES_NORMAL); // adhock
     wait_ms(100);
     command("AT+NDHCP=0", GSRES_NORMAL);
@@ -558,12 +601,12 @@
     if (_rts) {
         command("AT&R1", GSRES_NORMAL);
     }
-    disconnect();
-    command("AT+NMAC=?", GSRES_MACADDRESS);
+    if (getMacAddress(_mac)) return -1;
 #ifdef GS_BULK
     command("AT+BDATA=1", GSRES_NORMAL);
 #endif
 
+    disconnect();
     command("AT+WM=2", GSRES_NORMAL); // limited ap
     wait_ms(100);
     command("AT+NDHCP=0", GSRES_NORMAL);
@@ -642,12 +685,20 @@
         r = -1;
         break;
     }
+
+    if (r == 0) _connect = true;
     return r;
 }
 
-int GSwifi::setAddress () {
+int GSwifi::setAddress (char *name) {
+    char cmd[GS_CMD_SIZE];
 
-    if (command("AT+NDHCP=1", GSRES_DHCP), GS_TIMEOUT2) return -1;
+    if (name) {
+        sprintf(cmd, "AT+NDHCP=1,%s", name);
+    } else {
+        strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME);
+    }
+    if (command(cmd, GSRES_DHCP), GS_TIMEOUT2) return -1;
     if (_ipaddr.isNull()) return -1;
     return 0;
 }
@@ -686,8 +737,13 @@
 }
 
 int GSwifi::getMacAddress (char *mac) {
-    memcpy(mac, _mac, 6);
-    return 0;
+
+    command("AT+NMAC=?", GSRES_MACADDRESS);
+    if (_mac[0] || _mac[1] || _mac[2] || _mac[3] || _mac[4] || _mac[5]) {
+        memcpy(mac, _mac, 6);
+        return 0;
+    }
+    return -1;
 }
 
 int GSwifi::getHostByName (const char* name, IpAddr &addr) {
@@ -915,6 +971,7 @@
           strncmp(buf, "UnExpected Warm Boot", 20) == 0 ||
           strncmp(buf, "APP Reset-APP SW Reset", 22) == 0 ||
           strncmp(buf, "APP Reset-Wlan Except", 21) == 0 ) {
+            DBG("disassociate\r\n");
             _connect = false;
             for (i = 0; i < 16; i ++) {
                 _gs_sock[i].connect = false;
@@ -937,7 +994,6 @@
 
 void GSwifi::parseCmdResponse (char *buf) {
     if (_gs_res == GSRES_NONE) return;
-    DBG("cmd\r\n");
 
     if (strcmp(buf, "OK") == 0) {
         _gs_ok = true;
@@ -952,7 +1008,7 @@
         break;
     case GSRES_WPS:
         if (_gs_flg == 0 && strncmp(buf, "SSID=", 5) == 0) {
-            if (!_ssid) _ssid = new char[strlen(&buf[5]) + 1];
+            if (!_ssid) _ssid = (char*)malloc(strlen(&buf[5]) + 1);
             strcpy(_ssid, &buf[5]);
             _gs_flg ++;
         } else
@@ -960,7 +1016,7 @@
             _gs_flg ++;
         } else
         if (_gs_flg == 2 && strncmp(buf, "PASSPHRASE=", 11) == 0) {
-            if (!_pass) _pass = new char[strlen(&buf[11]) + 1];
+            if (!_pass) _pass = (char*)malloc(strlen(&buf[11]) + 1);
             strcpy(_pass, &buf[11]);
             _gs_flg = -1;
         }
@@ -1046,23 +1102,26 @@
     int i, j;
 
     for (i = 0; i < 16; i ++) {
-        if (_gs_sock[i].received && (! _gs_sock[i].data->isEmpty())) {
+        if (_gs_sock[i].connect && _gs_sock[i].received) {
+          if (_gs_sock[i].data && ! _gs_sock[i].data->isEmpty()) {
             // recv interrupt
             _gs_sock[i].received = false;
             for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) {
                 if (! _gs_sock[i].connect || _gs_sock[i].data->isEmpty()) break;
                 _gs_sock[i].onGsReceive.call(i, _gs_sock[i].data->available());
             }
+          }
         }
     }
-    
-    if ((!_connect) && _reconnect_count < _reconnect && _ssid) {
-        // re-connrct
-        _reconnect_count ++;
-        DBG("re-connect %d\r\n", _reconnect_count);
-        if (reconnect() == 0) {
-            _connect = true;
-            _reconnect_count = 0;
+
+    if (_reconnect && ! _connect) {
+        if (_reconnect_count == 0 || (_reconnect_count < _reconnect && _reconnect_time < time(NULL))) {
+            _reconnect_count ++;
+            DBG("reconnect %d/%d\r\n", _reconnect_count, _reconnect);
+            if (reconnect() == 0) {
+                _reconnect_count = 0;
+            }
+            _reconnect_time = time(NULL) + GS_RECONTIME;
         }
     }
 }
@@ -1155,10 +1214,15 @@
     
     DBG("GS mode=%d, escape=%d, cid=%d\r\n", _gs_mode, _escape, _cid);
     for (i = 0; i < 16; i ++) {
-        DBG("%d: connect=%d, type=%d, protocol=%d, len=%d\r\n", i, _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->available());
+        DBG("[%d] ", i);
+        DBG("connect=%d, type=%d, protocol=%d, len=%d\r\n", _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->available());
+        DBG("  %x, %x\r\n", &_gs_sock[i], _gs_sock[i].data);
+#ifdef GS_ENABLE_HTTPD
         if (_gs_sock[i].protocol == GSPROT_HTTPD) {
             DBG("  mode=%d, type=%d, len=%d\r\n", i, _httpd[i].mode, _httpd[i].type, _httpd[i].len);
+            DBG("  %x, %x\r\n", &_httpd[i], _httpd[i].buf);
         }
+#endif
     }
 }