@@ -91,6 +91,33 @@ size_t uart_resize_rx_buffer(uart_t* uart, size_t new_size)
91
91
return uart -> rx_buffer -> size ;
92
92
}
93
93
94
+ inline size_t uart_rx_buffer_available (uart_t * uart ) {
95
+ if (uart -> rx_buffer -> wpos < uart -> rx_buffer -> rpos ) {
96
+ return (uart -> rx_buffer -> wpos + uart -> rx_buffer -> size ) - uart -> rx_buffer -> rpos ;
97
+ }
98
+ return uart -> rx_buffer -> wpos - uart -> rx_buffer -> rpos ;
99
+ }
100
+
101
+ inline size_t uart_rx_fifo_available (uart_t * uart ) {
102
+ return (USS (uart -> uart_nr ) >> USRXC ) & 0x7F ;
103
+ }
104
+
105
+ // Copy all the rx fifo bytes that fit into the rx buffer
106
+ inline void uart_rx_copy_fifo_to_buffer (uart_t * uart ) {
107
+ while (uart_rx_fifo_available (uart )){
108
+ size_t nextPos = (uart -> rx_buffer -> wpos + 1 ) % uart -> rx_buffer -> size ;
109
+ if (nextPos != uart -> rx_buffer -> rpos ) {
110
+ uint8_t data = USF (uart -> uart_nr );
111
+ uart -> rx_buffer -> buffer [uart -> rx_buffer -> wpos ] = data ;
112
+ uart -> rx_buffer -> wpos = nextPos ;
113
+ }
114
+ else {
115
+ // Stop copying if rx buffer is full
116
+ break ;
117
+ }
118
+ }
119
+ }
120
+
94
121
int uart_peek_char (uart_t * uart )
95
122
{
96
123
if (uart == NULL || !uart -> rx_enabled ) {
@@ -99,6 +126,11 @@ int uart_peek_char(uart_t* uart)
99
126
if (!uart_rx_available (uart )) {
100
127
return -1 ;
101
128
}
129
+ if (uart_rx_buffer_available (uart ) == 0 ) {
130
+ ETS_UART_INTR_DISABLE ();
131
+ uart_rx_copy_fifo_to_buffer (uart );
132
+ ETS_UART_INTR_ENABLE ();
133
+ }
102
134
return uart -> rx_buffer -> buffer [uart -> rx_buffer -> rpos ];
103
135
}
104
136
@@ -119,20 +151,7 @@ size_t uart_rx_available(uart_t* uart)
119
151
if (uart == NULL || !uart -> rx_enabled ) {
120
152
return 0 ;
121
153
}
122
- ETS_UART_INTR_DISABLE ();
123
- while ((USS (uart -> uart_nr ) >> USRXC ) & 0x7F ){
124
- uint8_t data = USF (uart -> uart_nr );
125
- size_t nextPos = (uart -> rx_buffer -> wpos + 1 ) % uart -> rx_buffer -> size ;
126
- if (nextPos != uart -> rx_buffer -> rpos ) {
127
- uart -> rx_buffer -> buffer [uart -> rx_buffer -> wpos ] = data ;
128
- uart -> rx_buffer -> wpos = nextPos ;
129
- }
130
- }
131
- ETS_UART_INTR_ENABLE ();
132
- if (uart -> rx_buffer -> wpos < uart -> rx_buffer -> rpos ) {
133
- return (uart -> rx_buffer -> wpos + uart -> rx_buffer -> size ) - uart -> rx_buffer -> rpos ;
134
- }
135
- return uart -> rx_buffer -> wpos - uart -> rx_buffer -> rpos ;
154
+ return uart_rx_buffer_available (uart ) + uart_rx_fifo_available (uart );
136
155
}
137
156
138
157
@@ -145,14 +164,7 @@ void ICACHE_RAM_ATTR uart_isr(void * arg)
145
164
return ;
146
165
}
147
166
if (USIS (uart -> uart_nr ) & ((1 << UIFF ) | (1 << UITO ))){
148
- while ((USS (uart -> uart_nr ) >> USRXC ) & 0x7F ){
149
- uint8_t data = USF (uart -> uart_nr );
150
- size_t nextPos = (uart -> rx_buffer -> wpos + 1 ) % uart -> rx_buffer -> size ;
151
- if (nextPos != uart -> rx_buffer -> rpos ) {
152
- uart -> rx_buffer -> buffer [uart -> rx_buffer -> wpos ] = data ;
153
- uart -> rx_buffer -> wpos = nextPos ;
154
- }
155
- }
167
+ uart_rx_copy_fifo_to_buffer (uart );
156
168
}
157
169
USIC (uart -> uart_nr ) = USIS (uart -> uart_nr );
158
170
}
0 commit comments