fuck this

Dependencies:   BMP280

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?

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