@@ -65,6 +65,14 @@ bool SerialUART::setTX(pin_size_t pin) {
65
65
return false ;
66
66
}
67
67
68
+ bool SerialUART::setFIFOSize (size_t size) {
69
+ if (!size || _running) {
70
+ return false ;
71
+ }
72
+ _fifoSize = size + 1 ; // Always 1 unused entry
73
+ return true ;
74
+ }
75
+
68
76
SerialUART::SerialUART (uart_inst_t *uart, pin_size_t tx, pin_size_t rx) {
69
77
_uart = uart;
70
78
_tx = tx;
@@ -76,6 +84,7 @@ static void _uart0IRQ();
76
84
static void _uart1IRQ ();
77
85
78
86
void SerialUART::begin (unsigned long baud, uint16_t config) {
87
+ _queue = new uint8_t [_fifoSize];
79
88
_baud = baud;
80
89
uart_init (_uart, baud);
81
90
int bits, stop;
@@ -140,6 +149,7 @@ void SerialUART::end() {
140
149
irq_set_enabled (UART1_IRQ, false );
141
150
}
142
151
uart_deinit (_uart);
152
+ delete[] _queue;
143
153
_running = false ;
144
154
}
145
155
@@ -170,7 +180,7 @@ int SerialUART::read() {
170
180
while ((now - start) < _timeout) {
171
181
if (_writer != _reader) {
172
182
auto ret = _queue[_reader];
173
- _reader = (_reader + 1 ) % sizeof (_queue) ;
183
+ _reader = (_reader + 1 ) % _fifoSize ;
174
184
return ret;
175
185
}
176
186
delay (1 );
@@ -184,7 +194,7 @@ int SerialUART::available() {
184
194
if (!_running || !m) {
185
195
return 0 ;
186
196
}
187
- return (_writer - _reader) % sizeof (_queue) ;
197
+ return (_writer - _reader) % _fifoSize ;
188
198
}
189
199
190
200
int SerialUART::availableForWrite () {
@@ -250,10 +260,10 @@ void __not_in_flash_func(SerialUART::_handleIRQ)() {
250
260
uart_get_hw (_uart)->icr |= UART_UARTICR_RTIC_BITS | UART_UARTICR_RXIC_BITS;
251
261
while (uart_is_readable (_uart)) {
252
262
auto val = uart_getc (_uart);
253
- if ((_writer + 1 ) % sizeof (_queue) != _reader) {
263
+ if ((_writer + 1 ) % _fifoSize != _reader) {
254
264
_queue[_writer] = val;
255
265
asm volatile (" " ::: " memory" ); // Ensure the queue is written before the written count advances
256
- _writer = (_writer + 1 ) % sizeof (_queue) ;
266
+ _writer = (_writer + 1 ) % _fifoSize ;
257
267
} else {
258
268
// TODO: Overflow
259
269
}
0 commit comments