trabalho
Dependencies: X_NUCLEO_IKS01A1 mbed-rtos mbed
Fork of HelloWorld_IKS01A1 by
buffer.cpp@33:115aa467b4fa, 2016-05-10 (annotated)
- Committer:
- Jacinta
- Date:
- Tue May 10 11:19:21 2016 +0000
- Revision:
- 33:115aa467b4fa
- Parent:
- 31:eb7320bd1d37
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
stwykd | 26:71c54c8ae536 | 1 | #include "mbed.h" |
stwykd | 26:71c54c8ae536 | 2 | #include "rtos.h" |
stwykd | 26:71c54c8ae536 | 3 | #include "string.h" |
stwykd | 26:71c54c8ae536 | 4 | #include <stdio.h> |
stwykd | 26:71c54c8ae536 | 5 | #include <ctype.h> |
stwykd | 26:71c54c8ae536 | 6 | |
stwykd | 26:71c54c8ae536 | 7 | // A First-In-First-Out buffer is used with streams of data. |
stwykd | 26:71c54c8ae536 | 8 | // It is thread-safe and often used to buffer data across threads |
stwykd | 26:71c54c8ae536 | 9 | |
stwykd | 26:71c54c8ae536 | 10 | #define BUFFERSIZE 100 |
Jacinta | 31:eb7320bd1d37 | 11 | /* |
stwykd | 26:71c54c8ae536 | 12 | typedef struct { |
stwykd | 26:71c54c8ae536 | 13 | uint8_t id; |
stwykd | 27:0bbc1d575986 | 14 | float tempCelsius; |
stwykd | 26:71c54c8ae536 | 15 | float tempFarenheit; |
stwykd | 26:71c54c8ae536 | 16 | float humidity; |
stwykd | 26:71c54c8ae536 | 17 | float pressure; |
stwykd | 27:0bbc1d575986 | 18 | int32_t accelerometer[3]; |
stwykd | 27:0bbc1d575986 | 19 | int32_t gyroscope[3]; |
stwykd | 27:0bbc1d575986 | 20 | int32_t magnetometer[3]; |
stwykd | 26:71c54c8ae536 | 21 | char* date; |
stwykd | 26:71c54c8ae536 | 22 | } log_data; |
stwykd | 26:71c54c8ae536 | 23 | |
stwykd | 26:71c54c8ae536 | 24 | Semaphore *spaceAvailable; |
stwykd | 26:71c54c8ae536 | 25 | Semaphore *samplesInBuffer; |
stwykd | 26:71c54c8ae536 | 26 | Mutex *bufferLock; |
stwykd | 26:71c54c8ae536 | 27 | |
stwykd | 26:71c54c8ae536 | 28 | log_data buffer[BUFFERSIZE]; |
stwykd | 26:71c54c8ae536 | 29 | unsigned int newestIndex = BUFFERSIZE-1; |
stwykd | 26:71c54c8ae536 | 30 | unsigned int oldestIndex = BUFFERSIZE-1; |
stwykd | 26:71c54c8ae536 | 31 | |
stwykd | 26:71c54c8ae536 | 32 | class Buffer { |
stwykd | 26:71c54c8ae536 | 33 | public: |
stwykd | 26:71c54c8ae536 | 34 | void addDataToQueue(log_data d) { |
stwykd | 26:71c54c8ae536 | 35 | // Check whether there's space |
stwykd | 26:71c54c8ae536 | 36 | int32_t Nspaces = spaceAvailable->wait(); |
stwykd | 26:71c54c8ae536 | 37 | |
stwykd | 26:71c54c8ae536 | 38 | // If there's space, use the mutex |
stwykd | 26:71c54c8ae536 | 39 | bufferLock->lock(); |
stwykd | 26:71c54c8ae536 | 40 | |
stwykd | 26:71c54c8ae536 | 41 | // Update buffer |
stwykd | 26:71c54c8ae536 | 42 | newestIndex = (newestIndex+1) % BUFFERSIZE; |
stwykd | 26:71c54c8ae536 | 43 | buffer[newestIndex] = d; |
stwykd | 26:71c54c8ae536 | 44 | printf("\tAdded log_data id %d to buffer, %d space available\n", |
stwykd | 26:71c54c8ae536 | 45 | unsigned(d.id), Nspaces-1); |
stwykd | 26:71c54c8ae536 | 46 | |
stwykd | 26:71c54c8ae536 | 47 | bufferLock->unlock(); |
stwykd | 26:71c54c8ae536 | 48 | |
stwykd | 26:71c54c8ae536 | 49 | // Signal that a sample has been added |
stwykd | 26:71c54c8ae536 | 50 | samplesInBuffer->release(); |
stwykd | 26:71c54c8ae536 | 51 | } |
stwykd | 26:71c54c8ae536 | 52 | |
stwykd | 26:71c54c8ae536 | 53 | log_data takeCharacterFromQueue(){ |
stwykd | 26:71c54c8ae536 | 54 | // Check whether there are samples |
stwykd | 26:71c54c8ae536 | 55 | int32_t Nsamples = samplesInBuffer->wait(); |
stwykd | 26:71c54c8ae536 | 56 | |
stwykd | 26:71c54c8ae536 | 57 | bufferLock->lock(); |
stwykd | 26:71c54c8ae536 | 58 | |
stwykd | 26:71c54c8ae536 | 59 | oldestIndex = (oldestIndex+1) % BUFFERSIZE; |
stwykd | 26:71c54c8ae536 | 60 | log_data d = buffer[oldestIndex]; |
stwykd | 26:71c54c8ae536 | 61 | printf("\tRemoved log_data id %d from buffer, %d bytes remaining\n", |
stwykd | 26:71c54c8ae536 | 62 | unsigned(d.id), Nsamples-1); |
stwykd | 26:71c54c8ae536 | 63 | |
stwykd | 26:71c54c8ae536 | 64 | bufferLock->unlock(); |
stwykd | 26:71c54c8ae536 | 65 | |
stwykd | 26:71c54c8ae536 | 66 | //Signal there's space in the buffer |
stwykd | 26:71c54c8ae536 | 67 | spaceAvailable->release(); |
stwykd | 26:71c54c8ae536 | 68 | |
stwykd | 26:71c54c8ae536 | 69 | return d; |
stwykd | 26:71c54c8ae536 | 70 | } |
stwykd | 26:71c54c8ae536 | 71 | |
stwykd | 26:71c54c8ae536 | 72 | Buffer() { |
stwykd | 26:71c54c8ae536 | 73 | bufferLock = new Mutex(); |
stwykd | 26:71c54c8ae536 | 74 | spaceAvailable = new Semaphore(BUFFERSIZE); |
stwykd | 26:71c54c8ae536 | 75 | samplesInBuffer = new Semaphore(0); |
stwykd | 26:71c54c8ae536 | 76 | } |
Jacinta | 31:eb7320bd1d37 | 77 | }; |
Jacinta | 31:eb7320bd1d37 | 78 | */ |