@@ -41,6 +41,8 @@ mod test;
41
41
42
42
#[ derive( Debug ) ]
43
43
pub enum CommandError {
44
+ BufferInUse ,
45
+ BufferNotReady ,
44
46
DataVecNoData ,
45
47
DataVecTooSmall ,
46
48
IdNotImplemented ( HidIoCommandID ) ,
@@ -430,6 +432,7 @@ trait Commands<
430
432
fn rx_bytebuffer ( & mut self ) -> & mut buffer:: Buffer < RX , N > ;
431
433
fn rx_packetbuffer ( & self ) -> & HidIoPacketBuffer < H > ;
432
434
fn rx_packetbuffer_mut ( & mut self ) -> & mut HidIoPacketBuffer < H > ;
435
+ fn rx_packetbuffer_set ( & mut self , buf : HidIoPacketBuffer < H > ) ;
433
436
fn rx_packetbuffer_clear ( & mut self ) ;
434
437
fn supported_id ( & self , id : HidIoCommandID ) -> bool ;
435
438
@@ -452,18 +455,15 @@ trait Commands<
452
455
// Decode chunk
453
456
match self . rx_packetbuffer_mut ( ) . decode_packet ( & buf) {
454
457
Ok ( _recv) => {
455
- buffer_count += 1 ;
458
+ // Make sure buffer is ready
459
+ if self . rx_packetbuffer ( ) . done {
460
+ buffer_count += 1 ;
456
461
457
- // Handle packet type
458
- match self . rx_packetbuffer ( ) . ptype {
459
- HidIoPacketType :: Sync => {
462
+ // Handle sync packet type
463
+ if let HidIoPacketType :: Sync = self . rx_packetbuffer ( ) . ptype {
460
464
debug ! ( "Sync. Resetting buffer" ) ;
461
465
self . rx_packetbuffer_clear ( ) ;
462
466
}
463
- HidIoPacketType :: ACK => { }
464
- HidIoPacketType :: NAK => { }
465
- HidIoPacketType :: Continued | HidIoPacketType :: Data => { }
466
- HidIoPacketType :: NAData | HidIoPacketType :: NAContinued => { }
467
467
}
468
468
}
469
469
Err ( e) => {
@@ -485,6 +485,74 @@ trait Commands<
485
485
Ok ( buffer_count)
486
486
}
487
487
488
+ /// Generate a single HidIoPacketBuffer from the incoming byte
489
+ /// stream
490
+ /// Useful when byte and buffer processing are handled separately
491
+ /// If the buffer is not ready yet the buffer is processed
492
+ /// as much as possible and can be called again (when bytes are
493
+ /// ready).
494
+ fn process_bytes ( & mut self ) -> Result < & HidIoPacketBuffer < H > , CommandError > {
495
+ loop {
496
+ // Retrieve vec chunk
497
+ if let Some ( buf) = self . rx_bytebuffer ( ) . dequeue ( ) {
498
+ // Decode chunk
499
+ match self . rx_packetbuffer_mut ( ) . decode_packet ( & buf) {
500
+ Ok ( _recv) => {
501
+ // Only handle buffer if ready
502
+ if self . rx_packetbuffer ( ) . done {
503
+ // Handle sync packet type
504
+ match self . rx_packetbuffer ( ) . ptype {
505
+ HidIoPacketType :: Sync => {
506
+ debug ! ( "Sync. Resetting buffer" ) ;
507
+ self . rx_packetbuffer_clear ( ) ;
508
+ }
509
+ _ => {
510
+ return Ok ( self . rx_packetbuffer ( ) ) ;
511
+ }
512
+ }
513
+ }
514
+ }
515
+ Err ( e) => {
516
+ error ! ( "Decode error: {:?} {:?}" , e, buf) ;
517
+ return Err ( CommandError :: PacketDecodeError ( e) ) ;
518
+ }
519
+ }
520
+ } else {
521
+ return Err ( CommandError :: BufferNotReady ) ;
522
+ }
523
+ }
524
+ }
525
+
526
+ /// Process an already generate buffer
527
+ /// Useful in situations where buffers are passed around instead
528
+ /// of bytes buffers
529
+ fn process_buffer ( & mut self , buf : HidIoPacketBuffer < H > ) -> Result < ( ) , CommandError >
530
+ where
531
+ <Self as Commands < TX , RX , N , H , ID > >:: ID32 : ArrayLength < u8 > ,
532
+ {
533
+ // Make sure existing buffer is empty and unused
534
+ let pbuf = self . rx_packetbuffer ( ) ;
535
+ if pbuf. done || pbuf. data . len ( ) > 0 {
536
+ return Err ( CommandError :: BufferInUse ) ;
537
+ }
538
+
539
+ // Incoming buffer is not ready
540
+ if !buf. done {
541
+ return Err ( CommandError :: BufferNotReady ) ;
542
+ }
543
+
544
+ // Set buffer
545
+ self . rx_packetbuffer_set ( buf) ;
546
+
547
+ // Process buffer
548
+ self . rx_message_handling ( ) ?;
549
+
550
+ // Clear buffer
551
+ self . rx_packetbuffer_clear ( ) ;
552
+
553
+ Ok ( ( ) )
554
+ }
555
+
488
556
/// Simple empty ack
489
557
fn empty_ack ( & mut self ) -> Result < ( ) , CommandError > {
490
558
// Build empty ACK
0 commit comments