fuck this
Dependencies: BMP280
Sampling.cpp@25:a2aedb498b27, 2018-01-10 (annotated)
- Committer:
- mwthewsey
- Date:
- Wed Jan 10 03:57:59 2018 +0000
- Revision:
- 25:a2aedb498b27
- Parent:
- 21:6e733076f49c
Final Submission
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Swaggie | 5:bea93c8e50b7 | 1 | #include "Sampling.h" |
mwthewsey | 10:261f2b69c4c7 | 2 | #include "TimeInterface.h" |
Swaggie | 5:bea93c8e50b7 | 3 | #include "mbed.h" |
Swaggie | 8:dbb57b4d5ba4 | 4 | #include "rtos.h" |
Swaggie | 6:8e1795a5886b | 5 | |
mwthewsey | 9:ac5673cca703 | 6 | //Thread Sync Tools |
mwthewsey | 9:ac5673cca703 | 7 | Mutex tempReadingsLock; |
mwthewsey | 9:ac5673cca703 | 8 | Mutex presReadingsLock; |
mwthewsey | 9:ac5673cca703 | 9 | Mutex LDRReadingsLock; |
mwthewsey | 9:ac5673cca703 | 10 | Mutex timeReadingsLock; |
mwthewsey | 9:ac5673cca703 | 11 | |
mwthewsey | 9:ac5673cca703 | 12 | //Buffers with zero inital value |
mwthewsey | 9:ac5673cca703 | 13 | float tempReadings[BUFFERSIZE] = {}; |
mwthewsey | 9:ac5673cca703 | 14 | float presReadings[BUFFERSIZE] = {}; |
mwthewsey | 9:ac5673cca703 | 15 | float LDRReadings[BUFFERSIZE] = {}; |
mwthewsey | 10:261f2b69c4c7 | 16 | time_t timeReadings[BUFFERSIZE] = {}; |
mwthewsey | 9:ac5673cca703 | 17 | |
mwthewsey | 21:6e733076f49c | 18 | unsigned short SAMPLERATE = 15; //Set initial sample rate. |
mwthewsey | 21:6e733076f49c | 19 | |
mwthewsey | 9:ac5673cca703 | 20 | Thread t1; //Sample Enviromental Sensor |
mwthewsey | 9:ac5673cca703 | 21 | Thread t2; //Sample LDR Sensor |
mwthewsey | 9:ac5673cca703 | 22 | |
mwthewsey | 21:6e733076f49c | 23 | Ticker sampleRate; |
mwthewsey | 21:6e733076f49c | 24 | Timeout SampleLEDTimeout; |
mwthewsey | 9:ac5673cca703 | 25 | |
mwthewsey | 9:ac5673cca703 | 26 | bool NewEnvSample; //Is there new data from the envirom sensor to output? |
mwthewsey | 9:ac5673cca703 | 27 | bool NewLDRSample; //Is there new data from the LDR to output? |
mwthewsey | 9:ac5673cca703 | 28 | |
Swaggie | 7:bf9f92ff02e8 | 29 | //Index |
mwthewsey | 10:261f2b69c4c7 | 30 | volatile unsigned short nextIndex = 0; |
mwthewsey | 10:261f2b69c4c7 | 31 | volatile unsigned short currentIndex = 0; |
mwthewsey | 10:261f2b69c4c7 | 32 | volatile unsigned short oldestIndex = 0; |
Swaggie | 7:bf9f92ff02e8 | 33 | |
mwthewsey | 21:6e733076f49c | 34 | bool firstSample; |
Swaggie | 6:8e1795a5886b | 35 | |
Swaggie | 5:bea93c8e50b7 | 36 | void SampleTimerISR(void) |
Swaggie | 5:bea93c8e50b7 | 37 | { |
Swaggie | 5:bea93c8e50b7 | 38 | //Flag Threads |
Swaggie | 7:bf9f92ff02e8 | 39 | t1.signal_set(1); |
Swaggie | 7:bf9f92ff02e8 | 40 | t2.signal_set(1); |
Swaggie | 8:dbb57b4d5ba4 | 41 | SamplingLED = 1; |
mwthewsey | 9:ac5673cca703 | 42 | SampleLEDTimeout.attach(&FlipSamplingLED,0.1); //To turn LED off |
Swaggie | 5:bea93c8e50b7 | 43 | } |
Swaggie | 7:bf9f92ff02e8 | 44 | |
Swaggie | 5:bea93c8e50b7 | 45 | void ConfigThreadsAndIR(void) |
Swaggie | 5:bea93c8e50b7 | 46 | { |
Swaggie | 7:bf9f92ff02e8 | 47 | NewEnvSample = false; //Reset |
Swaggie | 7:bf9f92ff02e8 | 48 | NewLDRSample = false; //Reset |
Swaggie | 7:bf9f92ff02e8 | 49 | |
mwthewsey | 21:6e733076f49c | 50 | t1.start(&ThreadSampleEnvSensor); //Start Threads |
Swaggie | 8:dbb57b4d5ba4 | 51 | t2.start(&ThreadSampleLDR); |
Swaggie | 7:bf9f92ff02e8 | 52 | |
mwthewsey | 21:6e733076f49c | 53 | Thread t1(osPriorityRealtime); //Higher priority |
mwthewsey | 21:6e733076f49c | 54 | Thread t2(osPriorityRealtime); |
mwthewsey | 21:6e733076f49c | 55 | |
mwthewsey | 10:261f2b69c4c7 | 56 | sampleRate.attach(&SampleTimerISR, SAMPLERATE); //15 second interval |
Swaggie | 7:bf9f92ff02e8 | 57 | } |
Swaggie | 7:bf9f92ff02e8 | 58 | |
Swaggie | 7:bf9f92ff02e8 | 59 | void AddTempSample(float temp) |
Swaggie | 7:bf9f92ff02e8 | 60 | { |
mwthewsey | 21:6e733076f49c | 61 | tempReadingsLock.lock(); //Take the key |
mwthewsey | 9:ac5673cca703 | 62 | tempReadings[nextIndex] = temp; //Add the sample after the most recent |
mwthewsey | 21:6e733076f49c | 63 | tempReadingsLock.unlock(); // Release the key |
Swaggie | 7:bf9f92ff02e8 | 64 | } |
Swaggie | 7:bf9f92ff02e8 | 65 | |
Swaggie | 7:bf9f92ff02e8 | 66 | void AddPresSample(float pres) |
Swaggie | 7:bf9f92ff02e8 | 67 | { |
mwthewsey | 21:6e733076f49c | 68 | presReadingsLock.lock(); //Take the key |
mwthewsey | 9:ac5673cca703 | 69 | presReadings[nextIndex] = pres; //Add to register |
mwthewsey | 21:6e733076f49c | 70 | presReadingsLock.unlock(); //Release the key |
Swaggie | 6:8e1795a5886b | 71 | } |
Swaggie | 6:8e1795a5886b | 72 | |
Swaggie | 7:bf9f92ff02e8 | 73 | void ThreadSampleEnvSensor(void) |
Swaggie | 6:8e1795a5886b | 74 | { |
Swaggie | 7:bf9f92ff02e8 | 75 | while (true) { |
Swaggie | 7:bf9f92ff02e8 | 76 | Thread::signal_wait(1); //Wait for signal 1 |
Swaggie | 7:bf9f92ff02e8 | 77 | //Get readings |
Swaggie | 7:bf9f92ff02e8 | 78 | float temp = sensor.getTemperature(); |
Swaggie | 7:bf9f92ff02e8 | 79 | float pres = sensor.getPressure(); |
Swaggie | 7:bf9f92ff02e8 | 80 | AddPresSample(pres); //Add value to register |
Swaggie | 7:bf9f92ff02e8 | 81 | AddTempSample(temp); //Add value to register |
Swaggie | 7:bf9f92ff02e8 | 82 | NewEnvSample = true; //Signal to main thread |
Swaggie | 7:bf9f92ff02e8 | 83 | } |
Swaggie | 7:bf9f92ff02e8 | 84 | } |
Swaggie | 7:bf9f92ff02e8 | 85 | |
Swaggie | 7:bf9f92ff02e8 | 86 | void AddLDRSample(float LDRval) |
Swaggie | 7:bf9f92ff02e8 | 87 | { |
mwthewsey | 21:6e733076f49c | 88 | LDRReadingsLock.lock(); //Take the key |
mwthewsey | 21:6e733076f49c | 89 | LDRReadings[nextIndex] = LDRval; //Add the sample after the most recent |
mwthewsey | 21:6e733076f49c | 90 | LDRReadingsLock.unlock(); // Release the key |
Swaggie | 6:8e1795a5886b | 91 | } |
Swaggie | 6:8e1795a5886b | 92 | |
mwthewsey | 10:261f2b69c4c7 | 93 | void AddTimeSample(time_t sampledTime) |
mwthewsey | 10:261f2b69c4c7 | 94 | { |
mwthewsey | 21:6e733076f49c | 95 | timeReadingsLock.lock(); //Take the key |
mwthewsey | 10:261f2b69c4c7 | 96 | timeReadings[nextIndex] = sampledTime; //Add the sample after the most recent |
mwthewsey | 21:6e733076f49c | 97 | timeReadingsLock.unlock(); // Release the key |
mwthewsey | 10:261f2b69c4c7 | 98 | } |
mwthewsey | 10:261f2b69c4c7 | 99 | |
Swaggie | 7:bf9f92ff02e8 | 100 | void ThreadSampleLDR(void) |
Swaggie | 6:8e1795a5886b | 101 | { |
Swaggie | 7:bf9f92ff02e8 | 102 | while (true) { |
Swaggie | 7:bf9f92ff02e8 | 103 | Thread::signal_wait(1); //Wait for signal 1 |
Swaggie | 7:bf9f92ff02e8 | 104 | //get readings |
Swaggie | 8:dbb57b4d5ba4 | 105 | float LDRval = LDRSensor; //Read the analogue pin value |
mwthewsey | 10:261f2b69c4c7 | 106 | time_t currentTime = time(0); //Get the system time |
Swaggie | 7:bf9f92ff02e8 | 107 | AddLDRSample(LDRval); |
mwthewsey | 10:261f2b69c4c7 | 108 | |
mwthewsey | 10:261f2b69c4c7 | 109 | AddTimeSample(currentTime); |
Swaggie | 7:bf9f92ff02e8 | 110 | NewLDRSample = true; //signal to main thread |
Swaggie | 7:bf9f92ff02e8 | 111 | } |
Swaggie | 7:bf9f92ff02e8 | 112 | } |
Swaggie | 7:bf9f92ff02e8 | 113 | |
Swaggie | 7:bf9f92ff02e8 | 114 | void IncrementIndex(void) |
Swaggie | 7:bf9f92ff02e8 | 115 | { |
mwthewsey | 9:ac5673cca703 | 116 | nextIndex = IndexIncrement(nextIndex); //Increment next index |
mwthewsey | 9:ac5673cca703 | 117 | if (firstSample) { |
mwthewsey | 9:ac5673cca703 | 118 | firstSample = false; //During first sample, do not increment current or oldest |
mwthewsey | 9:ac5673cca703 | 119 | } else { |
mwthewsey | 9:ac5673cca703 | 120 | currentIndex = IndexIncrement(currentIndex); |
mwthewsey | 9:ac5673cca703 | 121 | if (currentIndex == oldestIndex) { //When current index overflows, start infrementing oldest |
mwthewsey | 10:261f2b69c4c7 | 122 | oldestIndex = IndexIncrement(oldestIndex); |
Swaggie | 7:bf9f92ff02e8 | 123 | } |
Swaggie | 7:bf9f92ff02e8 | 124 | } |
Swaggie | 7:bf9f92ff02e8 | 125 | } |
Swaggie | 8:dbb57b4d5ba4 | 126 | |
mwthewsey | 9:ac5673cca703 | 127 | unsigned short IndexIncrement(unsigned short thisIndex) |
mwthewsey | 9:ac5673cca703 | 128 | { |
mwthewsey | 10:261f2b69c4c7 | 129 | if (thisIndex+1 == BUFFERSIZE) { |
mwthewsey | 9:ac5673cca703 | 130 | thisIndex = 0; //When index reached buffersize, reset to 0 |
mwthewsey | 9:ac5673cca703 | 131 | } else { |
mwthewsey | 9:ac5673cca703 | 132 | thisIndex++; //Else increment |
mwthewsey | 9:ac5673cca703 | 133 | } |
mwthewsey | 9:ac5673cca703 | 134 | return thisIndex; |
mwthewsey | 9:ac5673cca703 | 135 | } |
mwthewsey | 9:ac5673cca703 | 136 | |
mwthewsey | 10:261f2b69c4c7 | 137 | unsigned short IndexDecrement(unsigned short thisIndex) |
mwthewsey | 10:261f2b69c4c7 | 138 | { |
mwthewsey | 10:261f2b69c4c7 | 139 | if (thisIndex-1 == -1) { // Wait for underflow |
mwthewsey | 10:261f2b69c4c7 | 140 | thisIndex = BUFFERSIZE-1; //When index reaches 0 reset to Buffersize-1 |
mwthewsey | 10:261f2b69c4c7 | 141 | } else { |
mwthewsey | 10:261f2b69c4c7 | 142 | thisIndex--; //Else decrement |
mwthewsey | 10:261f2b69c4c7 | 143 | } |
mwthewsey | 10:261f2b69c4c7 | 144 | return thisIndex; |
mwthewsey | 10:261f2b69c4c7 | 145 | } |
mwthewsey | 10:261f2b69c4c7 | 146 | |
mwthewsey | 10:261f2b69c4c7 | 147 | void Sampling(bool inputState) |
mwthewsey | 10:261f2b69c4c7 | 148 | { |
mwthewsey | 10:261f2b69c4c7 | 149 | if (inputState) { |
mwthewsey | 21:6e733076f49c | 150 | sampleRate.attach(&SampleTimerISR, SAMPLERATE); //Attach ticker |
mwthewsey | 10:261f2b69c4c7 | 151 | } else { |
mwthewsey | 21:6e733076f49c | 152 | sampleRate.detach(); //Detach ticker, stops sampling |
mwthewsey | 10:261f2b69c4c7 | 153 | } |
mwthewsey | 10:261f2b69c4c7 | 154 | } |
mwthewsey | 10:261f2b69c4c7 | 155 | |
mwthewsey | 10:261f2b69c4c7 | 156 | void TakeKeys(bool inputState) |
mwthewsey | 10:261f2b69c4c7 | 157 | { |
mwthewsey | 10:261f2b69c4c7 | 158 | if (inputState) { |
mwthewsey | 10:261f2b69c4c7 | 159 | tempReadingsLock.lock(); //Take the key |
mwthewsey | 10:261f2b69c4c7 | 160 | presReadingsLock.lock(); |
mwthewsey | 10:261f2b69c4c7 | 161 | LDRReadingsLock.lock(); |
mwthewsey | 10:261f2b69c4c7 | 162 | timeReadingsLock.lock(); |
mwthewsey | 10:261f2b69c4c7 | 163 | } else { |
mwthewsey | 21:6e733076f49c | 164 | tempReadingsLock.unlock(); //Release the key |
mwthewsey | 10:261f2b69c4c7 | 165 | presReadingsLock.unlock(); |
mwthewsey | 10:261f2b69c4c7 | 166 | LDRReadingsLock.unlock(); |
mwthewsey | 10:261f2b69c4c7 | 167 | timeReadingsLock.unlock(); |
mwthewsey | 10:261f2b69c4c7 | 168 | } |
mwthewsey | 10:261f2b69c4c7 | 169 | } |
mwthewsey | 10:261f2b69c4c7 | 170 | |
mwthewsey | 9:ac5673cca703 | 171 | |
Swaggie | 8:dbb57b4d5ba4 | 172 | void FlipSamplingLED(void) |
Swaggie | 8:dbb57b4d5ba4 | 173 | { |
Swaggie | 8:dbb57b4d5ba4 | 174 | SamplingLED = 0; |
Swaggie | 8:dbb57b4d5ba4 | 175 | } |
mwthewsey | 9:ac5673cca703 | 176 |