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:
28:fbba4c58d14c
Parent:
26:b347ee3a1087
Child:
29:1c4419512941
--- a/GSwifi.cpp	Fri Feb 22 01:10:17 2013 +0000
+++ b/GSwifi.cpp	Fri Feb 22 03:07:43 2013 +0000
@@ -99,7 +99,7 @@
         _alarm->write(0);
         wait_ms(10);
         _alarm->input(); // high
-        _alarm->mode(PullNone);
+        _alarm->mode(PullUp);
         wait_ms(10);
     }
     _reset.output(); // low
@@ -118,7 +118,7 @@
 
     wait_ms(10);
     _reset.input(); // high
-    _reset.mode(PullNone);
+    _reset.mode(PullUp);
     wait_ms(500);
 }
 
@@ -356,13 +356,9 @@
 
     if (cmd == NULL) {
         // dummy CR+LF
-printf("1\r\n");
         _gs.printf("\r\n");
-printf("2\r\n");
         wait_ms(100);
-printf("3\r\n");
         _buf_cmd.flush();
-printf("4\r\n");
         return 0;
     }
 
@@ -417,7 +413,6 @@
     command(NULL, GSRES_NORMAL);
     if (command("ATE0", GSRES_NORMAL)) return -1;
     if (_rts) {
-        command("AT&K0", GSRES_NORMAL);
         command("AT&R1", GSRES_NORMAL);
     }
     command("AT+NMAC=?", GSRES_MACADDRESS);
@@ -454,10 +449,11 @@
         }
         break;
     case GSSEC_WPA_PSK:
+    case GSSEC_WPA_ENT:
     case GSSEC_WPA2_PSK:
+    case GSSEC_WPA2_ENT:
         command("AT+WAUTH=0", GSRES_NORMAL);
 //        sprintf(cmd, "AT+WWPA=%s", pass);
-//        command(cmd, GSRES_NORMAL);
         sprintf(cmd, "AT+WPAPSK=%s,%s", ssid, pass);
         command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
         wait_ms(100);
@@ -477,6 +473,15 @@
             r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2);
         }
         break;
+    case GSSEC_WPS_PIN:
+        command("AT+WAUTH=0", GSRES_NORMAL);
+        sprintf(cmd, "AT+WWPS=2,%s", pass);
+        r = command(cmd, GSRES_WPS, GS_TIMEOUT2);
+        if (r) break;
+        if (dhcp) {
+            r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2);
+        }
+        break;
     default:
         DBG("Can't use security\r\n");
         r = -1;
@@ -493,8 +498,15 @@
         _connect = true;
         _reconnect = reconnect;
         _reconnect_count = 0;
-        if (!_ssid) _ssid = new char[sizeof(ssid) + 1];
-        strcpy(_ssid, ssid);
+        _sec = sec;
+        if (ssid) {
+            if (!_ssid) _ssid = new char[sizeof(ssid) + 1];
+            strcpy(_ssid, ssid);
+        }
+        if (pass) {
+            if (!_pass) _pass = new char[sizeof(pass) + 1];
+            strcpy(_pass, pass);
+        }
     }
     return r;
 }
@@ -508,7 +520,6 @@
     command(NULL, GSRES_NORMAL);
     if (command("ATE0", GSRES_NORMAL)) return -1;
     if (_rts) {
-        command("AT&K0", GSRES_NORMAL);
         command("AT&R1", GSRES_NORMAL);
     }
     disconnect();
@@ -555,7 +566,6 @@
     command(NULL, GSRES_NORMAL);
     if (command("ATE0", GSRES_NORMAL)) return -1;
     if (_rts) {
-        command("AT&K0", GSRES_NORMAL);
         command("AT&R1", GSRES_NORMAL);
     }
     disconnect();
@@ -614,6 +624,37 @@
     return 0;
 }
 
+int GSwifi::reconnect () {
+    int r;
+    char cmd[GS_CMD_SIZE];
+    
+    if (_connect || _status != GSSTAT_READY) return -1;
+    if (!_ssid) return -1;
+
+    switch (_sec) {
+    case GSSEC_WPS_BUTTON:
+    case GSSEC_WPS_PIN:
+        sprintf(cmd, "AT+WPAPSK=%s,%s", _ssid, _pass);
+        command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
+        wait_ms(100);
+    case GSSEC_NONE:
+    case GSSEC_OPEN:
+    case GSSEC_WEP:
+    case GSSEC_WPA_PSK:
+    case GSSEC_WPA_ENT:
+    case GSSEC_WPA2_PSK:
+    case GSSEC_WPA2_ENT:
+        sprintf(cmd, "AT+WA=%s", _ssid);
+        r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
+        break;
+    default:
+        DBG("Can't use security\r\n");
+        r = -1;
+        break;
+    }
+    return r;
+}
+
 int GSwifi::setAddress () {
 
     if (command("AT+NDHCP=1", GSRES_DHCP), GS_TIMEOUT2) return -1;
@@ -738,7 +779,7 @@
         }
         timeout.stop();
         _alarm->input(); // high
-        _alarm->mode(PullNone);
+        _alarm->mode(PullUp);
     }
 
     if (_status == GSSTAT_WAKEUP) {
@@ -1026,13 +1067,9 @@
     
     if ((!_connect) && _reconnect_count < _reconnect && _ssid) {
         // re-connrct
-        int r;
-        char cmd[GS_CMD_SIZE];
         _reconnect_count ++;
         DBG("re-connect %d\r\n", _reconnect_count);
-        sprintf(cmd, "AT+WA=%s", _ssid);
-        r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
-        if (r == 0) {
+        if (reconnect() == 0) {
             _connect = true;
             _reconnect_count = 0;
         }