Wrapper GenServer for actuator callback modules.
This module manages the lifecycle of user-defined actuator modules, handling:
- Parameter reference resolution at startup
- Subscription to parameter changes
- Subscription to the actuator's own command topic
- Delegation of GenServer callbacks to user module
- Automatic safety registration
User modules implement the BB.Actuator behaviour and define callbacks.
This server wraps them, providing the actual GenServer implementation.
The inbound command pipeline
Commands reach an actuator by three transports - published to
[:actuator | path], cast via BB.Process.cast/3, or called via
BB.Process.call/4. All three converge here and pass through the same
checks before the driver sees them:
- The robot must be armed.
BB.Message.Actuator.Command.Stopis exempt, since stopping is the fail-safe direction and a supervisor must be able to stop a joint it didn't arm. - The payload is translated from joint-space into motor-space using the joint's transmission.
The driver then receives it in BB.Actuator.handle_command/2, and its
reply is routed back to whichever transport delivered the command. Messages
from topics the driver subscribed to itself are not part of this pipeline -
they reach BB.Actuator.handle_info/2 untouched.
Summary
Functions
Returns a specification to start this module under a supervisor.
Types
@type t() :: %BB.Actuator.Server{ actuator_name: atom() | nil, bb: %{robot: module(), path: [atom()]}, callback_module: module(), command_topic: [atom()], joint: map() | nil, joint_name: atom() | nil, param_subscriptions: %{required([atom()]) => atom()}, raw_opts: keyword(), resolved_opts: keyword(), transmission: BB.Transmission.t() | nil, transmission_subscriptions: %{required(atom()) => [atom()]}, user_state: term() }
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.