Qubit 2020 / presensfirmwareupdate

Dependencies:   mbed

Committer:
whiteheadrf
Date:
Thu Jun 23 19:33:33 2022 +0000
Revision:
2:4603eae79fb6
Parent:
1:eac9f7a0488f
version for xbee wifi, new presens boards with firmware update to include view0005 and 4 wire pumps

Who changed what in which revision?

UserRevisionLine numberNew contents of line
whiteheadrf 0:1121a7ef2e36 1 #include <stdarg.h>
whiteheadrf 0:1121a7ef2e36 2
whiteheadrf 0:1121a7ef2e36 3 #include "cisme.h"
whiteheadrf 0:1121a7ef2e36 4 #include "wifi.h"
whiteheadrf 0:1121a7ef2e36 5 #include "debug.h"
whiteheadrf 0:1121a7ef2e36 6
whiteheadrf 0:1121a7ef2e36 7 #ifdef USE_WIFI
whiteheadrf 0:1121a7ef2e36 8
whiteheadrf 0:1121a7ef2e36 9 /* Wifi comm settings. */
whiteheadrf 0:1121a7ef2e36 10 #define WIFI_BAUD 9600
whiteheadrf 0:1121a7ef2e36 11 /* The number of bits in a word (5-8; default = 8) */
whiteheadrf 0:1121a7ef2e36 12 #define WIFI_NO_BITS 8
whiteheadrf 0:1121a7ef2e36 13 /* parity - The parity used (Serial::None, Serial::Odd, Serial::Even, Serial::Forced1, Serial::Forced0; default = Serial::None) */
whiteheadrf 0:1121a7ef2e36 14 #define WIFI_PARITY Serial::None
whiteheadrf 0:1121a7ef2e36 15 /* stop - The number of stop bits (1 or 2; default = 1) */
whiteheadrf 0:1121a7ef2e36 16 #define WIFI_NO_STOP_BITS 1
whiteheadrf 0:1121a7ef2e36 17
whiteheadrf 0:1121a7ef2e36 18 /* Wifi module settings. */
whiteheadrf 0:1121a7ef2e36 19 #define WIFI_IP_LOCAL_ADDRESS "192.168.1.10"
whiteheadrf 0:1121a7ef2e36 20 #define WIFI_IP_LOCAL_PORT 2000
whiteheadrf 0:1121a7ef2e36 21 #define WIFI_IP_DHCP 4 /* Enable DHCP in the soft AP mode. */
whiteheadrf 0:1121a7ef2e36 22 #define WIFI_IP_NET "255.255.255.0"
whiteheadrf 0:1121a7ef2e36 23
whiteheadrf 0:1121a7ef2e36 24 #define WIFI_IP_PROTOCOL 2 // TCP server
whiteheadrf 0:1121a7ef2e36 25
whiteheadrf 0:1121a7ef2e36 26 #define WIFI_OPT_DEVICE_ID "CISME"
whiteheadrf 0:1121a7ef2e36 27 #define WIFI_WLAN_SSID "CISME"
whiteheadrf 0:1121a7ef2e36 28 #define WIFI_WLAN_PASSWORD "CISME"
whiteheadrf 0:1121a7ef2e36 29
whiteheadrf 0:1121a7ef2e36 30 #define WIFI_WLAN_JOIN 7
whiteheadrf 0:1121a7ef2e36 31
whiteheadrf 0:1121a7ef2e36 32 #define WIFI_CMD_MODE_DELAY 1
whiteheadrf 0:1121a7ef2e36 33 #define WIFI_CMD_DELAY 0.5
whiteheadrf 0:1121a7ef2e36 34
whiteheadrf 0:1121a7ef2e36 35 #define WIFI_ENTER_CMD_MODE_RESPONCE "OK"
whiteheadrf 0:1121a7ef2e36 36 #define WIFI_EXIT_CMD_MODE_RESPONCE "OK"
whiteheadrf 0:1121a7ef2e36 37 #define WIFI_NORMAL_CMD_RESPONSE "OK"
whiteheadrf 0:1121a7ef2e36 38
whiteheadrf 2:4603eae79fb6 39 #define WIFI_MESSAGE_BUF_LENGTH 1024
whiteheadrf 0:1121a7ef2e36 40
whiteheadrf 0:1121a7ef2e36 41 #define OK 0
whiteheadrf 0:1121a7ef2e36 42 #define NOK 1
whiteheadrf 0:1121a7ef2e36 43
whiteheadrf 0:1121a7ef2e36 44 #define MSG_TAG_TYPE 0x08
whiteheadrf 0:1121a7ef2e36 45 #define MSG_TAG_PAYLOAD 0x12
whiteheadrf 0:1121a7ef2e36 46
whiteheadrf 0:1121a7ef2e36 47 static Serial wifiComm(p13, p14);
whiteheadrf 0:1121a7ef2e36 48 static DigitalOut reset_pin(p19);
whiteheadrf 0:1121a7ef2e36 49 static DigitalIn tcpStatus(p17);
whiteheadrf 0:1121a7ef2e36 50 static uint8_t msgBuffer[WIFI_MESSAGE_BUF_LENGTH];
whiteheadrf 0:1121a7ef2e36 51
whiteheadrf 0:1121a7ef2e36 52 static int writeIx;
whiteheadrf 0:1121a7ef2e36 53 static int readIx;
whiteheadrf 0:1121a7ef2e36 54 static bool isCmdModeActive = false;
whiteheadrf 0:1121a7ef2e36 55
whiteheadrf 0:1121a7ef2e36 56 static void reset(void)
whiteheadrf 0:1121a7ef2e36 57 {
whiteheadrf 0:1121a7ef2e36 58 wait(0.5);
whiteheadrf 0:1121a7ef2e36 59 reset_pin = 0;
whiteheadrf 0:1121a7ef2e36 60 /* clean in buffer. */
whiteheadrf 0:1121a7ef2e36 61 readIx = writeIx;
whiteheadrf 0:1121a7ef2e36 62 wait(0.5);
whiteheadrf 0:1121a7ef2e36 63 reset_pin = 1;
whiteheadrf 0:1121a7ef2e36 64 wait(0.5);
whiteheadrf 0:1121a7ef2e36 65 }
whiteheadrf 0:1121a7ef2e36 66
whiteheadrf 0:1121a7ef2e36 67 static void wifiCallback(void)
whiteheadrf 0:1121a7ef2e36 68 {
whiteheadrf 0:1121a7ef2e36 69 msgBuffer[writeIx] = wifiComm.getc();
whiteheadrf 0:1121a7ef2e36 70
whiteheadrf 0:1121a7ef2e36 71 writeIx = (writeIx == WIFI_MESSAGE_BUF_LENGTH - 1) ? 0 : writeIx + 1;
whiteheadrf 0:1121a7ef2e36 72
whiteheadrf 0:1121a7ef2e36 73 if (writeIx == readIx) {
whiteheadrf 0:1121a7ef2e36 74 ERROR("Wi-Fi message buffer overflow");
whiteheadrf 0:1121a7ef2e36 75 readIx = (readIx == WIFI_MESSAGE_BUF_LENGTH - 1)? 0 : readIx + 1;
whiteheadrf 0:1121a7ef2e36 76 }
whiteheadrf 0:1121a7ef2e36 77 }
whiteheadrf 0:1121a7ef2e36 78
whiteheadrf 0:1121a7ef2e36 79 static char* wifiGetStringMessage(void)
whiteheadrf 0:1121a7ef2e36 80 {
whiteheadrf 0:1121a7ef2e36 81 char* msg;
whiteheadrf 0:1121a7ef2e36 82
whiteheadrf 0:1121a7ef2e36 83 size_t msgLen = wifiGetMessage((uint8_t**)&msg);
whiteheadrf 0:1121a7ef2e36 84 if (msgLen == 0) {
whiteheadrf 0:1121a7ef2e36 85 return "";
whiteheadrf 0:1121a7ef2e36 86 }
whiteheadrf 0:1121a7ef2e36 87
whiteheadrf 0:1121a7ef2e36 88 msg[msgLen] = 0;
whiteheadrf 0:1121a7ef2e36 89 DEBUG1("Received message={%s}", msg);
whiteheadrf 0:1121a7ef2e36 90
whiteheadrf 0:1121a7ef2e36 91 return msg;
whiteheadrf 0:1121a7ef2e36 92 }
whiteheadrf 0:1121a7ef2e36 93
whiteheadrf 0:1121a7ef2e36 94 static void wifiSendString(const char* format, ...)
whiteheadrf 0:1121a7ef2e36 95 {
whiteheadrf 0:1121a7ef2e36 96 static char messageToSend[WIFI_MESSAGE_MAX_LENGTH];
whiteheadrf 0:1121a7ef2e36 97 va_list params;
whiteheadrf 0:1121a7ef2e36 98
whiteheadrf 0:1121a7ef2e36 99 va_start(params, format);
whiteheadrf 0:1121a7ef2e36 100
whiteheadrf 0:1121a7ef2e36 101 vsnprintf(messageToSend, WIFI_MESSAGE_MAX_LENGTH, format, params);
whiteheadrf 0:1121a7ef2e36 102
whiteheadrf 0:1121a7ef2e36 103 va_end(params);
whiteheadrf 0:1121a7ef2e36 104
whiteheadrf 0:1121a7ef2e36 105 wifiSendMessage((uint8_t*)messageToSend, strlen(messageToSend));
whiteheadrf 0:1121a7ef2e36 106 }
whiteheadrf 0:1121a7ef2e36 107
whiteheadrf 0:1121a7ef2e36 108 static bool wifiCheckResponse(const char* expectedRsp)
whiteheadrf 0:1121a7ef2e36 109 {
whiteheadrf 0:1121a7ef2e36 110 char* response = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 111
whiteheadrf 0:1121a7ef2e36 112 if (strstr(response, expectedRsp) == NULL) {
whiteheadrf 0:1121a7ef2e36 113 ERROR("Unexpected response. Expected:{%s} Received:{%s}", expectedRsp, response);
whiteheadrf 0:1121a7ef2e36 114 return false;
whiteheadrf 0:1121a7ef2e36 115 }
whiteheadrf 0:1121a7ef2e36 116
whiteheadrf 0:1121a7ef2e36 117 return true;
whiteheadrf 0:1121a7ef2e36 118 }
whiteheadrf 0:1121a7ef2e36 119
whiteheadrf 0:1121a7ef2e36 120 static int wifiEnterCmdMode(void)
whiteheadrf 0:1121a7ef2e36 121 {
whiteheadrf 0:1121a7ef2e36 122 isCmdModeActive = true;
whiteheadrf 0:1121a7ef2e36 123 wifiSendString("+++");
whiteheadrf 0:1121a7ef2e36 124 wait(WIFI_CMD_MODE_DELAY);
whiteheadrf 0:1121a7ef2e36 125 wait(WIFI_CMD_MODE_DELAY);
whiteheadrf 0:1121a7ef2e36 126 wifiSendString("+++");
whiteheadrf 0:1121a7ef2e36 127 /*
whiteheadrf 0:1121a7ef2e36 128 * According to user guied fo the device there is 500ms delay during which it's better to not sent anything
whiteheadrf 0:1121a7ef2e36 129 * before entering to CMD mode. Otherwise the string will be treated as data and sent to client
whiteheadrf 0:1121a7ef2e36 130 * through the socket.
whiteheadrf 0:1121a7ef2e36 131 */
whiteheadrf 0:1121a7ef2e36 132 wait(WIFI_CMD_MODE_DELAY);
whiteheadrf 0:1121a7ef2e36 133 wait(WIFI_CMD_MODE_DELAY);
whiteheadrf 0:1121a7ef2e36 134 if (!wifiCheckResponse(WIFI_ENTER_CMD_MODE_RESPONCE)) {
whiteheadrf 0:1121a7ef2e36 135 ERROR("Failed to enter CMD mode");
whiteheadrf 0:1121a7ef2e36 136 isCmdModeActive = false;
whiteheadrf 0:1121a7ef2e36 137 return NOK;
whiteheadrf 0:1121a7ef2e36 138 }
whiteheadrf 0:1121a7ef2e36 139
whiteheadrf 0:1121a7ef2e36 140 return OK;
whiteheadrf 0:1121a7ef2e36 141 }
whiteheadrf 0:1121a7ef2e36 142
whiteheadrf 0:1121a7ef2e36 143 static int wifiExitCmdMode(void)
whiteheadrf 0:1121a7ef2e36 144 {
whiteheadrf 0:1121a7ef2e36 145 wifiSendString("atcn\r");
whiteheadrf 0:1121a7ef2e36 146 wait(WIFI_CMD_MODE_DELAY);
whiteheadrf 0:1121a7ef2e36 147
whiteheadrf 0:1121a7ef2e36 148 if (!wifiCheckResponse(WIFI_EXIT_CMD_MODE_RESPONCE)) {
whiteheadrf 0:1121a7ef2e36 149 ERROR("Something was wrong on exit from CMD mode");
whiteheadrf 0:1121a7ef2e36 150 return NOK;
whiteheadrf 0:1121a7ef2e36 151 }
whiteheadrf 0:1121a7ef2e36 152
whiteheadrf 0:1121a7ef2e36 153 isCmdModeActive = false;
whiteheadrf 0:1121a7ef2e36 154 return OK;
whiteheadrf 0:1121a7ef2e36 155 }
whiteheadrf 0:1121a7ef2e36 156
whiteheadrf 0:1121a7ef2e36 157 static void wifiConfig(void)
whiteheadrf 0:1121a7ef2e36 158 {
whiteheadrf 0:1121a7ef2e36 159 char* message_temp;
whiteheadrf 0:1121a7ef2e36 160 char* charIt;
whiteheadrf 0:1121a7ef2e36 161 char* new_var1;
whiteheadrf 0:1121a7ef2e36 162 char* new_var2;
whiteheadrf 2:4603eae79fb6 163 char* rf_payload_bytes;
whiteheadrf 0:1121a7ef2e36 164
whiteheadrf 0:1121a7ef2e36 165 /*
whiteheadrf 0:1121a7ef2e36 166 * Two step of configuration needed, since some parameters
whiteheadrf 0:1121a7ef2e36 167 * can be applied only after restart, but due to unknown reason
whiteheadrf 0:1121a7ef2e36 168 * some of them are not restored after restart.
whiteheadrf 0:1121a7ef2e36 169 */
whiteheadrf 0:1121a7ef2e36 170
whiteheadrf 0:1121a7ef2e36 171 /* clean in buffer to skip greetings. */
whiteheadrf 0:1121a7ef2e36 172 readIx = writeIx;
whiteheadrf 0:1121a7ef2e36 173
whiteheadrf 0:1121a7ef2e36 174 if (wifiEnterCmdMode() != OK) {
whiteheadrf 0:1121a7ef2e36 175 return;
whiteheadrf 0:1121a7ef2e36 176 }
whiteheadrf 0:1121a7ef2e36 177
whiteheadrf 0:1121a7ef2e36 178 // Set the network type to infrastructure
whiteheadrf 0:1121a7ef2e36 179 wifiSendString("ATAH 2\r");
whiteheadrf 0:1121a7ef2e36 180 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 181 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 182
whiteheadrf 0:1121a7ef2e36 183 // Set the infrastructure mode to soft access point
whiteheadrf 0:1121a7ef2e36 184 wifiSendString("ATCE 1\r");
whiteheadrf 0:1121a7ef2e36 185 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 186 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 187
whiteheadrf 0:1121a7ef2e36 188 // Set the ip protocol to TCP
whiteheadrf 0:1121a7ef2e36 189 wifiSendString("ATIP 1\r");
whiteheadrf 0:1121a7ef2e36 190 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 191 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 192
whiteheadrf 0:1121a7ef2e36 193 // Set the ip addressing mode to Static
whiteheadrf 0:1121a7ef2e36 194 wifiSendString("ATMA 1\r");
whiteheadrf 0:1121a7ef2e36 195 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 196 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 197
whiteheadrf 0:1121a7ef2e36 198 // Set Serial Interface
whiteheadrf 0:1121a7ef2e36 199 // Set Baud Rate to 9600
whiteheadrf 0:1121a7ef2e36 200 wifiSendString("ATBD 3\r");
whiteheadrf 0:1121a7ef2e36 201 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 202 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 203
whiteheadrf 0:1121a7ef2e36 204 // Set API Enable to Transparent mode
whiteheadrf 0:1121a7ef2e36 205 wifiSendString("ATAP 0\r");
whiteheadrf 0:1121a7ef2e36 206 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 207 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 208
whiteheadrf 0:1121a7ef2e36 209 // IO Functions
whiteheadrf 0:1121a7ef2e36 210 wifiSendString("ATP2 6\r");
whiteheadrf 0:1121a7ef2e36 211 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 212 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 213
whiteheadrf 0:1121a7ef2e36 214 // Addressing
whiteheadrf 0:1121a7ef2e36 215 // Broadcasting destination
whiteheadrf 0:1121a7ef2e36 216 wifiSendString("ATDL FFFFFFFF\r");
whiteheadrf 0:1121a7ef2e36 217 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 218 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 219
whiteheadrf 0:1121a7ef2e36 220 //DNS
whiteheadrf 0:1121a7ef2e36 221 wifiSendString("ATNS 0\r");
whiteheadrf 0:1121a7ef2e36 222 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 223 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 224
whiteheadrf 0:1121a7ef2e36 225 //Module IP Address 192.168.1.10 in hex
whiteheadrf 0:1121a7ef2e36 226 wifiSendString("ATMY C0A8010A\r");
whiteheadrf 0:1121a7ef2e36 227 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 228 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 229
whiteheadrf 0:1121a7ef2e36 230 //Gateway Address
whiteheadrf 0:1121a7ef2e36 231 wifiSendString("ATGW C0A80101\r");
whiteheadrf 0:1121a7ef2e36 232 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 233 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 234
whiteheadrf 0:1121a7ef2e36 235 // Local and source port number 2000 in hex
whiteheadrf 0:1121a7ef2e36 236 wifiSendString("ATDE 7D0\r");
whiteheadrf 0:1121a7ef2e36 237 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 238 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 239
whiteheadrf 0:1121a7ef2e36 240 wifiSendString("ATC0 7D0\r");
whiteheadrf 0:1121a7ef2e36 241 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 242 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 243
whiteheadrf 0:1121a7ef2e36 244 //Mask
whiteheadrf 0:1121a7ef2e36 245 wifiSendString("ATMK FFFFFF00\r");
whiteheadrf 0:1121a7ef2e36 246 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 247 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 248
whiteheadrf 0:1121a7ef2e36 249 INFO("Get mac");
whiteheadrf 0:1121a7ef2e36 250 wifiSendString("ATSH\r");
whiteheadrf 0:1121a7ef2e36 251 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 252 message_temp = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 253 new_var1 = (char*) malloc (strlen(message_temp)+1);
whiteheadrf 0:1121a7ef2e36 254
whiteheadrf 0:1121a7ef2e36 255 charIt = message_temp;
whiteheadrf 0:1121a7ef2e36 256 int charWriteIx = 0;
whiteheadrf 0:1121a7ef2e36 257 //Removing <cr> in the string.
whiteheadrf 0:1121a7ef2e36 258 for (; *charIt >= '0'; charIt++) {
whiteheadrf 0:1121a7ef2e36 259 new_var1[charWriteIx++] = *charIt;
whiteheadrf 0:1121a7ef2e36 260 }
whiteheadrf 0:1121a7ef2e36 261
whiteheadrf 0:1121a7ef2e36 262 //new_var1 = (char*) malloc (strlen(message_temp)+1);
whiteheadrf 0:1121a7ef2e36 263 //memcpy ( new_var1, message_temp, strlen(message_temp)+1 );
whiteheadrf 0:1121a7ef2e36 264
whiteheadrf 0:1121a7ef2e36 265 wifiSendString("ATSL\r");
whiteheadrf 0:1121a7ef2e36 266 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 267 message_temp = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 268 new_var2 = (char*) malloc (strlen(message_temp)+1);
whiteheadrf 0:1121a7ef2e36 269 memcpy ( new_var2, message_temp, strlen(message_temp)+1 );
whiteheadrf 0:1121a7ef2e36 270 INFO("Wifi's module MAC address:{%s%s}", new_var1, new_var2);
whiteheadrf 2:4603eae79fb6 271
whiteheadrf 2:4603eae79fb6 272
whiteheadrf 0:1121a7ef2e36 273 //message_temp[charWriteIx] = 0;
whiteheadrf 0:1121a7ef2e36 274 //INFO("Wifi's module MAC address:{%s}", message_temp);
whiteheadrf 0:1121a7ef2e36 275
whiteheadrf 0:1121a7ef2e36 276 snprintf(instrumentId, 18, "CISME%s%s", new_var1, new_var2);
whiteheadrf 0:1121a7ef2e36 277
whiteheadrf 0:1121a7ef2e36 278
whiteheadrf 0:1121a7ef2e36 279 wifiSendString("ATID CISME%s%s\r", new_var1, new_var2);
whiteheadrf 0:1121a7ef2e36 280 //wifiSendString("ATID CISME\r");
whiteheadrf 0:1121a7ef2e36 281 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 282 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 283
whiteheadrf 0:1121a7ef2e36 284 // Set the ip addressing mode to DHCP
whiteheadrf 0:1121a7ef2e36 285 //wifiSendString("ATMA 0\r");
whiteheadrf 0:1121a7ef2e36 286 //wait(WIFI_CMD_DELAY);
whiteheadrf 2:4603eae79fb6 287 //wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 2:4603eae79fb6 288
whiteheadrf 2:4603eae79fb6 289 //get rf payload buffer size in hex
whiteheadrf 2:4603eae79fb6 290 wifiSendString("ATNP\r");
whiteheadrf 2:4603eae79fb6 291 wait(WIFI_CMD_DELAY);
whiteheadrf 2:4603eae79fb6 292 rf_payload_bytes = wifiGetStringMessage();
whiteheadrf 2:4603eae79fb6 293 INFO("Wifi's RF payload bytes:{%s}", rf_payload_bytes);
whiteheadrf 2:4603eae79fb6 294
whiteheadrf 2:4603eae79fb6 295
whiteheadrf 0:1121a7ef2e36 296 wifiSendString("ATAC\r");
whiteheadrf 0:1121a7ef2e36 297 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 298 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 299
whiteheadrf 0:1121a7ef2e36 300 // Apply and Write the Parameters, Storing in config
whiteheadrf 0:1121a7ef2e36 301 wifiSendString("ATWR\r");
whiteheadrf 0:1121a7ef2e36 302 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 303 wifiCheckResponse(WIFI_NORMAL_CMD_RESPONSE);
whiteheadrf 0:1121a7ef2e36 304
whiteheadrf 0:1121a7ef2e36 305 wifiExitCmdMode();
whiteheadrf 0:1121a7ef2e36 306 }
whiteheadrf 0:1121a7ef2e36 307
whiteheadrf 0:1121a7ef2e36 308 static int wifiGetExpectedMessageSize()
whiteheadrf 0:1121a7ef2e36 309 {
whiteheadrf 0:1121a7ef2e36 310 int expectedMsgSize = 0;
whiteheadrf 0:1121a7ef2e36 311 int byteIter;
whiteheadrf 0:1121a7ef2e36 312 int sizeByteIx = 0;
whiteheadrf 0:1121a7ef2e36 313 int localReadIx = readIx;
whiteheadrf 0:1121a7ef2e36 314 int localWriteIx = writeIx;
whiteheadrf 0:1121a7ef2e36 315
whiteheadrf 0:1121a7ef2e36 316 if (isCmdModeActive == true) {
whiteheadrf 0:1121a7ef2e36 317 /*
whiteheadrf 0:1121a7ef2e36 318 * In the CMD mode size of expected message is not defined, so
whiteheadrf 0:1121a7ef2e36 319 * everything that received is expected.
whiteheadrf 0:1121a7ef2e36 320 */
whiteheadrf 0:1121a7ef2e36 321 return (localReadIx > localWriteIx) ?
whiteheadrf 0:1121a7ef2e36 322 (WIFI_MESSAGE_BUF_LENGTH - localReadIx + localWriteIx) :
whiteheadrf 0:1121a7ef2e36 323 (localWriteIx - localReadIx);
whiteheadrf 0:1121a7ef2e36 324 }
whiteheadrf 0:1121a7ef2e36 325 /* size can be more than one byte. */
whiteheadrf 0:1121a7ef2e36 326 byteIter = localReadIx + 3;
whiteheadrf 0:1121a7ef2e36 327 if (byteIter > WIFI_MESSAGE_BUF_LENGTH - 1) {
whiteheadrf 0:1121a7ef2e36 328 byteIter -= WIFI_MESSAGE_BUF_LENGTH;
whiteheadrf 0:1121a7ef2e36 329 }
whiteheadrf 0:1121a7ef2e36 330
whiteheadrf 0:1121a7ef2e36 331 int payloadTagIx = (localReadIx + 2) > (WIFI_MESSAGE_BUF_LENGTH - 1) ?
whiteheadrf 0:1121a7ef2e36 332 (localReadIx + 2 - WIFI_MESSAGE_BUF_LENGTH) :
whiteheadrf 0:1121a7ef2e36 333 (localReadIx + 2);
whiteheadrf 0:1121a7ef2e36 334 if (msgBuffer[localReadIx] != MSG_TAG_TYPE || msgBuffer[payloadTagIx] != MSG_TAG_PAYLOAD) {
whiteheadrf 0:1121a7ef2e36 335 INFO("Message is broken, dropping all received messages.");
whiteheadrf 0:1121a7ef2e36 336 readIx = writeIx;
whiteheadrf 0:1121a7ef2e36 337 return 0;
whiteheadrf 0:1121a7ef2e36 338 }
whiteheadrf 0:1121a7ef2e36 339
whiteheadrf 0:1121a7ef2e36 340 /* Starting collection of message size. */
whiteheadrf 0:1121a7ef2e36 341 do {
whiteheadrf 0:1121a7ef2e36 342 expectedMsgSize |= (msgBuffer[byteIter] & (~0x80)) << (7 * sizeByteIx);
whiteheadrf 0:1121a7ef2e36 343 sizeByteIx++;
whiteheadrf 0:1121a7ef2e36 344
whiteheadrf 0:1121a7ef2e36 345 /* Check: is this the last byte of size? the last byte has the highest bit 0. */
whiteheadrf 0:1121a7ef2e36 346 if ((msgBuffer[byteIter] & 0x80) == 0) {
whiteheadrf 0:1121a7ef2e36 347 break;
whiteheadrf 0:1121a7ef2e36 348 }
whiteheadrf 0:1121a7ef2e36 349
whiteheadrf 0:1121a7ef2e36 350 byteIter = (byteIter == WIFI_MESSAGE_BUF_LENGTH - 1) ? 0 : byteIter + 1;
whiteheadrf 0:1121a7ef2e36 351 } while (byteIter != localWriteIx);
whiteheadrf 0:1121a7ef2e36 352
whiteheadrf 0:1121a7ef2e36 353 if (byteIter == localWriteIx) {
whiteheadrf 0:1121a7ef2e36 354 /* Receiving of message was finished in the middle of size field. */
whiteheadrf 0:1121a7ef2e36 355 DEBUG1("Size of message is not fully received. current size of size field is %d current size field is %d", sizeByteIx, expectedMsgSize);
whiteheadrf 0:1121a7ef2e36 356 return 0;
whiteheadrf 0:1121a7ef2e36 357 }
whiteheadrf 0:1121a7ef2e36 358
whiteheadrf 0:1121a7ef2e36 359 /* 4 is minimal size message header. (tag, msgId, tag, msgSize[0])*/
whiteheadrf 0:1121a7ef2e36 360 return expectedMsgSize + 3 + sizeByteIx;
whiteheadrf 0:1121a7ef2e36 361 }
whiteheadrf 0:1121a7ef2e36 362
whiteheadrf 0:1121a7ef2e36 363 void wifiInit(void)
whiteheadrf 0:1121a7ef2e36 364 {
whiteheadrf 0:1121a7ef2e36 365 char* responce;
whiteheadrf 0:1121a7ef2e36 366
whiteheadrf 0:1121a7ef2e36 367 /* Set settings for the Serial port for WIFI. */
whiteheadrf 0:1121a7ef2e36 368 wifiComm.baud(WIFI_BAUD);
whiteheadrf 0:1121a7ef2e36 369
whiteheadrf 0:1121a7ef2e36 370 wifiComm.format(WIFI_NO_BITS, WIFI_PARITY, WIFI_NO_STOP_BITS);
whiteheadrf 0:1121a7ef2e36 371 reset_pin=1;
whiteheadrf 0:1121a7ef2e36 372 reset();
whiteheadrf 0:1121a7ef2e36 373 wait(WIFI_CMD_DELAY);
whiteheadrf 0:1121a7ef2e36 374 INFO("Hardware reset done");
whiteheadrf 0:1121a7ef2e36 375
whiteheadrf 0:1121a7ef2e36 376 wifiComm.attach(&wifiCallback, Serial::RxIrq);
whiteheadrf 0:1121a7ef2e36 377
whiteheadrf 0:1121a7ef2e36 378 INFO("Reconfiguring WIFI module");
whiteheadrf 0:1121a7ef2e36 379 wifiConfig();
whiteheadrf 0:1121a7ef2e36 380
whiteheadrf 0:1121a7ef2e36 381 if ((debugGetCurrLvl() >= DEBUG_LEVEL_1) && wifiEnterCmdMode() == OK) {
whiteheadrf 0:1121a7ef2e36 382
whiteheadrf 0:1121a7ef2e36 383 wifiSendString("ATMY\r");
whiteheadrf 0:1121a7ef2e36 384 wait(1);
whiteheadrf 0:1121a7ef2e36 385 responce = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 386 INFO("Current IP settings:\n\r%s", responce);
whiteheadrf 0:1121a7ef2e36 387
whiteheadrf 0:1121a7ef2e36 388 wifiSendString("ATGW\r");
whiteheadrf 0:1121a7ef2e36 389 wait(1);
whiteheadrf 0:1121a7ef2e36 390 responce = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 391 INFO("Current wlan settings:\n\r%s", responce);
whiteheadrf 0:1121a7ef2e36 392
whiteheadrf 0:1121a7ef2e36 393 wifiSendString("ATDL\r");
whiteheadrf 0:1121a7ef2e36 394 wait(1);
whiteheadrf 0:1121a7ef2e36 395 responce = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 396 INFO("Current broadcast settings:\n\r%s", responce);
whiteheadrf 0:1121a7ef2e36 397
whiteheadrf 0:1121a7ef2e36 398 wifiSendString("ATNS\r");
whiteheadrf 0:1121a7ef2e36 399 wait(1);
whiteheadrf 0:1121a7ef2e36 400 responce = wifiGetStringMessage();
whiteheadrf 0:1121a7ef2e36 401 INFO("Current dns settings:\n\r%s", responce);
whiteheadrf 0:1121a7ef2e36 402
whiteheadrf 0:1121a7ef2e36 403 wifiExitCmdMode();
whiteheadrf 1:eac9f7a0488f 404
whiteheadrf 0:1121a7ef2e36 405 }
whiteheadrf 0:1121a7ef2e36 406
whiteheadrf 0:1121a7ef2e36 407 INFO("Reconfiguration done");
whiteheadrf 0:1121a7ef2e36 408 }
whiteheadrf 0:1121a7ef2e36 409
whiteheadrf 0:1121a7ef2e36 410 size_t wifiGetMessage(uint8_t** msg)
whiteheadrf 0:1121a7ef2e36 411 {
whiteheadrf 0:1121a7ef2e36 412 static uint8_t receivedMessage[WIFI_MESSAGE_MAX_LENGTH + 1];
whiteheadrf 0:1121a7ef2e36 413 int localReadIx = readIx;
whiteheadrf 0:1121a7ef2e36 414 int localWriteIx = writeIx;
whiteheadrf 0:1121a7ef2e36 415 int targetPlace = 0;
whiteheadrf 0:1121a7ef2e36 416 int sizeOfReceived;
whiteheadrf 0:1121a7ef2e36 417 int expectedMsgSize = 0;
whiteheadrf 0:1121a7ef2e36 418
whiteheadrf 0:1121a7ef2e36 419 if (readIx == writeIx) {
whiteheadrf 0:1121a7ef2e36 420 DEBUG1("No message received");
whiteheadrf 0:1121a7ef2e36 421 return 0;
whiteheadrf 0:1121a7ef2e36 422 }
whiteheadrf 0:1121a7ef2e36 423
whiteheadrf 0:1121a7ef2e36 424 sizeOfReceived = (localReadIx > localWriteIx)? WIFI_MESSAGE_BUF_LENGTH - localReadIx + localWriteIx : localWriteIx - localReadIx;
whiteheadrf 0:1121a7ef2e36 425
whiteheadrf 0:1121a7ef2e36 426 if (sizeOfReceived < 4 && isCmdModeActive == false) {
whiteheadrf 0:1121a7ef2e36 427 // size of message is not received
whiteheadrf 0:1121a7ef2e36 428 DEBUG1("Size of message is not received. sizeOfReceived=%d", sizeOfReceived);
whiteheadrf 0:1121a7ef2e36 429 return 0;
whiteheadrf 0:1121a7ef2e36 430 }
whiteheadrf 0:1121a7ef2e36 431
whiteheadrf 0:1121a7ef2e36 432 expectedMsgSize = wifiGetExpectedMessageSize();
whiteheadrf 0:1121a7ef2e36 433
whiteheadrf 0:1121a7ef2e36 434 if (expectedMsgSize == 0 || expectedMsgSize > sizeOfReceived) {
whiteheadrf 0:1121a7ef2e36 435 DEBUG1("Message is not fully received. sizeOfReceived=%d expectedSize=%d", sizeOfReceived, expectedMsgSize);
whiteheadrf 0:1121a7ef2e36 436 return 0;
whiteheadrf 0:1121a7ef2e36 437 }
whiteheadrf 0:1121a7ef2e36 438
whiteheadrf 0:1121a7ef2e36 439 readIx = localReadIx + expectedMsgSize;
whiteheadrf 0:1121a7ef2e36 440 memset(receivedMessage, 0, WIFI_MESSAGE_MAX_LENGTH + 1);
whiteheadrf 0:1121a7ef2e36 441
whiteheadrf 0:1121a7ef2e36 442 if (readIx > WIFI_MESSAGE_BUF_LENGTH - 1) {
whiteheadrf 0:1121a7ef2e36 443 readIx -= WIFI_MESSAGE_BUF_LENGTH;
whiteheadrf 0:1121a7ef2e36 444 targetPlace = WIFI_MESSAGE_BUF_LENGTH - localReadIx;
whiteheadrf 0:1121a7ef2e36 445 memcpy(receivedMessage, msgBuffer + localReadIx, targetPlace);
whiteheadrf 0:1121a7ef2e36 446 localReadIx = 0;
whiteheadrf 0:1121a7ef2e36 447 }
whiteheadrf 0:1121a7ef2e36 448
whiteheadrf 0:1121a7ef2e36 449 memcpy(receivedMessage + targetPlace, msgBuffer + localReadIx, expectedMsgSize - targetPlace);
whiteheadrf 0:1121a7ef2e36 450 *msg = receivedMessage;
whiteheadrf 0:1121a7ef2e36 451 return expectedMsgSize;
whiteheadrf 0:1121a7ef2e36 452 }
whiteheadrf 0:1121a7ef2e36 453
whiteheadrf 0:1121a7ef2e36 454 void wifiSendMessage(const uint8_t* msg, size_t len)
whiteheadrf 0:1121a7ef2e36 455 {
whiteheadrf 0:1121a7ef2e36 456 for (size_t symbIx = 0; symbIx < len; symbIx++) {
whiteheadrf 0:1121a7ef2e36 457 wifiComm.putc(msg[symbIx]);
whiteheadrf 0:1121a7ef2e36 458 }
whiteheadrf 0:1121a7ef2e36 459 }
whiteheadrf 0:1121a7ef2e36 460
whiteheadrf 0:1121a7ef2e36 461 bool wifiTcpConnectionActive(void)
whiteheadrf 0:1121a7ef2e36 462 {
whiteheadrf 0:1121a7ef2e36 463 return (tcpStatus.read() != 1);
whiteheadrf 0:1121a7ef2e36 464 }
whiteheadrf 0:1121a7ef2e36 465
whiteheadrf 0:1121a7ef2e36 466 #endif // USE_WIFI