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.

Files at this revision

API Documentation at this revision

Comitter:
BlazeX
Date:
Fri Dec 12 08:49:27 2014 +0000
Parent:
37:31db07ebcb68
Child:
39:8ef4f91813fd
Commit message:
Fixed txBufferSetSize and rxBufferSetSize. Now working with buffers in use.

Changed in this revision

MODSERIAL.h Show annotated file Show diff for this revision Revisions of this file
RESIZE.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/MODSERIAL.h	Thu Dec 11 20:24:15 2014 +0000
+++ b/MODSERIAL.h	Fri Dec 12 08:49:27 2014 +0000
@@ -949,19 +949,7 @@
      * @ingroup INTERNALS
      */
     int resizeBuffer(int size, IrqType type = RxIrq, bool memory_check = true);   
-    
-    /** 
-     * Function: downSizeBuffer
-     * @ingroup INTERNALS
-     */
-    int downSizeBuffer(int size, IrqType type, bool memory_check); 
-    
-    /** 
-     * Function: upSizeBuffer
-     * @ingroup INTERNALS
-     */
-    int upSizeBuffer(int size, IrqType type, bool memory_check); 
-    
+       
     /** 
      * Function: moveRingBuffer
      * @ingroup INTERNALS
@@ -1005,3 +993,4 @@
 using namespace AjK;
 
 #endif
+
--- 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