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(
"Accessories V1.0.2"));
40 Serial.println(F(
"Developed by Thierry Paris."));
41 Serial.println(F(
"(c) Locoduino 2016-2018"));
42 Serial.println(F(
""));
44 Serial.println(F(
"*** Setup Accessories started."));
47 if (EEPROMStart + EEPROMSize != -2 && (EEPROMSize == -1 || EEPROMStart == -1))
49 Serial.print(F(
" Error : EEPROM will not be used : "));
50 Serial.println(F(
" EEPROMSize or EEPROMStart is not defined by begin."));
56 #ifdef ACCESSORIES_DEBUG_MODE 57 void Accessories::printEvent(
unsigned long inId, ACCESSORIES_EVENT_TYPE inEventType,
int inEventData)
59 Serial.print(F(
"Commander event : Address : "));
60 Serial.print(inId, DEC);
61 Serial.print(F(
" / "));
64 case ACCESSORIES_EVENT_NONE: Serial.println(F(
"NONE"));
break;
65 case ACCESSORIES_EVENT_TOGGLE: Serial.println(F(
"TOGGLE"));
break;
66 case ACCESSORIES_EVENT_MOVE:
67 Serial.print(F(
"MOVE "));
68 switch ((ACCESSORIES_MOVE_TYPE)inEventData)
70 case ACCESSORIES_MOVE_MORE: Serial.println(F(
"MORE"));
break;
71 case ACCESSORIES_MOVE_LESS: Serial.println(F(
"LESS"));
break;
72 case ACCESSORIES_MOVE_STOP: Serial.println(F(
"STOP"));
break;
73 case ACCESSORIES_MOVE_LEFT: Serial.println(F(
"LEFT"));
break;
74 case ACCESSORIES_MOVE_RIGHT: Serial.println(F(
"RIGHT"));
break;
75 case ACCESSORIES_MOVE_CENTER: Serial.println(F(
"CENTER"));
break;
76 case ACCESSORIES_MOVE_TOP: Serial.println(F(
"TOP"));
break;
77 case ACCESSORIES_MOVE_BOTTOM: Serial.println(F(
"BOTTOM"));
break;
78 case ACCESSORIES_MOVE_STRAIGHT: Serial.println(F(
"STRAIGHT"));
break;
79 case ACCESSORIES_MOVE_DIVERGE: Serial.println(F(
"DIVERGE"));
break;
80 case ACCESSORIES_MOVE_ON: Serial.println(F(
"ON"));
break;
81 case ACCESSORIES_MOVE_OFF: Serial.println(F(
"OFF"));
break;
84 case ACCESSORIES_EVENT_MOVEPOSITION:
85 Serial.print(F(
"MOVEPOSITION : "));
86 Serial.println(inEventData, DEC);
88 case ACCESSORIES_EVENT_MOVEPOSITIONID:
89 Serial.println(F(
"MOVEPOSITIONID "));
91 case ACCESSORIES_EVENT_MOVEPOSITIONINDEX:
92 Serial.print(F(
"MOVEPOSITIONINDEX : "));
93 Serial.println(inEventData, DEC);
95 case ACCESSORIES_EVENT_CONFIG:
96 Serial.print(F(
"CONFIG : "));
97 Serial.print(ACCESSORIESCONFIGADDRESS(inEventData), DEC);
98 Serial.print(F(
" / "));
99 Serial.println(ACCESSORIESCONFIGVALUE(inEventData), DEC);
117 ArduiEmulator::ArduinoForm::_eventLog(
"Received", inId, inEventType, inEventData);
126 #ifdef ACCESSORIES_PRINT_ACCESSORIES 127 void Accessories::printAccessories()
129 Serial.println(F(
"********* Accessories List"));
132 while (pCurr != NULL)
134 pCurr->printAccessory();
137 Serial.println(F(
"********* End of Accessories"));
139 Serial.println(F(
"********* Groups"));
140 AccessoryGroup::printGroups();
141 Serial.println(F(
"********* End of groups"));
153 if (pLoopAccessory == NULL)
155 #ifdef ACCESSORIES_DEBUG_MODE 156 Serial.println(F(
"*** Setup Accessories Finished."));
160 while (pCurr != NULL)
171 EEPROMStartingDelay = 0;
173 #ifdef ACCESSORIES_DEBUG_MODE 174 bool good = Accessories::EEPROMLoad();
176 Serial.println(F(
"EEPROM loading aborted !"));
178 Accessories::EEPROMLoad();
190 if (pLoopAccessory == NULL)
193 pLoopAccessory->
loop();
206 if (EEPROMStartingDelay > 0)
215 unsigned long start = millis();
216 while (millis() < start + inWaitDelay)
270 #define EEPROM_VERSION 0 272 void Accessories::EEPROMSave()
274 if (EEPROMStart == -1 || EEPROMSize == -1)
277 if (EEPROMStartingDelay == 0)
278 EEPROMStartingDelay = millis();
281 void Accessories::EEPROMSaveRaw()
283 unsigned long mill = millis();
284 if (mill - EEPROMStartingDelay < EEPROM_SAVE_DELAY)
287 int pos = EEPROMStart;
292 EEPROM.update(pos++, EEPROM_VERSION);
293 EEPROM.update(pos++, accCount);
294 EEPROM.update(pos++, grpCount);
296 EEPROM.update(pos++, EEPROMSize / 256);
297 EEPROM.update(pos++, EEPROMSize % 256);
299 if (EEPROMRecordSize == 0)
304 while (pCurr != NULL)
306 EEPROMRecordSize = pCurr->
EEPROMSave(EEPROMRecordSize,
true);
312 circularBuffer.begin(pos+3, EEPROMRecordSize, (EEPROMSize - 10) / EEPROMRecordSize);
313 circularBuffer.clear();
316 EEPROM.update(pos++, EEPROMRecordSize / 256);
317 EEPROM.update(pos++, EEPROMRecordSize % 256);
319 EEPROM.update(pos++, (uint8_t) (EEPROM_VERSION + accCount + grpCount + EEPROMSize + EEPROMRecordSize));
321 pos = circularBuffer.startWrite();
324 while (pCurr != NULL)
331 EEPROMStartingDelay = 0;
334 bool Accessories::EEPROMLoad()
336 if (EEPROMStart == -1 || EEPROMSize == -1)
339 int pos = EEPROMStart;
343 if (EEPROM.read(pos++) != EEPROM_VERSION)
346 if (EEPROM.read(pos++) != accCount)
349 if (EEPROM.read(pos++) != grpCount)
350 if (EEPROM.read(pos++) != accCount)
354 b1 = EEPROM.read(pos++);
355 b2 = EEPROM.read(pos++);
356 if (EEPROMSize != b1 * 256 + b2)
359 b1 = EEPROM.read(pos++);
360 b2 = EEPROM.read(pos++);
361 EEPROMRecordSize = b1 * 256 + b2;
363 if (EEPROM.read(pos++) != (uint8_t)(EEPROM_VERSION + accCount + grpCount + EEPROMSize + EEPROMRecordSize))
365 EEPROMRecordSize = 0;
369 circularBuffer.begin(pos, EEPROMRecordSize, (EEPROMSize - 10) / EEPROMRecordSize);
372 pos = circularBuffer.getStartRead();
375 while (pCurr != NULL)
382 EEPROMStartingDelay = 0;
virtual int EEPROMLoad(int inPos)
static int EEPROMSaveAll(int inPos, bool inSimulate = false)
virtual int EEPROMSave(int inPos, bool inSimulate = false)
Accessory * GetNextAccessory() const
static Accessory * GetFirstAccessory()
static void RaiseEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
static uint8_t GetCount()
static void ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
static void ReceiveEvent(unsigned long inID, ACCESSORIES_EVENT_TYPE lastEventType, int inData)
static void EventAll(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
static void begin(int inEEPROMStart = -1, int inEEPROMSize = -1)
static bool IsActionPending()
static ActionsStack Actions
static int EEPROMLoadAll(int inPos)
ACCESSORIES_EVENT_TYPE Event
Action * GetActionToExecute()
static void wait(unsigned long inDelay)
static uint8_t GetCount()