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 09:58:24 2014 +0000
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad
initial check-in

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 #include <assert.h>
dan_ackme 0:ea85c4bb5e1f 12
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 #ifndef WICONNECT_SERIAL_RX_BUFFER
dan_ackme 0:ea85c4bb5e1f 17 #error WICONNECT_SERIAL_RX_BUFFER NOT defined NOT currently supported
dan_ackme 0:ea85c4bb5e1f 18 #endif
dan_ackme 0:ea85c4bb5e1f 19
dan_ackme 0:ea85c4bb5e1f 20
dan_ackme 0:ea85c4bb5e1f 21
dan_ackme 0:ea85c4bb5e1f 22
dan_ackme 0:ea85c4bb5e1f 23 typedef struct
dan_ackme 0:ea85c4bb5e1f 24 {
dan_ackme 0:ea85c4bb5e1f 25 uint16_t size;
dan_ackme 0:ea85c4bb5e1f 26 uint8_t *start, *end;
dan_ackme 0:ea85c4bb5e1f 27 volatile uint8_t *head;
dan_ackme 0:ea85c4bb5e1f 28 volatile uint8_t *tail;
dan_ackme 0:ea85c4bb5e1f 29 volatile uint16_t count;
dan_ackme 0:ea85c4bb5e1f 30 } SerialRxBuffer;
dan_ackme 0:ea85c4bb5e1f 31
dan_ackme 0:ea85c4bb5e1f 32
dan_ackme 0:ea85c4bb5e1f 33 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 34 WiconnectSerial::WiconnectSerial(const SerialConfig &config, Wiconnect *wiconnect) : RawSerial(config.tx, config.rx)
dan_ackme 0:ea85c4bb5e1f 35 {
dan_ackme 0:ea85c4bb5e1f 36 ct_assert(sizeof(ringBuffer) >= sizeof(SerialRxBuffer));
dan_ackme 0:ea85c4bb5e1f 37
dan_ackme 0:ea85c4bb5e1f 38 baud(config.baud);
dan_ackme 0:ea85c4bb5e1f 39
dan_ackme 0:ea85c4bb5e1f 40 SerialRxBuffer *rxBuffer = (SerialRxBuffer*)ringBuffer;
dan_ackme 0:ea85c4bb5e1f 41 memset(rxBuffer, 0, sizeof(SerialRxBuffer));
dan_ackme 0:ea85c4bb5e1f 42 bufferAlloc = false;
dan_ackme 0:ea85c4bb5e1f 43 if(config.serialRxBufferSize > 0)
dan_ackme 0:ea85c4bb5e1f 44 {
dan_ackme 0:ea85c4bb5e1f 45 if(config.serialRxBuffer != NULL)
dan_ackme 0:ea85c4bb5e1f 46 {
dan_ackme 0:ea85c4bb5e1f 47 rxBuffer->head = (uint8_t*)config.serialRxBuffer;
dan_ackme 0:ea85c4bb5e1f 48 }
dan_ackme 0:ea85c4bb5e1f 49 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 0:ea85c4bb5e1f 50 else
dan_ackme 0:ea85c4bb5e1f 51 {
dan_ackme 0:ea85c4bb5e1f 52 assert(wiconnect->_malloc != NULL);
dan_ackme 0:ea85c4bb5e1f 53 rxBuffer->start = (uint8_t*)wiconnect->_malloc(config.serialRxBufferSize);
dan_ackme 0:ea85c4bb5e1f 54 bufferAlloc = true;
dan_ackme 0:ea85c4bb5e1f 55 }
dan_ackme 0:ea85c4bb5e1f 56 #endif
dan_ackme 0:ea85c4bb5e1f 57 rxBuffer->head = rxBuffer->tail = (volatile uint8_t*)rxBuffer->start;
dan_ackme 0:ea85c4bb5e1f 58 rxBuffer->end = (uint8_t*)rxBuffer->head + config.serialRxBufferSize;
dan_ackme 0:ea85c4bb5e1f 59 rxBuffer->size = config.serialRxBufferSize;
dan_ackme 0:ea85c4bb5e1f 60 attach(this, &WiconnectSerial::rxIrqHandler, SerialBase::RxIrq);
dan_ackme 0:ea85c4bb5e1f 61 }
dan_ackme 0:ea85c4bb5e1f 62 }
dan_ackme 0:ea85c4bb5e1f 63
dan_ackme 0:ea85c4bb5e1f 64 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 65 WiconnectSerial::~WiconnectSerial()
dan_ackme 0:ea85c4bb5e1f 66 {
dan_ackme 0:ea85c4bb5e1f 67 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 0:ea85c4bb5e1f 68 if(bufferAlloc)
dan_ackme 0:ea85c4bb5e1f 69 {
dan_ackme 0:ea85c4bb5e1f 70 SerialRxBuffer *rxBuffer = (SerialRxBuffer*)ringBuffer;
dan_ackme 0:ea85c4bb5e1f 71 Wiconnect::getInstance()->_free(rxBuffer->start);
dan_ackme 0:ea85c4bb5e1f 72 }
dan_ackme 0:ea85c4bb5e1f 73 #endif
dan_ackme 0:ea85c4bb5e1f 74 }
dan_ackme 0:ea85c4bb5e1f 75
dan_ackme 0:ea85c4bb5e1f 76 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 77 void WiconnectSerial::flush(void)
dan_ackme 0:ea85c4bb5e1f 78 {
dan_ackme 0:ea85c4bb5e1f 79 while (readable())
dan_ackme 0:ea85c4bb5e1f 80 {
dan_ackme 0:ea85c4bb5e1f 81 int c = getc();
dan_ackme 0:ea85c4bb5e1f 82 }
dan_ackme 0:ea85c4bb5e1f 83
dan_ackme 0:ea85c4bb5e1f 84 SerialRxBuffer *rxBuffer = (SerialRxBuffer*)ringBuffer;
dan_ackme 0:ea85c4bb5e1f 85 rxBuffer->tail = rxBuffer->head = rxBuffer->start;
dan_ackme 0:ea85c4bb5e1f 86 rxBuffer->count = 0;
dan_ackme 0:ea85c4bb5e1f 87 }
dan_ackme 0:ea85c4bb5e1f 88
dan_ackme 0:ea85c4bb5e1f 89 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 90 int WiconnectSerial::write(const void *data, int bytesToWrite, int timeoutMs)
dan_ackme 0:ea85c4bb5e1f 91 {
dan_ackme 0:ea85c4bb5e1f 92 uint8_t *ptr = (uint8_t*)data;
dan_ackme 0:ea85c4bb5e1f 93 int remaining = bytesToWrite;
dan_ackme 0:ea85c4bb5e1f 94
dan_ackme 0:ea85c4bb5e1f 95 while(remaining > 0)
dan_ackme 0:ea85c4bb5e1f 96 {
dan_ackme 0:ea85c4bb5e1f 97 if(!writeable())
dan_ackme 0:ea85c4bb5e1f 98 {
dan_ackme 0:ea85c4bb5e1f 99 timeoutTimer.reset();
dan_ackme 0:ea85c4bb5e1f 100 while(!writeable())
dan_ackme 0:ea85c4bb5e1f 101 {
dan_ackme 0:ea85c4bb5e1f 102 if(timeoutMs == 0)
dan_ackme 0:ea85c4bb5e1f 103 {
dan_ackme 0:ea85c4bb5e1f 104 if(timeoutTimer.readUs() >= 500)
dan_ackme 0:ea85c4bb5e1f 105 {
dan_ackme 0:ea85c4bb5e1f 106 goto exit;
dan_ackme 0:ea85c4bb5e1f 107 }
dan_ackme 0:ea85c4bb5e1f 108 }
dan_ackme 0:ea85c4bb5e1f 109 else
dan_ackme 0:ea85c4bb5e1f 110 {
dan_ackme 0:ea85c4bb5e1f 111 if(timeoutTimer.readUs() >= timeoutMs*1000)
dan_ackme 0:ea85c4bb5e1f 112 {
dan_ackme 0:ea85c4bb5e1f 113 goto exit;
dan_ackme 0:ea85c4bb5e1f 114 }
dan_ackme 0:ea85c4bb5e1f 115 }
dan_ackme 0:ea85c4bb5e1f 116 }
dan_ackme 0:ea85c4bb5e1f 117 }
dan_ackme 0:ea85c4bb5e1f 118
dan_ackme 0:ea85c4bb5e1f 119 putc(*ptr);
dan_ackme 0:ea85c4bb5e1f 120 ++ptr;
dan_ackme 0:ea85c4bb5e1f 121 --remaining;
dan_ackme 0:ea85c4bb5e1f 122 }
dan_ackme 0:ea85c4bb5e1f 123
dan_ackme 0:ea85c4bb5e1f 124 exit:
dan_ackme 0:ea85c4bb5e1f 125 return bytesToWrite - remaining;
dan_ackme 0:ea85c4bb5e1f 126 }
dan_ackme 0:ea85c4bb5e1f 127
dan_ackme 0:ea85c4bb5e1f 128 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 129 int WiconnectSerial::read(void *data, int bytesToRead, int timeoutMs)
dan_ackme 0:ea85c4bb5e1f 130 {
dan_ackme 0:ea85c4bb5e1f 131 SerialRxBuffer *rxBuffer = (SerialRxBuffer*)ringBuffer;
dan_ackme 0:ea85c4bb5e1f 132 uint8_t *ptr = (uint8_t*)data;
dan_ackme 0:ea85c4bb5e1f 133 int remaining = bytesToRead;
dan_ackme 0:ea85c4bb5e1f 134
dan_ackme 0:ea85c4bb5e1f 135 while(remaining > 0)
dan_ackme 0:ea85c4bb5e1f 136 {
dan_ackme 0:ea85c4bb5e1f 137 if(rxBuffer->count == 0)
dan_ackme 0:ea85c4bb5e1f 138 {
dan_ackme 0:ea85c4bb5e1f 139 if(timeoutMs == 0)
dan_ackme 0:ea85c4bb5e1f 140 {
dan_ackme 0:ea85c4bb5e1f 141 break;
dan_ackme 0:ea85c4bb5e1f 142 }
dan_ackme 0:ea85c4bb5e1f 143 else
dan_ackme 0:ea85c4bb5e1f 144 {
dan_ackme 0:ea85c4bb5e1f 145 timeoutTimer.reset();
dan_ackme 0:ea85c4bb5e1f 146 while(rxBuffer->count == 0)
dan_ackme 0:ea85c4bb5e1f 147 {
dan_ackme 0:ea85c4bb5e1f 148 if(timeoutTimer.readUs() >= timeoutMs*1000)
dan_ackme 0:ea85c4bb5e1f 149 {
dan_ackme 0:ea85c4bb5e1f 150 goto exit;
dan_ackme 0:ea85c4bb5e1f 151 }
dan_ackme 0:ea85c4bb5e1f 152 }
dan_ackme 0:ea85c4bb5e1f 153 }
dan_ackme 0:ea85c4bb5e1f 154 }
dan_ackme 0:ea85c4bb5e1f 155
dan_ackme 0:ea85c4bb5e1f 156 *ptr++ = *rxBuffer->tail++;
dan_ackme 0:ea85c4bb5e1f 157 --remaining;
dan_ackme 0:ea85c4bb5e1f 158 --rxBuffer->count;
dan_ackme 0:ea85c4bb5e1f 159 if(rxBuffer->tail >= rxBuffer->end)
dan_ackme 0:ea85c4bb5e1f 160 rxBuffer->tail = rxBuffer->start;
dan_ackme 0:ea85c4bb5e1f 161 }
dan_ackme 0:ea85c4bb5e1f 162
dan_ackme 0:ea85c4bb5e1f 163 exit:
dan_ackme 0:ea85c4bb5e1f 164 return bytesToRead - remaining;
dan_ackme 0:ea85c4bb5e1f 165 }
dan_ackme 0:ea85c4bb5e1f 166
dan_ackme 0:ea85c4bb5e1f 167 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 168 void WiconnectSerial::rxIrqHandler(void)
dan_ackme 0:ea85c4bb5e1f 169 {
dan_ackme 0:ea85c4bb5e1f 170 SerialRxBuffer *rxBuffer = (SerialRxBuffer*)ringBuffer;
dan_ackme 0:ea85c4bb5e1f 171
dan_ackme 0:ea85c4bb5e1f 172 while (readable() && rxBuffer->count < rxBuffer->size)
dan_ackme 0:ea85c4bb5e1f 173 {
dan_ackme 0:ea85c4bb5e1f 174 *rxBuffer->head++ = (uint8_t)getc();
dan_ackme 0:ea85c4bb5e1f 175 ++rxBuffer->count;
dan_ackme 0:ea85c4bb5e1f 176 if(rxBuffer->head >= rxBuffer->end)
dan_ackme 0:ea85c4bb5e1f 177 rxBuffer->head = rxBuffer->start;
dan_ackme 0:ea85c4bb5e1f 178 }
dan_ackme 0:ea85c4bb5e1f 179 }
dan_ackme 0:ea85c4bb5e1f 180