Add SoftwareSerial::setRxIntMsk()

This moves the interrupt mask enabling / disabling code into a separate
method, so we can call it from multiple spots next.
This commit is contained in:
Matthijs Kooijman 2013-06-04 11:22:19 +02:00
parent 51b8ed2675
commit 7366268025
2 changed files with 14 additions and 2 deletions

View File

@ -403,8 +403,11 @@ void SoftwareSerial::begin(long speed)
// Set up RX interrupts, but only if we have a valid RX baud rate // Set up RX interrupts, but only if we have a valid RX baud rate
if (_rx_delay_stopbit) if (_rx_delay_stopbit)
{ {
// Enable the PCINT for the entire port here, but never disable it
// (others might also need it, so we disable the interrupt by using
// the per-pin PCMSK register).
*digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin)); *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
*digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin)); setRxIntMsk(true);
tunedDelay(_tx_delay); // if we were low this establishes the end tunedDelay(_tx_delay); // if we were low this establishes the end
} }
@ -416,10 +419,18 @@ void SoftwareSerial::begin(long speed)
listen(); listen();
} }
void SoftwareSerial::setRxIntMsk(bool enable)
{
if (enable)
*digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
else
*digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
}
void SoftwareSerial::end() void SoftwareSerial::end()
{ {
if (_rx_delay_stopbit) if (_rx_delay_stopbit)
*digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin)); setRxIntMsk(false);
} }

View File

@ -74,6 +74,7 @@ private:
void tx_pin_write(uint8_t pin_state); void tx_pin_write(uint8_t pin_state);
void setTX(uint8_t transmitPin); void setTX(uint8_t transmitPin);
void setRX(uint8_t receivePin); void setRX(uint8_t receivePin);
void setRxIntMsk(bool enable);
// private static method for timing // private static method for timing
static inline void tunedDelay(uint16_t delay); static inline void tunedDelay(uint16_t delay);