Current section
Files
Jump to
Current section
Files
lib/bb/ufactory/message/arm_status.ex
# SPDX-FileCopyrightText: 2026 Holden Oullette
#
# SPDX-License-Identifier: Apache-2.0
defmodule BB.Ufactory.Message.ArmStatus do
@moduledoc """
Arm state and mode snapshot from the xArm real-time report.
Published by `BB.Ufactory.Controller` to `[:sensor, controller_name, :arm_status]`
whenever the arm's `state`, `mode`, `error_code`, or `warn_code` changes between
consecutive report frames.
## Fields
- `state` — arm motion state integer (per the xArm Python SDK `get_state`):
- `1` — in motion
- `2` — sleeping (ready, no motion)
- `3` — suspended (paused)
- `4` — stopping
- Other values are firmware-internal transitional states and are passed
through unchanged.
- `mode` — control mode integer (per the SDK `set_mode`):
- `0` — position control (normal operation)
- `1` — servo motion (real-time servo mode)
- `2` — joint teaching (manual drag)
- `3` — Cartesian teaching (manual drag in Cartesian space)
- `4` — joint velocity control
- `5` — Cartesian velocity control
- `6` — joint online trajectory planning
- `7` — Cartesian online trajectory planning
- `error_code` — hardware/controller error code (`0` = no error). See
`BB.Error.Protocol.Ufactory.HardwareFault` for the full code table.
- `warn_code` — controller warning code (`0` = no warning).
State is taken from the lower nibble of byte 4 of the real-time report frame;
mode from the upper nibble.
"""
defstruct [:state, :mode, :error_code, :warn_code]
use BB.Message,
schema: [
state: [type: :non_neg_integer, required: true, doc: "Arm motion state (see moduledoc)"],
mode: [type: :non_neg_integer, required: true, doc: "Control mode (see moduledoc)"],
error_code: [type: :non_neg_integer, required: true, doc: "Hardware error code (0 = none)"],
warn_code: [
type: :non_neg_integer,
required: true,
doc: "Controller warning code (0 = none)"
]
]
@type t :: %__MODULE__{
state: non_neg_integer(),
mode: non_neg_integer(),
error_code: non_neg_integer(),
warn_code: non_neg_integer()
}
end