# SPDX-FileCopyrightText: 2026 James Harton
#
# SPDX-License-Identifier: Apache-2.0
defmodule BB.MCP.Resources.RobotJoints do
@moduledoc """
Current joint positions and velocities of a robot, in SI base units
(metres or radians for position, m/s or rad/s for velocity).
Read via `bb://robots/{robot}/joints`.
"""
use Anubis.Server.Component,
type: :resource,
uri_template: "bb://robots/{robot}/joints",
name: "robot_joints"
alias Anubis.Server.Response
alias BB.MCP.Resources
alias BB.Robot.Runtime
@impl true
def description, do: "Current joint positions and velocities (SI units)"
@impl true
def mime_type, do: "application/json"
@impl true
def read(params, frame) do
case Resources.fetch_robot(params) do
{:ok, module} ->
payload = %{
"positions" => stringify_keys(Runtime.positions(module)),
"velocities" => stringify_keys(Runtime.velocities(module))
}
{:reply, Response.json(Response.resource(), payload), frame}
{:error, error} ->
{:error, error, frame}
end
end
defp stringify_keys(map) when is_map(map),
do: Map.new(map, fn {k, v} -> {to_string(k), v} end)
end