eConais EC19D Wi-Fi module

Committer:
ecfan
Date:
Thu Feb 19 13:44:16 2015 +0000
Revision:
0:4425e1b86f65
test build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ecfan 0:4425e1b86f65 1 #include "EC19.h"
ecfan 0:4425e1b86f65 2
ecfan 0:4425e1b86f65 3 extern DigitalOut led1, led2, led3, led4;
ecfan 0:4425e1b86f65 4 extern Serial pc;
ecfan 0:4425e1b86f65 5
ecfan 0:4425e1b86f65 6 void EC19::recvData (char c) {
ecfan 0:4425e1b86f65 7 static int cid, sub, len, count;
ecfan 0:4425e1b86f65 8
ecfan 0:4425e1b86f65 9 pc.putc(c);
ecfan 0:4425e1b86f65 10 #ifdef DEBUG_DUMP
ecfan 0:4425e1b86f65 11 if (c < 0x20 || c >= 0x7f) {
ecfan 0:4425e1b86f65 12 std::printf("_%02x", c);
ecfan 0:4425e1b86f65 13 } else {
ecfan 0:4425e1b86f65 14 std::printf("_%c", c);
ecfan 0:4425e1b86f65 15 }
ecfan 0:4425e1b86f65 16 #endif
ecfan 0:4425e1b86f65 17
ecfan 0:4425e1b86f65 18 switch (_state.mode) {
ecfan 0:4425e1b86f65 19 case MODE_COMMAND:
ecfan 0:4425e1b86f65 20 if (c == '\r' || c == '\n') {
ecfan 0:4425e1b86f65 21 _state.buf[_state.n] = 0;
ecfan 0:4425e1b86f65 22 if (_state.n) {
ecfan 0:4425e1b86f65 23 led2 = 1;
ecfan 0:4425e1b86f65 24 parseMessage();
ecfan 0:4425e1b86f65 25 led2 = 0;
ecfan 0:4425e1b86f65 26 }
ecfan 0:4425e1b86f65 27 _state.n = 0;
ecfan 0:4425e1b86f65 28 } else {
ecfan 0:4425e1b86f65 29 if (_state.n < CFG_BUF_SIZE - 1) {
ecfan 0:4425e1b86f65 30 _state.buf[_state.n] = c;
ecfan 0:4425e1b86f65 31 _state.n ++;
ecfan 0:4425e1b86f65 32 }
ecfan 0:4425e1b86f65 33 }
ecfan 0:4425e1b86f65 34 break;
ecfan 0:4425e1b86f65 35 case MODE_DATA:
ecfan 0:4425e1b86f65 36 _state.n ++;
ecfan 0:4425e1b86f65 37 if (_state.n >= _state.datalen) {
ecfan 0:4425e1b86f65 38 _state.n = 0;
ecfan 0:4425e1b86f65 39 _state.mode = MODE_COMMAND;
ecfan 0:4425e1b86f65 40 }
ecfan 0:4425e1b86f65 41 break;
ecfan 0:4425e1b86f65 42 }
ecfan 0:4425e1b86f65 43 }
ecfan 0:4425e1b86f65 44
ecfan 0:4425e1b86f65 45 #define MSG_TABLE_NUM 12
ecfan 0:4425e1b86f65 46 int EC19::parseMessage () {
ecfan 0:4425e1b86f65 47 int i;
ecfan 0:4425e1b86f65 48 static int type = -1;
ecfan 0:4425e1b86f65 49 static const struct MSG_TABLE {
ecfan 0:4425e1b86f65 50 const char msg[16];
ecfan 0:4425e1b86f65 51 void (EC19::*func)(const char*);
ecfan 0:4425e1b86f65 52 } msg_table[MSG_TABLE_NUM] = {
ecfan 0:4425e1b86f65 53 {"IP", &EC19::msgIp},
ecfan 0:4425e1b86f65 54 {"MAC", &EC19::msgMac},
ecfan 0:4425e1b86f65 55 {"DHCP", &EC19::msgDhcp},
ecfan 0:4425e1b86f65 56 {"STATUS", &EC19::msgStatus},
ecfan 0:4425e1b86f65 57 {"CLIENT", &EC19::msgClient},
ecfan 0:4425e1b86f65 58 {"AP", &EC19::msgAp},
ecfan 0:4425e1b86f65 59 {"RSSI", &EC19::msgRssi},
ecfan 0:4425e1b86f65 60 {"TCP_CONNECT", &EC19::msgTcpConnect},
ecfan 0:4425e1b86f65 61 {"UDP_CONNECT", &EC19::msgUdpConnect},
ecfan 0:4425e1b86f65 62 {"TCP_RECEIVED", &EC19::msgTcpReceived},
ecfan 0:4425e1b86f65 63 {"UDP_RECEIVED", &EC19::msgUdpReceived},
ecfan 0:4425e1b86f65 64 {"HOST_EVENT", &EC19::msgHostEvent},
ecfan 0:4425e1b86f65 65 };
ecfan 0:4425e1b86f65 66
ecfan 0:4425e1b86f65 67 // DBG("parse %d '%s'\r\n", type, _state.buf);
ecfan 0:4425e1b86f65 68 if (_state.n == 3 && strncmp(_state.buf, "TXE", 3) == NULL) {
ecfan 0:4425e1b86f65 69 if (_state.datalen) {
ecfan 0:4425e1b86f65 70 _state.mode = MODE_DATA;
ecfan 0:4425e1b86f65 71 }
ecfan 0:4425e1b86f65 72 if (! _state.failure) {
ecfan 0:4425e1b86f65 73 _state.ok = true;
ecfan 0:4425e1b86f65 74 }
ecfan 0:4425e1b86f65 75 type = -1;
ecfan 0:4425e1b86f65 76 led3 = 0;
ecfan 0:4425e1b86f65 77 } else
ecfan 0:4425e1b86f65 78 if (type >= 0) {
ecfan 0:4425e1b86f65 79 led4 = 1;
ecfan 0:4425e1b86f65 80 (this->*(msg_table[type].func))(_state.buf);
ecfan 0:4425e1b86f65 81 led4 = 0;
ecfan 0:4425e1b86f65 82 } else
ecfan 0:4425e1b86f65 83 if (strncmp(_state.buf, "READY", 5) == NULL) {
ecfan 0:4425e1b86f65 84 _state.ready = true;
ecfan 0:4425e1b86f65 85 } else
ecfan 0:4425e1b86f65 86 if (strncmp(_state.buf, "DWAIT", 5) == NULL) {
ecfan 0:4425e1b86f65 87 _state.dwait = true;
ecfan 0:4425e1b86f65 88 } else
ecfan 0:4425e1b86f65 89 if (strncmp(_state.buf, "CMDOK", 5) == NULL) {
ecfan 0:4425e1b86f65 90 //
ecfan 0:4425e1b86f65 91 } else
ecfan 0:4425e1b86f65 92 if (strncmp(_state.buf, "CMDERR", 6) == NULL) {
ecfan 0:4425e1b86f65 93 _state.failure = true;
ecfan 0:4425e1b86f65 94 } else
ecfan 0:4425e1b86f65 95 if (strncmp(_state.buf, "TXS : ", 6) == NULL) {
ecfan 0:4425e1b86f65 96 for (i = 0; i < MSG_TABLE_NUM; i ++) {
ecfan 0:4425e1b86f65 97 if (strncmp(&_state.buf[6], msg_table[i].msg, strlen(msg_table[i].msg)) == NULL) {
ecfan 0:4425e1b86f65 98 type = i;
ecfan 0:4425e1b86f65 99 led3 = 1;
ecfan 0:4425e1b86f65 100 break;
ecfan 0:4425e1b86f65 101 }
ecfan 0:4425e1b86f65 102 }
ecfan 0:4425e1b86f65 103 } else {
ecfan 0:4425e1b86f65 104 return -1;
ecfan 0:4425e1b86f65 105 }
ecfan 0:4425e1b86f65 106 return 0;
ecfan 0:4425e1b86f65 107 }
ecfan 0:4425e1b86f65 108
ecfan 0:4425e1b86f65 109
ecfan 0:4425e1b86f65 110 void EC19::msgIp (const char *buf) {
ecfan 0:4425e1b86f65 111 if (strncmp(buf, "IP : ", 5) == NULL) {
ecfan 0:4425e1b86f65 112 strncpy(_state.ip, &buf[5], sizeof(_state.ip));
ecfan 0:4425e1b86f65 113 } else
ecfan 0:4425e1b86f65 114 if (strncmp(buf, "Subnet : ", 9) == NULL) {
ecfan 0:4425e1b86f65 115 strncpy(_state.netmask, &buf[9], sizeof(_state.netmask));
ecfan 0:4425e1b86f65 116 } else
ecfan 0:4425e1b86f65 117 if (strncmp(buf, "Gateway : ", 10) == NULL) {
ecfan 0:4425e1b86f65 118 strncpy(_state.gateway, &buf[10], sizeof(_state.gateway));
ecfan 0:4425e1b86f65 119 }
ecfan 0:4425e1b86f65 120 }
ecfan 0:4425e1b86f65 121
ecfan 0:4425e1b86f65 122 void EC19::msgMac (const char *buf) {
ecfan 0:4425e1b86f65 123 if (strncmp(buf, "MAC : ", 6) == NULL) {
ecfan 0:4425e1b86f65 124 strncpy(_state.mac, &buf[6], sizeof(_state.mac));
ecfan 0:4425e1b86f65 125 }
ecfan 0:4425e1b86f65 126 }
ecfan 0:4425e1b86f65 127
ecfan 0:4425e1b86f65 128 void EC19::msgDhcp (const char *buf) {
ecfan 0:4425e1b86f65 129 if (strncmp(buf, "DHCP : ", 7) == NULL) {
ecfan 0:4425e1b86f65 130 }
ecfan 0:4425e1b86f65 131 }
ecfan 0:4425e1b86f65 132
ecfan 0:4425e1b86f65 133 void EC19::msgStatus (const char *buf) {
ecfan 0:4425e1b86f65 134 if (strncmp(buf, "CONNECTED : ", 12) == NULL) {
ecfan 0:4425e1b86f65 135 switch (buf[12]) {
ecfan 0:4425e1b86f65 136 case 'Y':
ecfan 0:4425e1b86f65 137 case '1':
ecfan 0:4425e1b86f65 138 _state.associated = true;
ecfan 0:4425e1b86f65 139 break;
ecfan 0:4425e1b86f65 140 case 'N':
ecfan 0:4425e1b86f65 141 case '0':
ecfan 0:4425e1b86f65 142 default:
ecfan 0:4425e1b86f65 143 _state.associated = false;
ecfan 0:4425e1b86f65 144 break;
ecfan 0:4425e1b86f65 145 }
ecfan 0:4425e1b86f65 146 } else
ecfan 0:4425e1b86f65 147 if (strncmp(buf, "SSID : ", 7) == NULL) {
ecfan 0:4425e1b86f65 148 }
ecfan 0:4425e1b86f65 149 }
ecfan 0:4425e1b86f65 150
ecfan 0:4425e1b86f65 151 void EC19::msgClient (const char *buf) {
ecfan 0:4425e1b86f65 152 if (strncmp(buf, "CONNECTED : ", 12) == NULL) {
ecfan 0:4425e1b86f65 153 switch (buf[12]) {
ecfan 0:4425e1b86f65 154 case 'Y':
ecfan 0:4425e1b86f65 155 case '1':
ecfan 0:4425e1b86f65 156 _state.associated = true;
ecfan 0:4425e1b86f65 157 break;
ecfan 0:4425e1b86f65 158 case 'N':
ecfan 0:4425e1b86f65 159 case '0':
ecfan 0:4425e1b86f65 160 default:
ecfan 0:4425e1b86f65 161 _state.associated = false;
ecfan 0:4425e1b86f65 162 break;
ecfan 0:4425e1b86f65 163 }
ecfan 0:4425e1b86f65 164 } else
ecfan 0:4425e1b86f65 165 if (strncmp(buf, "DHCP : ", 7) == NULL) {
ecfan 0:4425e1b86f65 166 if (buf[7] == '1') {
ecfan 0:4425e1b86f65 167 _state.ip[0] = 0;
ecfan 0:4425e1b86f65 168 _state.netmask[0] = 0;
ecfan 0:4425e1b86f65 169 _state.gateway[0] = 0;
ecfan 0:4425e1b86f65 170 _state.nameserver[0] = 0;
ecfan 0:4425e1b86f65 171 }
ecfan 0:4425e1b86f65 172 }
ecfan 0:4425e1b86f65 173 }
ecfan 0:4425e1b86f65 174
ecfan 0:4425e1b86f65 175 void EC19::msgAp (const char *buf) {
ecfan 0:4425e1b86f65 176 if (strncmp(buf, "STARTED : ", 10) == NULL) {
ecfan 0:4425e1b86f65 177 _state.associated = buf[10] == 'Y' ? true : false;
ecfan 0:4425e1b86f65 178 }
ecfan 0:4425e1b86f65 179 }
ecfan 0:4425e1b86f65 180
ecfan 0:4425e1b86f65 181 void EC19::msgRssi (const char *buf) {
ecfan 0:4425e1b86f65 182 if (strncmp(buf, "RSSI : ", 7) == NULL) {
ecfan 0:4425e1b86f65 183 _state.rssi = atoi(&buf[7]);
ecfan 0:4425e1b86f65 184 }
ecfan 0:4425e1b86f65 185 }
ecfan 0:4425e1b86f65 186
ecfan 0:4425e1b86f65 187 void EC19::msgTcpConnect (const char *buf) {
ecfan 0:4425e1b86f65 188 int state;
ecfan 0:4425e1b86f65 189 if (strncmp(buf, "TCP_CONN_ID : ", 14) == NULL) {
ecfan 0:4425e1b86f65 190 _state.cid = atoi(&buf[14]);
ecfan 0:4425e1b86f65 191 } else
ecfan 0:4425e1b86f65 192 if (strncmp(buf, "TCP_STATE : ", 12) == NULL) {
ecfan 0:4425e1b86f65 193 state = atoi(&buf[12]);
ecfan 0:4425e1b86f65 194 }
ecfan 0:4425e1b86f65 195 }
ecfan 0:4425e1b86f65 196
ecfan 0:4425e1b86f65 197 void EC19::msgUdpConnect (const char *buf) {
ecfan 0:4425e1b86f65 198 int state;
ecfan 0:4425e1b86f65 199 if (strncmp(buf, "UDP_CONN_ID : ", 14) == NULL) {
ecfan 0:4425e1b86f65 200 _state.cid = atoi(&buf[14]);
ecfan 0:4425e1b86f65 201 } else
ecfan 0:4425e1b86f65 202 if (strncmp(buf, "TCP_STATE : ", 12) == NULL) {
ecfan 0:4425e1b86f65 203 state = atoi(&buf[12]);
ecfan 0:4425e1b86f65 204 }
ecfan 0:4425e1b86f65 205 }
ecfan 0:4425e1b86f65 206
ecfan 0:4425e1b86f65 207 void EC19::msgHostEvent (const char *buf) {
ecfan 0:4425e1b86f65 208 if (strncmp(buf, "IP : ", 5) == NULL) {
ecfan 0:4425e1b86f65 209 strncpy(_state.resolv, &buf[5], sizeof(_state.resolv));
ecfan 0:4425e1b86f65 210 }
ecfan 0:4425e1b86f65 211 }
ecfan 0:4425e1b86f65 212
ecfan 0:4425e1b86f65 213 void EC19::msgTcpReceived (const char *buf) {
ecfan 0:4425e1b86f65 214 if (strncmp(buf, "TCP_CONN_ID : ", 14) == NULL) {
ecfan 0:4425e1b86f65 215 _state.cid = atoi(&buf[14]);
ecfan 0:4425e1b86f65 216 } else
ecfan 0:4425e1b86f65 217 if (strncmp(buf, "TCP_DATALEN : ", 14) == NULL) {
ecfan 0:4425e1b86f65 218 _state.datalen = atoi(&buf[14]);
ecfan 0:4425e1b86f65 219 }
ecfan 0:4425e1b86f65 220 }
ecfan 0:4425e1b86f65 221
ecfan 0:4425e1b86f65 222 void EC19::msgUdpReceived (const char *buf) {
ecfan 0:4425e1b86f65 223 if (strncmp(buf, "UDP_CONN_ID : ", 14) == NULL) {
ecfan 0:4425e1b86f65 224 _state.cid = atoi(&buf[14]);
ecfan 0:4425e1b86f65 225 } else
ecfan 0:4425e1b86f65 226 if (strncmp(buf, "UDP_DATALEN : ", 14) == NULL) {
ecfan 0:4425e1b86f65 227 _state.datalen = atoi(&buf[14]);
ecfan 0:4425e1b86f65 228 }
ecfan 0:4425e1b86f65 229 }