From 5ff79119c87d3caf5a6518d3ab27acad92c08a06 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Sat, 16 Mar 2019 19:50:39 +0100 Subject: [PATCH] Added screen error messages --- src/app/ScreenManager.cpp | 118 ++++++++++++++++++++++++++++++++------ src/app/ScreenManager.h | 9 ++- 2 files changed, 110 insertions(+), 17 deletions(-) diff --git a/src/app/ScreenManager.cpp b/src/app/ScreenManager.cpp index 219f03c..086d4ee 100644 --- a/src/app/ScreenManager.cpp +++ b/src/app/ScreenManager.cpp @@ -1,6 +1,10 @@ #include "ScreenManager.h" -ScreenManager::ScreenManager(Adafruit_SSD1306 &display) : _displayRef(display), _displayColorInverted(false), _displayDimmed(false), _currentView(NULL), _error(0) +ScreenManager::ScreenManager(Adafruit_SSD1306 &display) : _displayRef(display), _displayColorInverted(false), _displayDimmed(false), _currentView(NO_CURRENT_VIEW), _error(0) +, _viewNotFound{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL} +, _viewFuncUndefined{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL} +, _currentViewUndefined{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL} +, _viewFunctionFailedToExecute{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL} { _viewLinkedList = (ViewLinkedList) createEmptyList(); _displayRef.setRotation(OR_0); @@ -131,45 +135,85 @@ ViewLink* ScreenManager::getLinkByUID(ViewLinkedList viewLinkedList, const unsig boolean ScreenManager::displayView(const int UID) { - boolean result = false; + //Reset draw settings: + _displayRef.clearDisplay(); + _displayRef.setCursor(0,0); + _displayRef.setTextSize(1); + if(UID == -1 && _currentView == NO_CURRENT_VIEW) { //We display an error message on the screen - + ((ErrorInfo *)_currentViewUndefined.pData)->errorMessage = F("Could not display current view"); + ((ErrorInfo *)_currentViewUndefined.pData)->viewUID = UID; + (*_currentViewUndefined.viewLogicFunction)(_displayRef, _currentViewUndefined.pData); + _displayRef.display(); return false; } else if(UID == -1) { - _displayRef.clearDisplay(); - _displayRef.setCursor(0,0); - result = (*_currentView->viewLogicFunction)(_displayRef, _currentView->pData); - _displayRef.display(); + if(!(*_currentView->viewLogicFunction)(_displayRef, _currentView->pData)) + { + //We display an error message on the screen + _displayRef.clearDisplay(); + ((ErrorInfo *)_viewFunctionFailedToExecute.pData)->errorMessage = F("View function failed\nto execute"); + ((ErrorInfo *)_viewFunctionFailedToExecute.pData)->viewUID = UID; + (*_viewFunctionFailedToExecute.viewLogicFunction)(_displayRef, _viewFunctionFailedToExecute.pData); + _displayRef.display(); + + _currentView = &_viewFunctionFailedToExecute; + return false; + } - return result; + _displayRef.display(); + return true; } ViewLink *viewLink = getLinkByUID(_viewLinkedList, UID); if(viewLink == NULL) { //We display an error message on the screen - + ((ErrorInfo *)_viewNotFound.pData)->errorMessage = F("View does not exist"); + ((ErrorInfo *)_viewNotFound.pData)->viewUID = UID; + (*_viewNotFound.viewLogicFunction)(_displayRef, _viewNotFound.pData); + _displayRef.display(); + + _currentView = &_viewNotFound; return false; }else if(viewLink->viewLogicFunction == NULL) { //We display an error message on the screen + ((ErrorInfo *)_viewFuncUndefined.pData)->errorMessage = F("View function is NULL"); + ((ErrorInfo *)_viewFuncUndefined.pData)->viewUID = UID; + (*_viewFuncUndefined.viewLogicFunction)(_displayRef, _viewFuncUndefined.pData); + _displayRef.display(); + _currentView = &_viewFuncUndefined; return false; } - _currentView = viewLink; - - _displayRef.clearDisplay(); - _displayRef.setCursor(0,0); - result = (*viewLink->viewLogicFunction)(_displayRef, viewLink->pData); - _displayRef.display(); - return result; + if(!(*viewLink->viewLogicFunction)(_displayRef, viewLink->pData)) + { + //We display an error message on the screen + _displayRef.clearDisplay(); + ((ErrorInfo *)_viewFunctionFailedToExecute.pData)->errorMessage = F("View function failed\nto execute"); + ((ErrorInfo *)_viewFunctionFailedToExecute.pData)->viewUID = UID; + (*_viewFunctionFailedToExecute.viewLogicFunction)(_displayRef, _viewFunctionFailedToExecute.pData); + _displayRef.display(); + + _currentView = &_viewFunctionFailedToExecute; + return false; + } + + _displayRef.display(); + _currentView = viewLink; + return true; +} + +boolean ScreenManager::displayNextView() +{ + return true; } void ScreenManager::invertDisplayColor(const boolean inverted) @@ -215,4 +259,46 @@ void ScreenManager::clearDisplay(const boolean bufferOnly) } } +unsigned char ScreenManager::getViewCount() +{ + unsigned char counter = 0; + ViewLinkedList temp = _viewLinkedList; + while(!isListEmpty(temp)) + { + counter++; + temp = temp->next; + } + return counter; +} + +int ScreenManager::getCurrentViewUID() const +{ + if(_currentView == NO_CURRENT_VIEW) + return -1; + return _currentView->UID < 0 ? -1 : _currentView->UID; +} + +boolean ScreenManager::displayError(Adafruit_SSD1306 &display, void *pData) +{ + const ErrorInfo *errorInfo = (ErrorInfo *) pData; + + display.setTextSize(3); + display.setCursor(19,3); + display.drawRect(0,0,display.width(), 27, WHITE); + display.print(F("ERROR")); + display.setTextSize(1); + display.setCursor(0,29); + display.print(errorInfo->errorMessage); + //We then display the view UID that caused the probleme + + if(errorInfo->viewUID >= 0) + { + display.setCursor(0,56); + char buff[30] = ""; + sprintf(buff,"VIEW UID : %d" ,errorInfo->viewUID); + display.println(buff); + } + + return true; +} diff --git a/src/app/ScreenManager.h b/src/app/ScreenManager.h index c3adb2b..6af0e59 100644 --- a/src/app/ScreenManager.h +++ b/src/app/ScreenManager.h @@ -10,6 +10,7 @@ class ScreenManager 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); + boolean displayNextView(); void invertDisplayColor(const boolean inverted); void orientDisplay(const Orientation orientation); void dimDisplay(const boolean dimmed); @@ -19,7 +20,8 @@ class ScreenManager boolean isDisplayColorInverted() const; Orientation getDisplayOrientation() const; boolean isDisplayDimmed() const; - ViewLink* getCurrentView() const; + int getCurrentViewUID() const; + unsigned char getViewCount(); void iterateThroughList(); @@ -32,6 +34,7 @@ class ScreenManager boolean removeLinkByUID(ViewLinkedList *viewLinkedList, const unsigned char UID); ViewLink* getLinkByUID(ViewLinkedList viewLinkedList, const unsigned char UID); boolean isListEmpty(ViewLinkedList viewLinkedList); + static boolean displayError(Adafruit_SSD1306 &display, void *pData); Adafruit_SSD1306 &_displayRef; ViewLinkedList _viewLinkedList; @@ -39,6 +42,10 @@ class ScreenManager boolean _displayColorInverted; boolean _displayDimmed; ViewLink* _currentView; + ViewLink _viewNotFound, _viewFuncUndefined, _currentViewUndefined, _viewFunctionFailedToExecute; + + //This structure contains the error message as well as the UID from the view that caused the error if available. + typedef struct {const __FlashStringHelper* errorMessage; int viewUID;} ErrorInfo; }; #endif //SCREENMANAGER_H