Catie fork

Dependencies:   SDFileSystem X_NUCLEO_IKS01A1

Fork of ATT_AWS_IoT_demo by AT&T IoT

Committer:
peyo
Date:
Wed Apr 05 16:05:41 2017 +0000
Revision:
29:537df716ba0b
Parent:
15:6f2798e45099
Use IKS01A1 sensors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ampembeng 15:6f2798e45099 1 /*
ampembeng 15:6f2798e45099 2 Copyright (c) 2010 Andy Kirkham
ampembeng 15:6f2798e45099 3
ampembeng 15:6f2798e45099 4 Permission is hereby granted, free of charge, to any person obtaining a copy
ampembeng 15:6f2798e45099 5 of this software and associated documentation files (the "Software"), to deal
ampembeng 15:6f2798e45099 6 in the Software without restriction, including without limitation the rights
ampembeng 15:6f2798e45099 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ampembeng 15:6f2798e45099 8 copies of the Software, and to permit persons to whom the Software is
ampembeng 15:6f2798e45099 9 furnished to do so, subject to the following conditions:
ampembeng 15:6f2798e45099 10
ampembeng 15:6f2798e45099 11 The above copyright notice and this permission notice shall be included in
ampembeng 15:6f2798e45099 12 all copies or substantial portions of the Software.
ampembeng 15:6f2798e45099 13
ampembeng 15:6f2798e45099 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ampembeng 15:6f2798e45099 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ampembeng 15:6f2798e45099 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ampembeng 15:6f2798e45099 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ampembeng 15:6f2798e45099 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ampembeng 15:6f2798e45099 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ampembeng 15:6f2798e45099 20 THE SOFTWARE.
ampembeng 15:6f2798e45099 21 */
ampembeng 15:6f2798e45099 22
ampembeng 15:6f2798e45099 23 #include "MODSERIAL.h"
ampembeng 15:6f2798e45099 24 #include "MACROS.h"
ampembeng 15:6f2798e45099 25
ampembeng 15:6f2798e45099 26 namespace AjK {
ampembeng 15:6f2798e45099 27
ampembeng 15:6f2798e45099 28 int
ampembeng 15:6f2798e45099 29 MODSERIAL::resizeBuffer(int size, IrqType type, bool memory_check)
ampembeng 15:6f2798e45099 30 {
ampembeng 15:6f2798e45099 31 // Make sure the ISR cannot use the buffers while we are manipulating them.
ampembeng 15:6f2798e45099 32 NVIC_DisableIRQ(_IRQ);
ampembeng 15:6f2798e45099 33
ampembeng 15:6f2798e45099 34 // If the requested size is the same as the current size there's nothing to do,
ampembeng 15:6f2798e45099 35 // just continue to use the same buffer as it's fine as it is.
ampembeng 15:6f2798e45099 36 if (buffer_size[type] == size)
ampembeng 15:6f2798e45099 37 {
ampembeng 15:6f2798e45099 38 NVIC_EnableIRQ(_IRQ);
ampembeng 15:6f2798e45099 39 return Ok;
ampembeng 15:6f2798e45099 40 }
ampembeng 15:6f2798e45099 41
ampembeng 15:6f2798e45099 42 // is new buffer is big enough?
ampembeng 15:6f2798e45099 43 if (size <= buffer_count[type])
ampembeng 15:6f2798e45099 44 {
ampembeng 15:6f2798e45099 45 NVIC_EnableIRQ(_IRQ);
ampembeng 15:6f2798e45099 46 return BufferOversize;
ampembeng 15:6f2798e45099 47 }
ampembeng 15:6f2798e45099 48
ampembeng 15:6f2798e45099 49 // allocate new buffer
ampembeng 15:6f2798e45099 50 char * newBuffer = (char*)malloc(size);
ampembeng 15:6f2798e45099 51
ampembeng 15:6f2798e45099 52 // allocation failed?
ampembeng 15:6f2798e45099 53 if (newBuffer == (char*)NULL)
ampembeng 15:6f2798e45099 54 {
ampembeng 15:6f2798e45099 55 if (memory_check)
ampembeng 15:6f2798e45099 56 error("Failed to allocate memory for %s buffer", type == TxIrq ? "TX" : "RX");
ampembeng 15:6f2798e45099 57
ampembeng 15:6f2798e45099 58 return NoMemory;
ampembeng 15:6f2798e45099 59 }
ampembeng 15:6f2798e45099 60
ampembeng 15:6f2798e45099 61 // copy old buffer content to new one
ampembeng 15:6f2798e45099 62 moveRingBuffer(newBuffer, type);
ampembeng 15:6f2798e45099 63
ampembeng 15:6f2798e45099 64 // free old buffer and reset ring buffer cursor
ampembeng 15:6f2798e45099 65 free((char*)buffer[type]);
ampembeng 15:6f2798e45099 66
ampembeng 15:6f2798e45099 67 buffer[type] = newBuffer;
ampembeng 15:6f2798e45099 68 buffer_size[type] = size;
ampembeng 15:6f2798e45099 69 buffer_in[type] = buffer_count[type];
ampembeng 15:6f2798e45099 70 buffer_out[type] = 0;
ampembeng 15:6f2798e45099 71
ampembeng 15:6f2798e45099 72 // Start the ISR system again with the new buffers.
ampembeng 15:6f2798e45099 73 NVIC_EnableIRQ(_IRQ);
ampembeng 15:6f2798e45099 74 return Ok;
ampembeng 15:6f2798e45099 75 }
ampembeng 15:6f2798e45099 76
ampembeng 15:6f2798e45099 77 void MODSERIAL::moveRingBuffer(char * newBuffer, IrqType type)
ampembeng 15:6f2798e45099 78 {
ampembeng 15:6f2798e45099 79 // copy old buffer content to new one
ampembeng 15:6f2798e45099 80 if(buffer_in[type] > buffer_out[type])
ampembeng 15:6f2798e45099 81 { // content in the middle of the ring buffer
ampembeng 15:6f2798e45099 82 memcpy(&newBuffer[0], (char*)&buffer[type][buffer_out[type]], buffer_count[type]);
ampembeng 15:6f2798e45099 83 }
ampembeng 15:6f2798e45099 84 else if(buffer_in[type] < buffer_out[type])
ampembeng 15:6f2798e45099 85 { // content split, free space in the middle
ampembeng 15:6f2798e45099 86 // copy last part of the old buffer
ampembeng 15:6f2798e45099 87 int end_count= buffer_size[type] - buffer_out[type];
ampembeng 15:6f2798e45099 88 memcpy(&newBuffer[0], (char*)&buffer[type][buffer_out[type]], end_count);
ampembeng 15:6f2798e45099 89
ampembeng 15:6f2798e45099 90 // copy first part of old buffer
ampembeng 15:6f2798e45099 91 memcpy(&newBuffer[end_count], (char*)buffer[type], buffer_in[type]);
ampembeng 15:6f2798e45099 92 }
ampembeng 15:6f2798e45099 93 // else old buffer empty
ampembeng 15:6f2798e45099 94 }
ampembeng 15:6f2798e45099 95
ampembeng 15:6f2798e45099 96 }; // namespace AjK ends
ampembeng 15:6f2798e45099 97