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
Screens/UtilityScreen.h
- Committer:
- OHstin
- Date:
- 2017-04-30
- Revision:
- 6:196a63a3378d
File content as of revision 6:196a63a3378d:
#ifndef UTILITYSCREEN_H #define UTILITYSCREEN_H DigitalOut utilityPin(p8); int uCxn = 0; // tracks the connection of the raspberry pi int prevuCxn = 0; // tracks the previous connection of the raspberry pi class UtilityScreen: public Button <UtilityScreen> { public: UtilityScreen(uint16_t backgroundColor); int start(); void buttonPressed(int button); private: void drawUtilityScreen(); void drawData(); void displayStaticData(); void displayDynamicData(); void updateData(); void deAllocateMemory(); void turnOnUtilityPort(); void turnOffUtilityPort(); // list ListController *list; // updated when a scroll event occurs bool scroll; // updated when an enter event occurs bool enter; // background color uint16_t bgColor; // text color; uint16_t textColor; float current; float voltage; float power; int changeScreen; }; UtilityScreen::UtilityScreen(uint16_t backgroundColor) { bgColor = backgroundColor; // determine the color of text if (bgColor == ST7735_WHITE ) { textColor = ST7735_RED; } else if (bgColor == ST7735_BLACK) { textColor = ST7735_CYAN; } } int UtilityScreen::start() { // initial values current = -1.0; voltage = -1.0; power = -1.0; // draw the screen drawUtilityScreen(); // attach interrupts to buttons Button<UtilityScreen>::activateButtons(this); changeScreen = 0; scroll = false; enter = false; while(changeScreen==0) { // update the raspberyy pi data updateData(); // scroll event occured if(scroll) { // perform scroll on the list list->scroll(); // reset variable scroll = false; } // enter event occured if (enter) { // read the current option on the list int option = list->getCurrentOption(); if (option == 1) { // make connection with pi //myled = 1; // first status of utility port //piCxn = 1; // utility port is not yet turned on if (uCxn == 0) { // turn on utlity port uCxn = 1; // initiate connection here turnOnUtilityPort(); } else { // do nothing } } else { // disconnect with pi //piCxn = 3; // first check the pi connection if (uCxn == 1) { // utility port is turned on // turn off the utility port uCxn = 0; turnOffUtilityPort(); } else { // do nothing } //myled = 0; } enter = false; } Thread::wait(200); } // detach interrupts to buttons Button<UtilityScreen>::deActivateButtons(); // free up any memory deAllocateMemory(); return changeScreen; } void UtilityScreen::updateData() { displayDynamicData(); } void UtilityScreen::drawUtilityScreen() { // draw static data here tft.setTextColor(textColor); displayStaticData(); // construct the list list = new ListController( 0, 63, "Turn Port on", "Yes", "No", "", "", bgColor, 2); // draw the list list->drawList(); } void UtilityScreen::displayStaticData() { // the static data is displayed here e.g headings tft.setTextWrap(true); tft.setTextColor(textColor); // display title char title[20]; if (uCxn){ strcpy(title,"UTILITY PORT ON"); } else { strcpy(title,"UTILITY PORT OFF"); } tft.setCursor((tft.width()/2)-50,4); tft.printf("%s",title); // display voltage tft.setCursor(0, 20); tft.printf("VOLTAGE[V]:"); // display minimum tft.setCursor(0, 35); tft.printf("CURRENT[mA]:"); // display capacity remaining tft.setCursor(0, 50); tft.printf("POWER[W]:"); } void UtilityScreen::displayDynamicData() { // first retrieve data from the sensor suite SensorSuite suite; ConsumptionModel model = suite.getConsumptionData(); float newCurrent; float newVoltage; float newPower; newCurrent = model.consumptionCurrent; newVoltage = model.consumptionVoltage; newPower = newCurrent*newVoltage*0.001; tft.setTextWrap(true); //tft.setTextColor(textColor); // the dynamic data is displayed here e.g values if (newVoltage == voltage) { // do nothing } else { tft.setCursor(tft.width()/2, 20); // first delete the previous value tft.setTextColor(backgroundColor); tft.printf("%+6.3f",voltage); tft.setCursor(tft.width()/2, 20); // then write the new voltage values tft.setTextColor(textColor); tft.printf("%+6.3f",newVoltage); } if (newCurrent == current){ // do nothing } else { // first delete the previous value tft.setCursor(tft.width()/2, 35); tft.setTextColor(backgroundColor); tft.printf("%+6.3f",current); // then write the new current values tft.setCursor(tft.width()/2, 35); tft.setTextColor(textColor); tft.printf("%+6.3f",newCurrent); } if (newPower == power) { // do nothing } else { tft.setCursor(tft.width()/2, 50); // first delete the previous value tft.setTextColor(backgroundColor); tft.printf("%+6.3f",power); tft.setCursor(tft.width()/2, 50); // then write the new voltage values tft.setTextColor(textColor); tft.printf("%+6.3f",newPower); } voltage = newVoltage; current = newCurrent; power = newPower; } void UtilityScreen::deAllocateMemory() { // deallocate memory that was created dynamically delete list; } void UtilityScreen::buttonPressed(int button) { switch(button) { case BACKBUTTON: // navigate to the previous screen changeScreen = -1; break; case SCROLLBUTTON: // scroll to the next option scroll = true; break; case ENTERBUTTON: // navigate to the selected option enter = true; break; default: // do nothing break; } } void UtilityScreen::turnOnUtilityPort() { /** ui_serial_letter *letter2 = ui_serial_mail.alloc(); letter2->activateSerial = true; ui_serial_mail.put(letter2); // start the thread // launch serial communication with raspberry pi thread3.start(raspiSerial); **/ // turn on utility port utilityPin = 1; utilityLED = 1; // delete text "UTILITY PORT OFF" tft.setTextColor(backgroundColor); tft.setCursor((tft.width()/2)-50,4); tft.printf("UTILITY PORT OFF"); // print text "UTILITY PORT ON" tft.setTextColor(textColor); tft.setCursor((tft.width()/2)-50,4); tft.printf("UTILITY PORT ON"); } void UtilityScreen::turnOffUtilityPort() { /** ui_serial_letter *letter2 = ui_serial_mail.alloc(); letter2->activateSerial = false; ui_serial_mail.put(letter2); **/ // turn off utility port utilityPin = 0; utilityLED = 0; // delete text "UTILITY PORT ON" tft.setTextColor(backgroundColor); tft.setCursor((tft.width()/2)-50,4); tft.printf("UTILITY PORT ON"); // print text "UTILITY PORT OFF" tft.setTextColor(textColor); tft.setCursor((tft.width()/2)-50,4); tft.printf("UTILITY PORT OFF"); } #endif