for TwitterMbed
Fork of GSwifi_old by
Diff: GSwifi.cpp
- Revision:
- 1:b127c6c5241d
- Parent:
- 0:2f6062c6d018
- Child:
- 2:c6e0e97901b3
diff -r 2f6062c6d018 -r b127c6c5241d GSwifi.cpp --- 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() {