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/

Files at this revision

API Documentation at this revision

Comitter:
gsfan
Date:
Fri Feb 22 03:07:43 2013 +0000
Parent:
27:5802e39041c5
Child:
29:1c4419512941
Commit message:
modifyed call back function

Changed in this revision

GSwifi.cpp Show annotated file Show diff for this revision Revisions of this file
GSwifi.h Show annotated file Show diff for this revision Revisions of this file
GSwifi_sock.cpp Show annotated file Show diff for this revision Revisions of this file
dbg.h Show annotated file Show diff for this revision Revisions of this file
--- 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;
         }
--- a/GSwifi.h	Fri Feb 22 01:10:17 2013 +0000
+++ b/GSwifi.h	Fri Feb 22 03:07:43 2013 +0000
@@ -72,6 +72,7 @@
     GSSEC_WPA_ENT = 16,
     GSSEC_WPA2_ENT = 32,
     GSSEC_WPS_BUTTON = 64,
+    GSSEC_WPS_PIN,
 };
 
 /**
@@ -243,6 +244,10 @@
      * unassociate
      */
     int disconnect ();
+    /**
+     * re-connect
+     */
+    int reconnect ();
 
     /**
      * use DHCP
@@ -360,38 +365,36 @@
      * tcp/udp client
      * @return CID, -1:failure
      */
-    int open (Host &host, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive = NULL);
-/*
-    int open (Host &host, GSPROTOCOL pro, void (*ponGsReceive)(int, int) = NULL);
-    template<class T>
-    int open (Host &host, GSPROTOCOL pro, T* pItem, void (T::*ponGsReceive)(int, int));
-*/
+    int open (Host &host, GSPROTOCOL pro);
+
+    int open (Host &host, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
+        int cid = open(host, pro);
+        if (cid >= 0) _gs_sock[cid].onGsReceive.attach(ponGsReceive);
+        return cid;
+    }
+    template<typename T>
+    int open (Host &host, GSPROTOCOL pro, T *object, void (T::*member)(int, int)) {
+        int cid = open(host, pro);
+        if (cid >= 0) _gs_sock[cid].onGsReceive.attach(object, member);
+        return cid;
+    }
     /**
      * tcp/udp server
      * @return CID, -1:failure
      */
-    int listen (int port, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive = NULL);
-/*
-    int listen (int port, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive = NULL);
+    int listen (int port, GSPROTOCOL pro);
+
+    int listen (int port, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
+        int cid = listen(port, pro);
+        if (cid >= 0) _gs_sock[cid].onGsReceive.attach(ponGsReceive);
+        return cid;
+    }
     template<typename T>
-    int listen (int port, GSPROTOCOL pro, T* pItem, onGsReceiveFunc ponGsReceive) {
-        void *_object;
-        char _member[16];
-        onGsReceiveFunc *_membercaller;
-    
-        _object = static_cast<void*(int, int)>(object);
-        memcpy(_member, (char*)&ponGsReceive, sizeof(ponGsReceive));
-        _membercaller = &FunctionPointer::membercaller<T>;
+    int listen (int port, GSPROTOCOL pro, T *object, void (T::*member)(int, int)) {
+        int cid = listen(port, pro);
+        if (cid >= 0) _gs_sock[cid].onGsReceive.attach(object, member);
+        return cid;
     }
-*/
-/*
-    template<typename T>
-    int listen2 (T* tptr, int port, GSPROTOCOL pro, void (T::*mptr)(int,int)) {
-        if((mptr != NULL) && (tptr != NULL)) {
-            return listen(port, pro, reinterpret_cast<onGsReceiveFunc>(mptr));
-        }
-    }
-*/
     /**
      * close client/server
      */
@@ -506,12 +509,12 @@
     void newSock (int cid, GSTYPE type, GSPROTOCOL pro);
 
     void newSock (int cid, GSTYPE type, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
-        newSock (cid, type, pro);
+        newSock(cid, type, pro);
         _gs_sock[cid].onGsReceive.attach(ponGsReceive);
     }
     template<typename T>
     void newSock (int cid, GSTYPE type, GSPROTOCOL pro, T *object, void (T::*member)(int, int)) {
-        newSock (cid, type, pro);
+        newSock(cid, type, pro);
         _gs_sock[cid].onGsReceive.attach(object, member);
     }
 
@@ -545,6 +548,7 @@
     CircBuffer<char> _buf_cmd;
     struct GS_Socket _gs_sock[16];
     time_t _time;
+    GSSECURITY _sec;
     char *_ssid, *_pass;
     int _reconnect, _reconnect_count;
     
--- a/GSwifi_sock.cpp	Fri Feb 22 01:10:17 2013 +0000
+++ b/GSwifi_sock.cpp	Fri Feb 22 03:07:43 2013 +0000
@@ -25,7 +25,6 @@
 #include "GSwifi.h"
 
 
-//void GSwifi::newSock (int cid, GSTYPE type, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
 void GSwifi::newSock (int cid, GSTYPE type, GSPROTOCOL pro) {
     _gs_sock[cid].type = type;
     _gs_sock[cid].protocol = pro;
@@ -39,7 +38,7 @@
     _gs_sock[cid].received = false;
 }
 
-int GSwifi::open (Host &host, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
+int GSwifi::open (Host &host, GSPROTOCOL pro) {
     char cmd[GS_CMD_SIZE];
 
     if (! _connect || _status != GSSTAT_READY) return -1;
@@ -54,11 +53,11 @@
     }
     if (command(cmd, GSRES_CONNECT)) return -1;
 
-    newSock(_cid, GSTYPE_CLIENT, pro, ponGsReceive);
+    newSock(_cid, GSTYPE_CLIENT, pro);
     return _cid;
 }
 
-int GSwifi::listen (int port, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
+int GSwifi::listen (int port, GSPROTOCOL pro) {
     char cmd[GS_CMD_SIZE];
 
     if (! _connect || _status != GSSTAT_READY) return -1;
@@ -73,7 +72,7 @@
     }
     if (command(cmd, GSRES_CONNECT)) return -1;
 
-    newSock(_cid, GSTYPE_SERVER, pro, ponGsReceive);
+    newSock(_cid, GSTYPE_SERVER, pro);
     return _cid;
 }
 
--- a/dbg.h	Fri Feb 22 01:10:17 2013 +0000
+++ b/dbg.h	Fri Feb 22 03:07:43 2013 +0000
@@ -1,4 +1,4 @@
-#define DEBUG
+//#define DEBUG
 //#define DEBUG_VIEW
 
 #ifdef DEBUG