From 06f8c567bc0aeb5ead6d3679e56350889d75ae57 Mon Sep 17 00:00:00 2001 From: Harald Barth Date: Fri, 15 Oct 2021 22:10:50 +0200 Subject: [PATCH] prevent driver pins to be used by sensors or outputs --- DCCWaveform.h | 3 +++ MotorDriver.cpp | 11 +++++++++++ MotorDriver.h | 1 + Outputs.cpp | 6 ++++++ Sensors.cpp | 6 ++++++ 5 files changed, 27 insertions(+) diff --git a/DCCWaveform.h b/DCCWaveform.h index 29d6a29..cd0ac39 100644 --- a/DCCWaveform.h +++ b/DCCWaveform.h @@ -107,6 +107,9 @@ class DCCWaveform { inline void setMaxAckPulseDuration(unsigned int i) { maxAckPulseDuration = i; } + inline bool pinUsed(byte pin) { + return motorDriver->pinUsed(pin); + } private: diff --git a/MotorDriver.cpp b/MotorDriver.cpp index f51ee04..d15cb22 100644 --- a/MotorDriver.cpp +++ b/MotorDriver.cpp @@ -84,6 +84,17 @@ bool MotorDriver::isPWMCapable() { return (!dualSignal) && DCCTimer::isPWMPin(signalPin); } +bool MotorDriver::pinUsed(byte pin) { + // order by how likely to hit + if (pin == powerPin) return true; + if (pin == signalPin) return true; + if (pin == currentPin) return true; + if (pin == faultPin) return true; + if (pin == brakePin) return true; + if (pin == signalPin2) return true; + return false; +} + void MotorDriver::setPower(bool on) { if (on) { diff --git a/MotorDriver.h b/MotorDriver.h index 08db049..c239a43 100644 --- a/MotorDriver.h +++ b/MotorDriver.h @@ -53,6 +53,7 @@ class MotorDriver { inline int getRawCurrentTripValue() { return rawCurrentTripValue; } + bool pinUsed(byte pin); bool isPWMCapable(); bool canMeasureCurrent(); static bool usePWM; diff --git a/Outputs.cpp b/Outputs.cpp index 52cafb8..d7ab0f2 100644 --- a/Outputs.cpp +++ b/Outputs.cpp @@ -84,6 +84,7 @@ the state of any outputs being monitored or controlled by a separate interface o #include "Outputs.h" #include "EEStore.h" #include "StringFormatter.h" +#include "DCCWaveform.h" // print all output states to stream void Output::printAll(Print *stream){ @@ -192,6 +193,11 @@ void Output::store(){ Output *Output::create(uint16_t id, uint8_t pin, uint8_t iFlag, uint8_t v){ Output *tt; + if (DCCWaveform::mainTrack.pinUsed(pin) || + DCCWaveform::progTrack.pinUsed(pin)) { + return NULL; + } + if(firstOutput==NULL){ firstOutput=(Output *)calloc(1,sizeof(Output)); tt=firstOutput; diff --git a/Sensors.cpp b/Sensors.cpp index 33c3fd6..141afbb 100644 --- a/Sensors.cpp +++ b/Sensors.cpp @@ -68,6 +68,7 @@ decide to ignore the return and only react to triggers. #include "StringFormatter.h" #include "Sensors.h" #include "EEStore.h" +#include "DCCWaveform.h" /////////////////////////////////////////////////////////////////////////////// @@ -126,6 +127,11 @@ void Sensor::printAll(Print *stream){ Sensor *Sensor::create(int snum, int pin, int pullUp){ Sensor *tt; + if (DCCWaveform::mainTrack.pinUsed(pin) || + DCCWaveform::progTrack.pinUsed(pin)) { + return NULL; + } + if(firstSensor==NULL){ firstSensor=(Sensor *)calloc(1,sizeof(Sensor)); tt=firstSensor;