7 #include "Accessories.hpp" 8 #include "ActionsStack.hpp" 11 #include "AccessoriesCircularBuffer.hpp" 14 bool Accessories::SerialStarted =
false;
15 unsigned long Accessories::WaitEndDate = 0;
17 int Accessories::EEPROMStart = -1;
18 int Accessories::EEPROMSize = -1;
19 int Accessories::EEPROMRecordSize = 0;
20 unsigned long Accessories::EEPROMStartingDelay = 0;
29 Accessories::EEPROMStart = inEEPROMStart;
30 Accessories::EEPROMSize = inEEPROMSize;
31 Accessories::EEPROMStartingDelay = 0;
34 #ifdef ACCESSORIES_DEBUG_MODE 38 Serial.println(F(
""));
39 Serial.println(F(
"Developed by Thierry Paris."));
40 Serial.println(F(
"(c) Locoduino 2016-2018"));
41 Serial.println(F(
""));
43 Serial.println(F(
"*** Setup Accessories started."));
46 if (EEPROMStart + EEPROMSize != -2 && (EEPROMSize == -1 || EEPROMStart == -1))
48 Serial.print(F(
" Error : EEPROM will not be used : "));
49 Serial.println(F(
" EEPROMSize or EEPROMStart is not defined by begin."));
55 #ifdef ACCESSORIES_DEBUG_MODE 58 Serial.print(F(
"Commander event : Address : "));
59 Serial.print(inId, DEC);
60 Serial.print(F(
" / "));
63 case ACCESSORIES_EVENT_NONE: Serial.println(F(
"NONE"));
break;
64 case ACCESSORIES_EVENT_TOGGLE: Serial.println(F(
"TOGGLE"));
break;
65 case ACCESSORIES_EVENT_MOVE:
66 Serial.print(F(
"MOVE "));
67 switch ((ACCESSORIES_MOVE_TYPE)inEventData)
69 case ACCESSORIES_MOVE_MORE: Serial.println(F(
"MORE"));
break;
70 case ACCESSORIES_MOVE_LESS: Serial.println(F(
"LESS"));
break;
71 case ACCESSORIES_MOVE_STOP: Serial.println(F(
"STOP"));
break;
72 case ACCESSORIES_MOVE_LEFT: Serial.println(F(
"LEFT"));
break;
73 case ACCESSORIES_MOVE_RIGHT: Serial.println(F(
"RIGHT"));
break;
74 case ACCESSORIES_MOVE_CENTER: Serial.println(F(
"CENTER"));
break;
75 case ACCESSORIES_MOVE_TOP: Serial.println(F(
"TOP"));
break;
76 case ACCESSORIES_MOVE_BOTTOM: Serial.println(F(
"BOTTOM"));
break;
77 case ACCESSORIES_MOVE_STRAIGHT: Serial.println(F(
"STRAIGHT"));
break;
78 case ACCESSORIES_MOVE_DIVERGE: Serial.println(F(
"DIVERGE"));
break;
79 case ACCESSORIES_MOVE_ON: Serial.println(F(
"ON"));
break;
80 case ACCESSORIES_MOVE_OFF: Serial.println(F(
"OFF"));
break;
83 case ACCESSORIES_EVENT_MOVEPOSITION:
84 Serial.print(F(
"MOVEPOSITION : "));
85 Serial.println(inEventData, DEC);
87 case ACCESSORIES_EVENT_MOVEPOSITIONID:
88 Serial.println(F(
"MOVEPOSITIONID "));
90 case ACCESSORIES_EVENT_MOVEPOSITIONINDEX:
91 Serial.print(F(
"MOVEPOSITIONINDEX : "));
92 Serial.println(inEventData, DEC);
94 case ACCESSORIES_EVENT_CONFIG:
95 Serial.print(F(
"CONFIG : "));
96 Serial.print(ACCESSORIESCONFIGADDRESS(inEventData), DEC);
97 Serial.print(F(
" / "));
98 Serial.println(ACCESSORIESCONFIGVALUE(inEventData), DEC);
100 case ACCESSORIES_EVENT_SETSPEED:
101 Serial.print(F(
"SET SPEED : "));
102 Serial.println(inEventData);
104 case ACCESSORIES_EVENT_SETDURATION:
105 Serial.print(F(
"SET DURATION : "));
106 Serial.println(inEventData);
123 ArduiEmulator::ArduinoForm::_eventLog(
"Received", inId, inEventType, inEventData);
132 #ifdef ACCESSORIES_PRINT_ACCESSORIES 135 Serial.println(F(
"********* Accessories List"));
138 while (pCurr != NULL)
140 pCurr->printAccessory();
143 Serial.println(F(
"********* End of Accessories"));
146 Serial.println(F(
"********* Groups"));
147 AccessoryGroup::printGroups();
148 Serial.println(F(
"********* End of groups"));
161 if (pLoopAccessory == NULL)
163 #ifdef ACCESSORIES_DEBUG_MODE 164 Serial.println(F(
"*** Setup Accessories Finished."));
168 while (pCurr != NULL)
179 EEPROMStartingDelay = 0;
181 #ifdef ACCESSORIES_DEBUG_MODE 182 bool good = Accessories::EEPROMLoad();
184 Serial.println(F(
"EEPROM loading aborted !"));
186 Accessories::EEPROMLoad();
198 if (pLoopAccessory == NULL)
201 pLoopAccessory->
loop();
214 if (EEPROMStartingDelay > 0)
223 unsigned long start = millis();
224 while (millis() < start + inWaitDelay)
278 #define EEPROM_VERSION 0 280 void Accessories::EEPROMSave()
282 if (EEPROMStart == -1 || EEPROMSize == -1)
285 if (EEPROMStartingDelay == 0)
286 EEPROMStartingDelay = millis();
289 void Accessories::EEPROMSaveRaw()
291 unsigned long mill = millis();
292 if (mill - EEPROMStartingDelay < EEPROM_SAVE_DELAY)
295 int pos = EEPROMStart;
302 EEPROM.update(pos++, EEPROM_VERSION);
303 EEPROM.update(pos++, accCount);
305 EEPROM.update(pos++, grpCount);
308 EEPROM.update(pos++, EEPROMSize / 256);
309 EEPROM.update(pos++, EEPROMSize % 256);
311 if (EEPROMRecordSize == 0)
316 while (pCurr != NULL)
318 EEPROMRecordSize = pCurr->
EEPROMSave(EEPROMRecordSize,
true);
326 circularBuffer.begin(pos+3, EEPROMRecordSize, (EEPROMSize - 10) / EEPROMRecordSize);
327 circularBuffer.clear();
330 EEPROM.update(pos++, EEPROMRecordSize / 256);
331 EEPROM.update(pos++, EEPROMRecordSize % 256);
333 EEPROM.update(pos++, (uint8_t) (EEPROM_VERSION + accCount +
337 EEPROMSize + EEPROMRecordSize));
339 pos = circularBuffer.startWrite();
342 while (pCurr != NULL)
351 EEPROMStartingDelay = 0;
354 bool Accessories::EEPROMLoad()
356 if (EEPROMStart == -1 || EEPROMSize == -1)
359 int pos = EEPROMStart;
365 if (EEPROM.read(pos++) != EEPROM_VERSION)
368 if (EEPROM.read(pos++) != accCount)
372 if (EEPROM.read(pos++) != grpCount)
374 if (EEPROM.read(pos++) != accCount)
378 b1 = EEPROM.read(pos++);
379 b2 = EEPROM.read(pos++);
380 if (EEPROMSize != b1 * 256 + b2)
383 b1 = EEPROM.read(pos++);
384 b2 = EEPROM.read(pos++);
385 EEPROMRecordSize = b1 * 256 + b2;
387 if (EEPROM.read(pos++) != (uint8_t)(EEPROM_VERSION + accCount +
391 EEPROMSize + EEPROMRecordSize))
393 EEPROMRecordSize = 0;
397 circularBuffer.begin(pos, EEPROMRecordSize, (EEPROMSize - 10) / EEPROMRecordSize);
400 pos = circularBuffer.getStartRead();
403 while (pCurr != NULL)
412 EEPROMStartingDelay = 0;
static int EEPROMLoadAll(int inPos)
virtual int EEPROMLoad(int inPos)
static int EEPROMSaveAll(int inPos, bool inSimulate = false)
static uint8_t GetCount()
static Accessory * GetFirstAccessory()
static void printAccessories()
static void ReceiveEvent(unsigned long inID, ACCESSORIES_EVENT_TYPE lastEventType, int inData)
static void RaiseEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
static void printEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEventType, int inEventData)
virtual int EEPROMSave(int inPos, bool inSimulate = false)
static void ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
static bool IsActionPending()
static void begin(int inEEPROMStart = -1, int inEEPROMSize = -1)
static void wait(unsigned long inDelay)
Accessory * GetNextAccessory() const
static ActionsStack Actions
static uint8_t GetCount()
Action * GetActionToExecute()
static void EventAll(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
ACCESSORIES_EVENT_TYPE Event