MODSERIAL with support for more devices

Dependents:   1D-Pong BMT-K9_encoder BMT-K9-Regelaar programma_filter ... more

Check the cookbook page for more information: https://mbed.org/cookbook/MODSERIAL

Did you add a device? Please send a pull request so we can keep everything in one library instead of many copies. In that case also send a PM, since currently mbed does not inform of new pull requests. I will then also add you to the developers of this library so you can do other changes directly.

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