Added new call-back functions: notifyDccAccTurnoutBoard and notifyDccAccTurnoutOutput
Added new example NmraDccAccessoryDecoder_Pulsed_8 changed version to 1.2.0
This commit is contained in:
92
examples/NmraDccAccessoryDecoder_Pulsed_8/PinPulser.cpp
Normal file
92
examples/NmraDccAccessoryDecoder_Pulsed_8/PinPulser.cpp
Normal file
@@ -0,0 +1,92 @@
|
||||
#include "PinPulser.h"
|
||||
|
||||
#define PIN_PULSER_SLOT_EMPTY 255
|
||||
|
||||
void PinPulser::init(uint16_t onMs, uint16_t cduRechargeMs, uint8_t activeOutputState)
|
||||
{
|
||||
this->onMs = onMs;
|
||||
this->cduRechargeMs = cduRechargeMs;
|
||||
this->activeOutputState = activeOutputState;
|
||||
state = PP_IDLE;
|
||||
targetMs = 0;
|
||||
memset(pinQueue, PIN_PULSER_SLOT_EMPTY, PIN_PULSER_MAX_PINS + 1);
|
||||
}
|
||||
|
||||
uint8_t PinPulser::addPin(uint8_t Pin)
|
||||
{
|
||||
// Serial.print(" PinPulser::addPin: "); Serial.print(Pin,DEC);
|
||||
|
||||
for(uint8_t i = 0; i < PIN_PULSER_MAX_PINS; i++)
|
||||
{
|
||||
if(pinQueue[i] == Pin)
|
||||
{
|
||||
// Serial.print(" Already in Index: "); Serial.println(i,DEC);
|
||||
return i;
|
||||
}
|
||||
|
||||
else if(pinQueue[i] == PIN_PULSER_SLOT_EMPTY)
|
||||
{
|
||||
// Serial.print(" pinQueue Index: "); Serial.println(i,DEC);
|
||||
pinQueue[i] = Pin;
|
||||
process();
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
// Serial.println();
|
||||
return PIN_PULSER_SLOT_EMPTY;
|
||||
}
|
||||
|
||||
PP_State PinPulser::process(void)
|
||||
{
|
||||
unsigned long now;
|
||||
|
||||
switch(state)
|
||||
{
|
||||
case PP_IDLE:
|
||||
if(pinQueue[0] != PIN_PULSER_SLOT_EMPTY)
|
||||
{
|
||||
// Serial.print(" PinPulser::process: PP_IDLE: Pin: "); Serial.println(pinQueue[0],DEC);
|
||||
|
||||
digitalWrite(pinQueue[0], activeOutputState);
|
||||
targetMs = millis() + onMs;
|
||||
state = PP_OUTPUT_ON_DELAY;
|
||||
}
|
||||
break;
|
||||
|
||||
case PP_OUTPUT_ON_DELAY:
|
||||
now = millis();
|
||||
if(now >= targetMs)
|
||||
{
|
||||
// Serial.print(" PinPulser::process: PP_OUTPUT_ON_DELAY: Done Deactivate Pin: "); Serial.println(pinQueue[0],DEC);
|
||||
|
||||
digitalWrite(pinQueue[0], !activeOutputState);
|
||||
targetMs = now + cduRechargeMs;
|
||||
memmove(pinQueue, pinQueue + 1, PIN_PULSER_MAX_PINS);
|
||||
state = PP_CDU_RECHARGE_DELAY;
|
||||
}
|
||||
break;
|
||||
|
||||
case PP_CDU_RECHARGE_DELAY:
|
||||
now = millis();
|
||||
if(now >= targetMs)
|
||||
{
|
||||
if(pinQueue[0] != PIN_PULSER_SLOT_EMPTY)
|
||||
{
|
||||
// Serial.print(" PinPulser::process: PIN_PULSER_SLOT_EMPTY: Done Deactivate Pin: "); Serial.println(pinQueue[0],DEC);
|
||||
|
||||
digitalWrite(pinQueue[0], activeOutputState);
|
||||
targetMs = now + onMs;
|
||||
state = PP_OUTPUT_ON_DELAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Serial.println(" PinPulser::process: PP_CDU_RECHARGE_DELAY - Now PP_IDLE");
|
||||
state = PP_IDLE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user