13 #include "ActionsStack.hpp" 19 #ifdef ACCESSORIES_DEBUG_MODE 20 #define CHECKINDEX(val, text) CheckIndex(val, F(text)) 21 #define CHECKINDEXITEM(val, text) CheckIndex(val, F(text)) 23 #define CHECKINDEX(val, text) 24 #define CHECKINDEXITEM(val, text) 31 #ifdef ACCESSORIES_PRINT_ACCESSORIES 32 void GroupStateItem::printAccessory()
34 Serial.print(F(
" Acc : ID "));
36 Serial.print(F(
" / State "));
37 Serial.print(this->State);
38 Serial.print(F(
" / AssyncDelay "));
39 Serial.println(this->Delay);
50 this->Synchronous = inSynchrone;
56 #ifdef ACCESSORIES_DEBUG_MODE 57 Serial.println(F(
" GroupState begin"));
89 this->startActionTime = 0;
91 if (this->Synchronous)
107 this->startActionTime = millis();
120 if (this->startActionTime != 0)
121 if (millis() - this->startActionTime < this->Items.
pCurrentItem->
Obj->Delay)
124 #ifdef ACCESSORIES_DEBUG_MODE 125 Serial.print(F(
"AccessoryGroupState next action state accessory "));
134 #ifdef ACCESSORIES_PRINT_ACCESSORIES 135 void GroupState::printAccessory()
137 Serial.print(F(
" State : ID "));
138 Serial.println(this->Id);
142 while (pCurr != NULL)
144 pCurr->
Obj->printAccessory();
145 pCurr = pCurr->
pNext;
156 AccessoryGroup::AccessoryGroup()
159 this->pNextGroup = NULL;
166 #ifdef ACCESSORIES_DEBUG_MODE 167 Serial.println(F(
" AccessoryGroup begin"));
177 #ifdef ACCESSORIES_DEBUG_MODE 178 Serial.println(F(
" AccessoryGroup wrong state id !"));
183 pState->
Add(&inAccessory, inState, inDelay);
188 if (AccessoryGroup::pFirstGroup == NULL)
190 AccessoryGroup::pFirstGroup = inGroup;
191 inGroup->SetNextGroup(NULL);
197 while (pCurr->GetNextGroup() != NULL)
198 pCurr = pCurr->GetNextGroup();
200 pCurr->SetNextGroup(inGroup);
201 inGroup->SetNextGroup(NULL);
208 while (pCurr != NULL)
211 pCurr = pCurr->
pNext;
219 while (pCurr != NULL)
222 pCurr = pCurr->GetNextGroup();
242 while (pCurr != NULL)
244 if (pCurr->
Obj->GetId() == inId)
246 pCurr = pCurr->
pNext;
259 #ifdef ACCESSORIES_DEBUG_MODE 260 Serial.print(F(
"AccessoryGroup start action state "));
261 Serial.println(inpState->
GetId());
266 while (pCurr != NULL)
268 if (pCurr->
Obj == inpState)
272 Accessories::EEPROMSave();
274 pCurr->
Obj->StartAction();
277 pCurr = pCurr->
pNext;
296 if (pLoopGroup == NULL)
298 pLoopGroup = AccessoryGroup::pFirstGroup;
302 if (pLoopGroup->GetNextGroup() == NULL)
303 pLoopGroup = AccessoryGroup::pFirstGroup;
305 pLoopGroup = pLoopGroup->GetNextGroup();
308 if (pLoopGroup == NULL)
311 return pLoopGroup->
loop();
318 while (pCurr != NULL)
322 while (pCurrState != NULL)
324 if (pCurrState->
Obj->
GetId() == inId)
326 pCurrState = pCurrState->
pNext;
329 if (pCurrState != NULL)
332 pCurr = pCurr->GetNextGroup();
336 pCurr->Event(inId, inEvent, inData);
348 while (pCurr != NULL)
350 if (pCurr->
Obj->GetId() == inId)
352 pCurr = pCurr->
pNext;
364 #ifdef ACCESSORIES_DEBUG_MODE 365 Serial.print(F(
"AccessoryGroup moved "));
366 Serial.println(inId);
370 #ifdef ACCESSORIES_DEBUG_MODE 371 Serial.println(F(
"No action item pending..."));
375 Accessories::EEPROMSave();
377 pCurr->
Obj->StartAction();
391 byte *pEvent = (byte *)&
id;
392 EEPROM.write(inPos, *pEvent);
393 EEPROM.write(inPos+1, *(pEvent + 1));
394 EEPROM.write(inPos+2, *(pEvent + 2));
395 EEPROM.write(inPos+3, *(pEvent + 3));
399 EEPROM.write(inPos, 0);
400 EEPROM.write(inPos+1, 0);
401 EEPROM.write(inPos+2, 0);
402 EEPROM.write(inPos+3, 0);
406 inPos +=
sizeof(
unsigned long);
413 long four = EEPROM.read(inPos++);
414 long three = EEPROM.read(inPos++);
415 long two = EEPROM.read(inPos++);
416 long one = EEPROM.read(inPos++);
418 if (one+two+three+four > 0)
421 unsigned long ID = ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
438 while (pCurr != NULL)
440 inPos = pCurr->EEPROMSave(inPos, inSimulate);
441 pCurr = pCurr->pNextGroup;
451 while (pCurr != NULL)
453 inPos = pCurr->EEPROMLoad(inPos);
454 pCurr = pCurr->pNextGroup;
461 #ifdef ACCESSORIES_PRINT_ACCESSORIES 462 void AccessoryGroup::printGroups()
466 while (pCurr != NULL)
468 pCurr->printAccessory();
469 pCurr = pCurr->pNextGroup;
473 void AccessoryGroup::printAccessory()
475 Serial.println(F(
" Group : "));
479 while (pCurr != NULL)
481 pCurr->
Obj->printAccessory();
482 pCurr = pCurr->
pNext;
static int EEPROMLoadAll(int inPos)
int EEPROMLoad(int inPos)
int EEPROMSave(int inPos, bool inSimulate = false)
unsigned char Add(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData = 0)
static int EEPROMSaveAll(int inPos, bool inSimulate = false)
static ActionsStack Actions
bool Toggle(unsigned long inId)
void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
static void EventAll(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
unsigned long GetId() const
void StartAction(GroupState *inpState)
static uint8_t GetCount()
void AddRange(const AccessoryGroup &inGroup)
GroupState * GetByID(unsigned long inId) const
void AddStateItem(unsigned long inId, Accessory &inAccessory, ACC_STATE inState, unsigned int inDelay = 0)
bool IsActionItemPending()
virtual bool IsGroupActionPending() const
ACCSCHAINEDLISTITEM< GroupState > * GetItemByID(unsigned long inId) const
virtual void StartAction()
ACCSCHAINEDLISTITEM * pNext
bool IsActionItemPending()
void Add(Accessory *inpAccessory, ACC_STATE inState, unsigned int inDelay = 0)
ACCSCHAINEDLISTITEM< T > * pFirst
unsigned long GetMovingPositionIdByIndex(uint8_t inIndex) const
ACCSCHAINEDLISTITEM< T > * pCurrentItem