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.1.3"));
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 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);
101 case ACCESSORIES_EVENT_SETSPEED:
102 Serial.print(F(
"SET SPEED : "));
103 Serial.println(inEventData);
105 case ACCESSORIES_EVENT_SETDURATION:
106 Serial.print(F(
"SET DURATION : "));
107 Serial.println(inEventData);
124 ArduiEmulator::ArduinoForm::_eventLog(
"Received", inId, inEventType, inEventData);
133 #ifdef ACCESSORIES_PRINT_ACCESSORIES 136 Serial.println(F(
"********* Accessories List"));
139 while (pCurr != NULL)
141 pCurr->printAccessory();
144 Serial.println(F(
"********* End of Accessories"));
147 Serial.println(F(
"********* Groups"));
148 AccessoryGroup::printGroups();
149 Serial.println(F(
"********* End of groups"));
162 if (pLoopAccessory == NULL)
164 #ifdef ACCESSORIES_DEBUG_MODE 165 Serial.println(F(
"*** Setup Accessories Finished."));
169 while (pCurr != NULL)
180 EEPROMStartingDelay = 0;
182 #ifdef ACCESSORIES_DEBUG_MODE 183 bool good = Accessories::EEPROMLoad();
185 Serial.println(F(
"EEPROM loading aborted !"));
187 Accessories::EEPROMLoad();
199 if (pLoopAccessory == NULL)
202 pLoopAccessory->
loop();
209 if (actionIndex != 255)
219 if (EEPROMStartingDelay > 0)
228 unsigned long start = millis();
229 while (millis() < start + inWaitDelay)
283 #define EEPROM_VERSION 0 285 void Accessories::EEPROMSave()
287 if (EEPROMStart == -1 || EEPROMSize == -1)
290 if (EEPROMStartingDelay == 0)
291 EEPROMStartingDelay = millis();
294 void Accessories::EEPROMSaveRaw()
296 unsigned long mill = millis();
297 if (mill - EEPROMStartingDelay < EEPROM_SAVE_DELAY)
300 int pos = EEPROMStart;
307 EEPROM.update(pos++, EEPROM_VERSION);
308 EEPROM.update(pos++, accCount);
310 EEPROM.update(pos++, grpCount);
313 EEPROM.update(pos++, EEPROMSize / 256);
314 EEPROM.update(pos++, EEPROMSize % 256);
316 if (EEPROMRecordSize == 0)
321 while (pCurr != NULL)
323 EEPROMRecordSize = pCurr->
EEPROMSave(EEPROMRecordSize,
true);
331 circularBuffer.begin(pos+3, EEPROMRecordSize, (EEPROMSize - 10) / EEPROMRecordSize);
332 circularBuffer.clear();
335 EEPROM.update(pos++, EEPROMRecordSize / 256);
336 EEPROM.update(pos++, EEPROMRecordSize % 256);
338 EEPROM.update(pos++, (uint8_t) (EEPROM_VERSION + accCount +
342 EEPROMSize + EEPROMRecordSize));
344 pos = circularBuffer.startWrite();
347 while (pCurr != NULL)
356 EEPROMStartingDelay = 0;
359 bool Accessories::EEPROMLoad()
361 if (EEPROMStart == -1 || EEPROMSize == -1)
364 int pos = EEPROMStart;
370 if (EEPROM.read(pos++) != EEPROM_VERSION)
373 if (EEPROM.read(pos++) != accCount)
377 if (EEPROM.read(pos++) != grpCount)
379 if (EEPROM.read(pos++) != accCount)
383 b1 = EEPROM.read(pos++);
384 b2 = EEPROM.read(pos++);
385 if (EEPROMSize != b1 * 256 + b2)
388 b1 = EEPROM.read(pos++);
389 b2 = EEPROM.read(pos++);
390 EEPROMRecordSize = b1 * 256 + b2;
392 if (EEPROM.read(pos++) != (uint8_t)(EEPROM_VERSION + accCount +
396 EEPROMSize + EEPROMRecordSize))
398 EEPROMRecordSize = 0;
402 circularBuffer.begin(pos, EEPROMRecordSize, (EEPROMSize - 10) / EEPROMRecordSize);
405 pos = circularBuffer.getStartRead();
408 while (pCurr != NULL)
417 EEPROMStartingDelay = 0;
static int EEPROMLoadAll(int inPos)
virtual int EEPROMLoad(int inPos)
static int EEPROMSaveAll(int inPos, bool inSimulate = false)
virtual int EEPROMSave(int inPos, bool inSimulate = false)
static uint8_t GetCount()
static uint8_t GetCount()
static void printAccessories()
ACCESSORIES_EVENT_TYPE Event
static void begin(int inEEPROMStart = -1, int inEEPROMSize = -1)
static ActionsStack Actions
static void ExecuteEvent(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)
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)
static Accessory * GetFirstAccessory()
static void wait(unsigned long inDelay)
unsigned char GetActionToExecute()
static bool IsActionPending()
Accessory * GetNextAccessory() const