From cb36793486dd8d8d91c16984c423dbad4f4710a6 Mon Sep 17 00:00:00 2001
From: Matthijs Kooijman <matthijs@stdin.nl>
Date: Tue, 4 Jun 2013 11:30:26 +0200
Subject: Toggle SoftwareSerial interrupts when starting / stopping to listen

This prevents interrupts from triggering when the SoftwareSerial
instance is not even listening.

Additionally, this removes the need to disable interrupts in
SoftwareSerial::listen, since no interrupts are active while it touches
the variables.
---
 libraries/SoftwareSerial/SoftwareSerial.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

(limited to 'libraries')

diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp
index a429f7d..b98451f 100644
--- a/libraries/SoftwareSerial/SoftwareSerial.cpp
+++ b/libraries/SoftwareSerial/SoftwareSerial.cpp
@@ -183,12 +183,14 @@ bool SoftwareSerial::listen()
 
   if (active_object != this)
   {
+    if (active_object)
+      active_object->stopListening();
+
     _buffer_overflow = false;
-    uint8_t oldSREG = SREG;
-    cli();
     _receive_buffer_head = _receive_buffer_tail = 0;
     active_object = this;
-    SREG = oldSREG;
+
+    setRxIntMsk(true);
     return true;
   }
 
@@ -200,6 +202,7 @@ bool SoftwareSerial::stopListening()
 {
   if (active_object == this)
   {
+    setRxIntMsk(false);
     active_object = NULL;
     return true;
   }
@@ -418,7 +421,6 @@ void SoftwareSerial::begin(long speed)
     // (others might also need it, so we disable the interrupt by using
     // the per-pin PCMSK register).
     *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
-    setRxIntMsk(true);
     tunedDelay(_tx_delay); // if we were low this establishes the end
   }
 
-- 
cgit v1.2.3-18-g5258