Updated
Revision 0:dbd6284a9f1b, committed 2019-01-05
- Comitter:
- Swabey89
- Date:
- Sat Jan 05 15:02:27 2019 +0000
- Commit message:
- Updated
Changed in this revision
sample_hardware.cpp | Show annotated file Show diff for this revision Revisions of this file |
sample_hardware.hpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r dbd6284a9f1b sample_hardware.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sample_hardware.cpp Sat Jan 05 15:02:27 2019 +0000 @@ -0,0 +1,235 @@ +#include "sample_hardware.hpp" + +#define RED_DONE 1 +#define YELLOW_DONE 2 + +//Digital outputs +DigitalOut onBoardLED(LED1); +DigitalOut redLED(PE_15); +DigitalOut yellowLED(PB_10); +DigitalOut greenLED(PB_11); + +//Inputs +DigitalIn onBoardSwitch(USER_BUTTON); +DigitalIn SW1(PE_12); +DigitalIn SW2(PE_14); +AnalogIn adcIn(PA_0); + +//Environmental Sensor driver +#ifdef BME +BME280 sensor(D14, D15); +#else +BMP280 sensor(I2C_SDA, I2C_SCL); +#endif + +//LCD Driver (provided via mbed repository) +//RS D9 +//E D8 +//D7,6,4,2 are the 4 bit for d4-7 +TextLCD lcd(D9, D8, D7, D6, D4, D2); // rs, e, d4-d7 + +//SD Card +SDBlockDevice sd(PB_5, D12, D13, D10); // mosi, miso, sclk, cs + +sensorData buffer[BUFFERSIZE]; + +FATFileSystem* fs; + +//POWER ON SELF TEST +void post() +{ + + seconds = time(NULL); + timeData = localtime(&seconds); + set_time(mktime(timeData)); + + //POWER ON TEST (POT) + pc->printf("**********STARTING POWER ON SELF TEST (POST)**********\n\r"); + + //Test LEDs + pc->printf("ALL LEDs should be blinking\n\r"); + for (unsigned int n=0; n<10; n++) { + redLED = 1; + yellowLED = 1; + greenLED = 1; + wait(0.05); + redLED = 0; + yellowLED = 0; + greenLED = 0; + wait(0.05); + } + + //Output the switch states (hold them down to test) + pc->printf("SW1: %d\tSW2: %d\n\r", SW1.read(), SW2.read()); + pc->printf("USER: %d\n\r", onBoardSwitch.read()); + + //Output the ADC + pc->printf("ADC: %f\n\r", adcIn.read()); + + //Read Sensors (I2C) + float temp = sensor.getTemperature(); + float pressure = sensor.getPressure(); + #ifdef BME + float humidity = sensor.getHumidity(); + #endif + + //Display in PuTTY + pc->printf("Temperature: %5.1f\n\r", temp); + pc->printf("Pressure: %5.1f\n\r", pressure); + #ifdef BME + pc->printf("Pressure: %5.1f\n\r", humidity); + #endif + + //Display on LCD + redLED = 1; + lcd.cls(); + lcd.printf("DISPLAY TEST..."); + wait(0.5); + redLED = 0; + pc->puts("**********POST END**********\r\n\n"); + + pc->puts("READY FOR COMMANDS\n\r"); + pc->puts("READ ALL/<N> : Read samples\r\n"); + pc->puts("DELETE ALL/<N> : Delete samples\r\n"); + pc->puts("SETDATE DDMMYYYY : Set the date\r\n"); + pc->puts("SETTIME HHMMSS : Set the time\r\n"); + pc->puts("SETT <T> : Set the sampling rate (15s)\r\n"); + pc->puts("STATE <X> : Toggle sampling on/off (off)\r\n"); + pc->puts("LOGGING <X> : Toggle logging on/off (off)\r\n\n"); + + pc->puts("PLEASE UPDATE DATE AND TIME IF REQUIRED\r\n"); + pc->printf("CURRENT DATE AND TIME : %s\r\n", ctime(&seconds)); +} + +void errorCode(ELEC350_ERROR_CODE err) +{ + switch (err) { + case OK: + greenLED = 1; + wait(1.0); + greenLED = 0; + return; + case FATAL: + while(1) { + redLED = 1; + wait(0.1); + redLED = 0; + wait(0.1); + } + } +} + +void sampleProducer() +{ + while(true) + { + //High priority thread + Thread::signal_wait(TAKE_SAMPLE); + + Nspaces = spaceAvailable.wait(0); //Non-blocking + bufferLock.lock(); + producer_tout.attach(producer_toutISR, TOUT_TIME_DEF); + + //Update buffer + if ((newestIndex == oldestIndex) && (Nspaces==0)) + { + oldestIndex = (oldestIndex+1) % BUFFERSIZE; + } + + newestIndex = (newestIndex+1) % BUFFERSIZE; //CIRCULAR + + double temp_r = sensor.getTemperature(); + double press_r = sensor.getPressure(); + float light_r = adcIn.read(); + + buffer[newestIndex].updatetemp(temp_r); + buffer[newestIndex].updatepress(press_r); + buffer[newestIndex].updatelight(light_r); + buffer[newestIndex].updateTime(); + + if (Nspaces != 0) + { + Nspaces--; + } + + samplesInBuffer.release(); + + if(logging) + { + printQueue.call(printf, "Sample placed in buffer at position %d\r\nNumber of spaces available in buffer:%d\r\n\n", newestIndex, Nspaces); + } + + bufferLock.unlock(); + producer_tout.detach(); + } +} + +void sampleConsumer() +{ + while(true) + { + //write to the SD card from oldestindex up to newestIndex. + + Nsamples = samplesInBuffer.wait(); //Block if no samples to take - acquires + + bufferLock.lock(); + consumer_tout.attach(consumer_toutISR,TOUT_TIME_DEF); + if (sd_init) + { + oldestIndex = (oldestIndex+1) % BUFFERSIZE; + SDqueue.call(SDaddSample,buffer[oldestIndex].getTime(), buffer[oldestIndex].gettemp(), buffer[oldestIndex].getpress(), buffer[oldestIndex].getlight(), oldestIndex); + } + else + { + samplesInBuffer.release(); + } + bufferLock.unlock(); + consumer_tout.detach(); + } + +} + +void sampleISR() +{ + producer_thread.signal_set(TAKE_SAMPLE); +} + +void producer_toutISR(void) +{ + threadstates |= PRODUCER; +} + +void consumer_toutISR(void) +{ + threadstates |= CONSUMER; +} + +/*SensorData Class Definitions*/ + +sensorData::sensorData(void) +{ + this->temperature = 0; + this->pressure = 0; + this->lightlevel = 0; + this->time_str = ""; +} +void sensorData::updateTime() +{ + string t; + time_t seconds; + timeLock.lock(); + seconds = time(NULL); + t = ctime(&seconds); + timeLock.unlock(); + t = t.substr(0,t.length()-1); + this->time_str = t; + +} +void sensorData::updatetemp(double t) {this->temperature = t;} +void sensorData::updatepress(double p) {this->pressure = p;} +void sensorData::updatelight(float l) {this->lightlevel = l;} +double sensorData::gettemp(void) {return this->temperature;} +double sensorData::getpress(void) {return this->pressure;} +float sensorData::getlight(void) {return this->lightlevel;} +string sensorData::getTime(void) {return this->time_str;} +
diff -r 000000000000 -r dbd6284a9f1b sample_hardware.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sample_hardware.hpp Sat Jan 05 15:02:27 2019 +0000 @@ -0,0 +1,71 @@ +#ifndef __sample_hardware__ +#define __sample_hardware__ + +#include "main.h" +#include "SDCard.hpp" + +//#define BME +#ifdef BME +#include "BME280.h" +#else +#include "BMP280.h" +#endif +#include "TextLCD.h" +#include "SDBlockDevice.h" +#include "FATFileSystem.h" +#include <string> + +class sensorData +{ + private: + double temperature; + double pressure; + float lightlevel; + string time_str; + public: + sensorData(void); + void updatetemp(double t); + void updatepress(double p); + void updatelight(float l); + void updateTime(); + double gettemp(void); + double getpress(void); + float getlight(void); + string getTime(void); +}; + +extern sensorData buffer[BUFFERSIZE]; + +enum ELEC350_ERROR_CODE {OK, FATAL}; + +extern RawSerial* pc; +extern DigitalOut onBoardLED; +extern DigitalOut redLED; +extern DigitalOut yellowLED; +extern DigitalOut greenLED; + +extern DigitalIn onBoardSwitch; +extern DigitalIn SW1; +extern DigitalIn SW2; +extern AnalogIn adcIn; + +extern FATFileSystem* fs; + +#ifdef BME +extern BME280 sensor; +#else +extern BMP280 sensor; +#endif + +extern TextLCD lcd; +extern SDBlockDevice sd; + +extern void post(); +extern void errorCode(ELEC350_ERROR_CODE err); +extern void sampleProducer(); +extern void sampleConsumer(); +extern void sampleISR(); +extern void producer_toutISR(void); +extern void consumer_toutISR(void); + +#endif \ No newline at end of file