> ## Documentation Index
> Fetch the complete documentation index at: https://motorbridge.seeedstudio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CLI Guide (`motor_cli`)

## Channel Compatibility (PCAN + slcan + Damiao Serial Bridge)

* Linux SocketCAN uses interface names directly: `can0`, `can1`, `slcan0`.
* For USB-serial CAN adapters, bring up `slcan0` first: `sudo slcand -o -c -s8 /dev/ttyUSB0 slcan0 && sudo ip link set slcan0 up`.
* Damiao-only CAN-FD transport is available in CLI (`--transport socketcanfd`), independent from classic `socketcan`.
* Damiao-only serial bridge transport is also available in CLI (`--transport dm-serial --serial-port /dev/ttyACM0 --serial-baud 921600`).
* On Linux SocketCAN, do not append bitrate in `--channel` (for example `can0@1000000` is invalid).
* On Windows (PCAN backend), `can0/can1` map to `PCAN_USBBUS1/2`; optional `@bitrate` suffix is supported.

Transport legend:

* `[STD-CAN]` => `--transport auto|socketcan`
* `[CAN-FD]` => `--transport socketcanfd`
* `[DM-SERIAL]` => `--transport dm-serial`

`[CAN-FD]` note: integrated transport path, but motor validation matrix is not declared yet.

## Debugging Guide

* For deterministic Linux `slcan` + Windows `pcan` troubleshooting, see [can\_debugging.md](/source/project/can-debugging).

## Build

```bash theme={null}
cargo build -p motor_cli --release
```

## Common

* `--vendor damiao|robstride|hightorque|myactuator|hexfellow|all`
* `--transport auto|socketcan|socketcanfd|dm-serial` (`dm-serial` is Damiao-only; `socketcanfd` required for Hexfellow)
* `--channel can0`
* `--serial-port /dev/ttyACM0 --serial-baud 921600` (used with `--transport dm-serial`)
* `--motor-id <id>`
* `--loop <n> --dt-ms <ms>`

## Damiao

```bash theme={null}
cargo run -p motor_cli --release -- \
  --vendor damiao --channel can0 --model 4340P --motor-id 0x01 --feedback-id 0x11 \
  --mode mit --pos 0 --vel 0 --kp 20 --kd 1 --tau 0 --loop 50 --dt-ms 20
```

`[STD-CAN]`

```bash theme={null}
# Damiao over serial bridge
cargo run -p motor_cli --release -- \
  --vendor damiao --transport dm-serial --serial-port /dev/ttyACM1 --serial-baud 921600 \
  --model 4310 --motor-id 0x04 --feedback-id 0x14 \
  --mode mit --verify-model 0 --ensure-mode 0 \
  --pos 0.5 --vel 0 --kp 20 --kd 1 --tau 0 --loop 80 --dt-ms 20
```

`[DM-SERIAL]`

```bash theme={null}
# Damiao over dedicated CAN-FD transport
cargo run -p motor_cli --release -- \
  --vendor damiao --transport socketcanfd --channel can0 \
  --model 4310 --motor-id 0x04 --feedback-id 0x14 \
  --mode mit --verify-model 0 --ensure-mode 0 \
  --pos 0.5 --vel 0 --kp 20 --kd 1 --tau 0 --loop 80 --dt-ms 20
```

`[CAN-FD]`

## Hexfellow

```bash theme={null}
# Hexfellow scan (CAN-FD path)
cargo run -p motor_cli --release -- \
  --vendor hexfellow --transport socketcanfd --channel can0 \
  --mode scan --start-id 1 --end-id 32
```

`[CAN-FD]`

```bash theme={null}
# Hexfellow status query
cargo run -p motor_cli --release -- \
  --vendor hexfellow --transport socketcanfd --channel can0 \
  --model hexfellow --motor-id 1 --feedback-id 0 \
  --mode status
```

`[CAN-FD]`

## RobStride

RobStride supports `rs-00` through `rs-06`. Always pass the physical motor model: control commands share the same CLI shape, but `read-param` / `write-param` use section 4 runtime manual parameter tables.

```bash theme={null}
cargo run -p motor_cli --release -- \
  --vendor robstride --channel can0 --model rs-06 --motor-id 127 --mode ping
```

```bash theme={null}
cargo run -p motor_cli --release -- \
  --vendor robstride --channel can0 --model rs-06 --motor-id 127 \
  --mode mit --ensure-strict 1 --pos 0.5 --vel 0 --kp 20.0 --kd 0.5 --tau 0 --loop 100 --dt-ms 20
```

```bash theme={null}
cargo run -p motor_cli --release -- \
  --vendor robstride --channel can0 --model rs-06 --motor-id 127 \
  --mode pos-vel --pos 1.5 --vlim 1.0 --loc-kp 5.0 --loop 1 --dt-ms 20
```

## HighTorque (native `ht_can` v1.5.5)

Supported modes:

* `scan`
* `read` / `ping`
* `mit` (unified interface)
* `pos` / `vel` / `tqe`
* `pos-vel-tqe`
* `volt` / `cur`
* `stop` / `brake` / `rezero` / `conf-write` / `timed-read`

Unit interface (aligned with other vendors):

* `--pos` in `rad`
* `--vel` in `rad/s`
* `--tau` in `Nm`
* `--kp`, `--kd` are accepted for unified MIT signature, ignored by `ht_can` protocol

Raw interface (debug):

* `--raw-pos`, `--raw-vel`, `--raw-tqe`

Examples:

```bash theme={null}
# Scan IDs
cargo run -p motor_cli --release -- \
  --vendor hightorque --channel can0 --mode scan --start-id 1 --end-id 32
```

```bash theme={null}
# Read status (prints pos_rad / vel_rad_s)
cargo run -p motor_cli --release -- \
  --vendor hightorque --channel can0 --motor-id 1 --mode read
```

```bash theme={null}
# Move to +180 deg (pi rad), with velocity/torque limits
cargo run -p motor_cli --release -- \
  --vendor hightorque --channel can0 --motor-id 1 \
  --mode mit --pos 3.1415926 --vel 0.8 --tau 0.8
```

```bash theme={null}
# Stop
cargo run -p motor_cli --release -- \
  --vendor hightorque --channel can0 --motor-id 1 --mode stop
```

## MyActuator

```bash theme={null}
cargo run -p motor_cli --release -- \
  --vendor myactuator --channel can0 --model X8 --motor-id 1 --feedback-id 0x241 \
  --mode status --loop 20 --dt-ms 50
```

```bash theme={null}
# Set current position as zero (power-cycle actuator to apply persistently)
cargo run -p motor_cli --release -- \
  --vendor myactuator --channel can0 --model X8 --motor-id 1 --feedback-id 0x241 \
  --mode set-zero --loop 1
```

## Unified scan

```bash theme={null}
cargo run -p motor_cli --release -- \
  --vendor all --channel can0 --mode scan --start-id 1 --end-id 255
```

RobStride focused scan:

```bash theme={null}
cargo run -p motor_cli --release -- \
  scan --vendor robstride --channel can0 --start-id 1 --end-id 127 \
  --feedback-ids 0xFD,0xFF,0xFE,0x00,0xAA
```

For RobStride, `probe` / `device_id` is the motor ID. `feedback_id` / `host_id` (for example `0xFD`) is the host-side ID, not the motor ID.
RobStride `motor_id` / `device_id` values are validated as `1..255`; `feedback_id` / `host_id` values are validated as `0..255`.
Use the exact RS00-RS06 model for RobStride limits/logging. Parameter read/write uses the common section 4 runtime table.
