temp

Revision:
0:2a4af0cb6e8d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sample_buffer.cpp	Thu Dec 06 15:38:09 2018 +0000
@@ -0,0 +1,58 @@
+#include "mbed.h"
+#include "sample_buffer.hpp"
+
+//Thread sychronisation primatives
+Semaphore spaceAvailable(BUFFERSIZE);
+Semaphore samplesInBuffer(0);
+Mutex bufferLock;
+
+//Output buffer
+char buffer[BUFFERSIZE];
+unsigned int newestIndex = BUFFERSIZE-1;    //First time it is incremented, it will be 0
+unsigned int oldestIndex = BUFFERSIZE-1;   
+
+//Producer
+void addCharacterToQueue(const char c)
+{    
+    //Is there space?
+    int32_t Nspaces = spaceAvailable.wait();
+             
+    //Ok, there is space - take the lock
+    bufferLock.lock();
+        
+    //Update buffer
+    newestIndex = (newestIndex+1) % BUFFERSIZE;  
+    buffer[newestIndex] = c;
+    //printf("\tAdded ASCII Character: %2Xh (%c) to buffer, %d spaces available\n", c, c, Nspaces-1);
+    
+    //Release lock
+    bufferLock.unlock();
+    
+    //Signal that a sample has been added
+    samplesInBuffer.release();
+}
+
+//Consumer
+char takeCharacterFromQueue()
+{    
+    //Are thre any samples in the buffer
+    int32_t Nsamples = samplesInBuffer.wait();
+        
+    //Ok, there are samples - take the lock
+    bufferLock.lock();   
+    
+    //Update buffer - remove oldest
+    oldestIndex = (oldestIndex+1) % BUFFERSIZE;
+    char cc = buffer[oldestIndex];
+    //printf("\t\tTaking ASCII Character: %2Xh (%c) from buffer, %d bytes remaining\n", cc, cc, Nsamples-1);
+    
+    //Release lock
+    bufferLock.unlock();
+    
+    //Signal there is space in the buffer
+    spaceAvailable.release();
+    
+    //return a copy of the result
+    return cc;
+}
+