@@ -116,6 +116,9 @@ void CDC_ReceiveQueue_CommitBlock(CDC_ReceiveQueue_TypeDef *queue, uint16_t size
116
116
if (queue -> write >= queue -> length ) {
117
117
queue -> length = CDC_RECEIVE_QUEUE_BUFFER_SIZE ;
118
118
}
119
+ if (queue -> write >= CDC_RECEIVE_QUEUE_BUFFER_SIZE ) {
120
+ queue -> write = 0 ;
121
+ }
119
122
}
120
123
121
124
// Determine size, available for read
@@ -145,18 +148,70 @@ int CDC_ReceiveQueue_Peek(CDC_ReceiveQueue_TypeDef *queue) {
145
148
146
149
uint16_t CDC_ReceiveQueue_Read (CDC_ReceiveQueue_TypeDef * queue , uint8_t * buffer , uint16_t size ) {
147
150
volatile uint16_t write = queue -> write ;
151
+ volatile uint16_t length = queue -> length ;
148
152
uint16_t available ;
153
+ while (write != queue -> write || length != queue -> length ) {
154
+ write = queue -> write ;
155
+ length = queue -> length ;
156
+ }
157
+
149
158
if (write >= queue -> read ) {
150
159
available = write - queue -> read ;
151
160
} else {
152
- available = CDC_RECEIVE_QUEUE_BUFFER_SIZE - queue -> read ;
161
+ available = length - queue -> read ;
153
162
}
154
163
if (available < size ) {
155
164
size = available ;
156
165
}
166
+
157
167
memcpy (buffer , & queue -> buffer [queue -> read ], size );
158
- queue -> read = (queue -> read + size ) % CDC_RECEIVE_QUEUE_BUFFER_SIZE ;
168
+ queue -> read = queue -> read + size ;
169
+ if (queue -> read >= length ) {
170
+ queue -> read = 0 ;
171
+ }
159
172
return size ;
160
173
}
174
+
175
+ bool CDC_ReceiveQueue_ReadUntil (CDC_ReceiveQueue_TypeDef * queue , uint8_t terminator , uint8_t * buffer ,
176
+ uint16_t size , uint16_t * fetched ) {
177
+ volatile uint16_t write = queue -> write ;
178
+ volatile uint16_t length = queue -> length ;
179
+ uint16_t available ;
180
+ while (write != queue -> write || length != queue -> length ) {
181
+ write = queue -> write ;
182
+ length = queue -> length ;
183
+ }
184
+
185
+ if (write >= queue -> read ) {
186
+ available = write - queue -> read ;
187
+ } else {
188
+ available = length - queue -> read ;
189
+ }
190
+ if (available < size ) {
191
+ size = available ;
192
+ }
193
+
194
+ uint8_t * start = & queue -> buffer [queue -> read ];
195
+ for (uint16_t i = 0 ; i < size ; i ++ ) {
196
+ uint8_t ch = start [i ];
197
+ if (ch == terminator ) {
198
+ queue -> read += (uint16_t )(i + 1 );
199
+ if (queue -> read >= length ) {
200
+ queue -> read = 0 ;
201
+ }
202
+ * fetched = i ;
203
+ return true;
204
+ } else {
205
+ buffer [i ] = ch ;
206
+ }
207
+ }
208
+
209
+ * fetched = size ;
210
+ queue -> read += size ;
211
+ if (queue -> read >= length ) {
212
+ queue -> read = 0 ;
213
+ }
214
+ return false;
215
+ }
161
216
#endif /* USBD_USE_CDC */
162
217
#endif /* USBCON */
0 commit comments