ESP8266_swiss_army_board/src/app/ScreenManager.cpp

117 lines
2.6 KiB
C++

#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;
}
}