Well, Dynamic memory it is. Only for the layout configuration at least
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#include "windowPool.h"
|
||||
#include "UIComponent.h"
|
||||
#include "UIBar.h"
|
||||
#include "UIString.h"
|
||||
#include "UITable.h"
|
||||
#include "values.h"
|
||||
|
||||
namespace WindowPool {
|
||||
WindowEntry pool[MAX_WINDOWS];
|
||||
bool inUse[MAX_WINDOWS] = {false};
|
||||
|
||||
static inline int16_t getNextIndex() {
|
||||
for (int k = 0; k < MAX_WINDOWS; k++) {
|
||||
if (!inUse[k]) {
|
||||
return k;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int16_t Allocate(ComponentType t) {
|
||||
int16_t nextIndex = getNextIndex();
|
||||
if (nextIndex < 0) {
|
||||
Serial2.println("Failed to allocate comp: poolIndex exceeds MAX_WINDOWS");
|
||||
Serial2.print( nextIndex);
|
||||
Serial2.print( " >= ");
|
||||
Serial2.println( MAX_WINDOWS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pool[nextIndex].type = t;
|
||||
|
||||
switch(pool[nextIndex].type) {
|
||||
case BAR:
|
||||
pool[nextIndex].bar = new UIBar();
|
||||
break;
|
||||
case STRING:
|
||||
pool[nextIndex].str = new UIString();
|
||||
break;
|
||||
case TABLE:
|
||||
pool[nextIndex].table = new UITable();
|
||||
break;
|
||||
case BASE:
|
||||
pool[nextIndex].base = new UIElement();
|
||||
break;
|
||||
}
|
||||
|
||||
// Mark it as in use
|
||||
inUse[nextIndex] = true;
|
||||
|
||||
return nextIndex;
|
||||
}
|
||||
|
||||
void Deallocate(int16_t id) {
|
||||
switch(pool[id].type) {
|
||||
case BAR:
|
||||
break;
|
||||
case STRING:
|
||||
break;
|
||||
case TABLE:
|
||||
break;
|
||||
case BASE:
|
||||
break;
|
||||
}
|
||||
|
||||
inUse[id] = false;
|
||||
}
|
||||
|
||||
UIElement* GetHandle(int16_t id) {
|
||||
switch(pool[id].type) {
|
||||
case BAR:
|
||||
return pool[id].bar;
|
||||
break;
|
||||
case STRING:
|
||||
return pool[id].str;
|
||||
break;
|
||||
case TABLE:
|
||||
return pool[id].table;
|
||||
break;
|
||||
case BASE:
|
||||
return pool[id].base;
|
||||
break;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void PrintInUse() {
|
||||
for (int k = 0; k < MAX_WINDOWS; k++) {
|
||||
if (inUse[k]) {
|
||||
Serial2.print(k);
|
||||
Serial2.print(" : ");
|
||||
Serial2.println(inUse[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user