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

Committer:
dan_ackme
Date:
Mon Aug 11 13:55:07 2014 -0700
Revision:
6:8a87a59d0d21
Parent:
1:6ec9998427ad
Child:
16:7f1d6d359787
added support for assertion handling

Who changed what in which revision?

UserRevisionLine numberNew 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 "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 13 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 14
dan_ackme 0:ea85c4bb5e1f 15 #define CHECK_OPENED_FOR_READING() if(!readEnabled) return WICONNECT_NOT_OPENED_FOR_READING
dan_ackme 0:ea85c4bb5e1f 16
dan_ackme 0:ea85c4bb5e1f 17
dan_ackme 0:ea85c4bb5e1f 18
dan_ackme 0:ea85c4bb5e1f 19
dan_ackme 0:ea85c4bb5e1f 20 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 21 File::File(int rxBufferLen, void *rxBuffer_)
dan_ackme 0:ea85c4bb5e1f 22 {
dan_ackme 0:ea85c4bb5e1f 23 wiconnect = Wiconnect::getInstance();
dan_ackme 0:ea85c4bb5e1f 24
dan_ackme 0:ea85c4bb5e1f 25 memset(&rxBuffer, 0, sizeof(Buffer));
dan_ackme 0:ea85c4bb5e1f 26
dan_ackme 0:ea85c4bb5e1f 27 rxBuffer.size = !wiconnect->nonBlocking ? rxBufferLen : 0;
dan_ackme 0:ea85c4bb5e1f 28 rxBuffer.buffer = (uint8_t*)rxBuffer_;
dan_ackme 0:ea85c4bb5e1f 29
dan_ackme 0:ea85c4bb5e1f 30 if(rxBuffer.size > 0)
dan_ackme 0:ea85c4bb5e1f 31 {
dan_ackme 0:ea85c4bb5e1f 32 if(rxBuffer_ == NULL)
dan_ackme 0:ea85c4bb5e1f 33 {
dan_ackme 0:ea85c4bb5e1f 34 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 6:8a87a59d0d21 35 wiconnect_assert(wiconnect, "File(), malloc not defined", wiconnect->_malloc != NULL);
dan_ackme 0:ea85c4bb5e1f 36 rxBuffer.buffer = (uint8_t*)wiconnect->_malloc(rxBufferLen);
dan_ackme 6:8a87a59d0d21 37 wiconnect_assert(wiconnect, "File(), failed to malloc buffer", rxBuffer.buffer != NULL);
dan_ackme 0:ea85c4bb5e1f 38 rxBuffer.allocated = true;
dan_ackme 0:ea85c4bb5e1f 39 #else
dan_ackme 6:8a87a59d0d21 40 wiconnect_assert(0);
dan_ackme 0:ea85c4bb5e1f 41 #endif
dan_ackme 0:ea85c4bb5e1f 42 }
dan_ackme 0:ea85c4bb5e1f 43 }
dan_ackme 0:ea85c4bb5e1f 44
dan_ackme 0:ea85c4bb5e1f 45 previous = next = NULL;
dan_ackme 0:ea85c4bb5e1f 46 handle = 0xff;
dan_ackme 0:ea85c4bb5e1f 47 readEnabled = false;
dan_ackme 0:ea85c4bb5e1f 48 *name = 0;
dan_ackme 0:ea85c4bb5e1f 49 size = 0;
dan_ackme 0:ea85c4bb5e1f 50 type = FILE_TYPE_UNKNOWN;
dan_ackme 0:ea85c4bb5e1f 51 version = 0;
dan_ackme 0:ea85c4bb5e1f 52 flags = FILE_FLAG_NONE;
dan_ackme 0:ea85c4bb5e1f 53 }
dan_ackme 0:ea85c4bb5e1f 54
dan_ackme 0:ea85c4bb5e1f 55 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 56 File::~File()
dan_ackme 0:ea85c4bb5e1f 57 {
dan_ackme 0:ea85c4bb5e1f 58 while(close() == WICONNECT_PROCESSING)
dan_ackme 0:ea85c4bb5e1f 59 {
dan_ackme 0:ea85c4bb5e1f 60 }
dan_ackme 0:ea85c4bb5e1f 61
dan_ackme 0:ea85c4bb5e1f 62 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 0:ea85c4bb5e1f 63 if(rxBuffer.allocated && rxBuffer.size > 0)
dan_ackme 0:ea85c4bb5e1f 64 {
dan_ackme 6:8a87a59d0d21 65 wiconnect_assert(wiconnect, "~File(), free not defined", wiconnect->_free != NULL);
dan_ackme 0:ea85c4bb5e1f 66 wiconnect->_free(rxBuffer.buffer);
dan_ackme 0:ea85c4bb5e1f 67 }
dan_ackme 0:ea85c4bb5e1f 68 #endif
dan_ackme 0:ea85c4bb5e1f 69 }
dan_ackme 0:ea85c4bb5e1f 70
dan_ackme 0:ea85c4bb5e1f 71 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 72 WiconnectResult File::openForRead(uint8_t handle_, const char *filename)
dan_ackme 0:ea85c4bb5e1f 73 {
dan_ackme 0:ea85c4bb5e1f 74 handle = handle_;
dan_ackme 0:ea85c4bb5e1f 75 readEnabled = true;
dan_ackme 0:ea85c4bb5e1f 76 strcpy(name, filename);
dan_ackme 0:ea85c4bb5e1f 77
dan_ackme 0:ea85c4bb5e1f 78 return WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 79 }
dan_ackme 0:ea85c4bb5e1f 80
dan_ackme 0:ea85c4bb5e1f 81 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 82 WiconnectResult File::initWithListing(const char *typeStr, const char *flagsStr, const char* sizeStr, const char *versionStr, const char *nameStr)
dan_ackme 0:ea85c4bb5e1f 83 {
dan_ackme 0:ea85c4bb5e1f 84 uint32_t tmp;
dan_ackme 0:ea85c4bb5e1f 85
dan_ackme 0:ea85c4bb5e1f 86 if(!StringUtil::strHexToUint32(&typeStr[2], &tmp))
dan_ackme 0:ea85c4bb5e1f 87 {
dan_ackme 0:ea85c4bb5e1f 88 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 89 }
dan_ackme 0:ea85c4bb5e1f 90 type = (FileType)tmp;
dan_ackme 0:ea85c4bb5e1f 91
dan_ackme 0:ea85c4bb5e1f 92 if(!StringUtil::strHexToUint32(flagsStr, &tmp))
dan_ackme 0:ea85c4bb5e1f 93 {
dan_ackme 0:ea85c4bb5e1f 94 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 95 }
dan_ackme 0:ea85c4bb5e1f 96 flags = (FileFlags)tmp;
dan_ackme 0:ea85c4bb5e1f 97
dan_ackme 0:ea85c4bb5e1f 98 if(!StringUtil::strToUint32(sizeStr, &tmp))
dan_ackme 0:ea85c4bb5e1f 99 {
dan_ackme 0:ea85c4bb5e1f 100 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 101 }
dan_ackme 0:ea85c4bb5e1f 102 size = (uint32_t)tmp;
dan_ackme 0:ea85c4bb5e1f 103
dan_ackme 0:ea85c4bb5e1f 104 if(!FileInterface::fileVersionStrToInt(versionStr, &version))
dan_ackme 0:ea85c4bb5e1f 105 {
dan_ackme 0:ea85c4bb5e1f 106 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 107 }
dan_ackme 0:ea85c4bb5e1f 108
dan_ackme 0:ea85c4bb5e1f 109 strcpy(name, nameStr);
dan_ackme 0:ea85c4bb5e1f 110
dan_ackme 0:ea85c4bb5e1f 111 return WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 112 }
dan_ackme 0:ea85c4bb5e1f 113
dan_ackme 0:ea85c4bb5e1f 114 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 115 void* File::operator new(size_t size)
dan_ackme 0:ea85c4bb5e1f 116 {
dan_ackme 6:8a87a59d0d21 117 Wiconnect *wiconnect = Wiconnect::getInstance();
dan_ackme 6:8a87a59d0d21 118 wiconnect_assert(wiconnect, "File:new, malloc not defined", wiconnect->_malloc != NULL);
dan_ackme 0:ea85c4bb5e1f 119 return Wiconnect::getInstance()->_malloc(size);
dan_ackme 0:ea85c4bb5e1f 120 }
dan_ackme 0:ea85c4bb5e1f 121
dan_ackme 0:ea85c4bb5e1f 122 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 123 void File::operator delete(void* ptr)
dan_ackme 0:ea85c4bb5e1f 124 {
dan_ackme 6:8a87a59d0d21 125 Wiconnect *wiconnect = Wiconnect::getInstance();
dan_ackme 6:8a87a59d0d21 126 wiconnect_assert(wiconnect, "File:delete, free not defined", wiconnect->_free != NULL);
dan_ackme 0:ea85c4bb5e1f 127 Wiconnect::getInstance()->_free(ptr);
dan_ackme 0:ea85c4bb5e1f 128 }
dan_ackme 0:ea85c4bb5e1f 129
dan_ackme 0:ea85c4bb5e1f 130
dan_ackme 0:ea85c4bb5e1f 131 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 132 WiconnectResult File::close()
dan_ackme 0:ea85c4bb5e1f 133 {
dan_ackme 0:ea85c4bb5e1f 134 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 135 CHECK_OPENED_FOR_READING();
dan_ackme 0:ea85c4bb5e1f 136 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 137
dan_ackme 0:ea85c4bb5e1f 138 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("close %d", handle)))
dan_ackme 0:ea85c4bb5e1f 139 {
dan_ackme 0:ea85c4bb5e1f 140 readEnabled = false;
dan_ackme 0:ea85c4bb5e1f 141 }
dan_ackme 0:ea85c4bb5e1f 142
dan_ackme 0:ea85c4bb5e1f 143 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 144
dan_ackme 0:ea85c4bb5e1f 145 return result;
dan_ackme 0:ea85c4bb5e1f 146 }
dan_ackme 0:ea85c4bb5e1f 147
dan_ackme 0:ea85c4bb5e1f 148 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 149 const char* File::getName() const
dan_ackme 0:ea85c4bb5e1f 150 {
dan_ackme 0:ea85c4bb5e1f 151 return name;
dan_ackme 0:ea85c4bb5e1f 152 }
dan_ackme 0:ea85c4bb5e1f 153
dan_ackme 0:ea85c4bb5e1f 154 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 155 uint32_t File::getSize() const
dan_ackme 0:ea85c4bb5e1f 156 {
dan_ackme 0:ea85c4bb5e1f 157 return size;
dan_ackme 0:ea85c4bb5e1f 158 }
dan_ackme 0:ea85c4bb5e1f 159
dan_ackme 0:ea85c4bb5e1f 160 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 161 FileType File::getType() const
dan_ackme 0:ea85c4bb5e1f 162 {
dan_ackme 0:ea85c4bb5e1f 163 return type;
dan_ackme 0:ea85c4bb5e1f 164 }
dan_ackme 0:ea85c4bb5e1f 165
dan_ackme 0:ea85c4bb5e1f 166 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 167 FileFlags File::getFlags() const
dan_ackme 0:ea85c4bb5e1f 168 {
dan_ackme 0:ea85c4bb5e1f 169 return flags;
dan_ackme 0:ea85c4bb5e1f 170 }
dan_ackme 0:ea85c4bb5e1f 171
dan_ackme 0:ea85c4bb5e1f 172 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 173 uint32_t File::getVersion() const
dan_ackme 0:ea85c4bb5e1f 174 {
dan_ackme 0:ea85c4bb5e1f 175 return version;
dan_ackme 0:ea85c4bb5e1f 176 }
dan_ackme 0:ea85c4bb5e1f 177
dan_ackme 0:ea85c4bb5e1f 178 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 179 const char* File::getVersionStr(char *buffer) const
dan_ackme 0:ea85c4bb5e1f 180 {
dan_ackme 0:ea85c4bb5e1f 181 return FileInterface::fileVersionIntToStr(version, true, buffer);
dan_ackme 0:ea85c4bb5e1f 182 }
dan_ackme 0:ea85c4bb5e1f 183
dan_ackme 0:ea85c4bb5e1f 184 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 185 const File* File::getNext() const
dan_ackme 0:ea85c4bb5e1f 186 {
dan_ackme 0:ea85c4bb5e1f 187 return next;
dan_ackme 0:ea85c4bb5e1f 188 }
dan_ackme 0:ea85c4bb5e1f 189
dan_ackme 0:ea85c4bb5e1f 190 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 191 const File* File::getPrevious() const
dan_ackme 0:ea85c4bb5e1f 192 {
dan_ackme 0:ea85c4bb5e1f 193 return previous;
dan_ackme 0:ea85c4bb5e1f 194 }
dan_ackme 0:ea85c4bb5e1f 195
dan_ackme 0:ea85c4bb5e1f 196
dan_ackme 0:ea85c4bb5e1f 197 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 198 WiconnectResult File::read(void* buffer, uint16_t maxLength, uint16_t *bytesRead)
dan_ackme 0:ea85c4bb5e1f 199 {
dan_ackme 0:ea85c4bb5e1f 200 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 201
dan_ackme 0:ea85c4bb5e1f 202 CHECK_OPENED_FOR_READING();
dan_ackme 0:ea85c4bb5e1f 203 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 204
dan_ackme 0:ea85c4bb5e1f 205 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand((char*)buffer, maxLength, "read %d %d", handle, maxLength-2)))
dan_ackme 0:ea85c4bb5e1f 206 {
dan_ackme 0:ea85c4bb5e1f 207 *bytesRead = wiconnect->getLastCommandResponseLength();
dan_ackme 0:ea85c4bb5e1f 208 }
dan_ackme 0:ea85c4bb5e1f 209
dan_ackme 0:ea85c4bb5e1f 210 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 211
dan_ackme 0:ea85c4bb5e1f 212 return result;
dan_ackme 0:ea85c4bb5e1f 213 }
dan_ackme 0:ea85c4bb5e1f 214
dan_ackme 0:ea85c4bb5e1f 215 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 216 WiconnectResult File::read(uint8_t **bufferPtr, uint16_t *bytesReadPtr)
dan_ackme 0:ea85c4bb5e1f 217 {
dan_ackme 0:ea85c4bb5e1f 218 WiconnectResult result = WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 219
dan_ackme 0:ea85c4bb5e1f 220 CHECK_OPENED_FOR_READING();
dan_ackme 0:ea85c4bb5e1f 221
dan_ackme 0:ea85c4bb5e1f 222 if(rxBuffer.size == 0)
dan_ackme 0:ea85c4bb5e1f 223 {
dan_ackme 0:ea85c4bb5e1f 224 return WICONNECT_UNSUPPORTED;
dan_ackme 0:ea85c4bb5e1f 225 }
dan_ackme 0:ea85c4bb5e1f 226 else if(bufferPtr != NULL && bytesReadPtr == NULL)
dan_ackme 0:ea85c4bb5e1f 227 {
dan_ackme 0:ea85c4bb5e1f 228 return WICONNECT_BAD_ARG;
dan_ackme 0:ea85c4bb5e1f 229 }
dan_ackme 0:ea85c4bb5e1f 230 else if(rxBuffer.bytesPending < rxBuffer.size - 2)
dan_ackme 0:ea85c4bb5e1f 231 {
dan_ackme 0:ea85c4bb5e1f 232 const int bytesToRead = rxBuffer.size - rxBuffer.bytesPending - 2;
dan_ackme 0:ea85c4bb5e1f 233 char* ptr = (char*)&rxBuffer.buffer[rxBuffer.bytesPending];
dan_ackme 0:ea85c4bb5e1f 234 if(!WICONNECT_FAILED(result, wiconnect->sendCommand(ptr, bytesToRead+2, "read %d %d", handle, bytesToRead)))
dan_ackme 0:ea85c4bb5e1f 235 {
dan_ackme 0:ea85c4bb5e1f 236 rxBuffer.bytesPending += wiconnect->getLastCommandResponseLength();
dan_ackme 0:ea85c4bb5e1f 237 }
dan_ackme 0:ea85c4bb5e1f 238 }
dan_ackme 0:ea85c4bb5e1f 239
dan_ackme 0:ea85c4bb5e1f 240 if(bufferPtr != NULL)
dan_ackme 0:ea85c4bb5e1f 241 {
dan_ackme 0:ea85c4bb5e1f 242 *bufferPtr = rxBuffer.buffer;
dan_ackme 0:ea85c4bb5e1f 243 *bytesReadPtr = rxBuffer.bytesPending;
dan_ackme 0:ea85c4bb5e1f 244 clearRxBuffer();
dan_ackme 0:ea85c4bb5e1f 245 }
dan_ackme 0:ea85c4bb5e1f 246
dan_ackme 0:ea85c4bb5e1f 247 return result;
dan_ackme 0:ea85c4bb5e1f 248 }
dan_ackme 0:ea85c4bb5e1f 249
dan_ackme 0:ea85c4bb5e1f 250 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 251 WiconnectResult File::getc(uint8_t *c)
dan_ackme 0:ea85c4bb5e1f 252 {
dan_ackme 0:ea85c4bb5e1f 253 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 254
dan_ackme 0:ea85c4bb5e1f 255 if(rxBuffer.size == 0)
dan_ackme 0:ea85c4bb5e1f 256 {
dan_ackme 0:ea85c4bb5e1f 257 return WICONNECT_UNSUPPORTED;
dan_ackme 0:ea85c4bb5e1f 258 }
dan_ackme 0:ea85c4bb5e1f 259
dan_ackme 0:ea85c4bb5e1f 260 read_data:
dan_ackme 0:ea85c4bb5e1f 261 if(rxBuffer.bytesPending == 0 &&
dan_ackme 0:ea85c4bb5e1f 262 WICONNECT_FAILED(result, read()))
dan_ackme 0:ea85c4bb5e1f 263 {
dan_ackme 0:ea85c4bb5e1f 264 return result;
dan_ackme 0:ea85c4bb5e1f 265 }
dan_ackme 0:ea85c4bb5e1f 266 else if(rxBuffer.ptr < &rxBuffer.buffer[rxBuffer.bytesPending])
dan_ackme 0:ea85c4bb5e1f 267 {
dan_ackme 0:ea85c4bb5e1f 268 *c = *rxBuffer.ptr;
dan_ackme 0:ea85c4bb5e1f 269 ++rxBuffer.ptr;
dan_ackme 0:ea85c4bb5e1f 270 return WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 271 }
dan_ackme 0:ea85c4bb5e1f 272 else
dan_ackme 0:ea85c4bb5e1f 273 {
dan_ackme 0:ea85c4bb5e1f 274 clearRxBuffer();
dan_ackme 0:ea85c4bb5e1f 275 goto read_data;
dan_ackme 0:ea85c4bb5e1f 276 }
dan_ackme 0:ea85c4bb5e1f 277 }
dan_ackme 0:ea85c4bb5e1f 278
dan_ackme 0:ea85c4bb5e1f 279 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 280 void File::clearRxBuffer()
dan_ackme 0:ea85c4bb5e1f 281 {
dan_ackme 0:ea85c4bb5e1f 282 rxBuffer.bytesPending = 0;
dan_ackme 0:ea85c4bb5e1f 283 rxBuffer.ptr = rxBuffer.buffer;
dan_ackme 0:ea85c4bb5e1f 284 }