@@ -49,7 +49,6 @@ extern crate futures;
49
49
#[ cfg( feature = "mio-evented" ) ]
50
50
extern crate mio;
51
51
extern crate nix;
52
- extern crate regex;
53
52
#[ cfg( feature = "tokio" ) ]
54
53
extern crate tokio_core;
55
54
@@ -78,6 +77,8 @@ use tokio_core::reactor::{Handle, PollEvented};
78
77
mod error;
79
78
pub use error:: Error ;
80
79
80
+ const GPIO_PATH_PREFIX : & ' static str = "/sys/class/gpio/gpio" ;
81
+
81
82
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
82
83
pub struct Pin {
83
84
pin_num : u64 ,
@@ -176,26 +177,23 @@ impl Pin {
176
177
a directory"
177
178
. to_owned ( ) ) ) ;
178
179
}
179
-
180
- let re = regex:: Regex :: new ( r"^/sys/.*?/gpio/gpio(\d+)$" ) . unwrap ( ) ;
181
- let caps = match re. captures ( pb. to_str ( ) . unwrap_or ( "" ) ) {
182
- Some ( cap) => cap,
183
- None => return Err ( Error :: InvalidPath ( format ! ( "{:?}" , pb) ) ) ,
184
- } ;
185
-
186
- let num: u64 = match caps. at ( 1 ) {
187
- Some ( num) => {
188
- match num. parse ( ) {
189
- Ok ( unum) => unum,
190
- Err ( _) => return Err ( Error :: InvalidPath ( format ! ( "{:?}" , pb) ) ) ,
191
- }
192
- }
193
- None => return Err ( Error :: InvalidPath ( format ! ( "{:?}" , pb) ) ) ,
194
- } ;
195
-
180
+ let num = Pin :: extract_pin_from_path ( & pb. to_str ( ) . unwrap_or ( "" ) ) ?;
196
181
Ok ( Pin :: new ( num) )
197
182
}
198
183
184
+ /// 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
+ }
195
+ }
196
+
199
197
/// Get the pin number
200
198
pub fn get_pin_num ( & self ) -> u64 {
201
199
self . pin_num
@@ -483,6 +481,18 @@ impl Pin {
483
481
}
484
482
}
485
483
484
+ #[ test]
485
+ 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" ) ;
489
+ assert_eq ! ( true , err1. is_err( ) ) ;
490
+ let err2 = Pin :: extract_pin_from_path ( & "/sys/CLASS/gpio/gpio" ) ;
491
+ 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
+ }
495
+
486
496
#[ derive( Debug ) ]
487
497
pub struct PinPoller {
488
498
pin_num : u64 ,
@@ -505,13 +515,9 @@ impl PinPoller {
505
515
let devfile: File = File :: open ( & format ! ( "/sys/class/gpio/gpio{}/value" , pin_num) ) ?;
506
516
let devfile_fd = devfile. as_raw_fd ( ) ;
507
517
let epoll_fd = epoll_create ( ) ?;
508
- let events = EPOLLPRI | EPOLLET ;
509
- let info = EpollEvent {
510
- events : events,
511
- data : 0u64 ,
512
- } ;
518
+ let mut event = EpollEvent :: new ( EpollFlags :: EPOLLPRI | EpollFlags :: EPOLLET , 0u64 ) ;
513
519
514
- match epoll_ctl ( epoll_fd, EpollOp :: EpollCtlAdd , devfile_fd, & info ) {
520
+ match epoll_ctl ( epoll_fd, EpollOp :: EpollCtlAdd , devfile_fd, & mut event ) {
515
521
Ok ( _) => {
516
522
Ok ( PinPoller {
517
523
pin_num : pin_num,
@@ -551,10 +557,7 @@ impl PinPoller {
551
557
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
552
558
pub fn poll ( & mut self , timeout_ms : isize ) -> Result < Option < u8 > > {
553
559
flush_input_from_file ( & mut self . devfile , 255 ) ?;
554
- let dummy_event = EpollEvent {
555
- events : EPOLLPRI | EPOLLET ,
556
- data : 0u64 ,
557
- } ;
560
+ let dummy_event = EpollEvent :: new ( EpollFlags :: EPOLLPRI | EpollFlags :: EPOLLET , 0u64 ) ;
558
561
let mut events: [ EpollEvent ; 1 ] = [ dummy_event] ;
559
562
let cnt = epoll_wait ( self . epoll_fd , & mut events, timeout_ms) ?;
560
563
Ok ( match cnt {
0 commit comments