Skip to content

Commit e444b9a

Browse files
author
Nathan Seidle
committed
Adding listen functions. Working for multiple instances.
1 parent 274dde6 commit e444b9a

File tree

2 files changed

+50
-16
lines changed

2 files changed

+50
-16
lines changed

libraries/SoftwareSerial/src/SoftwareSerial.cpp

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,19 @@
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
4545
ap3_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+
77105
void 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

127157
int 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

136167
int 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

158189
ap3_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

libraries/SoftwareSerial/src/SoftwareSerial.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ class SoftwareSerial
4646
SoftwareSerial(uint8_t rxPin, uint8_t txPin, bool invertLogic = false);
4747
~SoftwareSerial();
4848

49+
void listen();
50+
void stopListening();
51+
bool isListening();
52+
4953
void begin(uint32_t baudRate);
5054
void begin(uint32_t baudRate, HardwareSerial_Config_e SSconfig);
5155
void end(void);
@@ -56,7 +60,6 @@ class SoftwareSerial
5660
int peek();
5761
bool overflow();
5862

59-
6063
void rxBit(void);
6164
void endOfByte(void);
6265

0 commit comments

Comments
 (0)