ThingPlug Test
Dependents: WizFi310_ThingPlug_Test WizFi310_ThingPlug_Test_P
Fork of WizFi310Interface by
Revision 5:72212beb817c, committed 2017-06-26
- Comitter:
- jehoon
- Date:
- Mon Jun 26 00:17:10 2017 +0000
- Parent:
- 4:176b6f3addd6
- Child:
- 6:007cec5e96c0
- Commit message:
- modify message parsing in isr
Changed in this revision
--- a/WizFi310/WizFi310.cpp Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310/WizFi310.cpp Mon Jun 26 00:17:10 2017 +0000
@@ -41,6 +41,7 @@
_reset.output();
setRts(true); // release
+
/*
wait_ms(500);
cmdAT();
--- a/WizFi310/WizFi310.h Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310/WizFi310.h Mon Jun 26 00:17:10 2017 +0000
@@ -54,7 +54,7 @@
class WizFi310
{
public:
-
+
enum AntennaMode{
PCB = 0,
UFL = 1,
@@ -172,9 +172,9 @@
protected:
static WizFi310 * _inst;
-
// Serial _wizfi
RawSerial _wizfi;
+
int _baud;
DigitalIn *_cts;
DigitalOut *_rts;
@@ -211,8 +211,6 @@
int cid;
int n;
CircBuffer<char> *buf;
- char dbgRespBuf[BUF_SIZE];
- //char dummyBuf[BUF_SIZE];
} _state;
@@ -293,8 +291,8 @@
// --------- WizFi2550_util.cpp ---------
- int x2i (char c);
- int i2x (int i);
+ int x2i (char c);
+ int i2x (int i);
// --------- WizFi250_ifc.cpp (For NetworkSocketAPI) ---------
/**
--- a/WizFi310/WizFi310_hal.cpp Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310/WizFi310_hal.cpp Mon Jun 26 00:17:10 2017 +0000
@@ -43,9 +43,8 @@
char c;
c = getUart();
-
+
recvData(c);
- //S_UartPutc(c);
}
int WizFi310::getUart()
--- a/WizFi310/WizFi310_msg.cpp Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310/WizFi310_msg.cpp Mon Jun 26 00:17:10 2017 +0000
@@ -27,18 +27,23 @@
#define WIZ_DBG(x, ...)
#endif
-//daniel
-char g_asyncbuf[256];
+#define RESP_MSG_OK "[OK]"
+#define RESP_MSG_ERROR "[ERROR"
+#define RESP_MSG_CONNECT "[CONNECT "
+#define RESP_MSG_DISCONNECT "[DISCONNECT "
+#define RESP_MSG_LISTEN "[LISTEN "
+#define RESP_MSG_MQTTCON "[MQTT CONNECT]"
+#define RESP_MSG_MQTTDISCON "[MQTT DISCONNECT]"
+
// This function is operating in ISR. So you can't use debug message.
void WizFi310::recvData ( char c )
{
static int cid, sub, len, count;
- static int is_mqtt_data = 0;
- char tbf[10];
+ static int is_mqtt_data = 0;
switch(_state.mode)
- {
+ {
case MODE_COMMAND:
switch(c)
{
@@ -85,124 +90,118 @@
switch(sub)
{
case 0:
- // cid
- if( (c >= '0') && (c <= '9') )
- {
- cid = x2i(c);
- }
- else if ( c == ',' )
- {
- sub++;
- count = 0;
- len = 0;
- }
- //daniel add for mqtt
- else if ( c == 'Q' )
- {
- cid = 0;
- is_mqtt_data = 1;
- }
- //
- else
- {
- _state.mode = MODE_COMMAND;
- }
- break;
+ // cid
+ if( (c >= '0') && (c <= '9') )
+ {
+ cid = x2i(c);
+ }
+ else if ( c == ',' )
+ {
+ sub++;
+ count = 0;
+ len = 0;
+ }
+ //daniel add for mqtt
+ else if ( c == 'Q' )
+ {
+ cid = 0;
+ is_mqtt_data = 1;
+ }
+ //
+ else
+ {
+ _state.mode = MODE_COMMAND;
+ }
+ break;
- case 1:
- // ip
-// if ((c >= '0' && c <= '9') || c == '.')
- if (((c >= '0' && c <= '9') || c == '.') && is_mqtt_data == 0 )
- {
- _con[cid].ip[count] = c;
- count++;
- }
- else if( c == ',' )
- {
- _con[cid].ip[count] = '\0';
- _con[cid].port = 0;
- sub++;
- }
- //daniel for mqtt
- else if( is_mqtt_data == 1)
- {
- rcvd_mqtt_topic[count] = c;
- count++;
- }
-// else
- else if( is_mqtt_data == 0 )
- {
- _state.mode = MODE_COMMAND;
+ case 1:
+ // ip
+ // if ((c >= '0' && c <= '9') || c == '.')
+ if (((c >= '0' && c <= '9') || c == '.') && is_mqtt_data == 0 )
+ {
+ _con[cid].ip[count] = c;
+ count++;
+ }
+ else if( c == ',' )
+ {
+ _con[cid].ip[count] = '\0';
+ _con[cid].port = 0;
+ sub++;
+ }
+ //daniel for mqtt
+ else if( is_mqtt_data == 1)
+ {
+ rcvd_mqtt_topic[count] = c;
+ count++;
+ }
+ // else
+ else if( is_mqtt_data == 0 )
+ {
+ _state.mode = MODE_COMMAND;
+ }
+ break;
+
+ case 2:
+ // port
+ if ( c >= '0' && c <= '9' )
+ {
+ _con[cid].port = (_con[cid].port * 10) + ( c - '0' );
+ }
+ else if( c == ',')
+ {
+ sub++;
+ count = 0;
+ }
+ else
+ {
+ _state.mode = MODE_COMMAND;
+ }
+ break;
+
+ case 3:
+ // data length
+ if ( c >= '0' && c <= '9' )
+ {
+ //_con[cid].recv_length = (_con[cid].recv_length * 10) + (c - '0');
+ len = (len * 10) + (c - '0');
+ }
+ else if( c == '}' )
+ {
+ sub++;
+ count = 0;
+ _con[cid].recv_length = len;
+ }
+ else
+ {
+ _state.mode = MODE_COMMAND;
+ }
+ break;
+
+ default:
+
+ if(_con[cid].buf != NULL)
+ {
+ _con[cid].buf->queue(c);
+ if(_con[cid].buf->available() > CFG_DATA_SIZE - 16 )
+ {
+ setRts(false); // blcok
+ _con[cid].received = true;
+ WIZ_WARN("buf full");
+ }
+ }
+ _con[cid].recv_length--;
+ if(_con[cid].recv_length == 0)
+ {
+ _con[cid].received = true;
+ _state.mode = MODE_COMMAND;
+ }
+ break;
}
break;
-
- case 2:
- // port
- if ( c >= '0' && c <= '9' )
- {
- _con[cid].port = (_con[cid].port * 10) + ( c - '0' );
- }
- else if( c == ',')
- {
- sub++;
- count = 0;
- }
- else
- {
- _state.mode = MODE_COMMAND;
- }
- break;
-
- case 3:
- // data length
- if ( c >= '0' && c <= '9' )
- {
- //_con[cid].recv_length = (_con[cid].recv_length * 10) + (c - '0');
- len = (len * 10) + (c - '0');
- }
- else if( c == '}' )
- {
- sub++;
- count = 0;
- _con[cid].recv_length = len;
- }
- else
- {
- _state.mode = MODE_COMMAND;
- }
- break;
-
- default:
-
- if(_con[cid].buf != NULL)
- {
- _con[cid].buf->queue(c);
- if(_con[cid].buf->available() > CFG_DATA_SIZE - 16 )
- {
- setRts(false); // blcok
- _con[cid].received = true;
- WIZ_WARN("buf full");
- }
- }
- _con[cid].recv_length--;
- if(_con[cid].recv_length == 0)
- {
- //WIZ_DBG("recv cid: %d, count : %d, len : %d",cid, count, len);
- //sprintf(tbf, "recv cid: %d, count : %d, len : %d",cid, count, len);
- //strcat(g_asyncbuf, tbf);
- _con[cid].received = true;
- _state.mode = MODE_COMMAND;
- }
- break;
- }
- break;
}
}
-
-//#define MSG_TABLE_NUM 6
-//daniel
-#define MSG_TABLE_NUM 8
+#define MSG_TABLE_NUM 7
#define RES_TABLE_NUM 7
int WizFi310::parseMessage () {
int i;
@@ -212,15 +211,14 @@
const char msg[24];
void (WizFi310::*func)(const char *);
} msg_table[MSG_TABLE_NUM] = {
- {"[OK]", &WizFi310::msgOk},
- {"[ERROR]", &WizFi310::msgError},
- {"[ERROR:INVALIDINPUT]", &WizFi310::msgError},
- {"[CONNECT ", &WizFi310::msgConnect},
- {"[DISCONNECT ", &WizFi310::msgDisconnect},
- {"[LISTEN ", &WizFi310::msgListen},
- //daniel
- {"[MQTT CONNECT]", &WizFi310::msgMQTTConnect},
- {"[MQTT DISCONNECT]", &WizFi310::msgMQTTDisconnect},
+ {RESP_MSG_OK, &WizFi310::msgOk},
+ {RESP_MSG_ERROR, &WizFi310::msgError},
+// {"[ERROR:INVALIDINPUT]", &WizFi310::msgError},
+ {RESP_MSG_CONNECT, &WizFi310::msgConnect},
+ {RESP_MSG_DISCONNECT, &WizFi310::msgDisconnect},
+ {RESP_MSG_LISTEN, &WizFi310::msgListen},
+ {RESP_MSG_MQTTCON, &WizFi310::msgMQTTConnect},
+ {RESP_MSG_MQTTDISCON, &WizFi310::msgMQTTDisconnect},
};
static const struct RES_TABLE{
const Response res;
@@ -243,16 +241,13 @@
}
buf[i] = '\0';
- //strncpy(_state.dbgRespBuf, buf, sizeof(buf) );
- //WIZ_DBG("%s\r\n",_state.dbgRespBuf);
-
+
if(_state.res != RES_NULL)
{
for( i=0; i<RES_TABLE_NUM; i++)
{
if(res_table[i].res == _state.res)
{
- //WIZ_DBG("parse res %d '%s'\r\n", i, buf);
if(res_table[i].func != NULL)
{
(this->*(res_table[i].func))(buf);
@@ -268,7 +263,6 @@
{
if( strncmp(buf, msg_table[i].msg, strlen(msg_table[i].msg)) == 0 )
{
- //WIZ_DBG("parse msg '%s'\r\n", buf);
if(msg_table[i].func != NULL)
{
(this->*(msg_table[i].func))(buf);
@@ -295,10 +289,11 @@
{
int cid;
- if (buf[9] < '0' || buf[9] > '8' || buf[10] != ']') return;
+ //if (buf[9] < '0' || buf[9] > '8' || buf[10] != ']') return;
+ if( isdigit (buf[9])) return;
cid = x2i(buf[9]);
-
+
initCon(cid, true);
_state.cid = cid;
_con[cid].accept = true;
@@ -309,7 +304,8 @@
{
int cid;
- if(buf[12] < '0' || buf[12] > '8' || buf[13] != ']') return;
+ //if(buf[12] < '0' || buf[12] > '8' || buf[13] != ']') return;
+ if( isdigit (buf[9])) return;
cid = x2i(buf[12]);
_con[cid].connected = false;
@@ -320,9 +316,6 @@
{
int cid = 0;
- //if (buf[9] < '0' || buf[9] > '8' || buf[10] != ']') return;
-
- //cid = x2i(buf[9]);
initCon(cid, true);
_state.cid = cid;
_con[cid].accept = true;
@@ -336,10 +329,6 @@
void WizFi310::msgMQTTDisconnect (const char *buf)
{
int cid = 0;
-
- //if(buf[12] < '0' || buf[12] > '8' || buf[13] != ']') return;
-
- //cid = x2i(buf[12]);
_con[cid].connected = false;
}
@@ -348,7 +337,8 @@
{
int cid;
- if(buf[8] < '0' || buf[8] > '8' || buf[9] != ']') return;
+ //if(buf[8] < '0' || buf[8] > '8' || buf[9] != ']') return;
+ if( isdigit (buf[9])) return;
cid = x2i(buf[8]);
_state.cid = cid;
@@ -362,8 +352,9 @@
_state.mac[17] = 0;
_state.res = RES_NULL;
- if(strncmp(_state.mac,CFG_DEFAULT_MAC,sizeof(CFG_DEFAULT_MAC)) == 0)
+ if(strncmp(_state.mac,CFG_DEFAULT_MAC,sizeof(CFG_DEFAULT_MAC)) == 0){
_state.ok = false;
+ }
_state.ok = true;
}
}
@@ -372,13 +363,10 @@
{
int cid;
- if (buf[0] == '[' && buf[1] == 'O' && buf[2] == 'K' && buf[3] == ']')
- {
+ if( strstr((char*)buf, RESP_MSG_OK) != NULL){
_state.n++;
}
- else if( buf[0] == '[' && buf[1] == 'C' && buf[2] == 'O' && buf[3] == 'N' &&
- buf[4] == 'N' && buf[5] == 'E' && buf[6] == 'C' && buf[7] == 'T')
- {
+ else if( strstr((char*)buf, RESP_MSG_CONNECT) != NULL){
cid = x2i(buf[9]);
_state.cid = cid;
_state.n++;
@@ -421,7 +409,8 @@
int cid, i;
char *c;
- if( (buf[0] < '0' || buf[0] > '8') ) return;
+// if( (buf[0] < '0' || buf[0] > '8') ) return;
+ if( isdigit (buf[9])) return;
cid = x2i(buf[0]);
if( cid != _state.cid ) return;
@@ -456,34 +445,25 @@
void WizFi310::resWSTATUS (const char *buf)
{
- int idx=0,sep_cnt=0;
- int ip_idx=0,gw_idx=0;
-
+ char* idx_ptr;
+
if(_state.n == 0)
{
_state.n++;
}
else if(_state.n == 1)
{
- for(idx=0;buf[idx]!='\r';idx++)
- {
- if(buf[idx] =='/')
- {
- sep_cnt++;
- continue;
- }
+ idx_ptr = strtok((char*)buf, "/"); // Interface STA or AP
+ idx_ptr = strtok( NULL, "/"); // SSID
+ idx_ptr = strtok( NULL, "/"); // IP Addr
+ memset(_state.ip, 0, sizeof(_state.ip));
+ memcpy(_state.ip, idx_ptr, strlen(idx_ptr)+1);
+
+ idx_ptr = strtok( NULL, "/"); // Gateway Addr
+ memset(_state.gateway, 0, sizeof(_state.gateway));
+ memcpy(_state.gateway, idx_ptr, strlen(idx_ptr)+1);
- if( sep_cnt == 2) // IP Address
- {
- _state.ip[ip_idx++] = buf[idx];
- }
- else if(sep_cnt == 3)
- {
- _state.gateway[gw_idx++] = buf[idx];
- }
- }
- _state.ip[ip_idx] = '\0';
- _state.gateway[gw_idx] = '\0';
_state.res = RES_NULL;
}
-}
\ No newline at end of file
+
+}
--- a/WizFi310/WizFi310_sock.cpp Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310/WizFi310_sock.cpp Mon Jun 26 00:17:10 2017 +0000
@@ -67,9 +67,11 @@
{
if( cmdSCON( "O","UCN",ip, remotePort, localPort, "0" ) ) return -1;
}
+
if(_state.cid < 0) return -1;
-
+
initCon(_state.cid, true);
+
cid = _state.cid;
_con[cid].protocol = proto;
_con[cid].type = TYPE_CLIENT;
@@ -218,14 +220,14 @@
bool WizFi310::isConnected (int cid)
{
if ( cid < 0 || cid >=8 ) return false;
- //printf("%d %d\r\n", cid, _con[cid].connected);
+
return _con[cid].connected;
}
int WizFi310::accept (int cid)
{
if(!isConnected(cid)) return -1;
-
+
if(_con[cid].connected && _con[cid].accept)
{
_con[cid].accept = false;
--- a/WizFi310Interface.cpp Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310Interface.cpp Mon Jun 26 00:17:10 2017 +0000
@@ -125,6 +125,7 @@
struct wizfi310_socket *socket = new struct wizfi310_socket;
if (!socket) {
+ delete socket;
return NSAPI_ERROR_NO_SOCKET;
}
@@ -186,6 +187,7 @@
struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
WizFi310::Protocol proto = (socket->proto == NSAPI_UDP) ? WizFi310::PROTO_UDP : WizFi310::PROTO_TCP;
+
if((cid = _wizfi310.open(proto, addr.get_ip_address(), addr.get_port())) == -1 )
{
return NSAPI_ERROR_DEVICE_ERROR;
@@ -205,16 +207,15 @@
int WizFi310Interface::socket_accept(void **handle, void *server)
{
- struct wizfi310_socket *socket = (struct wizfi310_socket *)server;
struct wizfi310_socket *new_socket = new struct wizfi310_socket;
-
+
if( !new_socket )
{
return NSAPI_ERROR_NO_SOCKET;
}
memset(new_socket, 0, sizeof(new_socket));
-
+
for(int cid=0; cid<WIZFI310_SOCKET_COUNT; cid++)
{
if( _wizfi310.accept(cid) != -1 )
@@ -224,10 +225,12 @@
new_socket->connected = true;
*handle = new_socket;
+
+
return 0;
}
}
-
+ delete new_socket;
return NSAPI_ERROR_WOULD_BLOCK;
}
--- a/WizFi310Interface.h Mon Apr 17 06:44:26 2017 +0000
+++ b/WizFi310Interface.h Mon Jun 26 00:17:10 2017 +0000
@@ -64,7 +64,7 @@
{
return &_wizfi310;
}
-
+
protected:
/** Open a socket
* @param handle Handle in which to store new socket
