#include "ScreenManager.h" ScreenManager::ScreenManager(Adafruit_SSD1306 &display) : _displayRef(display) { _viewLinkedList = (ViewLinkedList) createEmptyList(); } boolean ScreenManager::addView(boolean (*viewLogicFunction)(Adafruit_SSD1306&, void*), void *pData, const unsigned char UID) { ViewLink viewLink ={viewLogicFunction, pData, UID, NULL}; addNewLinkAtTheEnd(&_viewLinkedList, viewLink); } void *ScreenManager::createEmptyList() { return NULL; } boolean ScreenManager::addNewLinkAtTheEnd(ViewLinkedList *viewLinkedList, ViewLink viewLink) { ViewLink *newViewLink = (ViewLink*) malloc(sizeof(ViewLink)); if(newViewLink == NULL) { _error |= MALLOC_ERR; return false; } //Because of the const member memcpy(newViewLink, &viewLink, sizeof(*newViewLink)); if(isListEmpty(*viewLinkedList))*viewLinkedList = newViewLink; else { if((*viewLinkedList)->UID == newViewLink->UID) { ViewLink *link = *viewLinkedList; *viewLinkedList = newViewLink; newViewLink->next = link->next; free(link); return true; } ViewLinkedList cursor = *viewLinkedList; while(cursor->next != NULL) { if(cursor->next->UID == newViewLink->UID) { ViewLink *link = cursor->next; cursor->next = newViewLink; newViewLink->next = link->next; free(link); return true; } cursor = cursor->next; } cursor->next = newViewLink; } return true; } boolean ScreenManager::removeView(const unsigned char UID) { return removeLinkByUID(&_viewLinkedList ,UID); } boolean ScreenManager::removeLinkByUID(ViewLinkedList *viewLinkedList, const unsigned char UID) { if(isListEmpty(*viewLinkedList))return false; if((*viewLinkedList)->UID == UID) { ViewLink *tmp = *viewLinkedList; *viewLinkedList = (*viewLinkedList)->next; free(tmp); return true; } ViewLinkedList cursor = *viewLinkedList; while(!isListEmpty(cursor->next)) { if(cursor->next->UID == UID) { ViewLink *tmp = cursor->next; cursor->next = cursor->next->next; free(tmp); return true; } cursor = cursor->next; } return false; } boolean ScreenManager::isListEmpty(ViewLinkedList viewLinkedList) { return viewLinkedList == NULL; } unsigned char ScreenManager::getError() const { return _error; } void ScreenManager::iterateThroughList() { Serial.println("Lets go through"); ViewLinkedList temp = _viewLinkedList; while(!isListEmpty(temp)) { Serial.print("UID : ");Serial.println(temp->UID); temp = temp->next; } }