Mbed Cloud example program for workshop in W27 2018.

Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:119624335925 1 /* ISM43362 Example
MACRUM 0:119624335925 2 *
MACRUM 0:119624335925 3 * Copyright (c) STMicroelectronics 2018
MACRUM 0:119624335925 4 *
MACRUM 0:119624335925 5 * Licensed under the Apache License, Version 2.0 (the "License");
MACRUM 0:119624335925 6 * you may not use this file except in compliance with the License.
MACRUM 0:119624335925 7 * You may obtain a copy of the License at
MACRUM 0:119624335925 8 *
MACRUM 0:119624335925 9 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:119624335925 10 *
MACRUM 0:119624335925 11 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:119624335925 12 * distributed under the License is distributed on an "AS IS" BASIS,
MACRUM 0:119624335925 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:119624335925 14 * See the License for the specific language governing permissions and
MACRUM 0:119624335925 15 * limitations under the License.
MACRUM 0:119624335925 16 */
MACRUM 0:119624335925 17 #include <string.h>
MACRUM 0:119624335925 18 #include "ISM43362.h"
MACRUM 0:119624335925 19 #include "mbed_debug.h"
MACRUM 0:119624335925 20
MACRUM 0:119624335925 21 // activate / de-activate debug
MACRUM 0:119624335925 22 #define ism_debug false
MACRUM 0:119624335925 23
MACRUM 0:119624335925 24 ISM43362::ISM43362(PinName mosi, PinName miso, PinName sclk, PinName nss, PinName resetpin, PinName datareadypin, PinName wakeup, bool debug)
MACRUM 0:119624335925 25 : _bufferspi(mosi, miso, sclk, nss, datareadypin), _parser(_bufferspi), _resetpin(resetpin),
MACRUM 0:119624335925 26 _packets(0), _packets_end(&_packets)
MACRUM 0:119624335925 27 {
MACRUM 0:119624335925 28 DigitalOut wakeup_pin(wakeup);
MACRUM 0:119624335925 29 ISM43362::setTimeout((uint32_t)5000);
MACRUM 0:119624335925 30 _bufferspi.format(16, 0); /* 16bits, ploarity low, phase 1Edge, master mode */
MACRUM 0:119624335925 31 _bufferspi.frequency(20000000); /* up to 20 MHz */
MACRUM 0:119624335925 32 _active_id = 0xFF;
MACRUM 0:119624335925 33
MACRUM 0:119624335925 34 reset();
MACRUM 0:119624335925 35
MACRUM 0:119624335925 36 _ism_debug = debug || ism_debug;
MACRUM 0:119624335925 37 _parser.debugOn(debug);
MACRUM 0:119624335925 38 }
MACRUM 0:119624335925 39
MACRUM 0:119624335925 40 /**
MACRUM 0:119624335925 41 * @brief Parses and returns number from string.
MACRUM 0:119624335925 42 * @param ptr: pointer to string
MACRUM 0:119624335925 43 * @param cnt: pointer to the number of parsed digit
MACRUM 0:119624335925 44 * @retval integer value.
MACRUM 0:119624335925 45 */
MACRUM 0:119624335925 46 #define CHARISHEXNUM(x) (((x) >= '0' && (x) <= '9') || \
MACRUM 0:119624335925 47 ((x) >= 'a' && (x) <= 'f') || \
MACRUM 0:119624335925 48 ((x) >= 'A' && (x) <= 'F'))
MACRUM 0:119624335925 49 #define CHARISNUM(x) ((x) >= '0' && (x) <= '9')
MACRUM 0:119624335925 50 #define CHAR2NUM(x) ((x) - '0')
MACRUM 0:119624335925 51
MACRUM 0:119624335925 52
MACRUM 0:119624335925 53 extern "C" int32_t ParseNumber(char* ptr, uint8_t* cnt)
MACRUM 0:119624335925 54 {
MACRUM 0:119624335925 55 uint8_t minus = 0, i = 0;
MACRUM 0:119624335925 56 int32_t sum = 0;
MACRUM 0:119624335925 57
MACRUM 0:119624335925 58 if (*ptr == '-') { /* Check for minus character */
MACRUM 0:119624335925 59 minus = 1;
MACRUM 0:119624335925 60 ptr++;
MACRUM 0:119624335925 61 i++;
MACRUM 0:119624335925 62 }
MACRUM 0:119624335925 63 while (CHARISNUM(*ptr) || (*ptr=='.')) { /* Parse number */
MACRUM 0:119624335925 64 if (*ptr == '.') {
MACRUM 0:119624335925 65 ptr++; // next char
MACRUM 0:119624335925 66 } else {
MACRUM 0:119624335925 67 sum = 10 * sum + CHAR2NUM(*ptr);
MACRUM 0:119624335925 68 ptr++;
MACRUM 0:119624335925 69 i++;
MACRUM 0:119624335925 70 }
MACRUM 0:119624335925 71 }
MACRUM 0:119624335925 72
MACRUM 0:119624335925 73 if (cnt != NULL) { /* Save number of characters used for number */
MACRUM 0:119624335925 74 *cnt = i;
MACRUM 0:119624335925 75 }
MACRUM 0:119624335925 76 if (minus) { /* Minus detected */
MACRUM 0:119624335925 77 return 0 - sum;
MACRUM 0:119624335925 78 }
MACRUM 0:119624335925 79 return sum; /* Return number */
MACRUM 0:119624335925 80 }
MACRUM 0:119624335925 81
MACRUM 0:119624335925 82 const char *ISM43362::get_firmware_version(void)
MACRUM 0:119624335925 83 {
MACRUM 0:119624335925 84 char tmp_buffer[250];
MACRUM 0:119624335925 85 char *ptr, *ptr2;
MACRUM 0:119624335925 86
MACRUM 0:119624335925 87 /* Use %[^\n] instead of %s to allow having spaces in the string */
MACRUM 0:119624335925 88 if(!(_parser.send("I?") && _parser.recv("%[^\n^\r]\r\n", tmp_buffer) && check_response())) {
MACRUM 0:119624335925 89 debug_if(_ism_debug, "ISM43362: get_firmware_version is FAIL\r\n");
MACRUM 0:119624335925 90 return 0;
MACRUM 0:119624335925 91 }
MACRUM 0:119624335925 92
MACRUM 0:119624335925 93 // Get the first version in the string
MACRUM 0:119624335925 94 ptr = strtok((char *)tmp_buffer, ",");
MACRUM 0:119624335925 95 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 96 ptr2 = strtok(NULL, ",");
MACRUM 0:119624335925 97 if (ptr == NULL) {
MACRUM 0:119624335925 98 debug_if(_ism_debug, "ISM43362: get_firmware_version decoding is FAIL\r\n");
MACRUM 0:119624335925 99 return 0;
MACRUM 0:119624335925 100 }
MACRUM 0:119624335925 101 strncpy(_fw_version, ptr , ptr2-ptr);
MACRUM 0:119624335925 102
MACRUM 0:119624335925 103 debug_if(_ism_debug, "ISM43362: get_firmware_version = [%s]\r\n", _fw_version);
MACRUM 0:119624335925 104
MACRUM 0:119624335925 105 return _fw_version;
MACRUM 0:119624335925 106 }
MACRUM 0:119624335925 107
MACRUM 0:119624335925 108 bool ISM43362::reset(void)
MACRUM 0:119624335925 109 {
MACRUM 0:119624335925 110 char tmp_buffer[100];
MACRUM 0:119624335925 111 debug_if(_ism_debug,"ISM43362: Reset Module\r\n");
MACRUM 0:119624335925 112 _resetpin = 0;
MACRUM 0:119624335925 113 wait_ms(10);
MACRUM 0:119624335925 114 _resetpin = 1;
MACRUM 0:119624335925 115 wait_ms(500);
MACRUM 0:119624335925 116
MACRUM 0:119624335925 117 /* Wait for prompt line : the string is "> ". */
MACRUM 0:119624335925 118 /* As the space char is not detected by sscanf function in parser.recv, */
MACRUM 0:119624335925 119 /* we need to use %[\n] */
MACRUM 0:119624335925 120 if (!_parser.recv(">%[^\n]", tmp_buffer)) {
MACRUM 0:119624335925 121 debug_if(_ism_debug,"ISM43362: Reset Module failed\r\n");
MACRUM 0:119624335925 122 return false;
MACRUM 0:119624335925 123 }
MACRUM 0:119624335925 124 return true;
MACRUM 0:119624335925 125 }
MACRUM 0:119624335925 126
MACRUM 0:119624335925 127 void ISM43362::print_rx_buff(void) {
MACRUM 0:119624335925 128 char tmp[150] = {0};
MACRUM 0:119624335925 129 uint16_t i = 0;
MACRUM 0:119624335925 130 debug_if(_ism_debug,"ISM43362: ");
MACRUM 0:119624335925 131 while(i < 150) {
MACRUM 0:119624335925 132 int c = _parser.getc();
MACRUM 0:119624335925 133 if (c < 0)
MACRUM 0:119624335925 134 break;
MACRUM 0:119624335925 135 tmp[i] = c;
MACRUM 0:119624335925 136 debug_if(_ism_debug,"0x%2X ",c);
MACRUM 0:119624335925 137 i++;
MACRUM 0:119624335925 138 }
MACRUM 0:119624335925 139 debug_if(_ism_debug,"\n");
MACRUM 0:119624335925 140 debug_if(_ism_debug,"ISM43362: Buffer content =====%s=====\r\n",tmp);
MACRUM 0:119624335925 141 }
MACRUM 0:119624335925 142
MACRUM 0:119624335925 143 /* checks the standard OK response of the WIFI module, shouldbe:
MACRUM 0:119624335925 144 * \r\nDATA\r\nOK\r\n>sp
MACRUM 0:119624335925 145 * or
MACRUM 0:119624335925 146 * \r\nERROR\r\nUSAGE\r\n>sp
MACRUM 0:119624335925 147 * function returns true if OK, false otherwise. In case of error,
MACRUM 0:119624335925 148 * print error content then flush buffer */
MACRUM 0:119624335925 149 bool ISM43362::check_response(void)
MACRUM 0:119624335925 150 {
MACRUM 0:119624335925 151 char tmp_buffer[100];
MACRUM 0:119624335925 152 if(!_parser.recv("OK\r\n")) {
MACRUM 0:119624335925 153 print_rx_buff();
MACRUM 0:119624335925 154 _parser.flush();
MACRUM 0:119624335925 155 return false;
MACRUM 0:119624335925 156 }
MACRUM 0:119624335925 157
MACRUM 0:119624335925 158 /* Then we should get the prompt: "> " */
MACRUM 0:119624335925 159 /* As the space char is not detected by sscanf function in parser.recv, */
MACRUM 0:119624335925 160 /* we need to use %[\n] */
MACRUM 0:119624335925 161 if (!_parser.recv(">%[^\n]", tmp_buffer)) {
MACRUM 0:119624335925 162 debug_if(_ism_debug, "ISM43362: Missing prompt in WIFI resp\r\n");
MACRUM 0:119624335925 163 print_rx_buff();
MACRUM 0:119624335925 164 _parser.flush();
MACRUM 0:119624335925 165 return false;
MACRUM 0:119624335925 166 }
MACRUM 0:119624335925 167
MACRUM 0:119624335925 168 /* Inventek module do stuffing / padding of data with 0x15,
MACRUM 0:119624335925 169 * in case buffer contains such */
MACRUM 0:119624335925 170 while(1) {
MACRUM 0:119624335925 171 int c = _parser.getc();
MACRUM 0:119624335925 172 if ( c == 0x15) {
MACRUM 0:119624335925 173 debug_if(_ism_debug, "ISM43362: Flush char 0x%x\n", c);
MACRUM 0:119624335925 174 continue;
MACRUM 0:119624335925 175 } else {
MACRUM 0:119624335925 176 /* How to put it back if needed ? */
MACRUM 0:119624335925 177 break;
MACRUM 0:119624335925 178 }
MACRUM 0:119624335925 179 }
MACRUM 0:119624335925 180 return true;
MACRUM 0:119624335925 181 }
MACRUM 0:119624335925 182
MACRUM 0:119624335925 183 bool ISM43362::dhcp(bool enabled)
MACRUM 0:119624335925 184 {
MACRUM 0:119624335925 185 return (_parser.send("C4=%d", enabled ? 1:0) && check_response());
MACRUM 0:119624335925 186 }
MACRUM 0:119624335925 187
MACRUM 0:119624335925 188 int ISM43362::connect(const char *ap, const char *passPhrase, ism_security_t ap_sec)
MACRUM 0:119624335925 189 {
MACRUM 0:119624335925 190 char tmp[256];
MACRUM 0:119624335925 191
MACRUM 0:119624335925 192 if (!(_parser.send("C1=%s", ap) && check_response())) {
MACRUM 0:119624335925 193 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 194 }
MACRUM 0:119624335925 195
MACRUM 0:119624335925 196 if (!(_parser.send("C2=%s", passPhrase) && check_response())) {
MACRUM 0:119624335925 197 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 198 }
MACRUM 0:119624335925 199
MACRUM 0:119624335925 200 /* Check security level is acceptable */
MACRUM 0:119624335925 201 if (ap_sec > ISM_SECURITY_WPA_WPA2 ) {
MACRUM 0:119624335925 202 debug_if(_ism_debug, "ISM43362: Unsupported security level %d\n", ap_sec);
MACRUM 0:119624335925 203 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 204 }
MACRUM 0:119624335925 205
MACRUM 0:119624335925 206 if (!(_parser.send("C3=%d", ap_sec) && check_response())) {
MACRUM 0:119624335925 207 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 208 }
MACRUM 0:119624335925 209
MACRUM 0:119624335925 210 if(_parser.send("C0")) {
MACRUM 0:119624335925 211 while (_parser.recv("%[^\n]\n", tmp)) {
MACRUM 0:119624335925 212 if(strstr(tmp, "OK")) {
MACRUM 0:119624335925 213 _parser.flush();
MACRUM 0:119624335925 214 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 215 }
MACRUM 0:119624335925 216 if(strstr(tmp, "JOIN")) {
MACRUM 0:119624335925 217 if(strstr(tmp, "Failed")) {
MACRUM 0:119624335925 218 _parser.flush();
MACRUM 0:119624335925 219 return NSAPI_ERROR_AUTH_FAILURE;
MACRUM 0:119624335925 220 }
MACRUM 0:119624335925 221 }
MACRUM 0:119624335925 222 }
MACRUM 0:119624335925 223 }
MACRUM 0:119624335925 224
MACRUM 0:119624335925 225 return NSAPI_ERROR_NO_CONNECTION;
MACRUM 0:119624335925 226 }
MACRUM 0:119624335925 227
MACRUM 0:119624335925 228 bool ISM43362::disconnect(void)
MACRUM 0:119624335925 229 {
MACRUM 0:119624335925 230 return (_parser.send("CD") && check_response());
MACRUM 0:119624335925 231 }
MACRUM 0:119624335925 232
MACRUM 0:119624335925 233 const char *ISM43362::getIPAddress(void)
MACRUM 0:119624335925 234 {
MACRUM 0:119624335925 235 char tmp_ip_buffer[250];
MACRUM 0:119624335925 236 char *ptr, *ptr2;
MACRUM 0:119624335925 237
MACRUM 0:119624335925 238 /* Use %[^\n] instead of %s to allow having spaces in the string */
MACRUM 0:119624335925 239 if(!(_parser.send("C?")
MACRUM 0:119624335925 240 && _parser.recv("%[^\n^\r]\r\n", tmp_ip_buffer)
MACRUM 0:119624335925 241 && check_response())) {
MACRUM 0:119624335925 242 debug_if(_ism_debug,"ISM43362: getIPAddress LINE KO: %s\n", tmp_ip_buffer);
MACRUM 0:119624335925 243 return 0;
MACRUM 0:119624335925 244 }
MACRUM 0:119624335925 245
MACRUM 0:119624335925 246 /* Get the IP address in the result */
MACRUM 0:119624335925 247 /* TODO : check if the begining of the string is always = "eS-WiFi_AP_C47F51011231," */
MACRUM 0:119624335925 248 ptr = strtok((char *)tmp_ip_buffer, ",");
MACRUM 0:119624335925 249 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 250 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 251 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 252 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 253 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 254 ptr2 = strtok(NULL, ",");
MACRUM 0:119624335925 255 if (ptr == NULL) return 0;
MACRUM 0:119624335925 256 strncpy(_ip_buffer, ptr , ptr2-ptr);
MACRUM 0:119624335925 257
MACRUM 0:119624335925 258 tmp_ip_buffer[59] = 0;
MACRUM 0:119624335925 259 debug_if(_ism_debug,"ISM43362: receivedIPAddress: %s\n", _ip_buffer);
MACRUM 0:119624335925 260
MACRUM 0:119624335925 261 return _ip_buffer;
MACRUM 0:119624335925 262 }
MACRUM 0:119624335925 263
MACRUM 0:119624335925 264 const char *ISM43362::getMACAddress(void)
MACRUM 0:119624335925 265 {
MACRUM 0:119624335925 266 if(!(_parser.send("Z5") && _parser.recv("%s\r\n", _mac_buffer) && check_response())) {
MACRUM 0:119624335925 267 debug_if(_ism_debug,"ISM43362: receivedMacAddress LINE KO: %s\n", _mac_buffer);
MACRUM 0:119624335925 268 return 0;
MACRUM 0:119624335925 269 }
MACRUM 0:119624335925 270
MACRUM 0:119624335925 271 debug_if(_ism_debug,"ISM43362: receivedMacAddress:%s, size=%d\r\n", _mac_buffer, sizeof(_mac_buffer));
MACRUM 0:119624335925 272
MACRUM 0:119624335925 273 return _mac_buffer;
MACRUM 0:119624335925 274 }
MACRUM 0:119624335925 275
MACRUM 0:119624335925 276 const char *ISM43362::getGateway()
MACRUM 0:119624335925 277 {
MACRUM 0:119624335925 278 char tmp[250];
MACRUM 0:119624335925 279 /* Use %[^\n] instead of %s to allow having spaces in the string */
MACRUM 0:119624335925 280 if(!(_parser.send("C?") && _parser.recv("%[^\n^\r]\r\n", tmp) && check_response())) {
MACRUM 0:119624335925 281 debug_if(_ism_debug,"ISM43362: getGateway LINE KO: %s\r\n", tmp);
MACRUM 0:119624335925 282 return 0;
MACRUM 0:119624335925 283 }
MACRUM 0:119624335925 284
MACRUM 0:119624335925 285 /* Extract the Gateway in the received buffer */
MACRUM 0:119624335925 286 char *ptr;
MACRUM 0:119624335925 287 ptr = strtok(tmp,",");
MACRUM 0:119624335925 288 for (int i = 0; i< 7;i++) {
MACRUM 0:119624335925 289 if (ptr == NULL) break;
MACRUM 0:119624335925 290 ptr = strtok(NULL,",");
MACRUM 0:119624335925 291 }
MACRUM 0:119624335925 292
MACRUM 0:119624335925 293 strncpy(_gateway_buffer, ptr, sizeof(_gateway_buffer));
MACRUM 0:119624335925 294
MACRUM 0:119624335925 295 debug_if(_ism_debug,"ISM43362: getGateway: %s\r\n", _gateway_buffer);
MACRUM 0:119624335925 296
MACRUM 0:119624335925 297 return _gateway_buffer;
MACRUM 0:119624335925 298 }
MACRUM 0:119624335925 299
MACRUM 0:119624335925 300 const char *ISM43362::getNetmask()
MACRUM 0:119624335925 301 {
MACRUM 0:119624335925 302 char tmp[250];
MACRUM 0:119624335925 303 /* Use %[^\n] instead of %s to allow having spaces in the string */
MACRUM 0:119624335925 304 if(!(_parser.send("C?") && _parser.recv("%[^\n^\r]\r\n", tmp) && check_response())) {
MACRUM 0:119624335925 305 debug_if(_ism_debug,"ISM43362: getNetmask LINE KO: %s\n", tmp);
MACRUM 0:119624335925 306 return 0;
MACRUM 0:119624335925 307 }
MACRUM 0:119624335925 308
MACRUM 0:119624335925 309 /* Extract Netmask in the received buffer */
MACRUM 0:119624335925 310 char *ptr;
MACRUM 0:119624335925 311 ptr = strtok(tmp,",");
MACRUM 0:119624335925 312 for (int i = 0; i< 6;i++) {
MACRUM 0:119624335925 313 if (ptr == NULL) break;
MACRUM 0:119624335925 314 ptr = strtok(NULL,",");
MACRUM 0:119624335925 315 }
MACRUM 0:119624335925 316
MACRUM 0:119624335925 317 strncpy(_netmask_buffer, ptr, sizeof(_netmask_buffer));
MACRUM 0:119624335925 318
MACRUM 0:119624335925 319 debug_if(_ism_debug,"ISM43362: getNetmask: %s\r\n", _netmask_buffer);
MACRUM 0:119624335925 320
MACRUM 0:119624335925 321 return _netmask_buffer;
MACRUM 0:119624335925 322 }
MACRUM 0:119624335925 323
MACRUM 0:119624335925 324 int8_t ISM43362::getRSSI()
MACRUM 0:119624335925 325 {
MACRUM 0:119624335925 326 int8_t rssi;
MACRUM 0:119624335925 327 char tmp[25];
MACRUM 0:119624335925 328
MACRUM 0:119624335925 329 if(!(_parser.send("CR") && _parser.recv("%s\r\n", tmp) && check_response())) {
MACRUM 0:119624335925 330 debug_if(_ism_debug,"ISM43362: getRSSI LINE KO: %s\r\n", tmp);
MACRUM 0:119624335925 331 return 0;
MACRUM 0:119624335925 332 }
MACRUM 0:119624335925 333
MACRUM 0:119624335925 334 rssi = ParseNumber(tmp, NULL);
MACRUM 0:119624335925 335
MACRUM 0:119624335925 336 debug_if(_ism_debug,"ISM43362: getRSSI: %d\r\n", rssi);
MACRUM 0:119624335925 337
MACRUM 0:119624335925 338 return rssi;
MACRUM 0:119624335925 339 }
MACRUM 0:119624335925 340 /**
MACRUM 0:119624335925 341 * @brief Parses Security type.
MACRUM 0:119624335925 342 * @param ptr: pointer to string
MACRUM 0:119624335925 343 * @retval Encryption type.
MACRUM 0:119624335925 344 */
MACRUM 0:119624335925 345 extern "C" nsapi_security_t ParseSecurity(char* ptr)
MACRUM 0:119624335925 346 {
MACRUM 0:119624335925 347 if(strstr(ptr,"Open")) return NSAPI_SECURITY_NONE;
MACRUM 0:119624335925 348 else if(strstr(ptr,"WEP")) return NSAPI_SECURITY_WEP;
MACRUM 0:119624335925 349 else if(strstr(ptr,"WPA2 AES")) return NSAPI_SECURITY_WPA2;
MACRUM 0:119624335925 350 else if(strstr(ptr,"WPA WPA2")) return NSAPI_SECURITY_WPA_WPA2;
MACRUM 0:119624335925 351 else if(strstr(ptr,"WPA2 TKIP")) return NSAPI_SECURITY_UNKNOWN; // no match in mbed
MACRUM 0:119624335925 352 else if(strstr(ptr,"WPA2")) return NSAPI_SECURITY_WPA2; // catch any other WPA2 formula
MACRUM 0:119624335925 353 else if(strstr(ptr,"WPA")) return NSAPI_SECURITY_WPA;
MACRUM 0:119624335925 354 else return NSAPI_SECURITY_UNKNOWN;
MACRUM 0:119624335925 355 }
MACRUM 0:119624335925 356
MACRUM 0:119624335925 357 /**
MACRUM 0:119624335925 358 * @brief Convert char in Hex format to integer.
MACRUM 0:119624335925 359 * @param a: character to convert
MACRUM 0:119624335925 360 * @retval integer value.
MACRUM 0:119624335925 361 */
MACRUM 0:119624335925 362 extern "C" uint8_t Hex2Num(char a)
MACRUM 0:119624335925 363 {
MACRUM 0:119624335925 364 if (a >= '0' && a <= '9') { /* Char is num */
MACRUM 0:119624335925 365 return a - '0';
MACRUM 0:119624335925 366 } else if (a >= 'a' && a <= 'f') { /* Char is lowercase character A - Z (hex) */
MACRUM 0:119624335925 367 return (a - 'a') + 10;
MACRUM 0:119624335925 368 } else if (a >= 'A' && a <= 'F') { /* Char is uppercase character A - Z (hex) */
MACRUM 0:119624335925 369 return (a - 'A') + 10;
MACRUM 0:119624335925 370 }
MACRUM 0:119624335925 371
MACRUM 0:119624335925 372 return 0;
MACRUM 0:119624335925 373 }
MACRUM 0:119624335925 374
MACRUM 0:119624335925 375 /**
MACRUM 0:119624335925 376 * @brief Extract a hex number from a string.
MACRUM 0:119624335925 377 * @param ptr: pointer to string
MACRUM 0:119624335925 378 * @param cnt: pointer to the number of parsed digit
MACRUM 0:119624335925 379 * @retval Hex value.
MACRUM 0:119624335925 380 */
MACRUM 0:119624335925 381 extern "C" uint32_t ParseHexNumber(char* ptr, uint8_t* cnt)
MACRUM 0:119624335925 382 {
MACRUM 0:119624335925 383 uint32_t sum = 0;
MACRUM 0:119624335925 384 uint8_t i = 0;
MACRUM 0:119624335925 385
MACRUM 0:119624335925 386 while (CHARISHEXNUM(*ptr)) { /* Parse number */
MACRUM 0:119624335925 387 sum <<= 4;
MACRUM 0:119624335925 388 sum += Hex2Num(*ptr);
MACRUM 0:119624335925 389 ptr++;
MACRUM 0:119624335925 390 i++;
MACRUM 0:119624335925 391 }
MACRUM 0:119624335925 392
MACRUM 0:119624335925 393 if (cnt != NULL) { /* Save number of characters used for number */
MACRUM 0:119624335925 394 *cnt = i;
MACRUM 0:119624335925 395 }
MACRUM 0:119624335925 396 return sum; /* Return number */
MACRUM 0:119624335925 397 }
MACRUM 0:119624335925 398
MACRUM 0:119624335925 399 bool ISM43362::isConnected(void)
MACRUM 0:119624335925 400 {
MACRUM 0:119624335925 401 return getIPAddress() != 0;
MACRUM 0:119624335925 402 }
MACRUM 0:119624335925 403
MACRUM 0:119624335925 404 int ISM43362::scan(WiFiAccessPoint *res, unsigned limit)
MACRUM 0:119624335925 405 {
MACRUM 0:119624335925 406 unsigned cnt = 0, num=0;
MACRUM 0:119624335925 407 char *ptr;
MACRUM 0:119624335925 408 char tmp[256];
MACRUM 0:119624335925 409
MACRUM 0:119624335925 410 if(!(_parser.send("F0"))) {
MACRUM 0:119624335925 411 debug_if(_ism_debug,"ISM43362: scan error\r\n");
MACRUM 0:119624335925 412 return 0;
MACRUM 0:119624335925 413 }
MACRUM 0:119624335925 414
MACRUM 0:119624335925 415 /* Parse the received buffer and fill AP buffer */
MACRUM 0:119624335925 416 /* Use %[^\n] instead of %s to allow having spaces in the string */
MACRUM 0:119624335925 417 while (_parser.recv("#%[^\n]\n", tmp)) {
MACRUM 0:119624335925 418 if (limit != 0 && cnt >= limit) {
MACRUM 0:119624335925 419 /* reached end */
MACRUM 0:119624335925 420 break;
MACRUM 0:119624335925 421 }
MACRUM 0:119624335925 422 nsapi_wifi_ap_t ap = {0};
MACRUM 0:119624335925 423 debug_if(_ism_debug,"ISM43362: received:%s\n", tmp);
MACRUM 0:119624335925 424 ptr = strtok(tmp, ",");
MACRUM 0:119624335925 425 num = 0;
MACRUM 0:119624335925 426 while (ptr != NULL) {
MACRUM 0:119624335925 427 switch (num++) {
MACRUM 0:119624335925 428 case 0: /* Ignore index */
MACRUM 0:119624335925 429 case 4: /* Ignore Max Rate */
MACRUM 0:119624335925 430 case 5: /* Ignore Network Type */
MACRUM 0:119624335925 431 case 7: /* Ignore Radio Band */
MACRUM 0:119624335925 432 break;
MACRUM 0:119624335925 433 case 1:
MACRUM 0:119624335925 434 ptr[strlen(ptr) - 1] = 0;
MACRUM 0:119624335925 435 strncpy((char *)ap.ssid, ptr+ 1, 32);
MACRUM 0:119624335925 436 break;
MACRUM 0:119624335925 437 case 2:
MACRUM 0:119624335925 438 for (int i=0; i<6; i++) {
MACRUM 0:119624335925 439 ap.bssid[i] = ParseHexNumber(ptr + (i*3), NULL);
MACRUM 0:119624335925 440 }
MACRUM 0:119624335925 441 break;
MACRUM 0:119624335925 442 case 3:
MACRUM 0:119624335925 443 ap.rssi = ParseNumber(ptr, NULL);
MACRUM 0:119624335925 444 break;
MACRUM 0:119624335925 445 case 6:
MACRUM 0:119624335925 446 ap.security = ParseSecurity(ptr);
MACRUM 0:119624335925 447 break;
MACRUM 0:119624335925 448 case 8:
MACRUM 0:119624335925 449 ap.channel = ParseNumber(ptr, NULL);
MACRUM 0:119624335925 450 num = 1;
MACRUM 0:119624335925 451 break;
MACRUM 0:119624335925 452 default:
MACRUM 0:119624335925 453 break;
MACRUM 0:119624335925 454 }
MACRUM 0:119624335925 455 ptr = strtok(NULL, ",");
MACRUM 0:119624335925 456 }
MACRUM 0:119624335925 457 res[cnt] = WiFiAccessPoint(ap);
MACRUM 0:119624335925 458 cnt++;
MACRUM 0:119624335925 459 }
MACRUM 0:119624335925 460
MACRUM 0:119624335925 461 /* We may stop before having read all the APs list, so flush the rest of
MACRUM 0:119624335925 462 * it as well as OK commands */
MACRUM 0:119624335925 463 _parser.flush();
MACRUM 0:119624335925 464
MACRUM 0:119624335925 465 debug_if(_ism_debug, "ISM43362: End of Scan: cnt=%d\n", cnt);
MACRUM 0:119624335925 466
MACRUM 0:119624335925 467 return cnt;
MACRUM 0:119624335925 468
MACRUM 0:119624335925 469 }
MACRUM 0:119624335925 470
MACRUM 0:119624335925 471 bool ISM43362::open(const char *type, int id, const char* addr, int port)
MACRUM 0:119624335925 472 { /* TODO : This is the implementation for the client socket, need to check if need to create openserver too */
MACRUM 0:119624335925 473 //IDs only 0-3
MACRUM 0:119624335925 474 if((id < 0) ||(id > 3)) {
MACRUM 0:119624335925 475 debug_if(_ism_debug, "ISM43362: open: wrong id\n");
MACRUM 0:119624335925 476 return false;
MACRUM 0:119624335925 477 }
MACRUM 0:119624335925 478 /* Set communication socket */
MACRUM 0:119624335925 479 debug_if(_ism_debug, "ISM43362: OPEN socket\n");
MACRUM 0:119624335925 480 _active_id = id;
MACRUM 0:119624335925 481 if (!(_parser.send("P0=%d", id) && check_response())) {
MACRUM 0:119624335925 482 return false;
MACRUM 0:119624335925 483 }
MACRUM 0:119624335925 484 /* Set protocol */
MACRUM 0:119624335925 485 if (!(_parser.send("P1=%s", type) && check_response())) {
MACRUM 0:119624335925 486 return false;
MACRUM 0:119624335925 487 }
MACRUM 0:119624335925 488 /* Set address */
MACRUM 0:119624335925 489 if (!(_parser.send("P3=%s", addr) && check_response())) {
MACRUM 0:119624335925 490 return false;
MACRUM 0:119624335925 491 }
MACRUM 0:119624335925 492 if (!(_parser.send("P4=%d", port) && check_response())) {
MACRUM 0:119624335925 493 return false;
MACRUM 0:119624335925 494 }
MACRUM 0:119624335925 495 /* Start client */
MACRUM 0:119624335925 496 if (!(_parser.send("P6=1") && check_response())) {
MACRUM 0:119624335925 497 return false;
MACRUM 0:119624335925 498 }
MACRUM 0:119624335925 499
MACRUM 0:119624335925 500 /* request as much data as possible - i.e. module max size */
MACRUM 0:119624335925 501 if (!(_parser.send("R1=%d", ES_WIFI_MAX_RX_PACKET_SIZE)&& check_response())) {
MACRUM 0:119624335925 502 return -1;
MACRUM 0:119624335925 503 }
MACRUM 0:119624335925 504
MACRUM 0:119624335925 505 return true;
MACRUM 0:119624335925 506 }
MACRUM 0:119624335925 507
MACRUM 0:119624335925 508 bool ISM43362::dns_lookup(const char* name, char* ip)
MACRUM 0:119624335925 509 {
MACRUM 0:119624335925 510 char tmp[30];
MACRUM 0:119624335925 511
MACRUM 0:119624335925 512 if (!(_parser.send("D0=%s", name) && _parser.recv("%s\r\n", tmp)
MACRUM 0:119624335925 513 && check_response())) {
MACRUM 0:119624335925 514 debug_if(_ism_debug,"ISM43362: dns_lookup LINE KO: %s\n", tmp);
MACRUM 0:119624335925 515 return 0;
MACRUM 0:119624335925 516 }
MACRUM 0:119624335925 517
MACRUM 0:119624335925 518 strncpy(ip, tmp, sizeof(tmp));
MACRUM 0:119624335925 519
MACRUM 0:119624335925 520 debug_if(_ism_debug, "ISM43362: ip of DNSlookup: %s\n", ip);
MACRUM 0:119624335925 521 return 1;
MACRUM 0:119624335925 522 }
MACRUM 0:119624335925 523
MACRUM 0:119624335925 524 bool ISM43362::send(int id, const void *data, uint32_t amount)
MACRUM 0:119624335925 525 {
MACRUM 0:119624335925 526 // The Size limit has to be checked on caller side.
MACRUM 0:119624335925 527 if (amount > ES_WIFI_MAX_RX_PACKET_SIZE) {
MACRUM 0:119624335925 528 return false;
MACRUM 0:119624335925 529 }
MACRUM 0:119624335925 530
MACRUM 0:119624335925 531 /* Activate the socket id in the wifi module */
MACRUM 0:119624335925 532 if ((id < 0) ||(id > 3)) {
MACRUM 0:119624335925 533 return false;
MACRUM 0:119624335925 534 }
MACRUM 0:119624335925 535 debug_if(_ism_debug, "ISM43362: SEND socket amount %d\n", amount);
MACRUM 0:119624335925 536 if (_active_id != id) {
MACRUM 0:119624335925 537 _active_id = id;
MACRUM 0:119624335925 538 if (!(_parser.send("P0=%d",id) && check_response())) {
MACRUM 0:119624335925 539 return false;
MACRUM 0:119624335925 540 }
MACRUM 0:119624335925 541 }
MACRUM 0:119624335925 542
MACRUM 0:119624335925 543 /* Change the write timeout */
MACRUM 0:119624335925 544 if (!(_parser.send("S2=%d", _timeout) && check_response())) {
MACRUM 0:119624335925 545 return false;
MACRUM 0:119624335925 546 }
MACRUM 0:119624335925 547 /* set Write Transport Packet Size */
MACRUM 0:119624335925 548 int i = _parser.printf("S3=%d\r", (int)amount);
MACRUM 0:119624335925 549 if (i < 0) {
MACRUM 0:119624335925 550 return false;
MACRUM 0:119624335925 551 }
MACRUM 0:119624335925 552 i = _parser.write((const char *)data, amount, i);
MACRUM 0:119624335925 553 if (i < 0) {
MACRUM 0:119624335925 554 return false;
MACRUM 0:119624335925 555 }
MACRUM 0:119624335925 556
MACRUM 0:119624335925 557 if (!check_response()) {
MACRUM 0:119624335925 558 return false;
MACRUM 0:119624335925 559 }
MACRUM 0:119624335925 560
MACRUM 0:119624335925 561 return true;
MACRUM 0:119624335925 562 }
MACRUM 0:119624335925 563
MACRUM 0:119624335925 564 int ISM43362::check_recv_status(int id, void *data)
MACRUM 0:119624335925 565 {
MACRUM 0:119624335925 566 int read_amount;
MACRUM 0:119624335925 567 static int keep_to = 0;
MACRUM 0:119624335925 568
MACRUM 0:119624335925 569 debug_if(_ism_debug, "ISM43362: ISM43362 req check_recv_status\r\n");
MACRUM 0:119624335925 570 /* Activate the socket id in the wifi module */
MACRUM 0:119624335925 571 if ((id < 0) ||(id > 3)) {
MACRUM 0:119624335925 572 return -1;
MACRUM 0:119624335925 573 }
MACRUM 0:119624335925 574
MACRUM 0:119624335925 575 if (_active_id != id) {
MACRUM 0:119624335925 576 _active_id = id;
MACRUM 0:119624335925 577 if (!(_parser.send("P0=%d",id) && check_response())) {
MACRUM 0:119624335925 578 return -1;
MACRUM 0:119624335925 579 }
MACRUM 0:119624335925 580 }
MACRUM 0:119624335925 581
MACRUM 0:119624335925 582
MACRUM 0:119624335925 583 /* MBED wifi driver is meant to be non-blocking, but we need anyway to
MACRUM 0:119624335925 584 * wait for some data on the RECV side to avoid overflow on TX side, the
MACRUM 0:119624335925 585 * tiemout is defined in higher layer */
MACRUM 0:119624335925 586 if (keep_to != _timeout) {
MACRUM 0:119624335925 587 if (!(_parser.send("R2=%d", _timeout) && check_response())) {
MACRUM 0:119624335925 588 return -1;
MACRUM 0:119624335925 589 }
MACRUM 0:119624335925 590 keep_to = _timeout;
MACRUM 0:119624335925 591 }
MACRUM 0:119624335925 592
MACRUM 0:119624335925 593 if (!_parser.send("R0")) {
MACRUM 0:119624335925 594 return -1;
MACRUM 0:119624335925 595 }
MACRUM 0:119624335925 596 read_amount = _parser.read((char *)data);
MACRUM 0:119624335925 597
MACRUM 0:119624335925 598 if(read_amount < 0) {
MACRUM 0:119624335925 599 debug_if(_ism_debug, "ISM43362: ERROR in data RECV, timeout?\r\n");
MACRUM 0:119624335925 600 return -1; /* nothing to read */
MACRUM 0:119624335925 601 }
MACRUM 0:119624335925 602
MACRUM 0:119624335925 603 /* If there are spurious 0x15 at the end of the data, this is an error
MACRUM 0:119624335925 604 * we hall can get rid off of them :-(
MACRUM 0:119624335925 605 * This should not happen, but let's try to clean-up anyway
MACRUM 0:119624335925 606 */
MACRUM 0:119624335925 607 char *cleanup = (char *) data;
MACRUM 0:119624335925 608 while ((read_amount > 0) && (cleanup[read_amount-1] == 0x15)) {
MACRUM 0:119624335925 609 debug_if(_ism_debug, "ISM43362: spurious 0X15 trashed\r\n");
MACRUM 0:119624335925 610 /* Remove the trailling char then search again */
MACRUM 0:119624335925 611 read_amount--;
MACRUM 0:119624335925 612 }
MACRUM 0:119624335925 613
MACRUM 0:119624335925 614 if ((read_amount >= 6) && (strncmp("OK\r\n> ", (char *)data, 6) == 0)) {
MACRUM 0:119624335925 615 debug_if(_ism_debug, "ISM43362: recv 2 nothing to read=%d\r\n", read_amount);
MACRUM 0:119624335925 616 return 0; /* nothing to read */
MACRUM 0:119624335925 617 } else if ((read_amount >= 8) && (strncmp((char *)((uint32_t) data + read_amount - 8), "\r\nOK\r\n> ", 8)) == 0) {
MACRUM 0:119624335925 618 /* bypass ""\r\nOK\r\n> " if present at the end of the chain */
MACRUM 0:119624335925 619 read_amount -= 8;
MACRUM 0:119624335925 620 } else {
MACRUM 0:119624335925 621 debug_if(_ism_debug, "ISM43362: ERROR in data RECV?, flushing %d bytes\r\n", read_amount);
MACRUM 0:119624335925 622 int i = 0;
MACRUM 0:119624335925 623 debug_if(_ism_debug, "ISM43362: ");
MACRUM 0:119624335925 624 for (i = 0; i < read_amount; i++) {
MACRUM 0:119624335925 625 debug_if(_ism_debug, "%2X ", cleanup[i]);
MACRUM 0:119624335925 626 }
MACRUM 0:119624335925 627 cleanup[i] = 0;
MACRUM 0:119624335925 628 debug_if(_ism_debug, "\r\n%s\r\n", cleanup);
MACRUM 0:119624335925 629 return -1; /* nothing to read */
MACRUM 0:119624335925 630 }
MACRUM 0:119624335925 631
MACRUM 0:119624335925 632 debug_if(_ism_debug, "ISM43362: read_amount=%d\r\n", read_amount);
MACRUM 0:119624335925 633 return read_amount;
MACRUM 0:119624335925 634 }
MACRUM 0:119624335925 635
MACRUM 0:119624335925 636 bool ISM43362::close(int id)
MACRUM 0:119624335925 637 {
MACRUM 0:119624335925 638 if ((id <0) || (id > 3)) {
MACRUM 0:119624335925 639 debug_if(_ism_debug,"ISM43362: Wrong socket number\n");
MACRUM 0:119624335925 640 return false;
MACRUM 0:119624335925 641 }
MACRUM 0:119624335925 642 /* Set connection on this socket */
MACRUM 0:119624335925 643 debug_if(_ism_debug,"ISM43362: CLOSE socket id=%d\n", id);
MACRUM 0:119624335925 644 _active_id = id;
MACRUM 0:119624335925 645 if (!(_parser.send("P0=%d", id) && check_response())) {
MACRUM 0:119624335925 646 return false;
MACRUM 0:119624335925 647 }
MACRUM 0:119624335925 648 /* close this socket */
MACRUM 0:119624335925 649 if (!(_parser.send("P6=0") && check_response())) {
MACRUM 0:119624335925 650 return false;
MACRUM 0:119624335925 651 }
MACRUM 0:119624335925 652 return true;
MACRUM 0:119624335925 653 }
MACRUM 0:119624335925 654
MACRUM 0:119624335925 655 void ISM43362::setTimeout(uint32_t timeout_ms)
MACRUM 0:119624335925 656 {
MACRUM 0:119624335925 657 _timeout = timeout_ms;
MACRUM 0:119624335925 658 _parser.setTimeout(timeout_ms);
MACRUM 0:119624335925 659 }
MACRUM 0:119624335925 660
MACRUM 0:119624335925 661 bool ISM43362::readable()
MACRUM 0:119624335925 662 {
MACRUM 0:119624335925 663 /* not applicable with SPI api */
MACRUM 0:119624335925 664 return true;
MACRUM 0:119624335925 665 }
MACRUM 0:119624335925 666
MACRUM 0:119624335925 667 bool ISM43362::writeable()
MACRUM 0:119624335925 668 {
MACRUM 0:119624335925 669 /* not applicable with SPI api */
MACRUM 0:119624335925 670 return true;
MACRUM 0:119624335925 671 }
MACRUM 0:119624335925 672
MACRUM 0:119624335925 673 void ISM43362::attach(Callback<void()> func)
MACRUM 0:119624335925 674 {
MACRUM 0:119624335925 675 /* not applicable with SPI api */
MACRUM 0:119624335925 676 }
MACRUM 0:119624335925 677