9 #if defined(ARDUINO_ARCH_ESP32) 16 #define DCC_TIMER_PRESCALE 80 19 #define DCC_ZERO_BIT_TOTAL_DURATION 196 21 #define DCC_ZERO_BIT_PULSE_DURATION 98 24 #define DCC_ONE_BIT_TOTAL_DURATION 116 26 #define DCC_ONE_BIT_PULSE_DURATION 58 61 byte nextBitToSendLocal = 0; 62 if(R->currentBit == R->currentReg->activePacket->nBits){ 64 if (R->nRepeat > 0 && R->currentReg == R->reg) { 67 else if (R->nextReg != NULL) { 68 R->currentReg = R->nextReg; 70 R->tempPacket = R->currentReg->activePacket; 71 R->currentReg->activePacket = R->currentReg->updatePacket; 72 R->currentReg->updatePacket = R->tempPacket; 75 if (R->currentReg == R->maxLoadedReg) 76 R->currentReg = R->reg; 81 if (R->currentReg->activePacket->buf[R->currentBit / 8] & R->bitMask[R->currentBit % 8]) { 82 nextBitToSendLocal = 1; 84 nextBitToSendLocal = 0; 95 SignalGenerator(byte inTimerIndex) { this->timerIndex = inTimerIndex; this->_pulseTimer = NULL; }
97 void configureSignal(uint8_t inSignalPin);
98 void startSignal(
bool inDebugMode);
99 void stopSignal(
void);
105 hw_timer_t* _pulseTimer;
110 SignalGenerator *pMainSignal = NULL, *pProgSignal = NULL;
111 #ifdef DCCPP_DEBUG_MODE 115 bool pulseMain =
false;
116 bool pulseProg =
false;
118 void IRAM_ATTR signalGeneratorPulseTimerMain(
void)
120 #ifdef DCCPP_DEBUG_MODE 129 pulseMain = !pulseMain;
132 digitalWrite(pMainSignal->_signalPin, LOW);
135 DCC_SIGNAL(pMainSignal->pRegisters)
136 if (nextBitToSendLocal)
137 timerAlarmWrite(pMainSignal->_pulseTimer, DCC_ONE_BIT_PULSE_DURATION, true);
139 timerAlarmWrite(pMainSignal->_pulseTimer, DCC_ZERO_BIT_PULSE_DURATION, true);
141 timerWrite(pMainSignal->_pulseTimer, 0);
142 timerAlarmEnable(pMainSignal->_pulseTimer);
143 digitalWrite(pMainSignal->_signalPin, HIGH);
146 void IRAM_ATTR signalGeneratorPulseTimerProg(
void)
148 #ifdef DCCPP_DEBUG_MODE 157 pulseProg = !pulseProg;
160 digitalWrite(pProgSignal->_signalPin, LOW);
164 DCC_SIGNAL(pProgSignal->pRegisters)
165 if (nextBitToSendLocal)
166 timerAlarmWrite(pProgSignal->_pulseTimer, DCC_ONE_BIT_PULSE_DURATION, true);
168 timerAlarmWrite(pProgSignal->_pulseTimer, DCC_ZERO_BIT_PULSE_DURATION, true);
169 timerWrite(pProgSignal->_pulseTimer, 0);
170 timerAlarmEnable(pProgSignal->_pulseTimer);
171 digitalWrite(pProgSignal->_signalPin, HIGH);
174 void SignalGenerator::startSignal(
bool inDebugMode)
177 this->_pulseTimer = timerBegin(this->timerIndex, inDebugMode ? DCC_TIMER_PRESCALE/10 : DCC_TIMER_PRESCALE,
true);
179 timerAttachInterrupt(this->_pulseTimer,
this == pMainSignal ? &signalGeneratorPulseTimerMain : &signalGeneratorPulseTimerProg,
true);
181 timerAlarmWrite(this->_pulseTimer, DCC_ONE_BIT_PULSE_DURATION,
true);
183 timerWrite(this->_pulseTimer, 0);
186 timerAlarmEnable(this->_pulseTimer);
188 #ifdef DCCPP_DEBUG_MODE 189 Serial.print(
"Signal started for ");
190 Serial.print(
this == pMainSignal ?
"Main track" :
"Prog track");
191 Serial.print(
" on pin ");
192 Serial.println(this->_signalPin);
196 void SignalGenerator::stopSignal(
void)
199 timerStop(this->_pulseTimer);
200 timerAlarmDisable(this->_pulseTimer);
201 timerDetachInterrupt(this->_pulseTimer);
202 timerEnd(this->_pulseTimer);
204 #ifdef DCCPP_DEBUG_MODE 205 Serial.print(
"Signal stoppedfor ");
206 Serial.print(
this == pMainSignal ?
"Main track" :
"Prog track");
207 Serial.print(
" on pin ");
208 Serial.println(this->_signalPin);
215 void SignalGenerator::configureSignal(uint8_t inSignalPin)
217 this->_signalPin = inSignalPin;
220 pinMode(inSignalPin, INPUT);
221 digitalWrite(inSignalPin, LOW);
222 pinMode(inSignalPin, OUTPUT);
223 this->startSignal(
false);
228 DCCpp::mainRegs.loadPacket(1, RegisterList::idlePacket, 2, 0);
230 pMainSignal =
new SignalGenerator(0);
231 pMainSignal->pRegisters = &DCCpp::mainRegs;
232 pMainSignal->configureSignal(inSignalPin);
234 #ifdef DCCPP_DEBUG_MODE 235 Serial.println(
"Main track DCC ESP32 started.");
241 DCCpp::progRegs.loadPacket(1, RegisterList::idlePacket, 2, 0);
243 pProgSignal =
new SignalGenerator(1);
244 pProgSignal->pRegisters = &DCCpp::progRegs;
245 pProgSignal->configureSignal(inSignalPin);
247 #ifdef DCCPP_DEBUG_MODE 248 Serial.println(
"Prog track DCC ESP32 started.");
254 if (pMainSignal != NULL)
256 pMainSignal->stopSignal();
257 pMainSignal->startSignal(
true);
260 if (pProgSignal != NULL)
262 pProgSignal->stopSignal();
263 pProgSignal->startSignal(
true);
static void setDebugDccMode()
static void beginProgDccSignal(uint8_t inSignalPin)
static void beginMainDccSignal(uint8_t inSignalPin)