3535#include " SoftwareSerial.h"
3636#include " Arduino.h"
3737
38- SoftwareSerial *ap3_serial_handle = 0 ;
38+ SoftwareSerial *ap3_active_softwareserial_handle = 0 ;
3939
4040// Uncomment to enable debug pulses and Serial.prints
41- // #define DEBUG
41+ #define DEBUG
4242
4343#ifdef DEBUG
44- #define SS_DEBUG_PIN 8
44+ #define SS_DEBUG_PIN 9
4545ap3_gpio_pad_t debugPad = ap3_gpio_pin2pad(SS_DEBUG_PIN);
4646#endif
4747
48- inline void _software_serial_isr (void * arg)
48+ inline void _software_serial_isr (void * arg)
4949{
50- SoftwareSerial* handle = (SoftwareSerial*)arg;
50+ SoftwareSerial * handle = (SoftwareSerial *)arg;
5151 handle->rxBit ();
5252}
5353
@@ -74,6 +74,34 @@ void SoftwareSerial::begin(uint32_t baudRate)
7474 begin (baudRate, SERIAL_8N1);
7575}
7676
77+ void SoftwareSerial::listen ()
78+ {
79+ if (ap3_active_softwareserial_handle != NULL )
80+ ap3_active_softwareserial_handle->stopListening (); // temp
81+
82+ // change handle to point to new PCI
83+ ap3_active_softwareserial_handle = this ;
84+
85+ lastBitTime = 0 ; // Reset for next byte
86+
87+ attachInterruptArg (digitalPinToInterrupt (_rxPin), _software_serial_isr, (void *)this , CHANGE);
88+ }
89+
90+ void SoftwareSerial::stopListening ()
91+ {
92+ // Disable the timer interrupt in the NVIC.
93+ NVIC_DisableIRQ (STIMER_CMPR7_IRQn);
94+
95+ detachInterrupt (_rxPin);
96+
97+ ap3_active_softwareserial_handle == NULL ;
98+ }
99+
100+ bool SoftwareSerial::isListening ()
101+ {
102+ return (this == ap3_active_softwareserial_handle);
103+ }
104+
77105void SoftwareSerial::begin (uint32_t baudRate, HardwareSerial_Config_e SSconfig)
78106{
79107 pinMode (_txPin, OUTPUT);
@@ -83,6 +111,10 @@ void SoftwareSerial::begin(uint32_t baudRate, HardwareSerial_Config_e SSconfig)
83111 if (_invertLogic == false )
84112 pinMode (_rxPin, INPUT_PULLUP); // Enable external pullup if using normal logic
85113
114+ #ifdef DEBUG
115+ pinMode (SS_DEBUG_PIN, OUTPUT);
116+ #endif
117+
86118 // Enable C/T H=7
87119 am_hal_stimer_int_enable (AM_HAL_STIMER_INT_COMPAREH);
88120
@@ -107,14 +139,12 @@ void SoftwareSerial::begin(uint32_t baudRate, HardwareSerial_Config_e SSconfig)
107139 // Clear compare interrupt
108140 am_hal_stimer_int_clear (AM_HAL_STIMER_INT_COMPAREH);
109141
110- // Attach argument interrupt with 'this' as argument
111- attachInterruptArg (digitalPinToInterrupt (_rxPin), _software_serial_isr, (void *)this , CHANGE);
112-
113- // temporary:
114- ap3_serial_handle = this ; // right now this is needed for the cmpr7 isr.
142+ // Begin PCI
143+ listen ();
115144}
116145
117- void SoftwareSerial::end (void ){
146+ void SoftwareSerial::end (void )
147+ {
118148 detachInterrupt (_rxPin);
119149 // todo: anything else?
120150}
@@ -126,7 +156,8 @@ int SoftwareSerial::available()
126156
127157int SoftwareSerial::read ()
128158{
129- if (available () == 0 ) return (-1 );
159+ if (available () == 0 )
160+ return (-1 );
130161
131162 rxBufferTail++;
132163 rxBufferTail %= AP3_SS_BUFFER_SIZE;
@@ -135,7 +166,8 @@ int SoftwareSerial::read()
135166
136167int SoftwareSerial::peek ()
137168{
138- if (available () == 0 ) return (-1 );
169+ if (available () == 0 )
170+ return (-1 );
139171
140172 uint8_t tempTail = rxBufferTail + 1 ;
141173 tempTail %= AP3_SS_BUFFER_SIZE;
@@ -152,7 +184,6 @@ bool SoftwareSerial::overflow()
152184 return (true );
153185 }
154186 return (false );
155-
156187}
157188
158189ap3_err_t SoftwareSerial::softwareserialSetConfig (HardwareSerial_Config_e SSconfig)
@@ -445,7 +476,7 @@ extern "C" void am_stimer_cmpr7_isr(void)
445476 {
446477 am_hal_stimer_int_clear (AM_HAL_STIMER_INT_COMPAREH);
447478
448- ap3_serial_handle ->endOfByte ();
479+ ap3_active_softwareserial_handle ->endOfByte ();
449480 }
450481
451482#ifdef DEBUG
0 commit comments