MODSERIAL with support for more devices
Fork of MODSERIAL by
Diff: RESIZE.cpp
- Revision:
- 38:a04506a9a55b
- Parent:
- 37:31db07ebcb68
diff -r 31db07ebcb68 -r a04506a9a55b RESIZE.cpp --- a/RESIZE.cpp Thu Dec 11 20:24:15 2014 +0000 +++ b/RESIZE.cpp Fri Dec 12 08:49:27 2014 +0000 @@ -27,37 +27,24 @@ int MODSERIAL::resizeBuffer(int size, IrqType type, bool memory_check) -{ - int rval = Ok; - - // If the requested size is the same as the current size there's nothing to do, - // just continue to use the same buffer as it's fine as it is. - if (buffer_size[type] == size) return rval; - +{ // Make sure the ISR cannot use the buffers while we are manipulating them. NVIC_DisableIRQ(_IRQ); - // If the requested buffer size is larger than the current size, - // attempt to create a new buffer and use it. - if (buffer_size[type] < size) { - rval = upSizeBuffer(size, type, memory_check); - } - else if (buffer_size[type] > size) { - rval = downSizeBuffer(size, type, memory_check); + // If the requested size is the same as the current size there's nothing to do, + // just continue to use the same buffer as it's fine as it is. + if (buffer_size[type] == size) + { + NVIC_EnableIRQ(_IRQ); + return Ok; } - // Start the ISR system again with the new buffers. - NVIC_EnableIRQ(_IRQ); - - return rval; -} - -int -MODSERIAL::downSizeBuffer(int size, IrqType type, bool memory_check) -{ // is new buffer is big enough? if (size <= buffer_count[type]) + { + NVIC_EnableIRQ(_IRQ); return BufferOversize; + } // allocate new buffer char * newBuffer = (char*)malloc(size); @@ -80,46 +67,19 @@ buffer[type] = newBuffer; buffer_size[type] = size; buffer_in[type] = buffer_count[type]; - buffer_out[type] = 0; - - return Ok; -} - -int -MODSERIAL::upSizeBuffer(int size, IrqType type, bool memory_check) -{ - // allocate new buffer - char * newBuffer = (char*)malloc(size); + buffer_out[type] = 0; - // allocation failed? - if (newBuffer == (char*)NULL) - { - if (memory_check) - error("Failed to allocate memory for %s buffer", type == TxIrq ? "TX" : "RX"); - - return NoMemory; - } - - // copy old buffer content to new one - moveRingBuffer(newBuffer, type); - - // free old buffer and reset ring buffer cursor - free((char*)buffer[type]); - - buffer[type] = newBuffer; - buffer_size[type] = size; - buffer_in[type] = buffer_count[type]; - buffer_out[type] = 0; - + // Start the ISR system again with the new buffers. + NVIC_EnableIRQ(_IRQ); return Ok; } void MODSERIAL::moveRingBuffer(char * newBuffer, IrqType type) -{ +{ // copy old buffer content to new one if(buffer_in[type] > buffer_out[type]) { // content in the middle of the ring buffer - memcpy(&newBuffer[0], (char*)buffer[type], buffer_count[type]); + memcpy(&newBuffer[0], (char*)&buffer[type][buffer_out[type]], buffer_count[type]); } else if(buffer_in[type] < buffer_out[type]) { // content split, free space in the middle