Host library for controlling a WiConnect enabled Wi-Fi module.
Dependents: wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more
internal/wiconnect/ProcessCommand.cpp@0:ea85c4bb5e1f, 2014-08-11 (annotated)
- Committer:
- dan_ackme
- Date:
- Mon Aug 11 09:58:24 2014 +0000
- Revision:
- 0:ea85c4bb5e1f
- Child:
- 1:6ec9998427ad
initial check-in
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dan_ackme | 0:ea85c4bb5e1f | 1 | /* |
dan_ackme | 0:ea85c4bb5e1f | 2 | * Copyright 2014, ACKme Networks |
dan_ackme | 0:ea85c4bb5e1f | 3 | * All Rights Reserved. |
dan_ackme | 0:ea85c4bb5e1f | 4 | * |
dan_ackme | 0:ea85c4bb5e1f | 5 | * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks; |
dan_ackme | 0:ea85c4bb5e1f | 6 | * the contents of this file may not be disclosed to third parties, copied |
dan_ackme | 0:ea85c4bb5e1f | 7 | * or duplicated in any form, in whole or in part, without the prior |
dan_ackme | 0:ea85c4bb5e1f | 8 | * written permission of ACKme Networks. |
dan_ackme | 0:ea85c4bb5e1f | 9 | */ |
dan_ackme | 0:ea85c4bb5e1f | 10 | |
dan_ackme | 0:ea85c4bb5e1f | 11 | |
dan_ackme | 0:ea85c4bb5e1f | 12 | #include "CommandCommon.h" |
dan_ackme | 0:ea85c4bb5e1f | 13 | |
dan_ackme | 0:ea85c4bb5e1f | 14 | |
dan_ackme | 0:ea85c4bb5e1f | 15 | |
dan_ackme | 0:ea85c4bb5e1f | 16 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 17 | WiconnectResult Wiconnect::checkCurrentCommand() |
dan_ackme | 0:ea85c4bb5e1f | 18 | { |
dan_ackme | 0:ea85c4bb5e1f | 19 | WiconnectResult result; |
dan_ackme | 0:ea85c4bb5e1f | 20 | |
dan_ackme | 0:ea85c4bb5e1f | 21 | start: |
dan_ackme | 0:ea85c4bb5e1f | 22 | CHECK_INITIALIZED(); |
dan_ackme | 0:ea85c4bb5e1f | 23 | if(!commandExecuting) |
dan_ackme | 0:ea85c4bb5e1f | 24 | { |
dan_ackme | 0:ea85c4bb5e1f | 25 | return WICONNECT_IDLE; |
dan_ackme | 0:ea85c4bb5e1f | 26 | } |
dan_ackme | 0:ea85c4bb5e1f | 27 | |
dan_ackme | 0:ea85c4bb5e1f | 28 | CommandContext *context = (CommandContext*)commandContext; |
dan_ackme | 0:ea85c4bb5e1f | 29 | |
dan_ackme | 0:ea85c4bb5e1f | 30 | if(context->commandLen > 0) |
dan_ackme | 0:ea85c4bb5e1f | 31 | { |
dan_ackme | 0:ea85c4bb5e1f | 32 | const int timeout = context->nonBlocking ? 0 : timeoutTimer.remainingMs(context->timeoutMs); |
dan_ackme | 0:ea85c4bb5e1f | 33 | const int bytesToWrite = context->commandLen; |
dan_ackme | 0:ea85c4bb5e1f | 34 | const int bytesWritten = serial.write(context->commandPtr, bytesToWrite, timeout); |
dan_ackme | 0:ea85c4bb5e1f | 35 | context->commandPtr += bytesWritten; |
dan_ackme | 0:ea85c4bb5e1f | 36 | context->commandLen -= bytesWritten; |
dan_ackme | 0:ea85c4bb5e1f | 37 | if(bytesToWrite != bytesWritten) |
dan_ackme | 0:ea85c4bb5e1f | 38 | { |
dan_ackme | 0:ea85c4bb5e1f | 39 | if(timeoutTimer.timedOut(context->timeoutMs)) |
dan_ackme | 0:ea85c4bb5e1f | 40 | { |
dan_ackme | 0:ea85c4bb5e1f | 41 | issueCommandCallback(WICONNECT_TIMEOUT); |
dan_ackme | 0:ea85c4bb5e1f | 42 | return WICONNECT_TIMEOUT; |
dan_ackme | 0:ea85c4bb5e1f | 43 | } |
dan_ackme | 0:ea85c4bb5e1f | 44 | else |
dan_ackme | 0:ea85c4bb5e1f | 45 | { |
dan_ackme | 0:ea85c4bb5e1f | 46 | return WICONNECT_PROCESSING; |
dan_ackme | 0:ea85c4bb5e1f | 47 | } |
dan_ackme | 0:ea85c4bb5e1f | 48 | } |
dan_ackme | 0:ea85c4bb5e1f | 49 | } |
dan_ackme | 0:ea85c4bb5e1f | 50 | |
dan_ackme | 0:ea85c4bb5e1f | 51 | while(context->reader.isValid()) |
dan_ackme | 0:ea85c4bb5e1f | 52 | { |
dan_ackme | 0:ea85c4bb5e1f | 53 | if(context->bytesToWrite == 0) |
dan_ackme | 0:ea85c4bb5e1f | 54 | { |
dan_ackme | 0:ea85c4bb5e1f | 55 | context->responseBufferPtr = context->responseBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 56 | if(WICONNECT_FAILED(result, context->reader.call(context->user, context->responseBuffer, context->responseBufferLen, &context->bytesToWrite))) |
dan_ackme | 0:ea85c4bb5e1f | 57 | { |
dan_ackme | 0:ea85c4bb5e1f | 58 | issueCommandCallback(result); |
dan_ackme | 0:ea85c4bb5e1f | 59 | return result; |
dan_ackme | 0:ea85c4bb5e1f | 60 | } |
dan_ackme | 0:ea85c4bb5e1f | 61 | else if(context->bytesToWrite == EOF) |
dan_ackme | 0:ea85c4bb5e1f | 62 | { |
dan_ackme | 0:ea85c4bb5e1f | 63 | context->reader.setInvalid(); |
dan_ackme | 0:ea85c4bb5e1f | 64 | context->bytesToWrite = 0; |
dan_ackme | 0:ea85c4bb5e1f | 65 | context->responseBufferPtr = context->responseBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 66 | break; |
dan_ackme | 0:ea85c4bb5e1f | 67 | } |
dan_ackme | 0:ea85c4bb5e1f | 68 | else |
dan_ackme | 0:ea85c4bb5e1f | 69 | { |
dan_ackme | 0:ea85c4bb5e1f | 70 | timeoutTimer.reset(); |
dan_ackme | 0:ea85c4bb5e1f | 71 | } |
dan_ackme | 0:ea85c4bb5e1f | 72 | } |
dan_ackme | 0:ea85c4bb5e1f | 73 | if(context->bytesToWrite > 0) |
dan_ackme | 0:ea85c4bb5e1f | 74 | { |
dan_ackme | 0:ea85c4bb5e1f | 75 | const int timeout = context->nonBlocking ? 0 : timeoutTimer.remainingMs(context->timeoutMs); |
dan_ackme | 0:ea85c4bb5e1f | 76 | const int bytesToWrite = context->bytesToWrite; |
dan_ackme | 0:ea85c4bb5e1f | 77 | const int bytesWritten = serial.write(context->responseBufferPtr, bytesToWrite, timeout); |
dan_ackme | 0:ea85c4bb5e1f | 78 | context->responseBufferPtr += bytesWritten; |
dan_ackme | 0:ea85c4bb5e1f | 79 | context->bytesToWrite -= bytesWritten; |
dan_ackme | 0:ea85c4bb5e1f | 80 | if(bytesToWrite != bytesWritten) |
dan_ackme | 0:ea85c4bb5e1f | 81 | { |
dan_ackme | 0:ea85c4bb5e1f | 82 | if(timeoutTimer.timedOut(context->timeoutMs)) |
dan_ackme | 0:ea85c4bb5e1f | 83 | { |
dan_ackme | 0:ea85c4bb5e1f | 84 | issueCommandCallback(WICONNECT_TIMEOUT); |
dan_ackme | 0:ea85c4bb5e1f | 85 | return WICONNECT_TIMEOUT; |
dan_ackme | 0:ea85c4bb5e1f | 86 | } |
dan_ackme | 0:ea85c4bb5e1f | 87 | else |
dan_ackme | 0:ea85c4bb5e1f | 88 | { |
dan_ackme | 0:ea85c4bb5e1f | 89 | return WICONNECT_PROCESSING; |
dan_ackme | 0:ea85c4bb5e1f | 90 | } |
dan_ackme | 0:ea85c4bb5e1f | 91 | } |
dan_ackme | 0:ea85c4bb5e1f | 92 | } |
dan_ackme | 0:ea85c4bb5e1f | 93 | } |
dan_ackme | 0:ea85c4bb5e1f | 94 | |
dan_ackme | 0:ea85c4bb5e1f | 95 | result = receiveResponse(); |
dan_ackme | 0:ea85c4bb5e1f | 96 | if(result == WICONNECT_PROCESSING && !context->nonBlocking) |
dan_ackme | 0:ea85c4bb5e1f | 97 | { |
dan_ackme | 0:ea85c4bb5e1f | 98 | goto start; |
dan_ackme | 0:ea85c4bb5e1f | 99 | } |
dan_ackme | 0:ea85c4bb5e1f | 100 | return result; |
dan_ackme | 0:ea85c4bb5e1f | 101 | } |
dan_ackme | 0:ea85c4bb5e1f | 102 | |
dan_ackme | 0:ea85c4bb5e1f | 103 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 104 | WiconnectResult Wiconnect::receiveResponse() |
dan_ackme | 0:ea85c4bb5e1f | 105 | { |
dan_ackme | 0:ea85c4bb5e1f | 106 | for(;;) |
dan_ackme | 0:ea85c4bb5e1f | 107 | { |
dan_ackme | 0:ea85c4bb5e1f | 108 | WiconnectResult result = receivePacket(); |
dan_ackme | 0:ea85c4bb5e1f | 109 | |
dan_ackme | 0:ea85c4bb5e1f | 110 | if(result == WICONNECT_PROCESSING) |
dan_ackme | 0:ea85c4bb5e1f | 111 | { |
dan_ackme | 0:ea85c4bb5e1f | 112 | return WICONNECT_PROCESSING; |
dan_ackme | 0:ea85c4bb5e1f | 113 | } |
dan_ackme | 0:ea85c4bb5e1f | 114 | else if(result == WICONNECT_SUCCESS) |
dan_ackme | 0:ea85c4bb5e1f | 115 | { |
dan_ackme | 0:ea85c4bb5e1f | 116 | CommandHeader *header = (CommandHeader*)commandHeaderBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 117 | CommandContext *context = (CommandContext*)commandContext; |
dan_ackme | 0:ea85c4bb5e1f | 118 | |
dan_ackme | 0:ea85c4bb5e1f | 119 | // TODO: need to notify safemode |
dan_ackme | 0:ea85c4bb5e1f | 120 | |
dan_ackme | 0:ea85c4bb5e1f | 121 | if(header->response_type == WICONNECT_CMD_TYPE_REPLY || header->response_type == WICONNECT_CMD_TYPE_SAFEMODE) |
dan_ackme | 0:ea85c4bb5e1f | 122 | { |
dan_ackme | 0:ea85c4bb5e1f | 123 | if(header->response_code != WICONNECT_CMD_SUCCESS) |
dan_ackme | 0:ea85c4bb5e1f | 124 | { |
dan_ackme | 0:ea85c4bb5e1f | 125 | DEBUG_CMD_ERROR(header->response_code); |
dan_ackme | 0:ea85c4bb5e1f | 126 | flush(); |
dan_ackme | 0:ea85c4bb5e1f | 127 | issueCommandCallback(WICONNECT_CMD_RESPONSE_ERROR); |
dan_ackme | 0:ea85c4bb5e1f | 128 | return WICONNECT_CMD_RESPONSE_ERROR; |
dan_ackme | 0:ea85c4bb5e1f | 129 | } |
dan_ackme | 0:ea85c4bb5e1f | 130 | else if(header->response_len > 0) |
dan_ackme | 0:ea85c4bb5e1f | 131 | { |
dan_ackme | 0:ea85c4bb5e1f | 132 | DEBUG_CMD_RESPONSE(context->responseBuffer); |
dan_ackme | 0:ea85c4bb5e1f | 133 | header->response_len -= 2; |
dan_ackme | 0:ea85c4bb5e1f | 134 | context->responseBuffer[header->response_len] = 0; |
dan_ackme | 0:ea85c4bb5e1f | 135 | } |
dan_ackme | 0:ea85c4bb5e1f | 136 | else |
dan_ackme | 0:ea85c4bb5e1f | 137 | { |
dan_ackme | 0:ea85c4bb5e1f | 138 | *context->responseBuffer = 0; |
dan_ackme | 0:ea85c4bb5e1f | 139 | } |
dan_ackme | 0:ea85c4bb5e1f | 140 | |
dan_ackme | 0:ea85c4bb5e1f | 141 | issueCommandCallback(WICONNECT_SUCCESS); |
dan_ackme | 0:ea85c4bb5e1f | 142 | |
dan_ackme | 0:ea85c4bb5e1f | 143 | return WICONNECT_SUCCESS; |
dan_ackme | 0:ea85c4bb5e1f | 144 | } |
dan_ackme | 0:ea85c4bb5e1f | 145 | else |
dan_ackme | 0:ea85c4bb5e1f | 146 | { |
dan_ackme | 0:ea85c4bb5e1f | 147 | DEBUG_CMD_LOG(context->responseBuffer); |
dan_ackme | 0:ea85c4bb5e1f | 148 | RESET_CMD_HEADER(header); |
dan_ackme | 0:ea85c4bb5e1f | 149 | context->responseBufferPtr = context->responseBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 150 | } |
dan_ackme | 0:ea85c4bb5e1f | 151 | } |
dan_ackme | 0:ea85c4bb5e1f | 152 | else |
dan_ackme | 0:ea85c4bb5e1f | 153 | { |
dan_ackme | 0:ea85c4bb5e1f | 154 | issueCommandCallback(result); |
dan_ackme | 0:ea85c4bb5e1f | 155 | return result; |
dan_ackme | 0:ea85c4bb5e1f | 156 | } |
dan_ackme | 0:ea85c4bb5e1f | 157 | } |
dan_ackme | 0:ea85c4bb5e1f | 158 | |
dan_ackme | 0:ea85c4bb5e1f | 159 | // shouldn't get here... |
dan_ackme | 0:ea85c4bb5e1f | 160 | return WICONNECT_ERROR; |
dan_ackme | 0:ea85c4bb5e1f | 161 | } |
dan_ackme | 0:ea85c4bb5e1f | 162 | |
dan_ackme | 0:ea85c4bb5e1f | 163 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 164 | WiconnectResult Wiconnect::receivePacket() |
dan_ackme | 0:ea85c4bb5e1f | 165 | { |
dan_ackme | 0:ea85c4bb5e1f | 166 | CommandHeader *header = (CommandHeader*)commandHeaderBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 167 | CommandContext *context = (CommandContext*)commandContext; |
dan_ackme | 0:ea85c4bb5e1f | 168 | |
dan_ackme | 0:ea85c4bb5e1f | 169 | if(header->bytes_remaining > 0) |
dan_ackme | 0:ea85c4bb5e1f | 170 | { |
dan_ackme | 0:ea85c4bb5e1f | 171 | uint16_t bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 172 | uint8_t buffer[WICONNECT_HEADER_LENGTH]; |
dan_ackme | 0:ea85c4bb5e1f | 173 | |
dan_ackme | 0:ea85c4bb5e1f | 174 | while(header->bytes_remaining > 0) |
dan_ackme | 0:ea85c4bb5e1f | 175 | { |
dan_ackme | 0:ea85c4bb5e1f | 176 | const int timeout = context->nonBlocking ? 0 : timeoutTimer.remainingMs(context->timeoutMs); |
dan_ackme | 0:ea85c4bb5e1f | 177 | bytesReceived = serial.read((char*)buffer, header->bytes_remaining, timeout); |
dan_ackme | 0:ea85c4bb5e1f | 178 | if(bytesReceived == 0) |
dan_ackme | 0:ea85c4bb5e1f | 179 | { |
dan_ackme | 0:ea85c4bb5e1f | 180 | return timeoutTimer.timedOut(context->timeoutMs) ? WICONNECT_TIMEOUT : WICONNECT_PROCESSING; |
dan_ackme | 0:ea85c4bb5e1f | 181 | } |
dan_ackme | 0:ea85c4bb5e1f | 182 | |
dan_ackme | 0:ea85c4bb5e1f | 183 | for(uint8_t *ptr = buffer; bytesReceived > 0; ++ptr) |
dan_ackme | 0:ea85c4bb5e1f | 184 | { |
dan_ackme | 0:ea85c4bb5e1f | 185 | if(header->response_type == WICONNECT_CMD_TYPE_NULL) |
dan_ackme | 0:ea85c4bb5e1f | 186 | { |
dan_ackme | 0:ea85c4bb5e1f | 187 | if( *ptr == WICONNECT_CMD_TYPE_REPLY || |
dan_ackme | 0:ea85c4bb5e1f | 188 | *ptr == WICONNECT_CMD_TYPE_LOG || |
dan_ackme | 0:ea85c4bb5e1f | 189 | *ptr == WICONNECT_CMD_TYPE_SAFEMODE) |
dan_ackme | 0:ea85c4bb5e1f | 190 | { |
dan_ackme | 0:ea85c4bb5e1f | 191 | header->response_type = (ResponseType)*ptr; |
dan_ackme | 0:ea85c4bb5e1f | 192 | -- header->bytes_remaining; |
dan_ackme | 0:ea85c4bb5e1f | 193 | } |
dan_ackme | 0:ea85c4bb5e1f | 194 | --bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 195 | } |
dan_ackme | 0:ea85c4bb5e1f | 196 | else if(header->response_code == WICONNECT_CMD_CODE_NULL) |
dan_ackme | 0:ea85c4bb5e1f | 197 | { |
dan_ackme | 0:ea85c4bb5e1f | 198 | if(*ptr >= '0' && *ptr <= '7') |
dan_ackme | 0:ea85c4bb5e1f | 199 | { |
dan_ackme | 0:ea85c4bb5e1f | 200 | header->response_code = (ResponseCode)(*ptr - '0' + 1); |
dan_ackme | 0:ea85c4bb5e1f | 201 | --header->bytes_remaining; |
dan_ackme | 0:ea85c4bb5e1f | 202 | header->len_buffer_ptr = header->len_buffer; |
dan_ackme | 0:ea85c4bb5e1f | 203 | } |
dan_ackme | 0:ea85c4bb5e1f | 204 | else |
dan_ackme | 0:ea85c4bb5e1f | 205 | { |
dan_ackme | 0:ea85c4bb5e1f | 206 | RESET_CMD_HEADER(header); |
dan_ackme | 0:ea85c4bb5e1f | 207 | } |
dan_ackme | 0:ea85c4bb5e1f | 208 | --bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 209 | } |
dan_ackme | 0:ea85c4bb5e1f | 210 | else if(header->bytes_remaining > 2) |
dan_ackme | 0:ea85c4bb5e1f | 211 | { |
dan_ackme | 0:ea85c4bb5e1f | 212 | uint8_t len_chars = MIN((int)bytesReceived, (int)(header->bytes_remaining-2)); |
dan_ackme | 0:ea85c4bb5e1f | 213 | header->bytes_remaining -= len_chars; |
dan_ackme | 0:ea85c4bb5e1f | 214 | bytesReceived -= len_chars; |
dan_ackme | 0:ea85c4bb5e1f | 215 | while(len_chars-- > 0) |
dan_ackme | 0:ea85c4bb5e1f | 216 | { |
dan_ackme | 0:ea85c4bb5e1f | 217 | *header->len_buffer_ptr++ = *ptr++; |
dan_ackme | 0:ea85c4bb5e1f | 218 | } |
dan_ackme | 0:ea85c4bb5e1f | 219 | --ptr; // need to decrement since the for loop increments |
dan_ackme | 0:ea85c4bb5e1f | 220 | if(header->bytes_remaining == 2) |
dan_ackme | 0:ea85c4bb5e1f | 221 | { |
dan_ackme | 0:ea85c4bb5e1f | 222 | uint32_t packetLen; |
dan_ackme | 0:ea85c4bb5e1f | 223 | *header->len_buffer_ptr = 0; |
dan_ackme | 0:ea85c4bb5e1f | 224 | if(!StringUtil::strToUint32((const char*)header->len_buffer, &packetLen)) |
dan_ackme | 0:ea85c4bb5e1f | 225 | { |
dan_ackme | 0:ea85c4bb5e1f | 226 | RESET_CMD_HEADER(header); |
dan_ackme | 0:ea85c4bb5e1f | 227 | } |
dan_ackme | 0:ea85c4bb5e1f | 228 | else |
dan_ackme | 0:ea85c4bb5e1f | 229 | { |
dan_ackme | 0:ea85c4bb5e1f | 230 | if((int)packetLen > context->responseBufferLen) |
dan_ackme | 0:ea85c4bb5e1f | 231 | { |
dan_ackme | 0:ea85c4bb5e1f | 232 | DEBUG_ERROR("Packet larger than response buffer: %d > %d", packetLen, context->responseBufferLen); |
dan_ackme | 0:ea85c4bb5e1f | 233 | return WICONNECT_OVERFLOW; |
dan_ackme | 0:ea85c4bb5e1f | 234 | } |
dan_ackme | 0:ea85c4bb5e1f | 235 | header->response_len = (uint16_t)packetLen; |
dan_ackme | 0:ea85c4bb5e1f | 236 | context->bytesToRead = packetLen; |
dan_ackme | 0:ea85c4bb5e1f | 237 | } |
dan_ackme | 0:ea85c4bb5e1f | 238 | } |
dan_ackme | 0:ea85c4bb5e1f | 239 | } |
dan_ackme | 0:ea85c4bb5e1f | 240 | else if(header->bytes_remaining == 2) |
dan_ackme | 0:ea85c4bb5e1f | 241 | { |
dan_ackme | 0:ea85c4bb5e1f | 242 | --bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 243 | if(*ptr == '\r') |
dan_ackme | 0:ea85c4bb5e1f | 244 | { |
dan_ackme | 0:ea85c4bb5e1f | 245 | header->bytes_remaining = 1; |
dan_ackme | 0:ea85c4bb5e1f | 246 | } |
dan_ackme | 0:ea85c4bb5e1f | 247 | else |
dan_ackme | 0:ea85c4bb5e1f | 248 | { |
dan_ackme | 0:ea85c4bb5e1f | 249 | RESET_CMD_HEADER(header); |
dan_ackme | 0:ea85c4bb5e1f | 250 | } |
dan_ackme | 0:ea85c4bb5e1f | 251 | } |
dan_ackme | 0:ea85c4bb5e1f | 252 | else |
dan_ackme | 0:ea85c4bb5e1f | 253 | { |
dan_ackme | 0:ea85c4bb5e1f | 254 | --bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 255 | if(*ptr == '\n') |
dan_ackme | 0:ea85c4bb5e1f | 256 | { |
dan_ackme | 0:ea85c4bb5e1f | 257 | header->bytes_remaining = 0; |
dan_ackme | 0:ea85c4bb5e1f | 258 | break; |
dan_ackme | 0:ea85c4bb5e1f | 259 | } |
dan_ackme | 0:ea85c4bb5e1f | 260 | else |
dan_ackme | 0:ea85c4bb5e1f | 261 | { |
dan_ackme | 0:ea85c4bb5e1f | 262 | RESET_CMD_HEADER(header); |
dan_ackme | 0:ea85c4bb5e1f | 263 | } |
dan_ackme | 0:ea85c4bb5e1f | 264 | } |
dan_ackme | 0:ea85c4bb5e1f | 265 | } |
dan_ackme | 0:ea85c4bb5e1f | 266 | } |
dan_ackme | 0:ea85c4bb5e1f | 267 | } |
dan_ackme | 0:ea85c4bb5e1f | 268 | |
dan_ackme | 0:ea85c4bb5e1f | 269 | while(context->bytesToRead > 0) |
dan_ackme | 0:ea85c4bb5e1f | 270 | { |
dan_ackme | 0:ea85c4bb5e1f | 271 | const int timeout = context->nonBlocking ? 0 : timeoutTimer.remainingMs(context->timeoutMs); |
dan_ackme | 0:ea85c4bb5e1f | 272 | const int bytesToRead = context->bytesToRead; |
dan_ackme | 0:ea85c4bb5e1f | 273 | const int bytesReceived = serial.read(context->responseBufferPtr, bytesToRead, timeout); |
dan_ackme | 0:ea85c4bb5e1f | 274 | context->responseBufferPtr += bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 275 | context->bytesToRead -= bytesReceived; |
dan_ackme | 0:ea85c4bb5e1f | 276 | |
dan_ackme | 0:ea85c4bb5e1f | 277 | if(bytesReceived != bytesToRead) |
dan_ackme | 0:ea85c4bb5e1f | 278 | { |
dan_ackme | 0:ea85c4bb5e1f | 279 | return timeoutTimer.timedOut(context->timeoutMs) ? WICONNECT_TIMEOUT : WICONNECT_PROCESSING; |
dan_ackme | 0:ea85c4bb5e1f | 280 | } |
dan_ackme | 0:ea85c4bb5e1f | 281 | else if(context->bytesToRead == 0) |
dan_ackme | 0:ea85c4bb5e1f | 282 | { |
dan_ackme | 0:ea85c4bb5e1f | 283 | *context->responseBufferPtr = 0; |
dan_ackme | 0:ea85c4bb5e1f | 284 | } |
dan_ackme | 0:ea85c4bb5e1f | 285 | } |
dan_ackme | 0:ea85c4bb5e1f | 286 | |
dan_ackme | 0:ea85c4bb5e1f | 287 | return (header->response_code != WICONNECT_CMD_CODE_NULL && |
dan_ackme | 0:ea85c4bb5e1f | 288 | header->response_type != WICONNECT_CMD_TYPE_NULL && |
dan_ackme | 0:ea85c4bb5e1f | 289 | context->bytesToRead == 0) ? WICONNECT_SUCCESS : WICONNECT_PROCESSING; |
dan_ackme | 0:ea85c4bb5e1f | 290 | } |
dan_ackme | 0:ea85c4bb5e1f | 291 | |
dan_ackme | 0:ea85c4bb5e1f | 292 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 293 | void Wiconnect::issueCommandCallback(WiconnectResult result) |
dan_ackme | 0:ea85c4bb5e1f | 294 | { |
dan_ackme | 0:ea85c4bb5e1f | 295 | CommandHeader *header = (CommandHeader*)commandHeaderBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 296 | CommandContext *context = (CommandContext*)commandContext; |
dan_ackme | 0:ea85c4bb5e1f | 297 | #ifdef WICONNECT_ASYNC_TIMER_ENABLED |
dan_ackme | 0:ea85c4bb5e1f | 298 | void *returnPtr = (currentQueuedCommand != NULL) ? (void*)currentQueuedCommand : (void*)context->responseBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 299 | currentQueuedCommand = NULL; |
dan_ackme | 0:ea85c4bb5e1f | 300 | commandProcessorTimer.stop(); |
dan_ackme | 0:ea85c4bb5e1f | 301 | #else |
dan_ackme | 0:ea85c4bb5e1f | 302 | void *returnPtr = (void*)context->responseBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 303 | #endif |
dan_ackme | 0:ea85c4bb5e1f | 304 | context->callback.call(result, returnPtr, (void*)(uint32_t)header->response_len); |
dan_ackme | 0:ea85c4bb5e1f | 305 | commandExecuting = false; |
dan_ackme | 0:ea85c4bb5e1f | 306 | |
dan_ackme | 0:ea85c4bb5e1f | 307 | #ifdef WICONNECT_ASYNC_TIMER_ENABLED |
dan_ackme | 0:ea85c4bb5e1f | 308 | processNextQueuedCommand(); |
dan_ackme | 0:ea85c4bb5e1f | 309 | #endif |
dan_ackme | 0:ea85c4bb5e1f | 310 | } |
dan_ackme | 0:ea85c4bb5e1f | 311 | |
dan_ackme | 0:ea85c4bb5e1f | 312 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 313 | void Wiconnect::stopCurrentCommand() |
dan_ackme | 0:ea85c4bb5e1f | 314 | { |
dan_ackme | 0:ea85c4bb5e1f | 315 | internalProcessingState = 0; |
dan_ackme | 0:ea85c4bb5e1f | 316 | issueCommandCallback(WICONNECT_ABORTED); |
dan_ackme | 0:ea85c4bb5e1f | 317 | } |
dan_ackme | 0:ea85c4bb5e1f | 318 | |
dan_ackme | 0:ea85c4bb5e1f | 319 |