@@ -116,6 +116,9 @@ void CDC_ReceiveQueue_CommitBlock(CDC_ReceiveQueue_TypeDef *queue, uint16_t size
116116 if (queue -> write >= queue -> length ) {
117117 queue -> length = CDC_RECEIVE_QUEUE_BUFFER_SIZE ;
118118 }
119+ if (queue -> write >= CDC_RECEIVE_QUEUE_BUFFER_SIZE ) {
120+ queue -> write = 0 ;
121+ }
119122}
120123
121124// Determine size, available for read
@@ -145,18 +148,70 @@ int CDC_ReceiveQueue_Peek(CDC_ReceiveQueue_TypeDef *queue) {
145148
146149uint16_t CDC_ReceiveQueue_Read (CDC_ReceiveQueue_TypeDef * queue , uint8_t * buffer , uint16_t size ) {
147150 volatile uint16_t write = queue -> write ;
151+ volatile uint16_t length = queue -> length ;
148152 uint16_t available ;
153+ while (write != queue -> write || length != queue -> length ) {
154+ write = queue -> write ;
155+ length = queue -> length ;
156+ }
157+
149158 if (write >= queue -> read ) {
150159 available = write - queue -> read ;
151160 } else {
152- available = CDC_RECEIVE_QUEUE_BUFFER_SIZE - queue -> read ;
161+ available = length - queue -> read ;
153162 }
154163 if (available < size ) {
155164 size = available ;
156165 }
166+
157167 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+ }
159172 return size ;
160173}
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+ }
161216#endif /* USBD_USE_CDC */
162217#endif /* USBCON */
0 commit comments