Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: GSwifiInterface_HelloWorld GSwifiInterface_HelloServo GSwifiInterface_UDPEchoServer GSwifiInterface_UDPEchoClient ... more
Fork of WiflyInterface by
Revision 22:d25a5a0d2497, committed 2019-09-24
- Comitter:
- gsfan
- Date:
- Tue Sep 24 06:24:37 2019 +0000
- Parent:
- 21:6431364fc667
- Commit message:
- UART Command and SPI Data supported.; bug fix.;
Changed in this revision
--- a/GSwifi/GSwifi.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifi/GSwifi.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013 gsfan, MIT License
+/* Copyright (C) 2019 gsfan, MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -23,13 +23,21 @@
GSwifi * GSwifi::_inst;
+#ifdef CFG_SPI_DATAINTERFACE
+GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset,
+ PinName mosi, PinName miso, PinName sclk, PinName cs, PinName wake,
+ PinName alarm, int baud, int freq):
+ _gs(tx, rx), _spi(mosi, miso, sclk), _wake(wake), _reset(reset)
+#else
GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
_gs(tx, rx), _reset(reset)
+#endif
{
_inst = this;
memset(&_state, 0, sizeof(_state));
memset(&_con, 0, sizeof(_con));
_state.initialized = false;
+ _state.datainterface = false;
_state.status = STAT_READY;
_state.cid = -1;
#ifdef CFG_EXTENDED_MEMORY1
@@ -57,6 +65,9 @@
setReset(true);
initUart(cts, rts, alarm, baud);
+#ifdef CFG_SPI_DATAINTERFACE
+ initSpi (cs, freq);
+#endif
setAlarm(true);
wait_ms(10);
setAlarm(false);
@@ -75,7 +86,11 @@
if (!strlen(_state.name)) {
strncpy(_state.name, CFG_DHCPNAME, sizeof(_state.name));
}
+#ifdef CFG_SPI_DATAINTERFACE
+// if (strstr(
+#endif
clearFlags();
+ _state.buf->flush();
_state.mode = MODE_COMMAND;
sendCommand(NULL, RES_NULL, 0);
if (cmdE(false)) return -1;
@@ -193,6 +208,7 @@
_state.wm = WM_ADHOCK;
_state.initialized = true;
clearFlags();
+ _state.buf->flush();
_state.mode = MODE_COMMAND;
sendCommand(NULL, RES_NULL, 0);
if (cmdE(false)) return -1;
@@ -243,6 +259,7 @@
strncpy(_state.name, CFG_DNSNAME, sizeof(_state.name));
}
clearFlags();
+ _state.buf->flush();
_state.mode = MODE_COMMAND;
sendCommand(NULL, RES_NULL, 0);
if (cmdE(false)) return -1;
--- a/GSwifi/GSwifi.h Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifi/GSwifi.h Tue Sep 24 06:24:37 2019 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013 gsfan, MIT License
+/* Copyright (C) 2019 gsfan, MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -17,13 +17,14 @@
*
* @section DESCRIPTION
*
- * GainSpan GS1011, Wi-Fi module
+ * GainSpan (Telit) GS1011, GS2000, GS2100 Wi-Fi module
*
+ * https://www.telit.com/m2m-iot-products/wifi-bluetooth-modules/
* http://www.gainspan.com/modules
*/
/** @file
- * @brief Gainspan wi-fi module library for mbed
- * GS1011MIC, GS1011MIP, GainSpan WiFi Breakout, etc.
+ * @brief GainSpan (Telit) wi-fi module library for mbed
+ * GS1011MIC, GS1011MIP, GS2100MIP, GainSpan WiFi Breakout, etc.
*/
#ifndef GSwifi_H
@@ -147,7 +148,13 @@
* \param alarm alarm pin of the wifi module (default NULL)
* \param baud baud rate of Serial interface (default 9600)
*/
+#ifdef CFG_SPI_DATAINTERFACE
+ GSwifi (PinName tx, PinName rx, PinName cts, PinName rts, PinName reset,
+ PinName mosi, PinName miso, PinName sclk, PinName cs, PinName wake,
+ PinName alarm = NC, int baud = 9600, int freq = 2000000);
+#else
GSwifi (PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm = NC, int baud = 9600);
+#endif
/** Connect the wifi module to the ssid contained in the constructor.
* @param sec Security type (NONE, WEP_128 or WPA)
@@ -437,6 +444,11 @@
// Serial _gs;
RawSerial _gs;
+#ifdef CFG_SPI_DATAINTERFACE
+ SPI _spi;
+ InterruptIn _wake;
+ Mutex _mutexSpi;
+#endif
int _baud;
DigitalIn *_cts;
DigitalOut *_rts;
@@ -469,7 +481,7 @@
bool dhcp;
time_t time;
- bool initialized;
+ bool initialized, datainterface;
bool associated;
volatile Mode mode;
volatile Status status;
@@ -608,6 +620,7 @@
void msgReset (const char*);
void msgOutofStandby (const char*);
void msgOutofDeepsleep (const char*);
+ void msgDataInterfaceReady (const char*);
void resNormal (const char*);
void resConnect (const char*);
void resWpapsk (const char *buf);
@@ -680,6 +693,13 @@
int lockUart (int ms);
void unlockUart ();
void initUart (PinName cts, PinName rts, PinName alarm, int baud);
+#ifdef CFG_SPI_DATAINTERFACE
+ void isrSpi ();
+ void putSpi (char c);
+ int lockSpi (int ms);
+ void unlockSpi ();
+ void initSpi (PinName cs, int freq);
+#endif
};
--- a/GSwifi/GSwifi_at.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifi/GSwifi_at.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -45,8 +45,13 @@
t.start();
for (;;) {
if (_state.ok && _state.res == RES_NULL) break;
- if (_state.failure || t.read_ms() > timeout) {
- WARN("failure or timeout\r\n");
+ if (_state.failure) {
+ WARN("failure\r\n");
+ _state.res = RES_NULL;
+ return -1;
+ }
+ if (t.read_ms() > timeout) {
+ WARN("timeout\r\n");
_state.res = RES_NULL;
return -1;
}
@@ -63,6 +68,34 @@
int i;
Timer t;
+#ifdef CFG_SPI_DATAINTERFACE
+ if (_state.datainterface) {
+ if (lockSpi(timeout)) return -1;
+
+ clearFlags();
+ for (i = 0; i < strlen(cmd); i ++) {
+ putSpi(cmd[i]);
+ }
+ for (i = 0; i < len; i ++) {
+ switch (data[i]) {
+ case 0: // encode
+ case 0xf3:
+ case 0xf5:
+ case 0xfa:
+ case 0xfb:
+ case 0xfd:
+ case 0xff:
+ putSpi(0xfb);
+ putSpi(data[i] ^ 0x20); // xor
+ break;
+ default:
+ putSpi(data[i]);
+ break;
+ }
+ }
+ unlockSpi();
+ } else {
+#endif
if (lockUart(timeout)) return -1;
clearFlags();
@@ -73,14 +106,21 @@
putUart(data[i]);
}
unlockUart();
- INFO("data: '%s' %d\r\n", cmd, len);
+#ifdef CFG_SPI_DATAINTERFACE
+ } // _state.datainterface
+#endif
+ INFO("data: '%s' %d %d\r\n", cmd, len, _state.datainterface);
if (timeout) {
t.start();
for (;;) {
if (_state.ok) break;
- if (_state.failure || t.read_ms() > timeout) {
- WARN("failure or timeout\r\n");
+ if (_state.failure) {
+ WARN("failure\r\n");
+ return -1;
+ }
+ if (t.read_ms() > timeout) {
+ WARN("timeout\r\n");
return -1;
}
}
--- a/GSwifi/GSwifi_conf.h Thu Jun 05 06:12:59 2014 +0000 +++ b/GSwifi/GSwifi_conf.h Tue Sep 24 06:24:37 2019 +0000 @@ -7,6 +7,7 @@ //#define CFG_ENABLE_WEBSOCKET //#define CFG_ENABLE_SMTP //#define CFG_UART_DIRECT +//#define CFG_SPI_DATAINTERFACE // GS2100 s2w (Serial to Wi-Fi, UART Command and SPI Data) #define CFG_UART_BAUD 9600 #define CFG_WREGDOMAIN 2 // 0:FCC, 1:ETSI, 2:TELEC @@ -14,7 +15,7 @@ #define CFG_DNSNAME "setup.local" #define CFG_TRYJOIN 3 #define CFG_RECONNECT 30 // sec -#define CFG_MAX_SOCKETS 16 +#define CFG_MAX_SOCKETS 8 // max 16 #define DEFAULT_WAIT_RESP_TIMEOUT 500 #define CFG_TIMEOUT 30000 // ms @@ -22,13 +23,13 @@ #define CFG_CMD_SIZE 128 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC176X) -#define CFG_DATA_SIZE 1024 +#define CFG_DATA_SIZE 1500 #elif defined(TARGET_LPC11U24) || defined(TARGET_LPC1114) || defined(TARGET_LPC11UXX) || defined(TARGET_LPC11XX) #define CFG_DATA_SIZE 256 #elif defined(TARGET_LPC812) || defined(TARGET_LPC81X) #define CFG_DATA_SIZE 128 #elif defined(TARGET_LPC4088) || defined(TARGET_LPC408X) -#define CFG_DATA_SIZE 4096 +#define CFG_DATA_SIZE 1500 #elif defined(TARGET_KL25Z) #define CFG_DATA_SIZE 512 #endif
--- a/GSwifi/GSwifi_hal.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifi/GSwifi_hal.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -223,3 +223,75 @@
_alarm = NULL;
}
}
+
+#ifdef CFG_SPI_DATAINTERFACE
+void GSwifi::putSpi (char c) {
+ _spi.write(c);
+}
+
+void GSwifi::isrSpi () {
+ char c;
+
+ while (_wake == 1) {
+ c = _spi.write(0xf5);
+ recvData(c);
+ }
+}
+
+int GSwifi::lockSpi (int ms) {
+ Timer t;
+
+ if (_state.mode != MODE_COMMAND) {
+ t.start();
+ while (_state.mode != MODE_COMMAND) {
+ if (t.read_ms() >= ms) {
+ WARN("lock timeout (%d)\r\n", _state.mode);
+ return -1;
+ }
+ }
+ }
+
+#ifdef CFG_ENABLE_RTOS
+ if (_mutexSpi.lock(ms) != osOK) return -1;
+#endif
+
+ if (_wake.read()) {
+ t.start();
+ while (_wake.read()) {
+ if (t.read_ms() >= ms) {
+ DBG("hostwake timeout\r\n");
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
+void GSwifi::unlockSpi () {
+#ifdef CFG_ENABLE_RTOS
+ _mutexSpi.unlock();
+#endif
+}
+
+void GSwifi::initSpi (PinName cs, int freq) {
+ _spi.format(8, 0);
+ _spi.frequency(freq);
+ _wake.mode(PullDown);
+ _wake.rise(this, &GSwifi::isrSpi);
+
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC176X)
+ if (cs == p8) { // SPI_1 (P0_6)
+ LPC_PINCON->PINSEL0 &= ~(3 << 12);
+ LPC_PINCON->PINSEL0 |= (2 << 12); // SSEL1
+ } else
+ if (cs == p14) { // (SPI_0) P0_16
+ LPC_PINCON->PINSEL1 &= ~(3 << 0);
+ LPC_PINCON->PINSEL1 |= (2 << 0); // SSEL0
+ } else
+ if (cs == P1_21) { // (SPI_0) P1_21
+ LPC_PINCON->PINSEL3 &= ~(3 << 10);
+ LPC_PINCON->PINSEL3 |= (3 << 10); // SSEL0
+ }
+#endif
+}
+#endif
--- a/GSwifi/GSwifi_msg.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifi/GSwifi_msg.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -43,11 +43,16 @@
case 0x1b: // ESC
_state.buf->flush();
_state.mode = MODE_ESCAPE;
+ _state.escape = false;
+ break;
+ case 0xf3: // SPI link ready indication
+ case 0xf5: // IDLE
break;
default:
_state.buf->flush();
_state.buf->queue(c);
_state.mode = MODE_CMDRESP;
+ _state.escape = false;
break;
}
break;
@@ -224,14 +229,30 @@
} else
#endif
if (_con[cid].buf != NULL) {
+#ifdef CFG_SPI_DATAINTERFACE
+ if (_state.datainterface) {
+ if (_state.escape) { // dencode
+ _con[cid].buf->queue(c ^ 0x20); // xor
+ _state.escape = false;
+ } else
+ if (c == 0xfb) {
+ _state.escape = true;
+ } else {
+ _con[cid].buf->queue(c);
+ }
+ } else {
+ _con[cid].buf->queue(c);
+ }
+#else
_con[cid].buf->queue(c);
+#endif
if (_con[cid].func != NULL && _con[cid].buf->available() > CFG_DATA_SIZE - 16) {
setRts(false);
_con[cid].received = true;
WARN("buf full");
}
}
- count ++;
+ if (!_state.escape) count ++;
if (count >= len) {
DBG("recv bulk %d %d/%d\r\n", cid, count, len);
_con[cid].received = true;
@@ -243,7 +264,7 @@
}
}
-#define MSG_TABLE_NUM 15
+#define MSG_TABLE_NUM 16
#define RES_TABLE_NUM 11
int GSwifi::parseMessage () {
int i;
@@ -267,6 +288,7 @@
{"Out of StandBy-Timer", &GSwifi::msgOutofStandby},
{"Out of StandBy-Alarm", &GSwifi::msgOutofStandby},
{"Out of Deep Sleep", &GSwifi::msgOutofDeepsleep},
+ {"DataInterfaceReady", &GSwifi::msgDataInterfaceReady},
};
static const struct RES_TABLE {
const Response res;
@@ -422,6 +444,12 @@
_state.status = STAT_READY;
}
+void GSwifi::msgDataInterfaceReady (const char *buf) {
+ DBG("DataInterfaceReady\r\n");
+ _state.datainterface = true;
+ _state.status = STAT_READY;
+}
+
void GSwifi::resConnect (const char *buf) {
int cid;
@@ -474,14 +502,14 @@
if (_state.n == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) {
_state.n ++;
} else
- if (_state.n == 1) {
+ if (_state.n == 1 && buf[0] == ' ') {
tmp = buf + 1;
tmp2 = strstr(tmp, ":");
strncpy(_state.ip, tmp, tmp2 - tmp);
- tmp = tmp2 + 2;
+ tmp = tmp2 + 1;
tmp2 = strstr(tmp, ":");
strncpy(_state.netmask, tmp, tmp2 - tmp);
- tmp = tmp2 + 2;
+ tmp = tmp2 + 1;
strncpy(_state.gateway, tmp, sizeof(_state.gateway));
_state.n ++;
_state.res = RES_NULL;
--- a/GSwifiInterface.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifiInterface.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -1,11 +1,18 @@
-/* Copyright (C) 2013 gsfan, MIT License
- * port to the GainSpan Wi-FI module GS1011
+/* Copyright (C) 2019 gsfan, MIT License
+ * port to the GainSpan (Telit) Wi-FI module GS1011/GS2000/GS2100
*/
#include "GSwifiInterface.h"
+#ifdef CFG_SPI_DATAINTERFACE
+GSwifiInterface::GSwifiInterface( PinName tx, PinName rx, PinName cts, PinName rts, PinName reset,
+ PinName mosi, PinName miso, PinName sclk, PinName cs, PinName wake,
+ PinName alarm, int baud, int freq) :
+ GSwifi(tx, rx, cts, rts, reset, mosi, miso, sclk, cs, wake, alarm, baud, freq)
+#else
GSwifiInterface::GSwifiInterface( PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud) :
GSwifi(tx, rx, cts, rts, reset, alarm, baud)
+#endif
{
}
--- a/GSwifiInterface.h Thu Jun 05 06:12:59 2014 +0000
+++ b/GSwifiInterface.h Tue Sep 24 06:24:37 2019 +0000
@@ -17,8 +17,8 @@
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-/* Copyright (C) 2013 gsfan, MIT License
- * port to the GainSpan Wi-FI module GS1011
+/* Copyright (C) 2019 gsfan, MIT License
+ * port to the GainSpan (Telit) Wi-FI module GS1011/GS2000/GS2100
*/
#ifndef GSWIFIINTERFACE_H_
@@ -43,7 +43,13 @@
* \param alarm alarm pin of the wifi module (default: NC)
* \param baud baud rate of Serial interface (default: 9600)
*/
+#ifdef CFG_SPI_DATAINTERFACE
+ GSwifiInterface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset,
+ PinName mosi, PinName miso, PinName sclk, PinName cs, PinName wake,
+ PinName alarm = NC, int baud = 9600, int freq = 2000000);
+#else
GSwifiInterface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm = NC, int baud = 9600);
+#endif
/** Initialize the interface with DHCP.
* Initialize the interface and configure it to use DHCP (no connection at this point).
--- a/Socket/TCPSocketConnection.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/Socket/TCPSocketConnection.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -86,6 +86,7 @@
DBG("receive readable");
break;
}
+ Thread::wait(1);
time = tmr.read_ms();
}
if (time >= _timeout + 20) {
@@ -119,6 +120,7 @@
if (idx == length)
break;
+ Thread::wait(1);
time = tmr.read_ms();
}
--- a/Socket/UDPSocket.cpp Thu Jun 05 06:12:59 2014 +0000
+++ b/Socket/UDPSocket.cpp Tue Sep 24 06:24:37 2019 +0000
@@ -40,6 +40,13 @@
{
_port = port;
_server = true;
+
+ if (_cid < 0 && _wifi->isAssociated()) {
+ // Socket open
+ _cid = _wifi->listen(GSwifi::PROTO_UDP, _port);
+ if (_cid < 0) return -1;
+ }
+
return 0;
}
@@ -103,10 +110,11 @@
if (_wifi->readable(_cid)) {
break;
}
+ Thread::wait(1);
time = tmr.read_ms();
}
if (time >= _timeout + 20) {
- return -1;
+ return 0;
}
}
@@ -126,7 +134,7 @@
return -1;
}
- if (idx == length) {
+ if (idx == length || idx > 0) {
break;
}
@@ -136,5 +144,6 @@
if (_server) {
remote.set_address(ip, port);
}
- return (idx == 0) ? -1 : idx;
+// return (idx == 0) ? -1 : idx;
+ return idx;
}

GainSpan Wi-Fi GS1011