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