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:
1:b127c6c5241d
Parent:
0:2f6062c6d018
Child:
2:c6e0e97901b3
--- a/GSwifi.cpp	Mon Jul 09 14:36:06 2012 +0000
+++ b/GSwifi.cpp	Thu Jul 12 08:19:50 2012 +0000
@@ -14,6 +14,18 @@
 #include "mbed.h"
 #include "GSwifi.h"
 
+#ifdef GS_UART_DIRECT
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+#define _gs_getc() LPC_UART1->RBR
+#define _gs_putc(c) while(!(LPC_UART1->LSR & (1<<5))); LPC_UART1->THR = c
+#elif defined(TARGET_LPC11U24)
+#define _gs_getc() LPC_UART->RBR
+#define _gs_putc(c) while(!(LPC_UART->LSR & (1<<5))); LPC_UART->THR = c
+#endif
+#else
+#define _gs_getc() _gs.getc()
+#define _gs_putc(c) _gs.putc(c)
+#endif
 
 GSwifi::GSwifi (PinName p_tx, PinName p_rx) : _gs(p_tx, p_rx), _buf_cmd(GS_CMD_SIZE) {
     _connect = false;
@@ -77,7 +89,7 @@
 #elif defined(TARGET_LPC11U24)
     flg = LPC_USART->LSR;
 #endif
-    dat = _gs.getc();
+    dat = _gs_getc();
     
     if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) return;
 //    DBG("%02x ", dat);
@@ -180,7 +192,7 @@
                 _gs_mode = GSMODE_COMMAND;
                 // recv interrupt
                 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) {
-                    _gs_sock[_cid].onGsReceive(_cid, 0, _gs_sock[_cid].data->use());
+                    _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
                     _gs_sock[_cid].received = 0;
                 }
                 break;
@@ -260,7 +272,7 @@
                 _gs_mode = GSMODE_COMMAND;
                 // recv interrupt
                 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) {
-                    _gs_sock[_cid].onGsReceive(_cid, 0, _gs_sock[_cid].data->use());
+                    _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
                     _gs_sock[_cid].received = 0;
                 }
             }
@@ -277,7 +289,7 @@
         // dummy CR+LF
         _gs.printf("\r\n");
         wait_ms(100);
-        while (_gs.readable()) _gs.getc(); // dummy read
+        while (_gs.readable()) _gs_getc(); // dummy read
         return 0;
     }
 
@@ -286,10 +298,10 @@
     _gs_failure = 0;
     _gs_enter = 0;
     for (i = 0; i < strlen(cmd); i ++) {
-        _gs.putc(cmd[i]);
+        _gs_putc(cmd[i]);
     }
-    _gs.putc('\r');
-    _gs.putc('\n');
+    _gs_putc('\r');
+    _gs_putc('\n');
     DBG("command: %s\r\n", cmd);
     if (strlen(cmd) == 0) return 0;
     wait_ms(50);
@@ -404,6 +416,12 @@
                 flg = 1;
             }
             break;
+        case GSRES_RSSI:
+            if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) {
+                _rssi = atoi(buf);
+                flg = 1;
+            }
+            break;
         }
         
         if ((flg && _gs_ok) || _gs_failure) break;
@@ -458,7 +476,7 @@
         command(cmd, GSRES_NORMAL);
         wait_ms(100);
         sprintf(cmd, "AT+WA=%s", ssid);
-        r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
+        r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
         break;
     case GSSEC_WPA_PSK:
     case GSSEC_WPA2_PSK:
@@ -469,7 +487,7 @@
         command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
         wait_ms(100);
         sprintf(cmd, "AT+WA=%s", ssid);
-        r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
+        r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
         break;
     case GSSEC_WPS_BUTTON:
         command("AT+WAUTH=0", GSRES_NORMAL);
@@ -631,6 +649,13 @@
     return r;
 }
 
