# 开发常用命令。未安装 just 时可直接使用 README 中的 cargo 命令。

default:
    @just --list

# 格式化全部代码
fmt:
    cargo fmt --all

# 本地检查（与 CI 同标准）
lint:
    cargo fmt --all -- --check
    cargo clippy --workspace --all-targets -- -D warnings

# 运行全部单测与集成测试（Linux 专属 vcan 测试自动跳过）
test:
    cargo test --workspace

# Linux：搭建 vcan0 并运行真实内核 CAN 栈集成测试
vcan-test:
    sudo modprobe vcan
    sudo ip link add dev vcan0 type vcan || true
    sudo ip link set up vcan0
    cargo test -p dji-esc-socketcan -- --ignored --test-threads 1

# 无硬件全链路演示（macOS / Linux 均可）
run-mock:
    cargo run -p chassisd -- --mock

# 交叉检查目标板架构
check-aarch64:
    cargo check --workspace --target aarch64-unknown-linux-gnu

# 交叉编译 armv7 静态二进制（目标板：创龙 T153 / Buildroot）
build-armv7:
    rustup target add armv7-unknown-linux-musleabihf
    cargo build --release -p chassisd --target armv7-unknown-linux-musleabihf

# 推送到板子并试运行（默认 mock 模式）
deploy board="root@192.168.2.2" mode="--mock":
    just build-armv7
    ssh {{board}} "mkdir -p /tmp/chassisd"
    scp -q target/armv7-unknown-linux-musleabihf/release/chassisd {{board}}:/tmp/chassisd/chassisd
    ssh {{board}} "/tmp/chassisd/chassisd {{mode}}"

# 板端：拉起 SocketCAN 接口（1Mbps，bus-off 后 100ms 自动恢复）
# 注意：slcan 适配器（CANable 系列）走串口，不走 SocketCAN，台架用下面的 bench-* 配方。
can-up board="root@192.168.2.2" iface="can0":
    ssh {{board}} "ip link set {{iface}} down; ip link set {{iface}} up type can bitrate 1000000 restart-ms 100 && ip -br link show {{iface}}"

# 交叉编译台架工具（armv7，musl 静态，无需交叉工具链）
build-bench:
    rustup target add armv7-unknown-linux-musleabihf
    cargo build --release -p chassis-bench --bin chassis-spin --target armv7-unknown-linux-musleabihf

# 台架：四轮同时 500 rpm（转子）旋转 —— 编译 → 推送 → 板端运行
# 轮子必须架空或整车固定；ctrl-c 安全停机。
bench-spin board="root@192.168.2.2" device="/dev/ttyACM0" rpm="500" opts="":
    just build-bench
    scp -q target/armv7-unknown-linux-musleabihf/release/chassis-spin {{board}}:/tmp/chassis-spin
    ssh {{board}} "/tmp/chassis-spin --device {{device}} --rpm {{rpm}} {{opts}}"

# 台架：只验证 slcan 链路与四轮反馈（不发非零电流）
bench-check board="root@192.168.2.2" device="/dev/ttyACM0":
    just build-bench
    scp -q target/armv7-unknown-linux-musleabihf/release/chassis-spin {{board}}:/tmp/chassis-spin
    ssh {{board}} "/tmp/chassis-spin --device {{device}} --dry-run"

# 自动整定：列出超参数预设（只读；预设文件 config/tune.toml）
tune-presets preset="config/tune.toml":
    cargo run -p chassis-tune -- presets --preset {{preset}}

# 自动整定：用预设跑（超参数进版本管理；CLI 只覆盖本次要变的项）
# 例：just tune-preset bench_loaded "--samples 16"
tune-preset name="sim_bench_model" opts="" preset="config/tune.toml":
    cargo run --release -p chassis-tune -- sweep --preset {{preset}} --preset-name {{name}} {{opts}}

# 自动整定：仿真搜索（不碰硬件；同 seed 结果逐位一致）
tune-sim samples="512" seed="20260101":
    cargo run --release -p chassis-tune -- sweep --samples {{samples}} --seed {{seed}} --out-dir target/tune

# 自动整定：冒烟（确定性、秒级；CI 与提交前自检用）
tune-smoke samples="64" seed="7":
    cargo run --release -p chassis-tune -- sweep --samples {{samples}} --top-k 3 --max-iters 40 --ensemble 2 --seed {{seed}} --out-dir target/tune-smoke

# 自动整定：复算一组给定增益（退出码 0 通过 / 1 未通过 / 2 参数错）
tune-validate gains="2,10,0,0":
    cargo run --release -p chassis-tune -- validate --gains {{gains}}

# 自动整定：带 SVG 图输出（需要 --features plot）
tune-plot samples="128":
    cargo run --release -p chassis-tune --features plot -- sweep --samples {{samples}} --out-dir target/tune-plot

# 自动整定：把结果写回一份配置（需 --config 指向现有 chassis.toml）
tune-write config="config/chassis.toml.example" motor="front_left" out="target/tune/chassis.tuned.toml":
    cargo run --release -p chassis-tune -- sweep --config {{config}} --motor {{motor}} --write-config {{out}} --samples 256 --out-dir target/tune

# 自动整定：**真机**逐次试验（轮子会转！轮子架空或整车固定，急停可及）
# 例：just tune-bench board="root@192.168.2.2" device="/dev/ttyACM0" esc_id="1" samples="24"
#     预设提供场景 / 参数空间 / 权重 / 阈值 / 安全包络；CLI 提供接线与样本数（CLI 优先）。
tune-bench board="root@192.168.2.2" device="/dev/ttyACM0" esc_id="1" samples="24" preset="bench_noload" opts="":
    cargo build --release -p chassis-tune
    scp -q target/release/chassis-tune {{board}}:/tmp/chassis-tune
    scp -q config/tune.toml {{board}}:/tmp/tune.toml
    ssh {{board}} "/tmp/chassis-tune sweep --backend bench --preset /tmp/tune.toml --preset-name {{preset}} --device {{device}} --esc-id {{esc_id}} --samples {{samples}} --top-k 3 --i-know-the-wheel-spins {{opts}}"
