From e5ce76e70334325f3aa6217f8fd65409e6cc7e54 Mon Sep 17 00:00:00 2001 From: Harald Barth Date: Mon, 1 Aug 2022 22:56:56 +0200 Subject: [PATCH] idle waveform through RMT --- DCCRMT.cpp | 2 +- DCCRMT.h | 5 +---- DCCWaveform.cpp | 23 +++++++++++++++++++++-- DCCWaveform.h | 9 ++++++++- MotorDriver.h | 1 + TrackManager.cpp | 9 +++++++++ TrackManager.h | 6 ++++++ 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/DCCRMT.cpp b/DCCRMT.cpp index d9a7844..0d819b9 100644 --- a/DCCRMT.cpp +++ b/DCCRMT.cpp @@ -1,5 +1,5 @@ /* - * © 2021, Harald Barth. + * © 2021-2022, Harald Barth. * * This file is part of DCC-EX * diff --git a/DCCRMT.h b/DCCRMT.h index e183423..6747e74 100644 --- a/DCCRMT.h +++ b/DCCRMT.h @@ -1,5 +1,5 @@ /* - * © 2021, Harald Barth. + * © 2021-2022, Harald Barth. * * This file is part of DCC-EX * @@ -37,9 +37,6 @@ class RMTChannel { //int RMTfillData(dccPacket packet); int RMTfillData(const byte buffer[], byte byteCount, byte repeatCount); - static RMTChannel mainRMTChannel; - static RMTChannel progRMTChannel; - private: rmt_channel_t channel; diff --git a/DCCWaveform.cpp b/DCCWaveform.cpp index 300150e..ff0cd19 100644 --- a/DCCWaveform.cpp +++ b/DCCWaveform.cpp @@ -198,12 +198,31 @@ void DCCWaveform::schedulePacket(const byte buffer[], byte byteCount, byte repea DCCWaveform DCCWaveform::mainTrack(PREAMBLE_BITS_MAIN, true); DCCWaveform DCCWaveform::progTrack(PREAMBLE_BITS_PROG, false); +RMTChannel *DCCWaveform::rmtMainChannel = NULL; +RMTChannel *DCCWaveform::rmtProgChannel = NULL; DCCWaveform::DCCWaveform(byte preambleBits, bool isMain) { + isMainTrack = isMain; + packetPending = false; + requiredPreambles = preambleBits; +} +void DCCWaveform::begin() { + for(const auto& md: TrackManager::getMainDrivers()) { + if(rmtMainChannel) { + /* rmtMainChannel->addPin(md->getSignalPin); // add pin to existing main channel */ + } else { + DIAG(F("new MAIN channel %d"), md->getSignalPin()); + rmtMainChannel = new RMTChannel(md->getSignalPin(), true); /* create new main channel */ + } + } + if (rmtProgChannel) { + /* exchange prog channel - not supported yet */ + } else { + DIAG(F("new PROGchannel %d"), TrackManager::getProgDriver()->getSignalPin()); + rmtProgChannel = new RMTChannel(TrackManager::getProgDriver()->getSignalPin(), false); + } } -void DCCWaveform::begin() { -} void DCCWaveform::schedulePacket(const byte buffer[], byte byteCount, byte repeats) { } void DCCWaveform::loop() { diff --git a/DCCWaveform.h b/DCCWaveform.h index cee39c3..d530b70 100644 --- a/DCCWaveform.h +++ b/DCCWaveform.h @@ -25,6 +25,10 @@ #define DCCWaveform_h #include "MotorDriver.h" +#ifdef ARDUINO_ARCH_ESP32 +#include "DCCRMT.h" +#include "TrackManager.h" +#endif @@ -71,6 +75,9 @@ class DCCWaveform { byte pendingPacket[MAX_PACKET_SIZE+1]; // +1 for checksum byte pendingLength; byte pendingRepeats; - +#ifdef ARDUINO_ARCH_ESP32 + static RMTChannel *rmtMainChannel; + static RMTChannel *rmtProgChannel; +#endif }; #endif diff --git a/MotorDriver.h b/MotorDriver.h index d9d3982..d673044 100644 --- a/MotorDriver.h +++ b/MotorDriver.h @@ -112,6 +112,7 @@ class MotorDriver { else pinMode(signalPin, INPUT); }; + inline byte getSignalPin() { return signalPin; }; virtual void setBrake( bool on); virtual void setDCSignal(byte speedByte); virtual int getCurrentRaw(); diff --git a/TrackManager.cpp b/TrackManager.cpp index acfb3f9..064dfc8 100644 --- a/TrackManager.cpp +++ b/TrackManager.cpp @@ -303,6 +303,15 @@ MotorDriver * TrackManager::getProgDriver() { return NULL; } +#ifdef ARDUINO_ARCH_ESP32 +std::vectorTrackManager::getMainDrivers() { + std::vector v; + FOR_EACH_TRACK(t) + if (trackMode[t]==TRACK_MODE_MAIN) v.push_back(track[t]); + return v; +} +#endif + void TrackManager::setPower2(bool setProg,POWERMODE mode) { if (!setProg) mainPowerGuess=mode; FOR_EACH_TRACK(t) { diff --git a/TrackManager.h b/TrackManager.h index 9184fd0..b210221 100644 --- a/TrackManager.h +++ b/TrackManager.h @@ -18,6 +18,9 @@ * You should have received a copy of the GNU General Public License * along with CommandStation. If not, see . */ +#ifdef ARDUINO_ARCH_ESP32 +#include +#endif #ifndef TrackManager_h #define TrackManager_h #include "FSH.h" @@ -55,6 +58,9 @@ class TrackManager { static void setPROGSignal( bool on); static void setDCSignal(int16_t cab, byte speedbyte); static MotorDriver * getProgDriver(); +#ifdef ARDUINO_ARCH_ESP32 + static std::vectorgetMainDrivers(); +#endif static void setPower2(bool progTrack,POWERMODE mode); static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);} static void setMainPower(POWERMODE mode) {setPower2(false,mode);}