+int GSwifi::getAddress (IpAddr &ipaddr, IpAddr &netmask, IpAddr &gateway, IpAddr &nameserver) {
+    ipaddr = _ipaddr;
+    netmask = _netmask;
+    gateway = _gateway;
+    nameserver = _nameserver;
+}
+
 int GSwifi::getHostByName (const char* name, IpAddr &addr) {
     char cmd[GS_CMD_SIZE];
 
@@ -738,6 +763,13 @@
     return _status;
 }
 
+int GSwifi::getRssi () {
+    if (command("AT+WRSSI=?", GSRES_RSSI)) {
+        return 0;
+    }
+    return _rssi;
+}
+
 void GSwifi::poll() {
     int i;
 
@@ -760,11 +792,20 @@
         buf[i] = 0;
         DBG("poll: %s\r\n", buf);
 
-        if (strncmp(buf, "CONNECT", 7) == 0 && buf[9] >= '0' && buf[9] <= 'F' &&
-          _gs_sock[x2i(buf[8])].type == GSTYPE_SERVER) {
+        if (strncmp(buf, "CONNECT", 7) == 0 && buf[8] >= '0' && buf[8] <= 'F') {
             i = x2i(buf[8]);
-            _gs_sock[i].acid = x2i(buf[9]);
-            // ip, port
+            if (_gs_sock[i].type == GSTYPE_SERVER) {
+                int acid, ip1, ip2, ip3, ip4;
+                char *tmp = buf + 12;
+
+                acid = x2i(buf[10]);
+                newSock(acid, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].onGsReceive);
+                _gs_sock[acid].lcid = i;
+                sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
+                _gs_sock[acid].host.setIp(IpAddr(ip1, ip2, ip3, ip4));
+                tmp = strstr(tmp, " ") + 1;
+                _gs_sock[acid].host.setPort(atoi(tmp));
+            }
         } else
         if (strncmp(buf, "DISCONNECT", 10) == 0) {
             _gs_sock[x2i(buf[11])].connect = false;
@@ -799,11 +840,25 @@
             // recv interrupt
             _gs_sock[i].received = 0;
             if (_gs_sock[i].onGsReceive != NULL)
-                _gs_sock[i].onGsReceive(i, _gs_sock[i].acid, _gs_sock[i].data->use());
+                _gs_sock[i].onGsReceive(i, _gs_sock[i].data->use());
         }
     }
 }
 
+int GSwifi::newSock (int cid, GSTYPE type, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
+    _gs_sock[cid].type = type;
+    _gs_sock[cid].protocol = pro;
+    _gs_sock[cid].connect = true;
+    if (_gs_sock[cid].data == NULL) {
+        _gs_sock[cid].data = new RingBuffer(GS_DATA_SIZE);
+    } else {
+        _gs_sock[cid].data->clear();
+    }
+    _gs_sock[cid].lcid = 0;
+    _gs_sock[cid].received = 0;
+    _gs_sock[cid].onGsReceive = ponGsReceive;
+}
+
 int GSwifi::open (Host &host, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
     char cmd[GS_CMD_SIZE];
 
@@ -819,17 +874,7 @@
     }
     if (command(cmd, GSRES_CONNECT)) return -1;
 
-    _gs_sock[_cid].type = GSTYPE_CLIENT;
-    _gs_sock[_cid].protocol = pro;
-    _gs_sock[_cid].connect = true;
-    if (_gs_sock[_cid].data == NULL) {
-        _gs_sock[_cid].data = new RingBuffer(GS_DATA_SIZE);
-    } else {
-        _gs_sock[_cid].data->clear();
-    }
-    _gs_sock[_cid].acid = 0;
-    _gs_sock[_cid].received = 0;
-    _gs_sock[_cid].onGsReceive = ponGsReceive;
+    newSock(_cid, GSTYPE_CLIENT, pro, ponGsReceive);
     return _cid;
 }
 
@@ -848,17 +893,7 @@
     }
     if (command(cmd, GSRES_CONNECT)) return -1;
 
