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:
26:b347ee3a1087
Parent:
25:f6e5622d2930
Child:
29:1c4419512941
--- a/GSwifi_httpd.cpp	Mon Feb 11 06:01:46 2013 +0000
+++ b/GSwifi_httpd.cpp	Fri Feb 22 01:05:10 2013 +0000
@@ -59,14 +59,7 @@
     sprintf(cmd, "AT+NSTCP=%d", port);
     if (command(cmd, GSRES_CONNECT)) return -1;
 
-    newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, NULL);
-/*
-//    newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, &GSwifi::poll_httpd);
-//    newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, reinterpret_cast<onGsReceiveFunc>(&GSwifi::poll_httpd));
-    void (GSwifi::*f1)(int,int) = &GSwifi::poll_httpd;
-    onGsReceiveFunc f2 = reinterpret_cast<onGsReceiveFunc>(f1);
-    newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, f2);
-*/
+    newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, this, &GSwifi::poll_httpd);
     return _cid;
 }
 
@@ -92,7 +85,7 @@
     }
 #endif
 
-  while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) {
+  while (_gs_sock[cid].connect && (! _gs_sock[cid].data->isEmpty())) {
     flg = 0;
     if (_httpd[cid].buf == NULL) {
         _httpd[cid].buf = new char[HTTPD_BUF_SIZE];
@@ -425,7 +418,7 @@
     int i, j, flg;
     unsigned char c;
 
-    while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) {
+    while (_gs_sock[cid].connect && (! _gs_sock[cid].data->isEmpty())) {
         flg = 0;
         // get 1 line
         for (j = 0; j < len; j ++) {
@@ -435,11 +428,13 @@
             switch (_httpd[cid].mode) {
             case GSHTTPDMODE_WEBSOCKET:
                 if (_httpd[cid].len == 0) {
+                    // flag
                     _httpd[cid].type = c & 0x0f;
                     _httpd[cid].websocket_flg = c << 8;
                     _httpd[cid].len ++;
                 } else
                 if (_httpd[cid].len == 1) {
+                    // length 7bit
                     _httpd[cid].websocket_flg |= c;
                     _httpd[cid].length = c & 0x7f;
                     _httpd[cid].len ++;
@@ -463,6 +458,7 @@
                         _httpd[cid].length = (_httpd[cid].length << 8) | c;
                         _httpd[cid].len ++;
                     } else {
+                        // end
                         _httpd[cid].length = (_httpd[cid].length << 8) | c;
                         _httpd[cid].len = 0;
                         if (_httpd[cid].websocket_flg & 0x0080) {
@@ -476,6 +472,7 @@
                 break;
 
             case GSHTTPDMODE_WEBSOCKET_MASK:
+                // masking key
                 _httpd[cid].websocket_mask[_httpd[cid].len] = c;
                 _httpd[cid].len ++;
                 if (_httpd[cid].len >= 4) {
@@ -486,8 +483,10 @@
                 break;
 
             case GSHTTPDMODE_WEBSOCKET_BODY:
+                // payload
                 if (_httpd[cid].len < HTTPD_BUF_SIZE - 1) {
                     if (_httpd[cid].websocket_flg & 0x0080) {
+                        // un-mask
                         _httpd[cid].buf[_httpd[cid].len] = c ^ _httpd[cid].websocket_mask[_httpd[cid].len & 0x03]; 
                     } else {
                         _httpd[cid].buf[_httpd[cid].len] = c; 
@@ -508,44 +507,46 @@
             DBG("websocket %d: (%d)\r\n", cid, _httpd[cid].len);
         }
 
-    if (flg) {
-        // websocket request
-      DBG("ws type %d\r\n", _httpd[cid].type);
-      switch (_httpd[cid].type) {
-      case 0x00: // continuation
-      case 0x01: // text
-      case 0x02: // binary
-        i = get_handler(_httpd[cid].uri);
-        if (i >= 0) {
-            if (_handler[i].onHttpCgi) {
-                // cgi
-                _handler[i].onHttpCgi(cid, &_httpd[cid]);
-                LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]);
-                LOG("%s %s %d 200 -\r\n", "WEBSOCKET", _httpd[cid].uri, _httpd[cid].length);
-                flg = 1;
+        if (flg) {
+            // websocket request
+          DBG("ws type %d\r\n", _httpd[cid].type);
+          switch (_httpd[cid].type) {
+          case 0x00: // continuation
+          case 0x01: // text
+          case 0x02: // binary
+            i = get_handler(_httpd[cid].uri);
+            if (i >= 0) {
+                if (_handler[i].onHttpCgi) {
+                    // cgi
+                    _handler[i].onHttpCgi(cid, &_httpd[cid]);
+                    LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]);
+                    LOG("%s %s %d 200 -\r\n", "WEBSOCKET", _httpd[cid].uri, _httpd[cid].length);
+                    flg = 1;
+                }
             }
-        }
-        break;
+            break;
 
-      case 0x08: // close
-        close(cid);
-        break;
+          case 0x08: // close
+            close(cid);
+            break;
 
-      case 0x09: // ping
-        _gs_putc(0x8a); // pong
-        _gs_putc(0x04);
-        for (i = 0; i < _httpd[cid].len; i ++) {
-            _gs_putc(_httpd[cid].buf[i]);
+          case 0x09: // ping
+            {
+            char pong[_httpd[cid].len + 2];
+            pong[0] = 0x8a;
+            pong[1] = 0x04;
+            memcpy(&pong[2], _httpd[cid].buf, _httpd[cid].len);
+            send(cid, pong, _httpd[cid].len + 2);
+            }
+            break;
+
+          case 0x0a: // pong
+            break;
+          }
+          _httpd[cid].mode = GSHTTPDMODE_WEBSOCKET;
+          _httpd[cid].len = 0;
+          _httpd[cid].length = 0;
         }
-        break;
-
-      case 0x0a: // pong
-        break;
-      }
-      _httpd[cid].mode = GSHTTPDMODE_WEBSOCKET;
-      _httpd[cid].len = 0;
-      _httpd[cid].length = 0;
-    }
     } // while
 }