@@ -114,22 +114,29 @@ void __not_in_flash_func(SerialPIO::_handleIRQ)() {
114
114
}
115
115
}
116
116
117
- if ((_writer + 1 ) % sizeof (_queue) != _reader) {
117
+ if ((_writer + 1 ) % _fifosize != _reader) {
118
118
_queue[_writer] = val & ((1 << _bits) - 1 );
119
119
asm volatile (" " ::: " memory" ); // Ensure the queue is written before the written count advances
120
- _writer = (_writer + 1 ) % sizeof (_queue) ;
120
+ _writer = (_writer + 1 ) % _fifosize ;
121
121
} else {
122
122
// TODO: Overflow
123
123
}
124
124
}
125
125
}
126
126
127
- SerialPIO::SerialPIO (pin_size_t tx, pin_size_t rx) {
127
+ SerialPIO::SerialPIO (pin_size_t tx, pin_size_t rx, size_t fifosize ) {
128
128
_tx = tx;
129
129
_rx = rx;
130
+ _fifosize = fifosize;
131
+ _queue = new uint8_t [_fifosize];
130
132
mutex_init (&_mutex);
131
133
}
132
134
135
+ SerialPIO::~SerialPIO () {
136
+ end ();
137
+ delete[] _queue;
138
+ }
139
+
133
140
void SerialPIO::begin (unsigned long baud, uint16_t config) {
134
141
_baud = baud;
135
142
switch (config & SERIAL_PARITY_MASK) {
@@ -273,7 +280,7 @@ int SerialPIO::read() {
273
280
while ((now - start) < _timeout) {
274
281
if (_writer != _reader) {
275
282
auto ret = _queue[_reader];
276
- _reader = (_reader + 1 ) % sizeof (_queue) ;
283
+ _reader = (_reader + 1 ) % _fifosize ;
277
284
return ret;
278
285
}
279
286
delay (1 );
@@ -287,7 +294,7 @@ int SerialPIO::available() {
287
294
if (!_running || !m || (_rx == NOPIN)) {
288
295
return 0 ;
289
296
}
290
- return (_writer - _reader) % sizeof (_queue) ;
297
+ return (_writer - _reader) % _fifosize ;
291
298
}
292
299
293
300
int SerialPIO::availableForWrite () {
0 commit comments