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
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/
ゲインスパン Wi-Fi モジュール ライブラリ
ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。
解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
Diff: GSwifi.cpp
- Revision:
- 35:515ec79792d3
- Parent:
- 33:b5a5a1e6325f
- Child:
- 36:a70b11e1560f
--- a/GSwifi.cpp Fri Mar 29 14:58:07 2013 +0000 +++ b/GSwifi.cpp Fri Jun 21 06:08:37 2013 +0000 @@ -36,11 +36,12 @@ _reset.output(); // low _reset = 0; - _gs.baud(baud); + _baud = baud; + if (_baud) _gs.baud(_baud); _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq); _rts = false; - wait_ms(500); + wait_ms(100); reset(); } @@ -56,7 +57,8 @@ _reset.output(); // low _reset = 0; - _gs.baud(baud); + _baud = baud; + if (_baud) _gs.baud(_baud); _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq); _rts = false; #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) @@ -85,7 +87,7 @@ } #endif - wait_ms(500); + wait_ms(100); reset(); } @@ -102,6 +104,8 @@ _reset.output(); // low _reset = 0; + memset(&_gs_sock, 0, sizeof(_gs_sock)); + memset(&_mac, 0, sizeof(_mac)); _connect = false; _status = GSSTAT_READY; _escape = 0; @@ -110,15 +114,49 @@ _ssid = NULL; _pass = NULL; _reconnect = 0; - _reconnect_count = 0; _buf_cmd.flush(); wait_ms(100); + if (! _baud) autobaud(0); _reset.input(); // high _reset.mode(PullUp); + if (! _baud) autobaud(1); wait_ms(500); } +int GSwifi::autobaud (int flg) { + int i; + +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + if (flg == 0) { + LPC_UART1->ACR = (1<<2)|(1<<0); // auto-baud mode 0 + return 0; + } else { + for (i = 0; i < 50; i ++) { + if (! (LPC_UART1->ACR & (1<<0))) { + return 0; + } + wait_ms(10); + } + LPC_UART1->ACR = 0; + } +#elif defined(TARGET_LPC11U24) + if (flg == 0) { + LPC_USART->ACR = (1<<2)|(1<<0); // auto-baud mode 0 + return 0; + } else { + for (i = 0; i < 50; i ++) { + if (! (LPC_USART->ACR & (1<<0))) { + return 0; + } + wait_ms(10); + } + LPC_USART->ACR = 0; + } +#endif + return -1; +} + // uart interrupt void GSwifi::isr_recv () { static int len, mode; @@ -394,7 +432,7 @@ return -1; } -int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect) { +int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect, char *name) { int r; char cmd[GS_CMD_SIZE]; @@ -405,7 +443,7 @@ if (_rts) { command("AT&R1", GSRES_NORMAL); } - command("AT+NMAC=?", GSRES_MACADDRESS); + if (getMacAddress(_mac)) return -1; #ifdef GS_BULK command("AT+BDATA=1", GSRES_NORMAL); #endif @@ -414,7 +452,12 @@ command("AT+WM=0", GSRES_NORMAL); // infrastructure wait_ms(100); if (dhcp && sec != GSSEC_WPS_BUTTON) { - command("AT+NDHCP=1", GSRES_NORMAL); + if (name) { + sprintf(cmd, "AT+NDHCP=1,%s", name); + } else { + strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME); + } + command(cmd, GSRES_NORMAL); } else { command("AT+NDHCP=0", GSRES_NORMAL); } @@ -460,7 +503,7 @@ r = command("AT+WWPS=1", GSRES_WPS, GS_TIMEOUT2); if (r) break; if (dhcp) { - r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2); + r = setAddress(name); } break; case GSSEC_WPS_PIN: @@ -469,7 +512,7 @@ r = command(cmd, GSRES_WPS, GS_TIMEOUT2); if (r) break; if (dhcp) { - r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2); + r = setAddress(name); } break; default: @@ -489,12 +532,12 @@ _reconnect = reconnect; _reconnect_count = 0; _sec = sec; - if (ssid) { - if (!_ssid) _ssid = new char[strlen(ssid) + 1]; + if (_reconnect && ssid) { + if (!_ssid) _ssid = (char*)malloc(strlen(ssid) + 1); strcpy(_ssid, ssid); } - if (pass) { - if (!_pass) _pass = new char[strlen(pass) + 1]; + if (_reconnect && pass) { + if (!_pass) _pass = (char*)malloc(strlen(pass) + 1); strcpy(_pass, pass); } } @@ -512,12 +555,12 @@ if (_rts) { command("AT&R1", GSRES_NORMAL); } - disconnect(); - command("AT+NMAC=?", GSRES_MACADDRESS); + if (getMacAddress(_mac)) return -1; #ifdef GS_BULK command("AT+BDATA=1", GSRES_NORMAL); #endif + disconnect(); command("AT+WM=1", GSRES_NORMAL); // adhock wait_ms(100); command("AT+NDHCP=0", GSRES_NORMAL); @@ -558,12 +601,12 @@ if (_rts) { command("AT&R1", GSRES_NORMAL); } - disconnect(); - command("AT+NMAC=?", GSRES_MACADDRESS); + if (getMacAddress(_mac)) return -1; #ifdef GS_BULK command("AT+BDATA=1", GSRES_NORMAL); #endif + disconnect(); command("AT+WM=2", GSRES_NORMAL); // limited ap wait_ms(100); command("AT+NDHCP=0", GSRES_NORMAL); @@ -642,12 +685,20 @@ r = -1; break; } + + if (r == 0) _connect = true; return r; } -int GSwifi::setAddress () { +int GSwifi::setAddress (char *name) { + char cmd[GS_CMD_SIZE]; - if (command("AT+NDHCP=1", GSRES_DHCP), GS_TIMEOUT2) return -1; + if (name) { + sprintf(cmd, "AT+NDHCP=1,%s", name); + } else { + strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME); + } + if (command(cmd, GSRES_DHCP), GS_TIMEOUT2) return -1; if (_ipaddr.isNull()) return -1; return 0; } @@ -686,8 +737,13 @@ } int GSwifi::getMacAddress (char *mac) { - memcpy(mac, _mac, 6); - return 0; + + command("AT+NMAC=?", GSRES_MACADDRESS); + if (_mac[0] || _mac[1] || _mac[2] || _mac[3] || _mac[4] || _mac[5]) { + memcpy(mac, _mac, 6); + return 0; + } + return -1; } int GSwifi::getHostByName (const char* name, IpAddr &addr) { @@ -915,6 +971,7 @@ strncmp(buf, "UnExpected Warm Boot", 20) == 0 || strncmp(buf, "APP Reset-APP SW Reset", 22) == 0 || strncmp(buf, "APP Reset-Wlan Except", 21) == 0 ) { + DBG("disassociate\r\n"); _connect = false; for (i = 0; i < 16; i ++) { _gs_sock[i].connect = false; @@ -937,7 +994,6 @@ void GSwifi::parseCmdResponse (char *buf) { if (_gs_res == GSRES_NONE) return; - DBG("cmd\r\n"); if (strcmp(buf, "OK") == 0) { _gs_ok = true; @@ -952,7 +1008,7 @@ break; case GSRES_WPS: if (_gs_flg == 0 && strncmp(buf, "SSID=", 5) == 0) { - if (!_ssid) _ssid = new char[strlen(&buf[5]) + 1]; + if (!_ssid) _ssid = (char*)malloc(strlen(&buf[5]) + 1); strcpy(_ssid, &buf[5]); _gs_flg ++; } else @@ -960,7 +1016,7 @@ _gs_flg ++; } else if (_gs_flg == 2 && strncmp(buf, "PASSPHRASE=", 11) == 0) { - if (!_pass) _pass = new char[strlen(&buf[11]) + 1]; + if (!_pass) _pass = (char*)malloc(strlen(&buf[11]) + 1); strcpy(_pass, &buf[11]); _gs_flg = -1; } @@ -1046,23 +1102,26 @@ int i, j; for (i = 0; i < 16; i ++) { - if (_gs_sock[i].received && (! _gs_sock[i].data->isEmpty())) { + if (_gs_sock[i].connect && _gs_sock[i].received) { + if (_gs_sock[i].data && ! _gs_sock[i].data->isEmpty()) { // recv interrupt _gs_sock[i].received = false; for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) { if (! _gs_sock[i].connect || _gs_sock[i].data->isEmpty()) break; _gs_sock[i].onGsReceive.call(i, _gs_sock[i].data->available()); } + } } } - - if ((!_connect) && _reconnect_count < _reconnect && _ssid) { - // re-connrct - _reconnect_count ++; - DBG("re-connect %d\r\n", _reconnect_count); - if (reconnect() == 0) { - _connect = true; - _reconnect_count = 0; + + if (_reconnect && ! _connect) { + if (_reconnect_count == 0 || (_reconnect_count < _reconnect && _reconnect_time < time(NULL))) { + _reconnect_count ++; + DBG("reconnect %d/%d\r\n", _reconnect_count, _reconnect); + if (reconnect() == 0) { + _reconnect_count = 0; + } + _reconnect_time = time(NULL) + GS_RECONTIME; } } } @@ -1155,10 +1214,15 @@ DBG("GS mode=%d, escape=%d, cid=%d\r\n", _gs_mode, _escape, _cid); for (i = 0; i < 16; i ++) { - DBG("%d: connect=%d, type=%d, protocol=%d, len=%d\r\n", i, _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->available()); + DBG("[%d] ", i); + DBG("connect=%d, type=%d, protocol=%d, len=%d\r\n", _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->available()); + DBG(" %x, %x\r\n", &_gs_sock[i], _gs_sock[i].data); +#ifdef GS_ENABLE_HTTPD if (_gs_sock[i].protocol == GSPROT_HTTPD) { DBG(" mode=%d, type=%d, len=%d\r\n", i, _httpd[i].mode, _httpd[i].type, _httpd[i].len); + DBG(" %x, %x\r\n", &_httpd[i], _httpd[i].buf); } +#endif } }