eConais EC19D Wi-Fi module
EC19_msg.cpp@0:4425e1b86f65, 2015-02-19 (annotated)
- Committer:
- ecfan
- Date:
- Thu Feb 19 13:44:16 2015 +0000
- Revision:
- 0:4425e1b86f65
test build
Who changed what in which revision?
User | Revision | Line number | New 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 | } |