@@ -18,12 +18,19 @@ pub use crate::workflow::Workflows as Ui;
1818use alloc:: string:: String ;
1919use alloc:: vec:: Vec ;
2020
21+ use futures_lite:: future:: yield_now;
22+
23+ #[ allow( async_fn_in_trait) ]
2124pub trait Sd {
22- fn sdcard_inserted ( & mut self ) -> bool ;
23- fn list_subdir ( & mut self , subdir : Option < & str > ) -> Result < Vec < String > , ( ) > ;
24- fn erase_file_in_subdir ( & mut self , filename : & str , dir : & str ) -> Result < ( ) , ( ) > ;
25- fn load_bin ( & mut self , filename : & str , dir : & str ) -> Result < zeroize:: Zeroizing < Vec < u8 > > , ( ) > ;
26- fn write_bin ( & mut self , filename : & str , dir : & str , data : & [ u8 ] ) -> Result < ( ) , ( ) > ;
25+ async fn sdcard_inserted ( & mut self ) -> bool ;
26+ async fn list_subdir ( & mut self , subdir : Option < & str > ) -> Result < Vec < String > , ( ) > ;
27+ async fn erase_file_in_subdir ( & mut self , filename : & str , dir : & str ) -> Result < ( ) , ( ) > ;
28+ async fn load_bin (
29+ & mut self ,
30+ filename : & str ,
31+ dir : & str ,
32+ ) -> Result < zeroize:: Zeroizing < Vec < u8 > > , ( ) > ;
33+ async fn write_bin ( & mut self , filename : & str , dir : & str , data : & [ u8 ] ) -> Result < ( ) , ( ) > ;
2734}
2835
2936/// Hardware abstraction layer for BitBox devices.
@@ -36,28 +43,42 @@ pub struct BitBox02Sd;
3643
3744impl Sd for BitBox02Sd {
3845 #[ inline( always) ]
39- fn sdcard_inserted ( & mut self ) -> bool {
40- bitbox02:: sd:: sdcard_inserted ( )
46+ async fn sdcard_inserted ( & mut self ) -> bool {
47+ let result = bitbox02:: sd:: sdcard_inserted ( ) ;
48+ yield_now ( ) . await ;
49+ result
4150 }
4251
4352 #[ inline( always) ]
44- fn list_subdir ( & mut self , subdir : Option < & str > ) -> Result < Vec < String > , ( ) > {
45- bitbox02:: sd:: list_subdir ( subdir)
53+ async fn list_subdir ( & mut self , subdir : Option < & str > ) -> Result < Vec < String > , ( ) > {
54+ let result = bitbox02:: sd:: list_subdir ( subdir) ;
55+ yield_now ( ) . await ;
56+ result
4657 }
4758
4859 #[ inline( always) ]
49- fn erase_file_in_subdir ( & mut self , filename : & str , dir : & str ) -> Result < ( ) , ( ) > {
50- bitbox02:: sd:: erase_file_in_subdir ( filename, dir)
60+ async fn erase_file_in_subdir ( & mut self , filename : & str , dir : & str ) -> Result < ( ) , ( ) > {
61+ let result = bitbox02:: sd:: erase_file_in_subdir ( filename, dir) ;
62+ yield_now ( ) . await ;
63+ result
5164 }
5265
5366 #[ inline( always) ]
54- fn load_bin ( & mut self , filename : & str , dir : & str ) -> Result < zeroize:: Zeroizing < Vec < u8 > > , ( ) > {
55- bitbox02:: sd:: load_bin ( filename, dir)
67+ async fn load_bin (
68+ & mut self ,
69+ filename : & str ,
70+ dir : & str ,
71+ ) -> Result < zeroize:: Zeroizing < Vec < u8 > > , ( ) > {
72+ let result = bitbox02:: sd:: load_bin ( filename, dir) ;
73+ yield_now ( ) . await ;
74+ result
5675 }
5776
5877 #[ inline( always) ]
59- fn write_bin ( & mut self , filename : & str , dir : & str , data : & [ u8 ] ) -> Result < ( ) , ( ) > {
60- bitbox02:: sd:: write_bin ( filename, dir, data)
78+ async fn write_bin ( & mut self , filename : & str , dir : & str , data : & [ u8 ] ) -> Result < ( ) , ( ) > {
79+ let result = bitbox02:: sd:: write_bin ( filename, dir, data) ;
80+ yield_now ( ) . await ;
81+ result
6182 }
6283}
6384
@@ -105,11 +126,11 @@ pub mod testing {
105126 }
106127
107128 impl super :: Sd for TestingSd {
108- fn sdcard_inserted ( & mut self ) -> bool {
129+ async fn sdcard_inserted ( & mut self ) -> bool {
109130 self . inserted . unwrap ( )
110131 }
111132
112- fn list_subdir ( & mut self , subdir : Option < & str > ) -> Result < Vec < String > , ( ) > {
133+ async fn list_subdir ( & mut self , subdir : Option < & str > ) -> Result < Vec < String > , ( ) > {
113134 match subdir {
114135 Some ( key) => Ok ( self
115136 . files
@@ -120,14 +141,14 @@ pub mod testing {
120141 }
121142 }
122143
123- fn erase_file_in_subdir ( & mut self , filename : & str , dir : & str ) -> Result < ( ) , ( ) > {
144+ async fn erase_file_in_subdir ( & mut self , filename : & str , dir : & str ) -> Result < ( ) , ( ) > {
124145 self . files
125146 . get_mut ( dir)
126147 . and_then ( |files| files. remove ( filename) . map ( |_| ( ) ) )
127148 . ok_or ( ( ) )
128149 }
129150
130- fn load_bin (
151+ async fn load_bin (
131152 & mut self ,
132153 filename : & str ,
133154 dir : & str ,
@@ -139,7 +160,7 @@ pub mod testing {
139160 . ok_or ( ( ) )
140161 }
141162
142- fn write_bin ( & mut self , filename : & str , dir : & str , data : & [ u8 ] ) -> Result < ( ) , ( ) > {
163+ async fn write_bin ( & mut self , filename : & str , dir : & str , data : & [ u8 ] ) -> Result < ( ) , ( ) > {
143164 self . files
144165 . entry ( dir. into ( ) )
145166 . or_default ( )
@@ -176,29 +197,38 @@ pub mod testing {
176197 use super :: * ;
177198 use crate :: hal:: Sd ;
178199
200+ use util:: bb02_async:: block_on;
201+
179202 // Quick check if our mock TestingSd implementation makes sense.
180203 #[ test]
181204 fn test_sd_list_write_read_erase ( ) {
182205 let mut sd = TestingSd :: new ( ) ;
183- assert_eq ! ( sd. list_subdir( None ) , Ok ( vec![ ] ) ) ;
184- assert_eq ! ( sd. list_subdir( Some ( "dir1" ) ) , Ok ( vec![ ] ) ) ;
206+ assert_eq ! ( block_on ( sd. list_subdir( None ) ) , Ok ( vec![ ] ) ) ;
207+ assert_eq ! ( block_on ( sd. list_subdir( Some ( "dir1" ) ) ) , Ok ( vec![ ] ) ) ;
185208
186- assert ! ( sd. load_bin( "file1.txt" , "dir1" ) . is_err( ) ) ;
187- assert ! ( sd. write_bin( "file1.txt" , "dir1" , b"data" ) . is_ok( ) ) ;
188- assert_eq ! ( sd. list_subdir( None ) , Ok ( vec![ "dir1" . into( ) ] ) ) ;
189- assert_eq ! ( sd. list_subdir( Some ( "dir1" ) ) , Ok ( vec![ "file1.txt" . into( ) ] ) ) ;
209+ assert ! ( block_on( sd. load_bin( "file1.txt" , "dir1" ) ) . is_err( ) ) ;
210+ assert ! ( block_on( sd. write_bin( "file1.txt" , "dir1" , b"data" ) ) . is_ok( ) ) ;
211+ assert_eq ! ( block_on( sd. list_subdir( None ) ) , Ok ( vec![ "dir1" . into( ) ] ) ) ;
212+ assert_eq ! (
213+ block_on( sd. list_subdir( Some ( "dir1" ) ) ) ,
214+ Ok ( vec![ "file1.txt" . into( ) ] )
215+ ) ;
190216 assert_eq ! (
191- sd. load_bin( "file1.txt" , "dir1" ) . unwrap( ) . as_slice( ) ,
217+ block_on( sd. load_bin( "file1.txt" , "dir1" ) )
218+ . unwrap( )
219+ . as_slice( ) ,
192220 b"data"
193221 ) ;
194- assert ! ( sd. write_bin( "file1.txt" , "dir1" , b"replaced data" ) . is_ok( ) ) ;
222+ assert ! ( block_on ( sd. write_bin( "file1.txt" , "dir1" , b"replaced data" ) ) . is_ok( ) ) ;
195223 assert_eq ! (
196- sd. load_bin( "file1.txt" , "dir1" ) . unwrap( ) . as_slice( ) ,
224+ block_on( sd. load_bin( "file1.txt" , "dir1" ) )
225+ . unwrap( )
226+ . as_slice( ) ,
197227 b"replaced data"
198228 ) ;
199- assert ! ( sd. erase_file_in_subdir( "doesnt-exist.txt" , "dir1" ) . is_err( ) ) ;
200- assert ! ( sd. erase_file_in_subdir( "file1.txt" , "dir1" ) . is_ok( ) ) ;
201- assert_eq ! ( sd. list_subdir( Some ( "dir1" ) ) , Ok ( vec![ ] ) ) ;
229+ assert ! ( block_on ( sd. erase_file_in_subdir( "doesnt-exist.txt" , "dir1" ) ) . is_err( ) ) ;
230+ assert ! ( block_on ( sd. erase_file_in_subdir( "file1.txt" , "dir1" ) ) . is_ok( ) ) ;
231+ assert_eq ! ( block_on ( sd. list_subdir( Some ( "dir1" ) ) ) , Ok ( vec![ ] ) ) ;
202232 }
203233 }
204234}
0 commit comments