diff --git a/src/app/ScreenManager.cpp b/src/app/ScreenManager.cpp index 2e495b4..496856e 100644 --- a/src/app/ScreenManager.cpp +++ b/src/app/ScreenManager.cpp @@ -1,6 +1,6 @@ #include "ScreenManager.h" -ScreenManager::ScreenManager(Adafruit_SSD1306 &display) : _displayRef(display) +ScreenManager::ScreenManager(Adafruit_SSD1306 &display) : _displayRef(display), _displayInverted(false), _displayDimmed(false), _currentView(NULL) { _viewLinkedList = (ViewLinkedList) createEmptyList(); } @@ -113,4 +113,56 @@ void ScreenManager::iterateThroughList() } } +ViewLink* ScreenManager::getLinkByUID(ViewLinkedList viewLinkedList, const unsigned char UID) +{ + if(isListEmpty(viewLinkedList)) + return NULL; + + while(!isListEmpty(viewLinkedList)) + { + if(viewLinkedList->UID == UID)return viewLinkedList; + viewLinkedList = viewLinkedList->next; + } + + return NULL; +} + +boolean ScreenManager::displayView(const int UID) +{ + if(UID == -1 && _currentView == NO_CURRENT_VIEW) + { + //We display an error message on the screen + return false; + } + else if(UID == -1) + return (*_currentView->viewLogicFunction)(_displayRef, _currentView->pData); + + ViewLink *viewLink = getLinkByUID(_viewLinkedList, UID); + if(viewLink == NULL) + { + //We display an error message on the screen + return false; + }else if(viewLink->viewLogicFunction == NULL) + { + //We display an error message on the screen + return false; + } + + _currentView = viewLink; + + return (*viewLink->viewLogicFunction)(_displayRef, viewLink->pData); +} + +void ScreenManager::invertDisplay(boolean inverted) +{ + _displayRef.invertDisplay(inverted); + _displayInverted = inverted; +} + +void ScreenManager::dimDisplay(boolean dimmed) +{ + _displayRef.dim(dimmed); + _displayDimmed = dimmed; +} + diff --git a/src/app/ScreenManager.h b/src/app/ScreenManager.h index 39282e1..805ff9e 100644 --- a/src/app/ScreenManager.h +++ b/src/app/ScreenManager.h @@ -9,7 +9,14 @@ class ScreenManager public: boolean addView(boolean (*viewLogicFunction)(Adafruit_SSD1306&, void*), void *pData, const unsigned char UID); boolean removeView(const unsigned char UID); + boolean displayView(const int UID = -1); + void invertDisplay(boolean inverted); + void dimDisplay(boolean dimmed); + unsigned char getError() const; + boolean isDisplayInverted() const; + boolean isDisplayDimmed() const; + ViewLink* getCurrentView() const; void iterateThroughList(); @@ -20,11 +27,15 @@ class ScreenManager void *createEmptyList(); boolean addNewLinkAtTheEnd(ViewLinkedList *viewLinkedList, ViewLink viewLink); boolean removeLinkByUID(ViewLinkedList *viewLinkedList, const unsigned char UID); + ViewLink* getLinkByUID(ViewLinkedList viewLinkedList, const unsigned char UID); boolean isListEmpty(ViewLinkedList viewLinkedList); Adafruit_SSD1306 &_displayRef; ViewLinkedList _viewLinkedList; unsigned char _error; + boolean _displayInverted; + boolean _displayDimmed; + ViewLink* _currentView; }; #endif //SCREENMANAGER_H diff --git a/src/app/app.ino b/src/app/app.ino index 4c9be3a..e5bcb98 100644 --- a/src/app/app.ino +++ b/src/app/app.ino @@ -6,29 +6,26 @@ SAB sab; +int i = 42; + void setup() { // put your setup code here, to run once: Serial.println("Starting"); - sab.getScreenManager().addView(&(view_1), NULL,9); - sab.getScreenManager().addView(&(view_1), NULL, 3); - sab.getScreenManager().addView(&(view_1), NULL, 6); + sab.getScreenManager().addView(&(view_1), &i,1); + sab.getScreenManager().addView(&(view_2), NULL, 2); + /*sab.getScreenManager().addView(&(view_1), NULL, 6); sab.getScreenManager().addView(&(view_1), NULL, 7); - sab.getScreenManager().iterateThroughList(); + sab.getScreenManager().iterateThroughList();*/ Serial.println("fin"); } void loop() { - sab.getScreenManager().addView(&(view_1), NULL, 7); - Serial.println(ESP.getFreeHeap()); - sab.getScreenManager().addView(&(view_1), NULL, 3); - Serial.println(ESP.getFreeHeap()); - sab.getScreenManager().addView(&(view_1), NULL, 6); - Serial.println(ESP.getFreeHeap()); - sab.getScreenManager().removeView(6); - Serial.println(ESP.getFreeHeap()); - sab.getScreenManager().removeView(7); - Serial.println(ESP.getFreeHeap()); - sab.getScreenManager().removeView(3); - Serial.println(ESP.getFreeHeap()); + sab.getScreenManager().iterateThroughList(); + sab.getScreenManager().displayView(2); + sab.getScreenManager().displayView(LAST_VIEW); + sab.getScreenManager().displayView(3); + sab.getScreenManager().displayView(1); + sab.getScreenManager().displayView(LAST_VIEW); + Serial.print("Free memory : ");Serial.println(ESP.getFreeHeap()); delay(3000); } diff --git a/src/app/definition.h b/src/app/definition.h index 2d56a70..512d79c 100644 --- a/src/app/definition.h +++ b/src/app/definition.h @@ -24,6 +24,9 @@ typedef enum { GPIO_0 = 0, #define MALLOC_ERR B00000001 +#define NO_CURRENT_VIEW NULL +#define LAST_VIEW -1 + //Data structure for the view handling typedef struct viewLink{ boolean (*viewLogicFunction)(Adafruit_SSD1306&, void*); diff --git a/src/app/views.cpp b/src/app/views.cpp index fbf1368..d9b3c2d 100644 --- a/src/app/views.cpp +++ b/src/app/views.cpp @@ -2,6 +2,12 @@ boolean view_1(Adafruit_SSD1306 &display, void *pData) { - display.clearDisplay(); + int *i = (int *) pData; + Serial.print("Value : ");Serial.println(*i); +} + +boolean view_2(Adafruit_SSD1306 &display, void *pData) +{ + Serial.println("Salut ma gueule"); } diff --git a/src/app/views.h b/src/app/views.h index 9788f57..2b2c21c 100644 --- a/src/app/views.h +++ b/src/app/views.h @@ -4,4 +4,6 @@ boolean view_1(Adafruit_SSD1306 &display, void *pData); +boolean view_2(Adafruit_SSD1306 &display, void *pData); + #endif //VIEWS_H