Updated

Dependents:   PROJECTTEST

Committer:
Swabey89
Date:
Sat Jan 05 15:02:27 2019 +0000
Revision:
0:dbd6284a9f1b
Updated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Swabey89 0:dbd6284a9f1b 1 #include "sample_hardware.hpp"
Swabey89 0:dbd6284a9f1b 2
Swabey89 0:dbd6284a9f1b 3 #define RED_DONE 1
Swabey89 0:dbd6284a9f1b 4 #define YELLOW_DONE 2
Swabey89 0:dbd6284a9f1b 5
Swabey89 0:dbd6284a9f1b 6 //Digital outputs
Swabey89 0:dbd6284a9f1b 7 DigitalOut onBoardLED(LED1);
Swabey89 0:dbd6284a9f1b 8 DigitalOut redLED(PE_15);
Swabey89 0:dbd6284a9f1b 9 DigitalOut yellowLED(PB_10);
Swabey89 0:dbd6284a9f1b 10 DigitalOut greenLED(PB_11);
Swabey89 0:dbd6284a9f1b 11
Swabey89 0:dbd6284a9f1b 12 //Inputs
Swabey89 0:dbd6284a9f1b 13 DigitalIn onBoardSwitch(USER_BUTTON);
Swabey89 0:dbd6284a9f1b 14 DigitalIn SW1(PE_12);
Swabey89 0:dbd6284a9f1b 15 DigitalIn SW2(PE_14);
Swabey89 0:dbd6284a9f1b 16 AnalogIn adcIn(PA_0);
Swabey89 0:dbd6284a9f1b 17
Swabey89 0:dbd6284a9f1b 18 //Environmental Sensor driver
Swabey89 0:dbd6284a9f1b 19 #ifdef BME
Swabey89 0:dbd6284a9f1b 20 BME280 sensor(D14, D15);
Swabey89 0:dbd6284a9f1b 21 #else
Swabey89 0:dbd6284a9f1b 22 BMP280 sensor(I2C_SDA, I2C_SCL);
Swabey89 0:dbd6284a9f1b 23 #endif
Swabey89 0:dbd6284a9f1b 24
Swabey89 0:dbd6284a9f1b 25 //LCD Driver (provided via mbed repository)
Swabey89 0:dbd6284a9f1b 26 //RS D9
Swabey89 0:dbd6284a9f1b 27 //E D8
Swabey89 0:dbd6284a9f1b 28 //D7,6,4,2 are the 4 bit for d4-7
Swabey89 0:dbd6284a9f1b 29 TextLCD lcd(D9, D8, D7, D6, D4, D2); // rs, e, d4-d7
Swabey89 0:dbd6284a9f1b 30
Swabey89 0:dbd6284a9f1b 31 //SD Card
Swabey89 0:dbd6284a9f1b 32 SDBlockDevice sd(PB_5, D12, D13, D10); // mosi, miso, sclk, cs
Swabey89 0:dbd6284a9f1b 33
Swabey89 0:dbd6284a9f1b 34 sensorData buffer[BUFFERSIZE];
Swabey89 0:dbd6284a9f1b 35
Swabey89 0:dbd6284a9f1b 36 FATFileSystem* fs;
Swabey89 0:dbd6284a9f1b 37
Swabey89 0:dbd6284a9f1b 38 //POWER ON SELF TEST
Swabey89 0:dbd6284a9f1b 39 void post()
Swabey89 0:dbd6284a9f1b 40 {
Swabey89 0:dbd6284a9f1b 41
Swabey89 0:dbd6284a9f1b 42 seconds = time(NULL);
Swabey89 0:dbd6284a9f1b 43 timeData = localtime(&seconds);
Swabey89 0:dbd6284a9f1b 44 set_time(mktime(timeData));
Swabey89 0:dbd6284a9f1b 45
Swabey89 0:dbd6284a9f1b 46 //POWER ON TEST (POT)
Swabey89 0:dbd6284a9f1b 47 pc->printf("**********STARTING POWER ON SELF TEST (POST)**********\n\r");
Swabey89 0:dbd6284a9f1b 48
Swabey89 0:dbd6284a9f1b 49 //Test LEDs
Swabey89 0:dbd6284a9f1b 50 pc->printf("ALL LEDs should be blinking\n\r");
Swabey89 0:dbd6284a9f1b 51 for (unsigned int n=0; n<10; n++) {
Swabey89 0:dbd6284a9f1b 52 redLED = 1;
Swabey89 0:dbd6284a9f1b 53 yellowLED = 1;
Swabey89 0:dbd6284a9f1b 54 greenLED = 1;
Swabey89 0:dbd6284a9f1b 55 wait(0.05);
Swabey89 0:dbd6284a9f1b 56 redLED = 0;
Swabey89 0:dbd6284a9f1b 57 yellowLED = 0;
Swabey89 0:dbd6284a9f1b 58 greenLED = 0;
Swabey89 0:dbd6284a9f1b 59 wait(0.05);
Swabey89 0:dbd6284a9f1b 60 }
Swabey89 0:dbd6284a9f1b 61
Swabey89 0:dbd6284a9f1b 62 //Output the switch states (hold them down to test)
Swabey89 0:dbd6284a9f1b 63 pc->printf("SW1: %d\tSW2: %d\n\r", SW1.read(), SW2.read());
Swabey89 0:dbd6284a9f1b 64 pc->printf("USER: %d\n\r", onBoardSwitch.read());
Swabey89 0:dbd6284a9f1b 65
Swabey89 0:dbd6284a9f1b 66 //Output the ADC
Swabey89 0:dbd6284a9f1b 67 pc->printf("ADC: %f\n\r", adcIn.read());
Swabey89 0:dbd6284a9f1b 68
Swabey89 0:dbd6284a9f1b 69 //Read Sensors (I2C)
Swabey89 0:dbd6284a9f1b 70 float temp = sensor.getTemperature();
Swabey89 0:dbd6284a9f1b 71 float pressure = sensor.getPressure();
Swabey89 0:dbd6284a9f1b 72 #ifdef BME
Swabey89 0:dbd6284a9f1b 73 float humidity = sensor.getHumidity();
Swabey89 0:dbd6284a9f1b 74 #endif
Swabey89 0:dbd6284a9f1b 75
Swabey89 0:dbd6284a9f1b 76 //Display in PuTTY
Swabey89 0:dbd6284a9f1b 77 pc->printf("Temperature: %5.1f\n\r", temp);
Swabey89 0:dbd6284a9f1b 78 pc->printf("Pressure: %5.1f\n\r", pressure);
Swabey89 0:dbd6284a9f1b 79 #ifdef BME
Swabey89 0:dbd6284a9f1b 80 pc->printf("Pressure: %5.1f\n\r", humidity);
Swabey89 0:dbd6284a9f1b 81 #endif
Swabey89 0:dbd6284a9f1b 82
Swabey89 0:dbd6284a9f1b 83 //Display on LCD
Swabey89 0:dbd6284a9f1b 84 redLED = 1;
Swabey89 0:dbd6284a9f1b 85 lcd.cls();
Swabey89 0:dbd6284a9f1b 86 lcd.printf("DISPLAY TEST...");
Swabey89 0:dbd6284a9f1b 87 wait(0.5);
Swabey89 0:dbd6284a9f1b 88 redLED = 0;
Swabey89 0:dbd6284a9f1b 89 pc->puts("**********POST END**********\r\n\n");
Swabey89 0:dbd6284a9f1b 90
Swabey89 0:dbd6284a9f1b 91 pc->puts("READY FOR COMMANDS\n\r");
Swabey89 0:dbd6284a9f1b 92 pc->puts("READ ALL/<N> : Read samples\r\n");
Swabey89 0:dbd6284a9f1b 93 pc->puts("DELETE ALL/<N> : Delete samples\r\n");
Swabey89 0:dbd6284a9f1b 94 pc->puts("SETDATE DDMMYYYY : Set the date\r\n");
Swabey89 0:dbd6284a9f1b 95 pc->puts("SETTIME HHMMSS : Set the time\r\n");
Swabey89 0:dbd6284a9f1b 96 pc->puts("SETT <T> : Set the sampling rate (15s)\r\n");
Swabey89 0:dbd6284a9f1b 97 pc->puts("STATE <X> : Toggle sampling on/off (off)\r\n");
Swabey89 0:dbd6284a9f1b 98 pc->puts("LOGGING <X> : Toggle logging on/off (off)\r\n\n");
Swabey89 0:dbd6284a9f1b 99
Swabey89 0:dbd6284a9f1b 100 pc->puts("PLEASE UPDATE DATE AND TIME IF REQUIRED\r\n");
Swabey89 0:dbd6284a9f1b 101 pc->printf("CURRENT DATE AND TIME : %s\r\n", ctime(&seconds));
Swabey89 0:dbd6284a9f1b 102 }
Swabey89 0:dbd6284a9f1b 103
Swabey89 0:dbd6284a9f1b 104 void errorCode(ELEC350_ERROR_CODE err)
Swabey89 0:dbd6284a9f1b 105 {
Swabey89 0:dbd6284a9f1b 106 switch (err) {
Swabey89 0:dbd6284a9f1b 107 case OK:
Swabey89 0:dbd6284a9f1b 108 greenLED = 1;
Swabey89 0:dbd6284a9f1b 109 wait(1.0);
Swabey89 0:dbd6284a9f1b 110 greenLED = 0;
Swabey89 0:dbd6284a9f1b 111 return;
Swabey89 0:dbd6284a9f1b 112 case FATAL:
Swabey89 0:dbd6284a9f1b 113 while(1) {
Swabey89 0:dbd6284a9f1b 114 redLED = 1;
Swabey89 0:dbd6284a9f1b 115 wait(0.1);
Swabey89 0:dbd6284a9f1b 116 redLED = 0;
Swabey89 0:dbd6284a9f1b 117 wait(0.1);
Swabey89 0:dbd6284a9f1b 118 }
Swabey89 0:dbd6284a9f1b 119 }
Swabey89 0:dbd6284a9f1b 120 }
Swabey89 0:dbd6284a9f1b 121
Swabey89 0:dbd6284a9f1b 122 void sampleProducer()
Swabey89 0:dbd6284a9f1b 123 {
Swabey89 0:dbd6284a9f1b 124 while(true)
Swabey89 0:dbd6284a9f1b 125 {
Swabey89 0:dbd6284a9f1b 126 //High priority thread
Swabey89 0:dbd6284a9f1b 127 Thread::signal_wait(TAKE_SAMPLE);
Swabey89 0:dbd6284a9f1b 128
Swabey89 0:dbd6284a9f1b 129 Nspaces = spaceAvailable.wait(0); //Non-blocking
Swabey89 0:dbd6284a9f1b 130 bufferLock.lock();
Swabey89 0:dbd6284a9f1b 131 producer_tout.attach(producer_toutISR, TOUT_TIME_DEF);
Swabey89 0:dbd6284a9f1b 132
Swabey89 0:dbd6284a9f1b 133 //Update buffer
Swabey89 0:dbd6284a9f1b 134 if ((newestIndex == oldestIndex) && (Nspaces==0))
Swabey89 0:dbd6284a9f1b 135 {
Swabey89 0:dbd6284a9f1b 136 oldestIndex = (oldestIndex+1) % BUFFERSIZE;
Swabey89 0:dbd6284a9f1b 137 }
Swabey89 0:dbd6284a9f1b 138
Swabey89 0:dbd6284a9f1b 139 newestIndex = (newestIndex+1) % BUFFERSIZE; //CIRCULAR
Swabey89 0:dbd6284a9f1b 140
Swabey89 0:dbd6284a9f1b 141 double temp_r = sensor.getTemperature();
Swabey89 0:dbd6284a9f1b 142 double press_r = sensor.getPressure();
Swabey89 0:dbd6284a9f1b 143 float light_r = adcIn.read();
Swabey89 0:dbd6284a9f1b 144
Swabey89 0:dbd6284a9f1b 145 buffer[newestIndex].updatetemp(temp_r);
Swabey89 0:dbd6284a9f1b 146 buffer[newestIndex].updatepress(press_r);
Swabey89 0:dbd6284a9f1b 147 buffer[newestIndex].updatelight(light_r);
Swabey89 0:dbd6284a9f1b 148 buffer[newestIndex].updateTime();
Swabey89 0:dbd6284a9f1b 149
Swabey89 0:dbd6284a9f1b 150 if (Nspaces != 0)
Swabey89 0:dbd6284a9f1b 151 {
Swabey89 0:dbd6284a9f1b 152 Nspaces--;
Swabey89 0:dbd6284a9f1b 153 }
Swabey89 0:dbd6284a9f1b 154
Swabey89 0:dbd6284a9f1b 155 samplesInBuffer.release();
Swabey89 0:dbd6284a9f1b 156
Swabey89 0:dbd6284a9f1b 157 if(logging)
Swabey89 0:dbd6284a9f1b 158 {
Swabey89 0:dbd6284a9f1b 159 printQueue.call(printf, "Sample placed in buffer at position %d\r\nNumber of spaces available in buffer:%d\r\n\n", newestIndex, Nspaces);
Swabey89 0:dbd6284a9f1b 160 }
Swabey89 0:dbd6284a9f1b 161
Swabey89 0:dbd6284a9f1b 162 bufferLock.unlock();
Swabey89 0:dbd6284a9f1b 163 producer_tout.detach();
Swabey89 0:dbd6284a9f1b 164 }
Swabey89 0:dbd6284a9f1b 165 }
Swabey89 0:dbd6284a9f1b 166
Swabey89 0:dbd6284a9f1b 167 void sampleConsumer()
Swabey89 0:dbd6284a9f1b 168 {
Swabey89 0:dbd6284a9f1b 169 while(true)
Swabey89 0:dbd6284a9f1b 170 {
Swabey89 0:dbd6284a9f1b 171 //write to the SD card from oldestindex up to newestIndex.
Swabey89 0:dbd6284a9f1b 172
Swabey89 0:dbd6284a9f1b 173 Nsamples = samplesInBuffer.wait(); //Block if no samples to take - acquires
Swabey89 0:dbd6284a9f1b 174
Swabey89 0:dbd6284a9f1b 175 bufferLock.lock();
Swabey89 0:dbd6284a9f1b 176 consumer_tout.attach(consumer_toutISR,TOUT_TIME_DEF);
Swabey89 0:dbd6284a9f1b 177 if (sd_init)
Swabey89 0:dbd6284a9f1b 178 {
Swabey89 0:dbd6284a9f1b 179 oldestIndex = (oldestIndex+1) % BUFFERSIZE;
Swabey89 0:dbd6284a9f1b 180 SDqueue.call(SDaddSample,buffer[oldestIndex].getTime(), buffer[oldestIndex].gettemp(), buffer[oldestIndex].getpress(), buffer[oldestIndex].getlight(), oldestIndex);
Swabey89 0:dbd6284a9f1b 181 }
Swabey89 0:dbd6284a9f1b 182 else
Swabey89 0:dbd6284a9f1b 183 {
Swabey89 0:dbd6284a9f1b 184 samplesInBuffer.release();
Swabey89 0:dbd6284a9f1b 185 }
Swabey89 0:dbd6284a9f1b 186 bufferLock.unlock();
Swabey89 0:dbd6284a9f1b 187 consumer_tout.detach();
Swabey89 0:dbd6284a9f1b 188 }
Swabey89 0:dbd6284a9f1b 189
Swabey89 0:dbd6284a9f1b 190 }
Swabey89 0:dbd6284a9f1b 191
Swabey89 0:dbd6284a9f1b 192 void sampleISR()
Swabey89 0:dbd6284a9f1b 193 {
Swabey89 0:dbd6284a9f1b 194 producer_thread.signal_set(TAKE_SAMPLE);
Swabey89 0:dbd6284a9f1b 195 }
Swabey89 0:dbd6284a9f1b 196
Swabey89 0:dbd6284a9f1b 197 void producer_toutISR(void)
Swabey89 0:dbd6284a9f1b 198 {
Swabey89 0:dbd6284a9f1b 199 threadstates |= PRODUCER;
Swabey89 0:dbd6284a9f1b 200 }
Swabey89 0:dbd6284a9f1b 201
Swabey89 0:dbd6284a9f1b 202 void consumer_toutISR(void)
Swabey89 0:dbd6284a9f1b 203 {
Swabey89 0:dbd6284a9f1b 204 threadstates |= CONSUMER;
Swabey89 0:dbd6284a9f1b 205 }
Swabey89 0:dbd6284a9f1b 206
Swabey89 0:dbd6284a9f1b 207 /*SensorData Class Definitions*/
Swabey89 0:dbd6284a9f1b 208
Swabey89 0:dbd6284a9f1b 209 sensorData::sensorData(void)
Swabey89 0:dbd6284a9f1b 210 {
Swabey89 0:dbd6284a9f1b 211 this->temperature = 0;
Swabey89 0:dbd6284a9f1b 212 this->pressure = 0;
Swabey89 0:dbd6284a9f1b 213 this->lightlevel = 0;
Swabey89 0:dbd6284a9f1b 214 this->time_str = "";
Swabey89 0:dbd6284a9f1b 215 }
Swabey89 0:dbd6284a9f1b 216 void sensorData::updateTime()
Swabey89 0:dbd6284a9f1b 217 {
Swabey89 0:dbd6284a9f1b 218 string t;
Swabey89 0:dbd6284a9f1b 219 time_t seconds;
Swabey89 0:dbd6284a9f1b 220 timeLock.lock();
Swabey89 0:dbd6284a9f1b 221 seconds = time(NULL);
Swabey89 0:dbd6284a9f1b 222 t = ctime(&seconds);
Swabey89 0:dbd6284a9f1b 223 timeLock.unlock();
Swabey89 0:dbd6284a9f1b 224 t = t.substr(0,t.length()-1);
Swabey89 0:dbd6284a9f1b 225 this->time_str = t;
Swabey89 0:dbd6284a9f1b 226
Swabey89 0:dbd6284a9f1b 227 }
Swabey89 0:dbd6284a9f1b 228 void sensorData::updatetemp(double t) {this->temperature = t;}
Swabey89 0:dbd6284a9f1b 229 void sensorData::updatepress(double p) {this->pressure = p;}
Swabey89 0:dbd6284a9f1b 230 void sensorData::updatelight(float l) {this->lightlevel = l;}
Swabey89 0:dbd6284a9f1b 231 double sensorData::gettemp(void) {return this->temperature;}
Swabey89 0:dbd6284a9f1b 232 double sensorData::getpress(void) {return this->pressure;}
Swabey89 0:dbd6284a9f1b 233 float sensorData::getlight(void) {return this->lightlevel;}
Swabey89 0:dbd6284a9f1b 234 string sensorData::getTime(void) {return this->time_str;}
Swabey89 0:dbd6284a9f1b 235