Add timer creation and callback flow descriptions
This commit is contained in:
parent
694817d845
commit
f93d40e0ce
1 changed files with 44 additions and 0 deletions
|
@ -300,4 +300,48 @@ sequenceDiagram
|
|||
|
||||
### Timer creation
|
||||
|
||||
Timer creation is similar to subscription creation. The `Component` calls `create_service()` which ends up creating a `rclcpp::WallTimer`. In its constructor, it creates a `rclcpp::Clock` object, which (for a `WallTimer`) is simply a nanosecond clock. It then allocates a `rcl_timer_t` handle, then calls `rcl_timer_init()`. This processes the handle and validates the period.
|
||||
|
||||
Note that `rcl_timer_init()` can take a callback as a parameter, but right now that feature is not used anywhere (`nullptr` is given), and callbacks are instead handled in the `rclcpp` layer.
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Component
|
||||
participant Node
|
||||
participant WallTimer
|
||||
participant rcl
|
||||
participant tracetools
|
||||
|
||||
Component->>Node: create_wall_timer(period, callback)
|
||||
Node->>WallTimer: WallTimer(period, callback, Context)
|
||||
Note over WallTimer: creates a Clock object
|
||||
Note over WallTimer: allocates a rcl_timer_t handle
|
||||
WallTimer->>rcl: rcl_timer_init(out rcl_timer_t, Clock, rcl_context_t, period)
|
||||
Note over rcl: validates and processes rcl_timer_t handle
|
||||
rcl-->>tracetools: TP(rcl_timer_init, rcl_timer_t *, period)
|
||||
WallTimer-->>tracetools: TP(rclcpp_timer_callback_added, rcl_timer_t *, &callback)
|
||||
```
|
||||
|
||||
### Timer callbacks
|
||||
|
||||
Timer callbacks are similar to susbcription callbacks. In `execute_timer()`, the `Executor` calls `execute_callback()` on the `WallTimer`. The timer then calls `rcl_timer_call()` with its `rcl_timer_t` handle and checks if the callback should be called.
|
||||
|
||||
If it that is the case, then the timer will call the actual `std::function`. Depending on the `std::function` that was given when creating the timer, it will either call the callback without any parameters or it will pass a reference of itself.
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Executor
|
||||
participant WallTimer
|
||||
participant rcl
|
||||
participant tracetools
|
||||
|
||||
Note over Executor: execute_timer()
|
||||
Executor->>WallTimer: execute_callback()
|
||||
WallTimer->>rcl: rcl_timer_call(rcl_timer_t) : ret
|
||||
Note over rcl: validates and updates timer
|
||||
opt RCL_RET_TIMER_CANCELED != ret && RCL_RET_OK == ret
|
||||
WallTimer-->>tracetools: TP(rclcpp_timer_callback_start, this)
|
||||
Note over WallTimer: std::function(...)
|
||||
WallTimer-->>tracetools: TP(rclcpp_timer_callback_end, this)
|
||||
end
|
||||
```
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue