@@ -95,6 +95,12 @@ impl Timer {
9595 to_rclrs_result ( unsafe { rcl_timer_reset ( & mut * rcl_timer) } )
9696 }
9797
98+ pub fn call ( & mut self ) -> Result < ( ) , RclrsError >
99+ {
100+ let mut rcl_timer = self . rcl_timer . lock ( ) . unwrap ( ) ;
101+ to_rclrs_result ( unsafe { rcl_timer_call ( & mut * rcl_timer) } )
102+ }
103+
98104 // handle() -> RCLC Timer Type
99105
100106 // clock() -> Clock ?
@@ -222,7 +228,7 @@ mod tests {
222228
223229 #[ test]
224230 fn test_reset ( ) {
225- let tolerance = 1e4 as i64 ;
231+ let tolerance = 20e4 as i64 ;
226232 let clock = Clock :: steady ( ) ;
227233 let context = Context :: new ( vec ! [ ] ) . unwrap ( ) ;
228234 let period_ns: i64 = 2e6 as i64 ; // 2 milliseconds.
@@ -235,4 +241,24 @@ mod tests {
235241 assert ! ( elapsed < tolerance , "elapsed after reset: {}" , elapsed) ;
236242 }
237243
244+ #[ test]
245+ fn test_call ( ) {
246+ let tolerance = 20e4 as i64 ;
247+ let clock = Clock :: steady ( ) ;
248+ let context = Context :: new ( vec ! [ ] ) . unwrap ( ) ;
249+ let period_ns: i64 = 1e6 as i64 ; // 1 millisecond.
250+ let mut dut = Timer :: new ( & clock, & context, period_ns) . unwrap ( ) ;
251+ let elapsed = period_ns - dut. time_until_next_call ( ) . unwrap ( ) ;
252+ assert ! ( elapsed < tolerance , "elapsed before reset: {}" , elapsed) ;
253+
254+ thread:: sleep ( time:: Duration :: from_micros ( 1500 ) ) ;
255+
256+ let elapsed = period_ns - dut. time_until_next_call ( ) . unwrap ( ) ;
257+ assert ! ( elapsed > 1500000i64 , "time_until_next_call before call: {}" , elapsed) ;
258+
259+ assert ! ( dut. call( ) . is_ok( ) ) ;
260+
261+ let elapsed = dut. time_until_next_call ( ) . unwrap ( ) ;
262+ assert ! ( elapsed < 500000i64 , "time_until_next_call after call: {}" , elapsed) ;
263+ }
238264}
0 commit comments