This program consists of the software developed for the ELEC5870M Individual Project. It runs on the mbed LPC1768. It uses the mbed RTOS to perform the following tasks: - Implements intuitive GUI with buttons, LCD TFT Display and LEDs. - Serial Communication with the RPi - I2C communication with INA219 voltage current sensors - Power control at the USB ports
Dependencies: Adafruit_GFX Adafruit_ST7735 INA219 MODSERIAL MbedJSONValue mbed-rtos mbed
main.cpp
- Committer:
- OHstin
- Date:
- 2017-02-04
- Revision:
- 3:7666de697752
- Parent:
- 2:104bec169fb6
- Child:
- 4:c7b0670f96b2
File content as of revision 3:7666de697752:
#include "mbed.h" #include "rtos.h" #include "MbedJSONValue.h" #include <string> #include "Adafruit_ST7735.h" #include "SensorSuite.h" DigitalOut myled(LED1); DigitalOut myled2(LED2); DigitalOut relayOne(p26); DigitalOut relayTwo(p25); DigitalOut relayThree(p24); #define OFF 1 #define ON 0 uint16_t backgroundColor = ST7735_BLACK; LocalFileSystem local("local"); //Adafruit_ST7735 tft(p11, p12, p13, p10, p8, p9); // MOSI, MISO, SCLK, SSEL, TFT_DC, TFT_RST Adafruit_ST7735 tft(p11, p12, p13, p16, p14, p15); // MOSI, MISO, SCLK, SSEL, TFT_DC, TFT_RST #include "Icons.h" #include "Inputs.h" #include "Settings.h" #include "SettingsTest.h" #include "LogManager.h" #include "LogRecord.h" #include "Screens.h" #include "RaspiSerial.h" void createScreens(); void changeBackgroundColor(); bool settingsExist( const char *fname); void uiThread(); void sensorThread(); uint16_t currentColor; // ensure that settings are not initialised bool Settings::settingsInitialised = false; MbedJSONValue Settings:: holder; // JSON Data structure to store settings read from file uint16_t Settings::backgroundColor = 0; // ensure that sensor data is initialised MainMenuScreen *menu; BatteriesScreen *batteriesScreen; BatteryScreen *battScreen; SolarScreen *solarScreen; OutputScreen *outputScreen; SettingsScreen *settingsScreen; SolarGraphScreen *solarGraphScreen; SolarValueScreen *solarValueScreen; TestScreen *test; LogScreen *logg; LogSelectScreen *logSelect2; LogSelectScreen *logSelect1; LogDurationScreen *logDuration; LogDurationScreen *logDuration2; ViewLogScreen *viewLog; DeleteLogScreen *deleteLog; LogManager *log1; //LogManager *log2; int main() { // launch the sensors Thread thread(osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25), NULL); thread.start(sensorThread); // launch the user interface Thread thread2(osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25), NULL); thread2.start(uiThread); // launch serial communication with raspberry pi Thread thread3(osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25), NULL); thread3.start(raspiSerial); while(true) { } } void sensorThread() { SensorSuite suite; // launch the sensor suite suite.begin(); } void uiThread() { // set the current time set_time(1475252667); // Use this initializer if you're using a 1.8" TFT tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab // create the settings object Settings settings; currentColor = settings.getBackgroundColor(); backgroundColor = currentColor; tft.fillScreen(backgroundColor); // landscape view tft.setRotation(1); createScreens(); //struct setting lcdBackground; //lcdBackground.value = 1; //lcdBackground.key = 1; //rewind(ptr_myfile); //fseek(ptr_myfile,sizeof(struct setting)*0,SEEK_SET); //fwrite(&emptySetting, sizeof(struct setting), 1, ptr_myfile); //fread(&lcdBackground, sizeof(struct setting), 1, ptr_myfile); /** wait(5); relayOne = OFF; relayTwo = OFF; relayThree = OFF; wait(5); while(1) { relayTwo = ON; relayOne = ON; relayThree = ON; wait(5); relayOne = OFF; relayTwo = OFF; relayThree = OFF; wait(5); } **/ bool backToFirstLayer = false; bool backToSecondLayer = false; bool backToThirdLayer = false; bool backToFourthLayer = false; while(1) { int val = menu->start(); if (val == 1) { backToFirstLayer = false; while(!backToFirstLayer) { switch(batteriesScreen->start()) { case 1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = false; while(!backToSecondLayer) { switch(battScreen->start(BATTERY_ONE)) { case -1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = true; break; default: // do nothing break; } } break; case 2: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = false; while(!backToSecondLayer) { switch(battScreen->start(BATTERY_TWO)) { case -1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = true; break; default: // do nothing break; } } break; case -1: // clear screen tft.fillScreen(backgroundColor); backToFirstLayer = true; break; default: break; } } } else if (val == 2) { outputScreen->start(); } else if (val == 3) { backToFirstLayer = false; while(!backToFirstLayer) { switch(solarScreen->start()) { case 1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = false; while(!backToSecondLayer) { switch(solarValueScreen->start()) { case -1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = true; break; default: // do nothing break; } } break; case 2: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = false; while(!backToSecondLayer) { switch(solarGraphScreen->start()) { case -1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = true; break; default: // do nothing break; } } break; case -1: // clear screen tft.fillScreen(backgroundColor); backToFirstLayer = true; break; default: // do nothing break; } } } else if (val == 4) { backToFirstLayer = false; while (!backToFirstLayer) { switch(settingsScreen->start()) { case 1: // clear screen tft.fillScreen(backgroundColor); backToSecondLayer = false; while (!backToSecondLayer) { switch(test->start()) { case -1: // clear screen // first check if the background color was changed // then change the background colors changeBackgroundColor(); tft.fillScreen(backgroundColor); backToSecondLayer = true; break; } } break; case 2: // clear the screen tft.fillScreen(backgroundColor); backToSecondLayer = false; while (!backToSecondLayer) { switch(logg->start()) { case 1: // clear the screen tft.fillScreen(backgroundColor); backToThirdLayer = false; while(!backToThirdLayer) { switch(viewLog->start()) { case -1: tft.fillScreen(backgroundColor); backToThirdLayer = true; break; } } break; case 2: // clear the screen tft.fillScreen(backgroundColor); backToThirdLayer = false; while(!backToThirdLayer) { switch(logSelect2->start()) { case 1: // clear the screen tft.fillScreen(backgroundColor); backToFourthLayer = false; while(!backToFourthLayer) { switch(logDuration->start()) { case 1: // start logging for 30 seconds tft.fillScreen(backgroundColor); // navigate all the way back to log screen backToFourthLayer = true; backToThirdLayer = true; break; case 2: // start logging for 1 minute tft.fillScreen(backgroundColor); // navigate all the way to log screen backToFourthLayer = true; backToThirdLayer = true; break; case -1: // clear the screen tft.fillScreen(backgroundColor); backToFourthLayer = true; } } break; case 2: // clear the screen tft.fillScreen(backgroundColor); backToFourthLayer = false; while(!backToFourthLayer) { switch(logDuration->start()) { case 1: // start logging for 30 seconds log1 = new LogManager(); log1->createNewLog(POWER_CONSUMPTION,THIRTY_SECONDS); tft.fillScreen(backgroundColor); // navigate all the way back to log screen backToFourthLayer = true; backToThirdLayer = true; break; case 2: // start logging for 1 minute //log1 = new LogManager(); //log1.createNewLog(ONE_MINUTE,SOLAR_POWER); tft.fillScreen(backgroundColor); // navigate all the way to log screen backToFourthLayer = true; backToThirdLayer = true; break; case -1: // clear the screen tft.fillScreen(backgroundColor); backToFourthLayer = true; } } break; case -1: tft.fillScreen(backgroundColor); backToThirdLayer = true; break; default: break; } } break; case 3: // clear the screen tft.fillScreen(backgroundColor); backToThirdLayer = false; while(!backToThirdLayer) { switch(deleteLog->start()) { case -1: // clear the screen tft.fillScreen(backgroundColor); backToThirdLayer = true; } } break; case -1: tft.fillScreen(backgroundColor); backToSecondLayer = true; break; default: break; } } break; case -1: // clear screen tft.fillScreen(backgroundColor); backToFirstLayer = true; break; } } } tft.fillScreen(backgroundColor); } } void changeBackgroundColor() { Settings settings; if (currentColor != settings.getBackgroundColor()) { currentColor = settings.getBackgroundColor(); backgroundColor = currentColor; // delete all the pointer delete menu; delete batteriesScreen; delete solarScreen; delete outputScreen; delete settingsScreen; delete solarGraphScreen; delete test; delete logg; delete logSelect2; delete logDuration; delete viewLog; delete deleteLog; delete battScreen; delete solarValueScreen; // create new screens createScreens(); } } void createScreens() { menu = new MainMenuScreen(backgroundColor); batteriesScreen = new BatteriesScreen(backgroundColor); solarScreen = new SolarScreen(backgroundColor); outputScreen = new OutputScreen(backgroundColor); settingsScreen = new SettingsScreen(backgroundColor); solarGraphScreen = new SolarGraphScreen(backgroundColor); test = new TestScreen(backgroundColor); logg = new LogScreen(backgroundColor); logSelect2 = new LogSelectScreen(backgroundColor); logDuration = new LogDurationScreen(backgroundColor); viewLog = new ViewLogScreen(backgroundColor); deleteLog = new DeleteLogScreen(backgroundColor); battScreen = new BatteryScreen(backgroundColor); solarValueScreen = new SolarValueScreen(backgroundColor); }