Pull request for i.a. sensor buffer template
Dependencies: BLE_API MPU6050 mbed nRF51822
MeasurementBufferTemplate.h@11:8c38e284e9f7, 2018-11-15 (annotated)
- Committer:
- JustinAtAlten
- Date:
- Thu Nov 15 15:20:46 2018 +0000
- Revision:
- 11:8c38e284e9f7
- Parent:
- 10:eed92ffd0bba
Added readme.txt
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JustinAtAlten | 10:eed92ffd0bba | 1 | #ifndef MEASUREMENTBUFFERTEMPLATE_H |
JustinAtAlten | 10:eed92ffd0bba | 2 | #define MEASUREMENTBUFFERTEMPLATE_H |
JustinAtAlten | 10:eed92ffd0bba | 3 | |
JustinAtAlten | 10:eed92ffd0bba | 4 | #include "AppTime.h" |
JustinAtAlten | 10:eed92ffd0bba | 5 | |
JustinAtAlten | 10:eed92ffd0bba | 6 | #define IncrementInRange(x, range) (((x+1) >= range) ? 0 : x+1) |
JustinAtAlten | 10:eed92ffd0bba | 7 | |
JustinAtAlten | 10:eed92ffd0bba | 8 | |
JustinAtAlten | 10:eed92ffd0bba | 9 | template<typename T_BufferType, unsigned int T_BufferLength, unsigned int T_ReadingsInUpdate, unsigned int T_ReadInterval, T_BufferType (*T_MeasurementFunction)()> |
JustinAtAlten | 10:eed92ffd0bba | 10 | class MeasurementBufferTemplate { |
JustinAtAlten | 10:eed92ffd0bba | 11 | public: |
JustinAtAlten | 10:eed92ffd0bba | 12 | struct BulkUpdate { |
JustinAtAlten | 10:eed92ffd0bba | 13 | uint32_t requestedTime; //intended time of first sensor-reading, specified by request |
JustinAtAlten | 10:eed92ffd0bba | 14 | uint32_t initialTime; //provided time of first sensor-reading |
JustinAtAlten | 10:eed92ffd0bba | 15 | uint32_t sensorReadingInterval; // time difference between sensor-readings (seconds) |
JustinAtAlten | 10:eed92ffd0bba | 16 | uint32_t numberOfReadings; |
JustinAtAlten | 10:eed92ffd0bba | 17 | T_BufferType readings[T_ReadingsInUpdate]; |
JustinAtAlten | 10:eed92ffd0bba | 18 | |
JustinAtAlten | 10:eed92ffd0bba | 19 | BulkUpdate(const time_t & requestedTime=0, const time_t & initialTime=0, const time_t & sensorReadingInterval=0) : |
JustinAtAlten | 10:eed92ffd0bba | 20 | requestedTime(requestedTime), |
JustinAtAlten | 10:eed92ffd0bba | 21 | initialTime(initialTime), |
JustinAtAlten | 10:eed92ffd0bba | 22 | sensorReadingInterval(sensorReadingInterval), |
JustinAtAlten | 10:eed92ffd0bba | 23 | numberOfReadings(0) |
JustinAtAlten | 10:eed92ffd0bba | 24 | { |
JustinAtAlten | 10:eed92ffd0bba | 25 | |
JustinAtAlten | 10:eed92ffd0bba | 26 | } |
JustinAtAlten | 10:eed92ffd0bba | 27 | }; |
JustinAtAlten | 10:eed92ffd0bba | 28 | |
JustinAtAlten | 10:eed92ffd0bba | 29 | public: |
JustinAtAlten | 10:eed92ffd0bba | 30 | MeasurementBufferTemplate() : |
JustinAtAlten | 10:eed92ffd0bba | 31 | buffer(new T_BufferType[T_BufferLength]), |
JustinAtAlten | 10:eed92ffd0bba | 32 | indexOfNewestReading(T_BufferLength-1), |
JustinAtAlten | 10:eed92ffd0bba | 33 | timeOfLastReading(0), |
JustinAtAlten | 10:eed92ffd0bba | 34 | nrSensorReadingsPerformed(0) |
JustinAtAlten | 10:eed92ffd0bba | 35 | { |
JustinAtAlten | 10:eed92ffd0bba | 36 | |
JustinAtAlten | 10:eed92ffd0bba | 37 | } |
JustinAtAlten | 10:eed92ffd0bba | 38 | |
JustinAtAlten | 10:eed92ffd0bba | 39 | virtual ~MeasurementBufferTemplate(){ |
JustinAtAlten | 10:eed92ffd0bba | 40 | delete [] buffer; |
JustinAtAlten | 10:eed92ffd0bba | 41 | } |
JustinAtAlten | 10:eed92ffd0bba | 42 | |
JustinAtAlten | 10:eed92ffd0bba | 43 | T_BufferType performMeasurement(){ |
JustinAtAlten | 10:eed92ffd0bba | 44 | //Get data |
JustinAtAlten | 10:eed92ffd0bba | 45 | T_BufferType measurementData = T_MeasurementFunction(); |
JustinAtAlten | 10:eed92ffd0bba | 46 | |
JustinAtAlten | 10:eed92ffd0bba | 47 | //Update buffer and meta-data |
JustinAtAlten | 10:eed92ffd0bba | 48 | indexOfNewestReading = IncrementInRange(indexOfNewestReading, T_BufferLength); |
JustinAtAlten | 10:eed92ffd0bba | 49 | timeOfLastReading = AppTime::getTime(); |
JustinAtAlten | 10:eed92ffd0bba | 50 | buffer[indexOfNewestReading] = measurementData; |
JustinAtAlten | 10:eed92ffd0bba | 51 | |
JustinAtAlten | 10:eed92ffd0bba | 52 | if(nrSensorReadingsPerformed < T_BufferLength){ //doesn't matter what the value is past this point, so only increment when relevant to prevent overflow |
JustinAtAlten | 10:eed92ffd0bba | 53 | nrSensorReadingsPerformed++; |
JustinAtAlten | 10:eed92ffd0bba | 54 | } |
JustinAtAlten | 10:eed92ffd0bba | 55 | |
JustinAtAlten | 10:eed92ffd0bba | 56 | return measurementData; |
JustinAtAlten | 10:eed92ffd0bba | 57 | } |
JustinAtAlten | 10:eed92ffd0bba | 58 | |
JustinAtAlten | 10:eed92ffd0bba | 59 | BulkUpdate getBulkUpdate(const time_t & requestedTime){ |
JustinAtAlten | 10:eed92ffd0bba | 60 | if(timeOfLastReading < requestedTime){ |
JustinAtAlten | 10:eed92ffd0bba | 61 | //no data available yet for requested time |
JustinAtAlten | 10:eed92ffd0bba | 62 | return BulkUpdate(requestedTime); |
JustinAtAlten | 10:eed92ffd0bba | 63 | } |
JustinAtAlten | 10:eed92ffd0bba | 64 | |
JustinAtAlten | 10:eed92ffd0bba | 65 | //find sensor-reading from where to start copying data |
JustinAtAlten | 10:eed92ffd0bba | 66 | float tDiff = timeOfLastReading - (float)requestedTime; |
JustinAtAlten | 10:eed92ffd0bba | 67 | unsigned int periodsPassed = tDiff / T_ReadInterval; |
JustinAtAlten | 10:eed92ffd0bba | 68 | |
JustinAtAlten | 10:eed92ffd0bba | 69 | //if request is made for data that no longer exists (i.e. it was overwritten already), then just present the oldest data we have |
JustinAtAlten | 10:eed92ffd0bba | 70 | if(periodsPassed >= T_BufferLength){ |
JustinAtAlten | 10:eed92ffd0bba | 71 | periodsPassed = T_BufferLength-1; |
JustinAtAlten | 10:eed92ffd0bba | 72 | } |
JustinAtAlten | 10:eed92ffd0bba | 73 | |
JustinAtAlten | 10:eed92ffd0bba | 74 | //If more sensor-readings are requested than have been read: adjust request to all readings that have been read |
JustinAtAlten | 10:eed92ffd0bba | 75 | if(periodsPassed >= nrSensorReadingsPerformed){ |
JustinAtAlten | 10:eed92ffd0bba | 76 | periodsPassed = nrSensorReadingsPerformed-1; |
JustinAtAlten | 10:eed92ffd0bba | 77 | } |
JustinAtAlten | 10:eed92ffd0bba | 78 | |
JustinAtAlten | 10:eed92ffd0bba | 79 | //set time of initial sensorReading |
JustinAtAlten | 10:eed92ffd0bba | 80 | float timePassed = periodsPassed * T_ReadInterval; |
JustinAtAlten | 10:eed92ffd0bba | 81 | time_t initialTime = 0; |
JustinAtAlten | 10:eed92ffd0bba | 82 | if(timePassed > timeOfLastReading){ |
JustinAtAlten | 10:eed92ffd0bba | 83 | //Shouldn't happen |
JustinAtAlten | 10:eed92ffd0bba | 84 | initialTime = 0; |
JustinAtAlten | 10:eed92ffd0bba | 85 | } else { |
JustinAtAlten | 10:eed92ffd0bba | 86 | initialTime = timeOfLastReading - timePassed; |
JustinAtAlten | 10:eed92ffd0bba | 87 | } |
JustinAtAlten | 10:eed92ffd0bba | 88 | |
JustinAtAlten | 10:eed92ffd0bba | 89 | //find the startIndex of the stored data |
JustinAtAlten | 10:eed92ffd0bba | 90 | int startIndex = (int)indexOfNewestReading - periodsPassed; // n+1 sensor-readings read for n = periodsPassed |
JustinAtAlten | 10:eed92ffd0bba | 91 | if(startIndex < 0){ |
JustinAtAlten | 10:eed92ffd0bba | 92 | //count backwards |
JustinAtAlten | 10:eed92ffd0bba | 93 | startIndex = T_BufferLength - abs(startIndex); |
JustinAtAlten | 10:eed92ffd0bba | 94 | //startIndex should now be >= 0, because (abs(startIndex) + 1) <= T_BufferLength |
JustinAtAlten | 10:eed92ffd0bba | 95 | } |
JustinAtAlten | 10:eed92ffd0bba | 96 | |
JustinAtAlten | 10:eed92ffd0bba | 97 | //copy data to BulkUpdate |
JustinAtAlten | 10:eed92ffd0bba | 98 | BulkUpdate ret(requestedTime, initialTime, T_ReadInterval); |
JustinAtAlten | 10:eed92ffd0bba | 99 | unsigned int readIndex = startIndex; |
JustinAtAlten | 10:eed92ffd0bba | 100 | for(unsigned int i=0; i < T_ReadingsInUpdate; i++){ |
JustinAtAlten | 10:eed92ffd0bba | 101 | //Copy reading |
JustinAtAlten | 10:eed92ffd0bba | 102 | ret.readings[i] = buffer[readIndex]; |
JustinAtAlten | 10:eed92ffd0bba | 103 | ret.numberOfReadings++; |
JustinAtAlten | 10:eed92ffd0bba | 104 | |
JustinAtAlten | 10:eed92ffd0bba | 105 | //increment read index |
JustinAtAlten | 10:eed92ffd0bba | 106 | readIndex = IncrementInRange(readIndex, T_BufferLength); |
JustinAtAlten | 10:eed92ffd0bba | 107 | |
JustinAtAlten | 10:eed92ffd0bba | 108 | if(readIndex == IncrementInRange(indexOfNewestReading, T_BufferLength)){ |
JustinAtAlten | 10:eed92ffd0bba | 109 | //if this iteration just read the newest temperature-sensor-reading: stop |
JustinAtAlten | 10:eed92ffd0bba | 110 | break; |
JustinAtAlten | 10:eed92ffd0bba | 111 | } |
JustinAtAlten | 10:eed92ffd0bba | 112 | } |
JustinAtAlten | 10:eed92ffd0bba | 113 | |
JustinAtAlten | 10:eed92ffd0bba | 114 | return ret; |
JustinAtAlten | 10:eed92ffd0bba | 115 | } |
JustinAtAlten | 10:eed92ffd0bba | 116 | |
JustinAtAlten | 10:eed92ffd0bba | 117 | private: |
JustinAtAlten | 10:eed92ffd0bba | 118 | T_BufferType * buffer; |
JustinAtAlten | 10:eed92ffd0bba | 119 | unsigned int indexOfNewestReading; |
JustinAtAlten | 10:eed92ffd0bba | 120 | float timeOfLastReading; |
JustinAtAlten | 10:eed92ffd0bba | 121 | uint16_t nrSensorReadingsPerformed; |
JustinAtAlten | 10:eed92ffd0bba | 122 | }; |
JustinAtAlten | 10:eed92ffd0bba | 123 | |
JustinAtAlten | 10:eed92ffd0bba | 124 | |
JustinAtAlten | 10:eed92ffd0bba | 125 | #endif /* MEASUREMENTBUFFERTEMPLATE_H */ |