33
33
34
34
#define CDC_LINESTATE_READY (CDC_LINESTATE_RTS | CDC_LINESTATE_DTR)
35
35
36
- struct ring_buffer {
37
- uint8_t buffer[CDC_SERIAL_BUFFER_SIZE];
38
- volatile uint32_t head;
39
- volatile uint32_t tail;
40
- volatile bool full;
41
- };
42
- ring_buffer cdc_rx_buffer = {{0 }, 0 , 0 , false };
43
-
44
36
typedef struct {
45
37
uint32_t dwDTERate;
46
38
uint8_t bCharFormat;
@@ -146,7 +138,6 @@ bool CDC_Setup(USBSetup& setup)
146
138
return false ;
147
139
}
148
140
149
- uint32_t _serialPeek = -1 ;
150
141
void Serial_::begin (uint32_t /* baud_count */ )
151
142
{
152
143
// uart config is ignored in USB-CDC
@@ -161,31 +152,9 @@ void Serial_::end(void)
161
152
{
162
153
}
163
154
164
- void Serial_::accept (uint8_t *data, uint32_t size)
165
- {
166
- ring_buffer *ringBuffer = &cdc_rx_buffer;
167
- uint32_t i = ringBuffer->head ;
168
- while (size--) {
169
- ringBuffer->buffer [i++] = *data;
170
- data++;
171
- i %= CDC_SERIAL_BUFFER_SIZE;
172
- }
173
- ringBuffer->head = i;
174
- if (i == ringBuffer->tail ) ringBuffer->full = true ;
175
- if (availableForStore () < EPX_SIZE) {
176
- stalled = true ;
177
- } else {
178
- usb.epOut (CDC_ENDPOINT_OUT);
179
- }
180
- }
181
-
182
155
int Serial_::available (void )
183
156
{
184
- ring_buffer *buffer = &cdc_rx_buffer;
185
- if (buffer->full ) {
186
- return CDC_SERIAL_BUFFER_SIZE;
187
- }
188
- return (uint32_t )(CDC_SERIAL_BUFFER_SIZE + buffer->head - buffer->tail ) % CDC_SERIAL_BUFFER_SIZE;
157
+ return usb.available (CDC_ENDPOINT_OUT);
189
158
}
190
159
191
160
int Serial_::availableForWrite (void )
@@ -195,43 +164,24 @@ int Serial_::availableForWrite(void)
195
164
return (EPX_SIZE - 1 );
196
165
}
197
166
167
+ int _serialPeek = -1 ;
168
+
198
169
int Serial_::peek (void )
199
170
{
200
- ring_buffer *buffer = &cdc_rx_buffer;
201
- if (buffer->head == buffer->tail && !buffer->full ) {
202
- return -1 ;
203
- } else {
204
- return buffer->buffer [buffer->tail ];
205
- }
171
+ if (_serialPeek != -1 )
172
+ return _serialPeek;
173
+ _serialPeek = read ();
174
+ return _serialPeek;
206
175
}
207
176
208
-
209
- // if the ringBuffer is empty: try to fill it
210
- // if it's still empty: return -1
211
- // else return the last char
212
- // so the buffer is filled only when needed
213
177
int Serial_::read (void )
214
178
{
215
- ring_buffer *buffer = &cdc_rx_buffer;
216
-
217
- uint8_t enableInterrupts = ((__get_PRIMASK () & 0x1 ) == 0 );
218
- __disable_irq ();
219
-
220
- // if we have enough space enable OUT endpoint to receive more data
221
- if (stalled && availableForStore () >= EPX_SIZE)
222
- {
223
- stalled = false ;
224
- usb.epOut (CDC_ENDPOINT_OUT);
179
+ if (_serialPeek != -1 ) {
180
+ int res = _serialPeek;
181
+ _serialPeek = -1 ;
182
+ return res;
225
183
}
226
- int c = -1 ;
227
- if (buffer->head != buffer->tail || buffer->full )
228
- {
229
- c = buffer->buffer [buffer->tail ];
230
- buffer->tail = (uint32_t )(buffer->tail + 1 ) % CDC_SERIAL_BUFFER_SIZE;
231
- buffer->full = false ;
232
- }
233
- if (enableInterrupts) __enable_irq ();
234
- return c;
184
+ return usb.recv (CDC_ENDPOINT_OUT);
235
185
}
236
186
237
187
void Serial_::flush (void )
@@ -337,17 +287,6 @@ bool Serial_::rts() {
337
287
return _usbLineInfo.lineState & 0x2 ;
338
288
}
339
289
340
- int Serial_::availableForStore (void ) {
341
- ring_buffer *buffer = &cdc_rx_buffer;
342
-
343
- if (buffer->full )
344
- return 0 ;
345
- else if (buffer->head >= buffer->tail )
346
- return CDC_SERIAL_BUFFER_SIZE - 1 - buffer->head + buffer->tail ;
347
- else
348
- return buffer->tail - buffer->head - 1 ;
349
- }
350
-
351
290
Serial_ SerialUSB (USBDevice);
352
291
353
292
#endif
0 commit comments