Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Autoflight2018_22_MODSERIAL
Fork of MODSERIAL by
Diff: RESIZE.cpp
- Revision:
- 38:a04506a9a55b
- Parent:
- 37:31db07ebcb68
--- 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
