Pull request for i.a. sensor buffer template

Dependencies:   BLE_API MPU6050 mbed nRF51822

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?

UserRevisionLine numberNew 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 */