@@ -51,13 +51,15 @@ constexpr uint8_t BYTE_ALL_BITS_SET = ~static_cast<uint8_t>(0);
5151
5252SoftwareSerial::SoftwareSerial () {
5353 m_isrOverflow = false ;
54- m_rxGPIOPullupEnabled = true ;
54+ m_rxGPIOPullUpEnabled = true ;
55+ m_txGPIOOpenDrain = false ;
5556}
5657
5758SoftwareSerial::SoftwareSerial (int8_t rxPin, int8_t txPin, bool invert)
5859{
5960 m_isrOverflow = false ;
60- m_rxGPIOPullupEnabled = true ;
61+ m_rxGPIOPullUpEnabled = true ;
62+ m_txGPIOOpenDrain = false ;
6163 m_rxPin = rxPin;
6264 m_txPin = txPin;
6365 m_invert = invert;
@@ -67,7 +69,10 @@ SoftwareSerial::~SoftwareSerial() {
6769 end ();
6870}
6971
70- bool SoftwareSerial::isValidGPIOpin (int8_t pin) {
72+ #if __GNUC__ >= 10
73+ constexpr
74+ #endif
75+ bool SoftwareSerial::isValidGPIOpin (int8_t pin) const {
7176#if defined(ESP8266)
7277 return (pin >= 0 && pin <= 16 ) && !isFlashInterfacePin (pin);
7378#elif defined(ESP32)
@@ -97,15 +102,21 @@ bool SoftwareSerial::isValidGPIOpin(int8_t pin) {
97102#endif
98103}
99104
100- bool SoftwareSerial::isValidRxGPIOpin (int8_t pin) {
105+ #if __GNUC__ >= 10
106+ constexpr
107+ #endif
108+ bool SoftwareSerial::isValidRxGPIOpin (int8_t pin) const {
101109 return isValidGPIOpin (pin)
102110#if defined(ESP8266)
103111 && (pin != 16 )
104112#endif
105113 ;
106114}
107115
108- bool SoftwareSerial::isValidTxGPIOpin (int8_t pin) {
116+ #if __GNUC__ >= 10
117+ constexpr
118+ #endif
119+ bool SoftwareSerial::isValidTxGPIOpin (int8_t pin) const {
109120 return isValidGPIOpin (pin)
110121#if defined(ESP32)
111122#ifdef CONFIG_IDF_TARGET_ESP32
@@ -119,7 +130,10 @@ bool SoftwareSerial::isValidTxGPIOpin(int8_t pin) {
119130 ;
120131}
121132
122- bool SoftwareSerial::hasRxGPIOPullUp (int8_t pin) {
133+ #if __GNUC__ >= 10
134+ constexpr
135+ #endif
136+ bool SoftwareSerial::hasRxGPIOPullUp (int8_t pin) const {
123137#if defined(ESP32)
124138 return !(pin >= 34 && pin <= 39 );
125139#else
@@ -128,9 +142,15 @@ bool SoftwareSerial::hasRxGPIOPullUp(int8_t pin) {
128142#endif
129143}
130144
131- void SoftwareSerial::setRxGPIOPullUp () {
145+ void SoftwareSerial::setRxGPIOPinMode () {
132146 if (m_rxValid) {
133- pinMode (m_rxPin, hasRxGPIOPullUp (m_rxPin) && m_rxGPIOPullupEnabled ? INPUT_PULLUP : INPUT);
147+ pinMode (m_rxPin, hasRxGPIOPullUp (m_rxPin) && m_rxGPIOPullUpEnabled ? INPUT_PULLUP : INPUT);
148+ }
149+ }
150+
151+ void SoftwareSerial::setTxGPIOPinMode () {
152+ if (m_txValid) {
153+ pinMode (m_txPin, m_txGPIOOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
134154 }
135155}
136156
@@ -160,7 +180,7 @@ void SoftwareSerial::begin(uint32_t baud, SoftwareSerialConfig config,
160180 isrBufCapacity : m_buffer->capacity () * (2 + m_dataBits + static_cast <bool >(m_parityMode))));
161181 if (m_buffer && (!m_parityMode || m_parityBuffer) && m_isrBuffer) {
162182 m_rxValid = true ;
163- setRxGPIOPullUp ();
183+ setRxGPIOPinMode ();
164184 }
165185 }
166186 if (isValidTxGPIOpin (m_txPin)) {
@@ -170,7 +190,7 @@ void SoftwareSerial::begin(uint32_t baud, SoftwareSerialConfig config,
170190 m_txBitMask = digitalPinToBitMask (m_txPin);
171191 m_txValid = true ;
172192 if (!m_oneWire) {
173- pinMode (m_txPin, OUTPUT );
193+ setTxGPIOPinMode ( );
174194 digitalWrite (m_txPin, !m_invert);
175195 }
176196 }
@@ -210,20 +230,25 @@ void SoftwareSerial::enableIntTx(bool on) {
210230 m_intTxEnabled = on;
211231}
212232
213- void SoftwareSerial::enableRxGPIOPullup (bool on) {
214- m_rxGPIOPullupEnabled = on;
215- setRxGPIOPullUp ();
233+ void SoftwareSerial::enableRxGPIOPullUp (bool on) {
234+ m_rxGPIOPullUpEnabled = on;
235+ setRxGPIOPinMode ();
236+ }
237+
238+ void SoftwareSerial::enableTxGPIOOpenDrain (bool on) {
239+ m_txGPIOOpenDrain = on;
240+ setTxGPIOPinMode ();
216241}
217242
218243void SoftwareSerial::enableTx (bool on) {
219244 if (m_txValid && m_oneWire) {
220245 if (on) {
221246 enableRx (false );
222- pinMode (m_txPin, OUTPUT );
247+ setTxGPIOPinMode ( );
223248 digitalWrite (m_txPin, !m_invert);
224249 }
225250 else {
226- setRxGPIOPullUp ();
251+ setRxGPIOPinMode ();
227252 enableRx (true );
228253 }
229254 }
0 commit comments