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 03:29:30 2014 -0700
Revision:
1:6ec9998427ad
Parent:
0:ea85c4bb5e1f
Child:
6:8a87a59d0d21
fixed compiler warnings

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