Ben Gordon
/
ELEC351_GroupA_alternate
temp
Diff: sample_buffer.cpp
- 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; +} +