@@ -205,13 +205,8 @@ pub trait KeyboardLayout {
205
205
}
206
206
207
207
pub trait ScancodeSet {
208
- /// Handles state logic based on the byte.
209
- /// `ConsumeState::Consume(state)` indicates that the byte is now consumed and
210
- /// there may or may not be a new state.
211
- ///
212
- /// `ConsumeState::Proceed(state)` indicates that the byte should be passed to
213
- /// the map methods, and there may or may not be a new state.
214
- fn advance_state ( state : DecodeState , code : u8 ) -> Result < ConsumeState , Error > ;
208
+ /// Handles the state logic for the decoding of scan codes into key events.
209
+ fn advance_state ( state : & mut DecodeState , code : u8 ) -> Result < Option < KeyEvent > , Error > ;
215
210
216
211
/// Convert a Scan Code set X byte to our 'KeyCode' enum
217
212
fn map_scancode ( code : u8 ) -> Result < KeyCode , Error > ;
@@ -221,21 +216,6 @@ pub trait ScancodeSet {
221
216
fn map_extended_scancode ( code : u8 ) -> Result < KeyCode , Error > ;
222
217
}
223
218
224
- pub enum ConsumeState {
225
- Consume ( DecodeState ) ,
226
- Proceed ( DecodeState ) ,
227
- }
228
-
229
- impl ConsumeState {
230
- /// Allocates a new decode state
231
- fn extract_state ( & self ) -> DecodeState {
232
- match self {
233
- & ConsumeState :: Consume ( ref st) => st. clone ( ) ,
234
- & ConsumeState :: Proceed ( ref st) => st. clone ( ) ,
235
- }
236
- }
237
- }
238
-
239
219
#[ derive( Debug ) ]
240
220
pub struct Modifiers {
241
221
pub lshift : bool ,
@@ -338,31 +318,8 @@ where
338
318
/// We assume the start, stop and parity bits have been processed and
339
319
/// verified.
340
320
pub fn add_byte ( & mut self , byte : u8 ) -> Result < Option < KeyEvent > , Error > {
341
- let st = self . decode_state ;
342
- self . clear ( ) ;
343
- let consume_state = S :: advance_state ( st, byte) ?;
344
- self . decode_state = consume_state. extract_state ( ) ;
345
- match consume_state {
346
- ConsumeState :: Consume ( _) => Ok ( None ) ,
347
- ConsumeState :: Proceed ( st) => match st {
348
- DecodeState :: Start => {
349
- let code = S :: map_scancode ( byte) ?;
350
- Ok ( Some ( KeyEvent :: new ( code, KeyState :: Down ) ) )
351
- }
352
- DecodeState :: Extended => {
353
- let code = S :: map_extended_scancode ( byte) ?;
354
- Ok ( Some ( KeyEvent :: new ( code, KeyState :: Down ) ) )
355
- }
356
- DecodeState :: Release => {
357
- let code = S :: map_scancode ( byte) ?;
358
- Ok ( Some ( KeyEvent :: new ( code, KeyState :: Up ) ) )
359
- }
360
- DecodeState :: ExtendedRelease => {
361
- let code = S :: map_extended_scancode ( byte) ?;
362
- Ok ( Some ( KeyEvent :: new ( code, KeyState :: Up ) ) )
363
- }
364
- } ,
365
- }
321
+ let r = S :: advance_state ( & mut self . decode_state , byte) ;
322
+ r
366
323
}
367
324
368
325
/// Shift a bit into the register.
@@ -374,6 +331,8 @@ where
374
331
self . num_bits += 1 ;
375
332
if self . num_bits == KEYCODE_BITS {
376
333
let word = self . register ;
334
+ self . register = 0 ;
335
+ self . num_bits = 0 ;
377
336
self . add_word ( word)
378
337
} else {
379
338
Ok ( None )
@@ -791,8 +750,8 @@ mod test {
791
750
}
792
751
codes. sort ( ) ;
793
752
println ! ( "{:?}" , codes) ;
794
- assert_eq ! ( codes. len( ) , 85 ) ;
795
- assert_eq ! ( errs. len( ) , 171 ) ;
753
+ assert_eq ! ( codes. len( ) , 86 ) ;
754
+ assert_eq ! ( errs. len( ) , 170 ) ;
796
755
}
797
756
798
757
#[ test]
@@ -811,6 +770,69 @@ mod test {
811
770
Ok ( Some ( KeyEvent :: new( KeyCode :: S , KeyState :: Down ) ) )
812
771
) ;
813
772
}
773
+
774
+ #[ test]
775
+ fn test_set_1_ext_down_up_down ( ) {
776
+ let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet1 ) ;
777
+ assert_eq ! ( k. add_byte( 0xe0 ) , Ok ( None ) ) ;
778
+ assert_eq ! (
779
+ k. add_byte( 0x1c ) ,
780
+ Ok ( Some ( KeyEvent :: new( KeyCode :: NumpadEnter , KeyState :: Down ) ) )
781
+ ) ;
782
+ assert_eq ! ( k. add_byte( 0xe0 ) , Ok ( None ) ) ;
783
+ assert_eq ! (
784
+ k. add_byte( 0x9c ) ,
785
+ Ok ( Some ( KeyEvent :: new( KeyCode :: NumpadEnter , KeyState :: Up ) ) )
786
+ ) ;
787
+ }
788
+
789
+ #[ test]
790
+ fn test_set_2_down_up ( ) {
791
+ let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 ) ;
792
+ assert_eq ! (
793
+ k. add_byte( 0x29 ) ,
794
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Down ) ) )
795
+ ) ;
796
+ assert_eq ! ( k. add_byte( 0xF0 ) , Ok ( None ) ) ;
797
+ assert_eq ! (
798
+ k. add_byte( 0x29 ) ,
799
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Up ) ) )
800
+ ) ;
801
+ assert_eq ! (
802
+ k. add_byte( 0x29 ) ,
803
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Down ) ) )
804
+ ) ;
805
+ assert_eq ! ( k. add_byte( 0xF0 ) , Ok ( None ) ) ;
806
+ assert_eq ! (
807
+ k. add_byte( 0x29 ) ,
808
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Up ) ) )
809
+ ) ;
810
+ assert_eq ! (
811
+ k. add_byte( 0x29 ) ,
812
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Down ) ) )
813
+ ) ;
814
+ assert_eq ! ( k. add_byte( 0xF0 ) , Ok ( None ) ) ;
815
+ assert_eq ! (
816
+ k. add_byte( 0x29 ) ,
817
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Up ) ) )
818
+ ) ;
819
+ }
820
+
821
+ #[ test]
822
+ fn test_set_2_ext_down_up ( ) {
823
+ let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 ) ;
824
+ assert_eq ! ( k. add_byte( 0xE0 ) , Ok ( None ) ) ;
825
+ assert_eq ! (
826
+ k. add_byte( 0x6C ) ,
827
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Home , KeyState :: Down ) ) )
828
+ ) ;
829
+ assert_eq ! ( k. add_byte( 0xE0 ) , Ok ( None ) ) ;
830
+ assert_eq ! ( k. add_byte( 0xF0 ) , Ok ( None ) ) ;
831
+ assert_eq ! (
832
+ k. add_byte( 0x6C ) ,
833
+ Ok ( Some ( KeyEvent :: new( KeyCode :: Home , KeyState :: Up ) ) )
834
+ ) ;
835
+ }
814
836
}
815
837
816
838
// ****************************************************************************
0 commit comments