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
Diff: Controllers/GraphController.h
- Revision:
- 3:7666de697752
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Controllers/GraphController.h Sat Feb 04 20:17:44 2017 +0000 @@ -0,0 +1,308 @@ +#ifndef GRAPHCONTROLLER_H +#define GRAPHCONTROLLER_H + +class GraphController +{ + +public: + GraphController(uint16_t backgroundColor, char title[]); + void plotData(); // plots the data on the graph + void drawAxes(); // draws the axes on the map + +private: + int pointNumber; // the total number of X Coordintes + int originWidth; // where the x axis starts + int originHeight; // where the y axis starts + int previousValue; // previous x coordinate + int position; + int counter; + uint16_t bgColor; + uint16_t textColor; + uint16_t plotColor; + char t[32]; + + int valStore[130]; // stores all avalialble x Cordinates i.e before plotting + int oldValStore[130]; // stores outdated x Coordinates i.e after plotting + + void drawLeftToRight(); // plots data from left to right + void drawRightToLeft(); // plots data from right to left + void printXAxis(int direction); // prints labels on the X Axis depending on direction + void increment(int position, int val); // plots data when before splace on the x axis runs out + void shift(int val); // intenlligently plots more data on the graph by moving plots to the left + +}; + +GraphController::GraphController(uint16_t backgroundColor, char title[]) +{ + pointNumber = 130; // the total number of X Coordintes + originWidth = 15; // where the x axis starts + originHeight = 116; // where the y axis starts + + strcpy(t,title); + + bgColor = backgroundColor; + + if (bgColor == ST7735_BLACK) { + textColor = ST7735_WHITE; + plotColor = ST7735_YELLOW; + } else if (bgColor == ST7735_WHITE) { + textColor = ST7735_BLACK; + plotColor = ST7735_BLUE; + } +} + +void GraphController::drawAxes() +{ + tft.setTextColor(textColor); + + // first draw the title + tft.setCursor(25,0); + tft.printf("%s",t); + + // draw the axes + tft.drawFastHLine(originWidth-1-3,originHeight,pointNumber+10,textColor); + tft.drawFastVLine(originWidth-1,originHeight+1-100,100+3,textColor); + + // draw the demarcations + // y axis + tft.drawFastHLine(originWidth-1-3,originHeight-30,3,textColor); + tft.drawFastHLine(originWidth-1-3,originHeight-60,3,textColor); + tft.drawFastHLine(originWidth-1-3,originHeight-90,3,textColor); + + // x axis + tft.drawFastVLine(originWidth-1+26,originHeight+1,3,textColor); + tft.drawFastVLine(originWidth-1+(26*2),originHeight+1,3,textColor); + tft.drawFastVLine(originWidth-1+(26*3),originHeight+1,3,textColor); + tft.drawFastVLine(originWidth-1+(26*4),originHeight+1,3,textColor); + tft.drawFastVLine(originWidth-1+(26*5),originHeight+1,3,textColor); + + + // label the X Axis left to right direction + printXAxis(0); + + + // change the rotation + tft.setCursor(originWidth-10,originHeight-3); + tft.printf("0"); + + tft.setCursor(originWidth-10,originHeight-2-30); + tft.printf("3"); + + tft.setCursor(originWidth-10,originHeight-2-(30*2)); + tft.printf("6"); + + tft.setCursor(originWidth-10,originHeight-2-(30*3)); + tft.printf("9"); + + position = 0; + counter = 0; + previousValue = -1; // previous x coordinate +} + +void GraphController::printXAxis(int direction) +{ + // direction of zero means left to right + + // direction one means right to left + + // first set text color to deleting color + tft.setTextColor(bgColor); + + if (direction == 0) { + + // first clear all the previous right to left numbers + drawRightToLeft(); + + // draw numbers form left to right + tft.setTextColor(textColor); + drawLeftToRight(); + + } else if(direction == 1) { + + // first clear all the previous left to right numbers + drawLeftToRight(); + + // draw numbers from left to right + tft.setTextColor(textColor); + drawRightToLeft(); + tft.setTextColor(plotColor); + + } + + // reset to the drawing color + +} + +void GraphController::drawLeftToRight() +{ + tft.setCursor(originWidth-3,originHeight+5); + tft.printf("0"); + + tft.setCursor(originWidth-8+(25),originHeight+5); + tft.printf("2.5"); + + tft.setCursor(originWidth-1+(25*2),originHeight+5); + tft.printf("5"); + + tft.setCursor(originWidth-8+(25*3),originHeight+5); + tft.printf("7.5"); + + tft.setCursor(originWidth-3+(25*4),originHeight+5); + tft.printf("10"); + + tft.setCursor(originWidth-8+(25*5),originHeight+5); + tft.printf("12.5"); +} + +void GraphController::drawRightToLeft() +{ + + tft.setCursor(originWidth-15,originHeight+5); + tft.printf("12.5"); + + tft.setCursor(originWidth-5+(25),originHeight+5); + tft.printf("10"); + + tft.setCursor(originWidth-8+(25*2),originHeight+5); + tft.printf("7.5"); + + tft.setCursor(originWidth+(25*3),originHeight+5); + tft.printf("5"); + + tft.setCursor(originWidth-5+(25*4),originHeight+5); + tft.printf("2.5"); + + tft.setCursor(originWidth+2+(25*5),originHeight+5); + tft.printf("0"); +} + +void GraphController::plotData() +{ + //static int position = 0; + //static int counter = 0; + // first check how many much space is left + //numStore[position-1]= position; + int val = getSolarPower(); + + // read the val + + //counter makes sure the value is only displayed + // only once every 5 times the graph is updated + + if (counter == 0) { + if (val != previousValue) { + // first delete the previous value + tft.setCursor(2,9); + tft.setTextColor(bgColor); + tft.printf("%dW",previousValue); + + // then write the new value + tft.setCursor(2,9); + tft.setTextColor(plotColor); + tft.printf("%dW",val); + } else { + // do nothing + } + + previousValue = val; + + } + + + // esure the counter is reset accordingly i.e every 5 times + counter++; + if (counter > 5) { + counter = 0; + } + + + // if the space on the X Axis is enough + if (position < pointNumber) { + // update the array with the new value + valStore[position] = val; + + // plot the value in the available position + //increment(position, val); + tft.drawFastVLine(originWidth+(position*1),originHeight-val,val,plotColor); + + // plot in the following position the next time + position++; + } else { + + // intelligently plot the new value on the graph + shift(val); + } + + // ensure change of X Axis direction only occurs once + if (position==pointNumber) { + printXAxis(1); + position++; + } +} + +void GraphController::increment(int position, int val) +{ + +} + +void GraphController::shift(int val) +{ + // all coordinates in the graph are shifted to the left + // therefore creating space for one more coordinate to be plotted + + + // first, store previous values in the apprpriate array array + for(int i = 0; i < pointNumber; i++) { + oldValStore[i] = valStore[i]; + } + + + // second, shift all the values in the array to the left + + int bufferVal = -1; + + for (int i = (pointNumber-1); i >= 0; i--) { + + int currentSpot = i; + int nextSpot = i-1; + + int nextVal = 0; + + if(bufferVal != -1) { + nextVal = bufferVal; + } else { + nextVal = valStore[currentSpot]; + } + + bufferVal = valStore[nextSpot]; + valStore[nextSpot] = nextVal; + } + + valStore[pointNumber-1] = val; + + // third, intelligently plot the data onto the graph + int deltaVal; + for (int i = 0; i < pointNumber; i++) { + + // first calculate difference between the new value and the old value + deltaVal = valStore[i] - oldValStore[i]; + + // if new value is bigger the old value + if (deltaVal > 0) { + // only add the extra height required + tft.drawFastVLine(originWidth+(i*1),originHeight-oldValStore[i]-deltaVal,deltaVal,plotColor); + } + // if new value is smaller than the old value + else if(deltaVal < 0) { + // only remmove the excess height + tft.drawFastVLine(originWidth+(i*1),originHeight-oldValStore[i],(deltaVal*-1),bgColor); + } + // if the values are the same + else { + // do nothing + } + } +} + + +#endif \ No newline at end of file