117 lines
2.6 KiB
C++
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;
|
|
}
|
|
}
|
|
|
|
|