Skip to content

Commit 132c9db

Browse files
committed
Preliminary callback.
Signed-off-by: Agustin Alba Chicar <[email protected]>
1 parent 501439d commit 132c9db

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

rclrs/src/timer.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,48 @@
11
use crate::{
22
clock::Clock, context::Context, error::RclrsError, rcl_bindings::*, to_rclrs_result
33
};
4+
// use std::fmt::Debug;
45
use std::sync::{Arc, Mutex};
56

7+
pub type TimerCallback = Box<dyn FnMut(i64) + Send + Sync>;
68

7-
8-
pub trait TimerCallback {
9-
fn call(time_since_last_callback_ns: i64);
10-
}
11-
12-
#[derive(Debug)]
9+
// #[derive(Debug)]
1310
pub struct Timer {
1411
rcl_timer: Arc<Mutex<rcl_timer_t>>,
15-
// callback: Option<T>,
12+
callback: Option<TimerCallback>,
1613
}
1714

1815
impl Timer {
16+
1917
pub fn new(clock: &Clock, context: &Context, period: i64) -> Result<Timer, RclrsError> {
18+
Self::with_callback(clock, context, period, None)
19+
}
20+
21+
pub fn with_callback(clock: &Clock, context: &Context, period: i64, callback: Option<TimerCallback>) -> Result<Timer, RclrsError> {
2022
let mut rcl_timer;
2123
let timer_init_result = unsafe {
2224
// SAFETY: Getting a default value is always safe.
2325
rcl_timer = rcl_get_zero_initialized_timer();
2426
let allocator = rcutils_get_default_allocator();
2527
let mut rcl_clock = clock.rcl_clock.lock().unwrap();
2628
let mut rcl_context = context.handle.rcl_context.lock().unwrap();
27-
let callback: rcl_timer_callback_t = None;
29+
// Callbacks will be handled in the WaitSet.
30+
let rcl_timer_callback: rcl_timer_callback_t = None;
2831
// Function will return Err(_) only if there isn't enough memory to allocate a clock
2932
// object.
3033
rcl_timer_init(
3134
&mut rcl_timer,
3235
&mut *rcl_clock,
3336
&mut *rcl_context,
3437
period,
35-
callback,
38+
rcl_timer_callback,
3639
allocator,
3740
)
3841
};
3942
to_rclrs_result(timer_init_result).map(|_| {
4043
Timer {
4144
rcl_timer: Arc::new(Mutex::new(rcl_timer)),
42-
// callback: None
45+
callback,
4346
}
4447
})
4548
}
@@ -319,4 +322,16 @@ mod tests {
319322
assert!(is_ready.is_ok());
320323
assert!(is_ready.unwrap());
321324
}
325+
326+
#[test]
327+
fn test_callback_wip() {
328+
let clock = Clock::steady();
329+
let context = Context::new(vec![]).unwrap();
330+
let period_ns: i64 = 1e6 as i64; // 1 millisecond.
331+
let foo = Arc::new(Mutex::new(0i64));
332+
let foo_callback = foo.clone();
333+
let dut = Timer::with_callback(&clock, &context, period_ns, Some(Box::new(move |x| *foo_callback.lock().unwrap() = x ))).unwrap();
334+
dut.callback.unwrap()(123);
335+
assert_eq!(*foo.lock().unwrap(), 123);
336+
}
322337
}

0 commit comments

Comments
 (0)