33//! For use with STM Nucleo-F103RB example board (`stm_nucleo_f103rb.rs`).
44//!
55
6- use nix :: ioctl_readwrite ;
6+ use openemc_io :: { OpenEmc , OpenEmcIoctlError } ;
77use rand:: prelude:: * ;
8- use std:: {
9- fs:: File ,
10- io:: { Read , Write } ,
11- os:: fd:: AsRawFd ,
12- } ;
8+ use std:: io:: { Read , Write } ;
139
14- const OPENEMC_MAX_DATA_SIZE : usize = 32 ;
15- const OPENEMC_IOC_MAGIC : u8 = 0xEC ;
16-
17- #[ repr( C ) ]
18- struct OpenemcIoctlData {
19- len : u8 ,
20- data : [ u8 ; OPENEMC_MAX_DATA_SIZE ] ,
21- }
22-
23- ioctl_readwrite ! ( openemc_board_ioctl, OPENEMC_IOC_MAGIC , 0 , OpenemcIoctlData ) ;
24-
25- fn io_test ( openemc : & mut File ) {
10+ fn io_test ( openemc : & mut OpenEmc ) {
2611 let mut test_data = vec ! [ 0u8 ; 32 ] ;
2712 rand:: rng ( ) . fill ( test_data. as_mut_slice ( ) ) ;
2813
@@ -43,37 +28,30 @@ fn io_test(openemc: &mut File) {
4328 println ! ( "IO test done" ) ;
4429}
4530
46- fn ioctl_test ( openemc : & mut File ) {
31+ fn ioctl_test ( openemc : & mut OpenEmc ) {
4732 println ! ( "ioctl test" ) ;
4833
4934 let mut test_data = vec ! [ 0u8 ; 32 ] ;
5035 rand:: rng ( ) . fill ( test_data. as_mut_slice ( ) ) ;
5136
52- let mut ioctl_data = OpenemcIoctlData { len : 30 , data : [ 0u8 ; OPENEMC_MAX_DATA_SIZE ] } ;
53- ioctl_data. data [ ..30 ] . copy_from_slice ( & test_data[ ..30 ] ) ;
54-
55- let ret = unsafe { openemc_board_ioctl ( openemc. as_raw_fd ( ) , & mut ioctl_data) } ;
56- assert ! ( ret. is_ok( ) , "ioctl failed" ) ;
57- assert_eq ! ( ret. unwrap( ) , 25 , "ioctl return value mismatch" ) ;
58- assert_eq ! ( ioctl_data. len, 25 , "ioctl response length mismatch" ) ;
37+ let result = openemc. ioctl ( & test_data[ ..30 ] ) . unwrap ( ) ;
38+ assert_eq ! ( result. len( ) , 25 , "ioctl response length mismatch" ) ;
5939
6040 let expected: Vec < _ > = test_data. iter ( ) . map ( |v| v. wrapping_add ( 1 ) ) . collect ( ) ;
61- assert_eq ! ( & ioctl_data . data [ ..25 ] , & expected[ ..25 ] , "ioctl data mismatch" ) ;
41+ assert_eq ! ( & result [ ..25 ] , & expected[ ..25 ] , "ioctl data mismatch" ) ;
6242
63- ioctl_data. len = 32 ;
64- ioctl_data. data . copy_from_slice ( & test_data) ;
65- let ret = unsafe { openemc_board_ioctl ( openemc. as_raw_fd ( ) , & mut ioctl_data) } ;
66- assert ! ( ret. is_err( ) , "ioctl should have failed" ) ;
67- let errno = ret. unwrap_err ( ) as i32 ;
68- assert_eq ! ( errno, 10 , "wrong errno" ) ;
43+ let result = openemc. ioctl ( & test_data) ;
44+ assert ! ( result. is_err( ) , "ioctl should have failed" ) ;
45+ let err = result. unwrap_err ( ) ;
46+ let ioctl_err = err. get_ref ( ) . unwrap ( ) . downcast_ref :: < OpenEmcIoctlError > ( ) . unwrap ( ) ;
47+ assert_eq ! ( ioctl_err. 0 , 10 , "wrong errno" ) ;
6948
7049 println ! ( "ioctl test done" ) ;
7150}
7251
7352fn main ( ) {
7453 println ! ( "Opening /dev/openemc" ) ;
75- let mut openemc =
76- File :: options ( ) . read ( true ) . write ( true ) . open ( "/dev/openemc" ) . expect ( "cannot open /dev/openemc" ) ;
54+ let mut openemc = OpenEmc :: new ( ) . expect ( "cannot open /dev/openemc" ) ;
7755
7856 io_test ( & mut openemc) ;
7957 ioctl_test ( & mut openemc) ;
0 commit comments