diff --git a/DisplayESP32.ino b/DisplayESP32.ino index a95fd84..e9616ab 100644 --- a/DisplayESP32.ino +++ b/DisplayESP32.ino @@ -13,13 +13,13 @@ #define MAX_OPTIONS 10 //Maximum number of options for each menu #define MAX_MENUS 3 -#define MAX_GRAPH 3 +#define MAX_GRAPHS 3 #define DISP_WIDTH 128 // OLED display width #define DISP_HEIGHT 64 // OLED display height #define REFRESH 10 //Refresh time in ms +#define ADDRESS 0x3C //I2C address of the display Adafruit_SSD1306 display(DISP_WIDTH, DISP_HEIGHT, &Wire, -1); -int i = 0; class Option{ private: @@ -80,7 +80,7 @@ class Option{ } }; -class Menu{ //ContentTypeMenu true, it is a menu +class Menu{ //ContentType (1) private: int sizex; //X size for each option in the menu @@ -118,31 +118,34 @@ class Menu{ //ContentTypeMenu true, it is a menu return destinationIndex; } +//The following method draws the whole menu by drawing every option configured within it void drawMenu(){ display.clearDisplay(); - this->page = pos/this->optPPage; + this->page = pos/this->optPPage; //The current page is obtained by dividing the position by the number of options per page (only integer) for(int i = 0; i < options; i++){ this->opt[i].drawopt(this->page, this->pos, this->optPPage); } display.display(); } - - int extractPos(){ + //Methods used by Screen + int extractPos(){ //Gets the current position of the cursor return(this->pos); } - int extractOptNumber(){ + int extractOptNumber(){ //Gets the number of options in the menu return(this->options); } - void increasePos(){ + void increasePos(){ //Increases the position of the cursor this->pos++; } - void decreasePos(){ + void decreasePos(){ //Decreases the position of the cursor this->pos--; } +//Both of the following methods store the values of the previous screen passed as parameters by Screen + void setPreviousScreen(int prev){ this->previousScreen = prev; } @@ -151,6 +154,7 @@ class Menu{ //ContentTypeMenu true, it is a menu this->previousContentType = prev; } +//Both of the following methods retrieve the values of the screen previous to the menu containing these data. int getPreviousScreen(){ int prev = this->previousScreen; return prev; @@ -162,7 +166,7 @@ class Menu{ //ContentTypeMenu true, it is a menu } }; -class Graph{ //ContentTypeMenu false, it is not a menu +class Graph{ private: String title; @@ -181,7 +185,7 @@ class Graph{ //ContentTypeMenu false, it is not a menu double xmaximum; //For: Horizontal Bar Cartesian double yStepSize; //For: Vertical Bar Cartesian double xStepSize; //For: Horizontal Bar Cartesian - double digit; //For: Vertical Bar Horizontal Bar Cartesian + int digit; //For: Vertical Bar Horizontal Bar Cartesian double x; double yrange; double xrange; @@ -196,8 +200,9 @@ class Graph{ //ContentTypeMenu false, it is not a menu public: +//This method configures the graph created, defines its parameters according the type of graph selected. void configure(String title, char graphType, double xpos, double ypos, double width, double height, - double yminimum, double ymaximum, double xminimum, double xmaximum, double yStepSize, double xStepSize, double digit){ + double yminimum, double ymaximum, double xminimum, double xmaximum, double yStepSize, double xStepSize, int digit){ this->title = title; this->graphType = graphType; this->yminimum = yminimum; @@ -236,7 +241,7 @@ class Graph{ //ContentTypeMenu false, it is not a menu case 'a': double my; - if (this->redraw) { + if (this->redraw) { //Prints the labels display.clearDisplay(); this->redraw = false; display.fillRect(0, 0, 127 , 14, SSD1306_WHITE); @@ -374,7 +379,7 @@ class Graph{ //ContentTypeMenu false, it is not a menu } } - void redrawFlag(){ + void redrawFlag(){ // Activates the redraw bool to get the graph printed correctly this->redraw = true; } @@ -410,21 +415,22 @@ class Graph{ //ContentTypeMenu false, it is not a menu class Screen{ private: - Menu menu[MAX_MENUS]; - Graph graph[MAX_GRAPH]; - int counterM = 0; - int counterG = 0; - bool redraw = true; + Menu menu[MAX_MENUS]; //Array of menus to use + Graph graph[MAX_GRAPHS]; //Array of graphs to use + int counterM = 0; //Number of menus created + int counterG = 0; //Number of graphs created + bool redraw = true; //Redraw interface for when there is a change of screen int currentScreen = 0; int contentType = 0; public: - void configure(bool fullsetting){ + + void configure(bool fullsetting){ //This method allows the configuration of the display when the parameter is true. Otherwise only prints a greeting message. if(fullsetting){ //Adafruit_SSD1306 display(DISP_WIDTH, DISP_HEIGHT, &Wire, -1); Serial.begin(115200); - if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { + if (!display.begin(SSD1306_SWITCHCAPVCC, ADDRESS)) { #ifdef __DEBUG__ Serial.println("Display not found!"); #endif @@ -449,29 +455,29 @@ class Screen{ delay(5000); } - void createMenu(int sizex, int sizey){ + void createMenu(int sizex, int sizey){ //This method is used for the creation of a menu this->menu[counterM].configure(sizex, sizey); this->counterM++; } - void createOption(int menuIndex, String content, bool destinationTypeMenu, int destinationIndex){ + void createOption(int menuIndex, String content, bool destinationTypeMenu, int destinationIndex){ //this method should be used for creating an option in a menu this->menu[menuIndex].createOption(content, destinationTypeMenu, destinationIndex); } void createVGraph(String title, double xpos, double ypos, double width, double height, - double yminimum, double ymaximum, double yStepSize, double digit){ + double yminimum, double ymaximum, double yStepSize, int digit){ //this method calls the configure() of graph for a vertical graph this->graph[counterG].configure(title, 'a', xpos, ypos, width, height, yminimum, ymaximum, 0, 0, yStepSize, 0, digit); this->counterG++; } void createHGraph(String title, double xpos, double ypos, double width, double height, - double xminimum, double xmaximum, double xStepSize, double digit){ + double xminimum, double xmaximum, double xStepSize, int digit){ //this method calls the configure() of graph for a horizontal graph this->graph[counterG].configure(title, 'b', xpos, ypos, width, height, 0, 0, xminimum, xmaximum, 0, xStepSize, digit); counterG++; } void createCGraph(String title, double xpos, double ypos, double width, double height, - double yminimum, double ymaximum, double xminimum, double xmaximum, double yStepSize, double xStepSize, double digit){ + double yminimum, double ymaximum, double xminimum, double xmaximum, double yStepSize, double xStepSize, int digit){ //this method calls the configure() of graph for a cartesian chart this->graph[counterG].configure(title, 'c', xpos, ypos, width, height, yminimum, ymaximum, xminimum, xmaximum, yStepSize, xStepSize, digit); counterG++; } @@ -482,11 +488,13 @@ class Screen{ } */ +//The following method is used for assingning a value to a graph void graphAssignValue(int graphIndex, double value){ this->graph[graphIndex].assignValue(value); this->redraw = true; } +//This method controls the whole interface, it needs to be called within a loop void control(){ if (redraw){ if (contentType == 0){ @@ -499,6 +507,7 @@ class Screen{ } } +//The following two methods allow the change in position of the cursor void increasePos(){ if(this->menu[this->currentScreen].extractPos() < this->menu[this->currentScreen].extractOptNumber() - 1) this->menu[this->currentScreen].increasePos(); @@ -509,6 +518,7 @@ class Screen{ this->menu[this->currentScreen].decreasePos(); } +//This method lets the user go into another screen by selecting an option void goTo(){ if(this->contentType == 0){ int newScreen = this->menu[this->currentScreen].extractDestinationIndex(); @@ -545,6 +555,7 @@ class Screen{ } } +//These methods control the plus and minus button actions void plusAction(){ if(contentType == 0){ increasePos(); @@ -572,6 +583,7 @@ class Keyboard{ public: +//Keyboard constructor Keyboard(byte goTo, byte goBack, byte plus, byte minus, byte debounceTime, Screen * screen){ this->goTo = goTo; this->goBack = goBack; @@ -586,7 +598,7 @@ class Keyboard{ pinMode(plus, INPUT_PULLUP); pinMode(minus, INPUT_PULLUP); } - +//Debouncing functions void checkGoTo(){ static char cont; if(digitalRead(this->goTo) == LOW) @@ -594,10 +606,7 @@ class Keyboard{ else cont = 0; if(cont == debounceTime/REFRESH){ - cont = 0; this->screen->goTo(); - while(digitalRead(this->goTo) == LOW){ - } } } @@ -609,10 +618,7 @@ class Keyboard{ else cont = 0; if(cont == debounceTime/REFRESH){ - cont = 0; this->screen->goBack(); - while(digitalRead(this->goBack) == LOW){ - } } } @@ -623,10 +629,7 @@ class Keyboard{ else cont = 0; if(cont == debounceTime/REFRESH){ - cont = 0; this->screen->plusAction(); - while(digitalRead(this->plus) == LOW){ - } } } @@ -637,13 +640,11 @@ class Keyboard{ else cont = 0; if(cont == debounceTime/REFRESH){ - cont = 0; this->screen->minusAction(); - while(digitalRead(this->minus) == LOW){ - } } } +// All buttons are checked with this method void control(){ this->checkGoTo(); this->checkGoBack(); @@ -652,6 +653,8 @@ class Keyboard{ } }; +int i = 0; + Screen screen; Keyboard keyboard(13, 12, 14, 27, 30, &screen);