From 8c8b78ce4975103ed82067fe98f2101fcce48d68 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 5 Nov 2015 16:16:19 -0500 Subject: [PATCH 1/2] Move SoftwareSerial TX and RX pin setup from constructor to begin as per #3041 --- .../SoftwareSerial/SoftwareSerial.cpp | 28 ++++++++++--------- .../libraries/SoftwareSerial/SoftwareSerial.h | 5 ++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp index 80df664fab0..84e34eeb982 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -247,6 +247,8 @@ ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); // Constructor // SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic /* = false */) : + _receivePin(receivePin), + _transmitPin(transmitPin), _rx_delay_centering(0), _rx_delay_intrabit(0), _rx_delay_stopbit(0), @@ -254,8 +256,6 @@ SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inv _buffer_overflow(false), _inverse_logic(inverse_logic) { - setTX(transmitPin); - setRX(receivePin); } // @@ -266,27 +266,26 @@ SoftwareSerial::~SoftwareSerial() end(); } -void SoftwareSerial::setTX(uint8_t tx) +void SoftwareSerial::setupTX() { // First write, then set output. If we do this the other way around, // the pin would be output low for a short while before switching to // output hihg. Now, it is input with pullup for a short while, which // is fine. With inverse logic, either order is fine. - digitalWrite(tx, _inverse_logic ? LOW : HIGH); - pinMode(tx, OUTPUT); - _transmitBitMask = digitalPinToBitMask(tx); - uint8_t port = digitalPinToPort(tx); + digitalWrite(_transmitPin, _inverse_logic ? LOW : HIGH); + pinMode(_transmitPin, OUTPUT); + _transmitBitMask = digitalPinToBitMask(_transmitPin); + uint8_t port = digitalPinToPort(_transmitPin); _transmitPortRegister = portOutputRegister(port); } -void SoftwareSerial::setRX(uint8_t rx) +void SoftwareSerial::setupRX() { - pinMode(rx, INPUT); + pinMode(_receivePin, INPUT); if (!_inverse_logic) - digitalWrite(rx, HIGH); // pullup for normal logic! - _receivePin = rx; - _receiveBitMask = digitalPinToBitMask(rx); - uint8_t port = digitalPinToPort(rx); + digitalWrite(_receivePin, HIGH); // pullup for normal logic! + _receiveBitMask = digitalPinToBitMask(_receivePin); + uint8_t port = digitalPinToPort(_receivePin); _receivePortRegister = portInputRegister(port); } @@ -303,6 +302,9 @@ uint16_t SoftwareSerial::subtract_cap(uint16_t num, uint16_t sub) { void SoftwareSerial::begin(long speed) { + setupTX(); + setupRX(); + _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; // Precalculate the various delays, in number of 4-cycle delays diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h index 622e2a516d5..677cf98d713 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h +++ b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h @@ -49,6 +49,7 @@ class SoftwareSerial : public Stream private: // per object data uint8_t _receivePin; + uint8_t _transmitPin; uint8_t _receiveBitMask; volatile uint8_t *_receivePortRegister; uint8_t _transmitBitMask; @@ -74,8 +75,8 @@ class SoftwareSerial : public Stream // private methods inline void recv() __attribute__((__always_inline__)); uint8_t rx_pin_read(); - void setTX(uint8_t transmitPin); - void setRX(uint8_t receivePin); + void setupTX(); + void setupRX(); inline void setRxIntMsk(bool enable) __attribute__((__always_inline__)); // Return num - sub, or 1 if the result would be < 1 From 752e17b6d9488855600f5c25f768277e62ecb5dd Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Fri, 6 Nov 2015 09:30:14 -0500 Subject: [PATCH 2/2] Change type of receivePin and transmitPin to int to remove some warnings --- .../arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp | 2 +- .../arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp index 84e34eeb982..5848d839208 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -246,7 +246,7 @@ ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); // // Constructor // -SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic /* = false */) : +SoftwareSerial::SoftwareSerial(int receivePin, int transmitPin, bool inverse_logic /* = false */) : _receivePin(receivePin), _transmitPin(transmitPin), _rx_delay_centering(0), diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h index 677cf98d713..2b4c0870131 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h +++ b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h @@ -48,8 +48,8 @@ class SoftwareSerial : public Stream { private: // per object data - uint8_t _receivePin; - uint8_t _transmitPin; + int _receivePin; + int _transmitPin; uint8_t _receiveBitMask; volatile uint8_t *_receivePortRegister; uint8_t _transmitBitMask; @@ -87,7 +87,7 @@ class SoftwareSerial : public Stream public: // public methods - SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false); + SoftwareSerial(int receivePin, int transmitPin, bool inverse_logic = false); ~SoftwareSerial(); void begin(long speed); bool listen();