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:
40:72f70748f6e8
Parent:
39:3360db93c65c
Child:
41:0afda15e9bb4
--- a/GSwifi.cpp	Tue Jul 23 02:56:47 2013 +0000
+++ b/GSwifi.cpp	Thu Aug 01 15:09:49 2013 +0000
@@ -131,6 +131,7 @@
     _escape = 0;
     resetResponse(GSRES_NONE);
     _gs_mode = GSMODE_COMMAND;
+    _dhcp = 0;
     _ssid = NULL;
     _pass = NULL;
     _reconnect = 0;
@@ -139,7 +140,7 @@
     wait_ms(100);
     if (! _baud) autobaud(0);
     _reset.input(); // high
-    _reset.mode(PullUp);
+    _reset.mode(PullNone);
     if (! _baud) autobaud(1);
     wait_ms(500);
 }
@@ -606,6 +607,34 @@
             _gs_flg = -1;
         }
         break;
+    case GSRES_STATUS:
+        if (_gs_flg == 0 && strncmp(buf, "NOT ASSOCIATED", 14) == 0) {
+            _connect = false;
+            for (int i = 0; i < 16; i ++) {
+                _gs_sock[i].connect = false;
+            }
+            _gs_flg = -1;
+        }
+        if (_gs_flg == 0 && strncmp(buf, "MODE:", 5) == 0) {
+            _gs_flg ++;
+        } else
+        if (_gs_flg == 1 && strncmp(buf, "BSSID:", 6) == 0) {
+            char *tmp = strstr(buf, "SECURITY:") + 2;
+            if (strncmp(tmp, "WEP (OPEN)", 10) == NULL) {
+                _sec = GSSEC_OPEN;
+            } else
+            if (strncmp(tmp, "WEP (SHARED)", 12) == NULL) {
+                _sec = GSSEC_WEP;
+            } else
+            if (strncmp(tmp, "WPA-PERSONAL", 12) == NULL) {
+                _sec = GSSEC_WPA_PSK;
+            } else
+            if (strncmp(tmp, "WPA2-PERSONAL", 13) == NULL) {
+                _sec = GSSEC_WPA2_PSK;
+            }
+            _gs_flg = -1;
+        }
+        break;        
     }
 
     return;
@@ -627,7 +656,7 @@
         }
     }
 
-    if (_reconnect && ! _connect) {
+    if (_reconnect > 0 && ! _connect) {
         if (_reconnect_count == 0 || (_reconnect_count < _reconnect && _reconnect_time < time(NULL))) {
             _reconnect_count ++;
             DBG("reconnect %d/%d\r\n", _reconnect_count, _reconnect);
@@ -797,6 +826,7 @@
         _reconnect = reconnect;
         _reconnect_count = 0;
         _sec = sec;
+        _dhcp = dhcp;
         if (_reconnect && ssid) {
             if (!_ssid) _ssid = (char*)malloc(strlen(ssid) + 1);
             strcpy(_ssid, ssid);
@@ -942,6 +972,9 @@
     case GSSEC_WPA_ENT:
     case GSSEC_WPA2_PSK:
     case GSSEC_WPA2_ENT:
+        if (_dhcp) {
+            command("AT+NDHCP=1," GS_DHCPNAME, GSRES_NORMAL);
+        }
         sprintf(cmd, "AT+WA=%s", _ssid);
         r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
         break;
@@ -1036,6 +1069,11 @@
 }
 
 bool GSwifi::isConnected () {
+/*
+    if (_status == GSSTAT_READY) {
+        command("AT+WSTATUS", GSRES_STATUS);
+    }
+*/
     return _connect;
 }
 
@@ -1102,7 +1140,7 @@
     if (_status != GSSTAT_READY && _status != GSSTAT_WAKEUP) return -1;
 
     if (_status == GSSTAT_READY) {
-        command("AT+WRXACTIVE=0", GSRES_NORMAL);
+//        command("AT+WRXACTIVE=0", GSRES_NORMAL);
         command("AT+STORENWCONN", GSRES_NORMAL, 100);
     } else {
         command("ATE0", GSRES_NORMAL);
@@ -1142,9 +1180,10 @@
 #ifdef GS_BULK
         command("AT+BDATA=1", GSRES_NORMAL);
 #endif
-        command("AT+RESTORENWCONN", GSRES_NORMAL);
+        int r = command("AT+RESTORENWCONN", GSRES_NORMAL);
         wait_ms(100);
-        return command("AT+WRXACTIVE=1", GSRES_NORMAL);
+//        return command("AT+WRXACTIVE=1", GSRES_NORMAL);
+        return r;
     } else
     if (_status == GSSTAT_DEEPSLEEP) {
         _status = GSSTAT_READY;