stateDiagram-v2
    direction TB
    record_replay: 录制重放APP
    init: 初始化
    app_loaded: 内置APP模式(通过SDK load_app接口选择要加载的APP)
    ext_ctrl: 外部控制模式(通过SDK switch_mode切换控制模式)
    offline_connected: USB已连接,等待控制服务

    state app_loaded {
      direction LR
      state record_replay {
        direction TB
        replay_waiting: 重放初始状态
        replay_ready: 重放准备就绪
        replaying: 重放中
        replay_paused: 重放暂停
        idle: 空闲状态
        record_sub: 录制部分
        replay_sub: 重放部分
        drag: 可拖拽状态
        recording: 轨迹录制中
        state record_sub {
          direction LR
          idle --> drag: 末端按键 [长按]
          drag --> idle: 末端按键 [长按]
          drag --> recording: 底座按键 [短按]
          recording --> drag: 底座按键 [短按]
        }

        state replay_sub {
          direction LR
          replay_waiting --> replay_ready: 底座按键 [短按]
          replay_ready --> replaying: 底座按键 [短按],开始重放
          replaying --> replay_paused: 底座按键 [短按]
          replay_paused --> replaying: 底座按键 [短按]
          replaying --> replay_ready: 重放结束
          replay_waiting --> idle: 底座按键 [双击]
          %% replay_ready --> idle: 底座按键 [双击]
          %% replay_paused --> idle: 底座按键 [双击]
          idle --> replay_waiting: 末端按键 [双击]
        }
        [*] --> idle: 初始化
      }
    }

    [*] --> init: 上电
    init --> offline_connected: USB连接
    offline_connected --> ext_ctrl: 控制服务启动
    ext_ctrl --> record_replay: 底座按键 [长按]
    app_loaded --> ext_ctrl: SDK调用 [unload_app]
    record_replay --> ext_ctrl: 底座按键 [长按]
    ext_ctrl --> app_loaded: SDK调用 [load_app]


    classDef cyan fill:#00FFFF,stroke:#007F7F,stroke-width:2px,color:#000;
    classDef blue fill:#7F7FFF,stroke:#3F3F7F,stroke-width:2px,color:#000;
    classDef red fill:#FF7F7F,stroke:#7F3F3F,stroke-width:2px,color:#000;
    classDef purple fill:#FF7FFF,stroke:#7F3F7F,stroke-width:2px,color:#000;
    classDef green fill:#7FFF7F,stroke:#3F7F3F,stroke-width:2px,color:#000;
    classDef yellow fill:#FFFF3F,stroke:#7F7F3F,stroke-width:2px,color:#000;
    classDef light_grey fill:#BBBBBB,stroke:#777777,stroke-width:2px,color:#000;

    class idle cyan
    class idle breathing
    class drag blue
    class recording blue
    class recording flowing
    class replay_waiting purple
    class replay_waiting flashing
    class replay_ready purple
    class replaying purple
    class replaying breathing
    class replay_paused purple
    class replay_paused flashing

    class planning_pos green
    class servo_pos_joint green
    class servo_pos_cart green
    class servo_vel_joint green
    class servo_vel_cart green
    class gravity_comp green

    class self_check yellow
    class calibration_needed yellow
    class calibration_needed flashing
    class offline_idle light_grey
    class offline_connected light_grey
    class offline_connected breathing
    class failure red