fuck this

Dependencies:   BMP280

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?

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