9 #ifdef NO_DCCCOMMANDERNMRA 10 #pragma message ("Commanders : No DCC NMRA commander !") 14 NmraDcc DccCommanderNMRAClass::Dcc;
22 CVPair FactoryDefaultCVs[] =
24 {CV_ACCESSORY_DECODER_ADDRESS_LSB, 1},
25 {CV_ACCESSORY_DECODER_ADDRESS_MSB, 0},
28 uint8_t FactoryDefaultCVIndex = 0;
30 void notifyCVResetFactoryDefault()
34 FactoryDefaultCVIndex =
sizeof(FactoryDefaultCVs) /
sizeof(
CVPair);
41 void notifyDccAccTurnoutBoard(uint16_t inBoardAddr, uint8_t inOutputPair, uint8_t inDirection, uint8_t inOutputPower)
48 int realAddress = (inBoardAddr - (DccCommanderNMRA.GetRocoMode() ?0:1)) * 4 + inOutputPair + 1;
50 #ifdef COMMANDERS_DEBUG_MODE 52 Serial.print(F(
"Dcc packet found : real data : "));
53 Serial.print(inBoardAddr);
54 Serial.print(F(
" / "));
55 Serial.print(inOutputPair);
56 Serial.print(F(
" / "));
57 Serial.print(inDirection, DEC);
58 Serial.print(F(
" / "));
59 Serial.print(inOutputPower, DEC);
61 Serial.print(F(
" converted : "));
62 Serial.print(realAddress);
63 Serial.print(F(
" / "));
64 Serial.print(inDirection, DEC);
65 Serial.print(F(
" / "));
66 Serial.println(inOutputPower, DEC);
77 if (inOutputPower == DccCommanderNMRA.raiseEventOnActivation)
79 if (DCCINT(realAddress, inDirection) == DccCommanderNMRA.lastDccId)
80 if (millis() - DccCommanderNMRA.lastEventDate < DccCommanderNMRA.raiseEventDebounceDelay)
82 #ifdef COMMANDERS_DEBUG_MODE 83 Serial.print(F(
"DccCommander packet IGNORED :"));
84 Serial.print(realAddress);
85 Serial.print(F(
" / "));
86 Serial.println(inDirection, DEC);
91 DccCommanderNMRA.lastEventDate = millis();
93 #ifdef COMMANDERS_DEBUG_MODE 94 Serial.print(F(
"DccCommander packet received :"));
95 Serial.print(realAddress);
96 Serial.print(F(
" / "));
97 Serial.println(inDirection, DEC);
105 DccCommanderNMRA.lastDccId = DCCINT(realAddress, inDirection);
111 void StatusBlink_handler()
119 Serial.println(
"Start beginByPin");
120 DccCommanderNMRAClass::Dcc.pin(interruptPinNumber,
true);
121 Serial.println(
"pin ok");
122 DccCommanderNMRAClass::Dcc.initAccessoryDecoder(inManufacturerId, inVersionId, FLAGS_DCC_ACCESSORY_DECODER, 0);
123 Serial.println(
"init ok");
125 this->rocoMode = inRocoMode;
129 pinMode(interruptPinNumber, OUTPUT_INTERRUPT);
132 this->lastEventDate = 0;
133 this->raiseEventOnActivation =
false;
134 this->raiseEventDebounceDelay = 200;
139 #ifdef COMMANDERS_PRINT_COMMANDERS 140 this->Interrupt = digitalPinToInterrupt(interruptPinNumber);
142 Serial.println(
"End beginByPin");
147 this->raiseEventOnActivation = inRaiseEventOnActivation;
148 this->raiseEventDebounceDelay = inRaiseEventDebounceDelay;
160 if (FactoryDefaultCVIndex && Dcc.isSetCVReady())
162 FactoryDefaultCVIndex--;
163 Dcc.setCV(FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
168 unsigned long last = this->lastDccId;
178 #ifdef COMMANDERS_DEBUG_MODE 181 Serial.print(F(
"DCC Commander event : Address : "));
182 Serial.print(DCCID(inId), DEC);
183 Serial.print(F(
" / "));
184 Serial.print(DCCACTIVATION(inId), DEC);
185 Serial.print(F(
" / "));
191 Serial.print(F(
"MOVE "));
209 Serial.print(F(
"MOVEPOSITION : "));
210 Serial.println(inEventData, DEC);
213 Serial.println(F(
"MOVEPOSITIONID"));
216 Serial.print(F(
"MOVEPOSITIONINDEX : "));
217 Serial.println(inEventData, DEC);
220 Serial.print(F(
"CONFIG : "));
221 Serial.print(COMMANDERSCONFIGADDRESS(inEventData), DEC);
222 Serial.print(F(
" / "));
223 Serial.println(COMMANDERSCONFIGVALUE(inEventData), DEC);
229 #ifdef COMMANDERS_PRINT_COMMANDERS 232 Serial.print(F(
"Commander: DccCommander - Interrupt: "));
233 Serial.println(this->Interrupt);
static void SetLastEventData(int inData)
static void SetLastEventType(COMMANDERS_EVENT_TYPE inEvent)
void RaiseEventWhen(boolean inRaiseEventOnActivation, int inRaiseEventDebounceDelay = 200)
static void printEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
void beginByPin(int inManufacturerId, int inVersionId, int interruptNumber, boolean inInterruptMonitor = false, boolean inRocoMode = false)
static GPIO_pin_t StatusLedPin
static unsigned long RaiseEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEvent = COMMANDERS_EVENT_MOVEPOSITIONID, int inData = 0)
static void CheckLastReception(uint16_t inBoardAddr, uint8_t inOutputPair, uint8_t inDirection, uint8_t inOutputPower)