Generates convenience functions for commands on the robot module and resolves arm/disarm command routing.
For each command defined in the DSL, this transformer generates a function
on the robot module that calls BB.Robot.Runtime.execute/3.
It also:
- Sets
arm: trueimplicitly on commands whose handler isBB.Command.Arm, anddisarm: trueimplicitly on commands usingBB.Command.Disarm. This preserves the historical behaviour ofBB.Safety.arm/1/BB.Safety.disarm/2for robots that use the built-in command modules: those calls now dispatch via the runtime instead of flipping safety state directly, while still producing the same observable outcome. - Validates that at most one command in the DSL is
arm-flagged and at most one isdisarm-flagged, that no single command sets both, and that theallowed_statesof flagged commands are compatible with the state(s) the command is supposed to transition out of. - Injects
__bb_arm_command__/0and__bb_disarm_command__/0lookup functions on the robot module, returning the name (atom) of the flagged command ornil.BB.Safetyuses these to decide whether to route through the command pipeline or fall through to the safety controller's direct state-flip behaviour.
Example
Given a command definition:
commands do
command :navigate_to_pose do
handler NavigateToPoseHandler
argument :target_pose, BB.Pose, required: true
argument :tolerance, :float, default: 0.1
end
endThis transformer generates:
@spec navigate_to_pose(keyword()) :: {:ok, pid()} | {:error, term()}
def navigate_to_pose(goal \\ []) do
BB.Robot.Runtime.execute(__MODULE__, :navigate_to_pose, Map.new(goal))
endThe caller can then await the command to get the result:
{:ok, cmd} = MyRobot.navigate_to_pose(target_pose: pose)
{:ok, result} = BB.Command.await(cmd)
Summary
Functions
Callback implementation for Spark.Dsl.Transformer.after_compile?/0.
Functions
Callback implementation for Spark.Dsl.Transformer.after_compile?/0.