-    _gs_sock[_cid].type = GSTYPE_SERVER;
-    _gs_sock[_cid].protocol = pro;
-    _gs_sock[_cid].connect = true;
-    if (_gs_sock[_cid].data == NULL) {
-        _gs_sock[_cid].data = new RingBuffer(GS_DATA_SIZE);
-    } else {
-        _gs_sock[_cid].data->clear();
-    }
-    _gs_sock[_cid].acid = 0;
-    _gs_sock[_cid].received = 0;
-    _gs_sock[_cid].onGsReceive = ponGsReceive;
+    newSock(_cid, GSTYPE_SERVER, pro, ponGsReceive);
     return _cid;
 }
 
@@ -887,19 +922,19 @@
 #ifdef GS_BULK
         _gs.printf("\x1bZ%X%04d", cid, len);
         for (i = 0; i < len; i ++) {
-            _gs.putc(buf[i]);
+            _gs_putc(buf[i]);
             DBG("%c", buf[i]);
         }
 #else
         _gs.printf("\x1bS%X", cid);
         for (i = 0; i < len; i ++) {
             if (buf[i] >= 0x20 && buf[i] < 0x7f) {
-                _gs.putc(buf[i]);
+                _gs_putc(buf[i]);
                 DBG("%c", buf[i]);
             }
         }
-        _gs.putc(0x1b);
-        _gs.putc('E');
+        _gs_putc(0x1b);
+        _gs_putc('E');
 #endif
     } else {
         return -1;
@@ -917,13 +952,13 @@
         // UDP Server
         _gs_ok = 0;
         _gs_failure = 0;
-        _gs.putc(0x1b);
+        _gs_putc(0x1b);
 #ifdef GS_BULK
         _gs.printf("\x1bY%X", cid);
         _gs.printf("%d.%d.%d.%d %d:", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
         _gs.printf("%04d", len);
         for (i = 0; i < len; i ++) {
-            _gs.putc(buf[i]);
+            _gs_putc(buf[i]);
             DBG("%c", buf[i]);
         }
 #else
@@ -931,12 +966,12 @@
         _gs.printf("%d.%d.%d.%d %d:", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
         for (i = 0; i < len; i ++) {
             if (buf[i] >= 0x20 && buf[i] < 0x7f) {
-                _gs.putc(buf[i]);
+                _gs_putc(buf[i]);
                 DBG("%c", buf[i]);
             }
         }
-        _gs.putc(0x1b);
-        _gs.putc('E');
+        _gs_putc(0x1b);
+        _gs_putc('E');
 #endif
     } else {
         return -1;
@@ -1009,17 +1044,7 @@
     }
     if (command(cmd, GSRES_HTTP)) return -1;
 
-    _gs_sock[_cid].type = GSTYPE_CLIENT;
-    _gs_sock[_cid].protocol = GSPROT_HTTPGET;
-    _gs_sock[_cid].connect = true;
-    if (_gs_sock[_cid].data == NULL) {
-        _gs_sock[_cid].data = new RingBuffer(GS_DATA_SIZE);
-    } else {
-        _gs_sock[_cid].data->clear();
-    }
-    _gs_sock[_cid].acid = 0;
-    _gs_sock[_cid].received = 0;
-    _gs_sock[_cid].onGsReceive = ponGsReceive;
+    newSock(_cid, GSTYPE_CLIENT, GSPROT_HTTPGET, ponGsReceive);
 
     sprintf(cmd, "AT+HTTPSEND=%d,1,%d,%s", _cid, GS_TIMEOUT / 1000, uri);  // Get:
     command(cmd, GSRES_NORMAL);
@@ -1036,10 +1061,10 @@
     sprintf(cmd, "AT+TCERTADD=%s,1,%d,1", name, len);  // Hex, ram
     command(cmd, GSRES_NORMAL);
     
-    _gs.putc(0x1b);
-    _gs.putc('W');
+    _gs_putc(0x1b);
+    _gs_putc('W');
     for (i = 0; i < len; i ++) {
-        _gs.putc(cert[i]);
+        _gs_putc(cert[i]);
     }
     return cmdResponse(GSRES_NORMAL, GS_TIMEOUT);
 }
@@ -1092,7 +1117,7 @@
 }
 
 void GSwifi::putc(char c) {
-    _gs.putc(c);
+    _gs_putc(c);
 }
 
 int GSwifi::readable() {