@@ -77,8 +77,6 @@ use tokio_core::reactor::{Handle, PollEvented};
77
77
mod error;
78
78
pub use error:: Error ;
79
79
80
- const GPIO_PATH_PREFIX : & ' static str = "/sys/class/gpio/gpio" ;
81
-
82
80
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
83
81
pub struct Pin {
84
82
pin_num : u64 ,
@@ -177,21 +175,17 @@ impl Pin {
177
175
a directory"
178
176
. to_owned ( ) ) ) ;
179
177
}
180
- let num = Pin :: extract_pin_from_path ( & pb. to_str ( ) . unwrap_or ( "" ) ) ?;
178
+ let num = Pin :: extract_pin_from_path ( & pb) ?;
181
179
Ok ( Pin :: new ( num) )
182
180
}
183
181
184
182
/// Extract pin number from paths like /sys/class/gpio/gpioXXX
185
- fn extract_pin_from_path ( path : & str ) -> Result < u64 > {
186
- if path. starts_with ( GPIO_PATH_PREFIX ) {
187
- path. split_at ( GPIO_PATH_PREFIX . len ( ) ) . 1 . parse :: < u64 > ( ) . or (
188
- Err (
189
- Error :: InvalidPath ( format ! ( "{:?}" , path) ) ,
190
- ) ,
191
- )
192
- } else {
193
- Err ( Error :: InvalidPath ( format ! ( "{:?}" , path) ) )
194
- }
183
+ fn extract_pin_from_path < P : AsRef < Path > > ( path : P ) -> Result < u64 > {
184
+ path. as_ref ( )
185
+ . file_name ( )
186
+ . and_then ( |filename| filename. to_str ( ) )
187
+ . and_then ( |filename_str| filename_str. trim_left_matches ( "gpio" ) . parse :: < u64 > ( ) . ok ( ) )
188
+ . ok_or ( Error :: InvalidPath ( format ! ( "{:?}" , path. as_ref( ) ) ) )
195
189
}
196
190
197
191
/// Get the pin number
@@ -483,14 +477,16 @@ impl Pin {
483
477
484
478
#[ test]
485
479
fn extract_pin_fom_path_test ( ) {
486
- let tok = Pin :: extract_pin_from_path ( & "/sys/class/gpio/gpio951" ) ;
487
- assert_eq ! ( 951 , tok. unwrap( ) ) ;
488
- let err1 = Pin :: extract_pin_from_path ( & "/sys/is/error/gpio/gpio111" ) ;
480
+ let tok1 = Pin :: extract_pin_from_path ( & "/sys/class/gpio/gpio951" ) ;
481
+ assert_eq ! ( 951 , tok1. unwrap( ) ) ;
482
+ let tok2 = Pin :: extract_pin_from_path ( & "/sys/CLASS/gpio/gpio951/" ) ;
483
+ assert_eq ! ( 951 , tok2. unwrap( ) ) ;
484
+ let tok3 = Pin :: extract_pin_from_path ( & "../../devices/soc0/gpiochip3/gpio/gpio124" ) ;
485
+ assert_eq ! ( 124 , tok3. unwrap( ) ) ;
486
+ let err1 = Pin :: extract_pin_from_path ( & "/sys/CLASS/gpio/gpio" ) ;
489
487
assert_eq ! ( true , err1. is_err( ) ) ;
490
- let err2 = Pin :: extract_pin_from_path ( & "/sys/CLASS /gpio/gpio " ) ;
488
+ let err2 = Pin :: extract_pin_from_path ( & "/sys/class /gpio/gpioSDS " ) ;
491
489
assert_eq ! ( true , err2. is_err( ) ) ;
492
- let err3 = Pin :: extract_pin_from_path ( & "/sys/class/gpio/gpioSDS" ) ;
493
- assert_eq ! ( true , err3. is_err( ) ) ;
494
490
}
495
491
496
492
#[ derive( Debug ) ]
0 commit comments