diff --git a/libraries/CurieSoftwareSerial/SoftwareSerial.cpp b/libraries/CurieSoftwareSerial/SoftwareSerial.cpp index 3d1ae51a..6b3abd9b 100644 --- a/libraries/CurieSoftwareSerial/SoftwareSerial.cpp +++ b/libraries/CurieSoftwareSerial/SoftwareSerial.cpp @@ -46,7 +46,6 @@ volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; // // Globals // -uint8_t txPin; uint8_t rxPin; uint16_t bitDelay; uint16_t rxIntraBitDelay; @@ -95,8 +94,16 @@ bool SoftwareSerial::listen() bufferOverflow = false; _receive_buffer_head = _receive_buffer_tail = 0; active_object = this; - - setRxIntMsk(true); + rxPin = _receivePin; + if(invertedLogic) + { + attachInterrupt(rxPin, recv, HIGH); + } + else + { + attachInterrupt(rxPin, recv, LOW); + } + return true; } @@ -108,8 +115,8 @@ bool SoftwareSerial::stopListening() { if (active_object == this) { - setRxIntMsk(false); active_object = NULL; + detachInterrupt(rxPin); return true; } return false; @@ -230,9 +237,9 @@ SoftwareSerial::SoftwareSerial(uint32_t receivePin, uint32_t transmitPin, bool i { invertedLogic = inverse_logic; setTX(transmitPin); - txPin = transmitPin; + _transmitPin = transmitPin; setRX(receivePin); - rxPin = receivePin; + _receivePin = receivePin; } // @@ -313,24 +320,9 @@ void SoftwareSerial::begin(long speed) pinMode(_DEBUG_PIN1, OUTPUT); pinMode(_DEBUG_PIN2, OUTPUT); #endif - digitalRead(rxPin); - if(invertedLogic) - { - attachInterrupt(rxPin, recv, HIGH); - } - else - { - attachInterrupt(rxPin, recv, LOW); - } - listen(); } -void SoftwareSerial::setRxIntMsk(bool enable) -{ - -} - void SoftwareSerial::end() { stopListening(); @@ -380,9 +372,9 @@ size_t SoftwareSerial::write(uint8_t b) // Write the start bit if (invertedLogic) - digitalWrite(txPin, HIGH); + digitalWrite(_transmitPin, HIGH); else - digitalWrite(txPin, LOW); + digitalWrite(_transmitPin, LOW); delayTicks(delay); @@ -390,9 +382,9 @@ size_t SoftwareSerial::write(uint8_t b) for (uint8_t i = 8; i > 0; --i) { if (b & 1) // choose bit - digitalWrite(txPin, HIGH); + digitalWrite(_transmitPin, HIGH); else - digitalWrite(txPin, LOW); + digitalWrite(_transmitPin, LOW); delayTicks(delay); b >>= 1; @@ -400,9 +392,9 @@ size_t SoftwareSerial::write(uint8_t b) // restore pin to natural state if (invertedLogic) - digitalWrite(txPin, LOW); + digitalWrite(_transmitPin, LOW); else - digitalWrite(txPin, HIGH); + digitalWrite(_transmitPin, HIGH); interrupts(); delayTicks(delay); diff --git a/libraries/CurieSoftwareSerial/SoftwareSerial.h b/libraries/CurieSoftwareSerial/SoftwareSerial.h index 660e82c1..b11a6b62 100644 --- a/libraries/CurieSoftwareSerial/SoftwareSerial.h +++ b/libraries/CurieSoftwareSerial/SoftwareSerial.h @@ -39,6 +39,7 @@ class SoftwareSerial : public Stream private: // per object data uint32_t _receivePin; + uint32_t _transmitPin; uint32_t _receiveBitMask; volatile uint32_t *_receivePortRegister; uint32_t _transmitBitMask; @@ -66,7 +67,6 @@ class SoftwareSerial : public Stream void tx_pin_write(uint32_t pin_state) __attribute__((__always_inline__)); void setTX(uint8_t transmitPin); void setRX(uint8_t receivePin); - void setRxIntMsk(bool enable); // Return num - sub, or 1 if the result would be < 1 static uint16_t subtract_cap(uint16_t num, uint16_t sub);