syntax = "proto3";
import "cmvr/msgs/canopen.proto";
package cmvr.msgs;



/* --------------------------------------------------------
 * CAN OPEN 定义
 * --------------------------------------------------------*/




// 电机控制模式（Operation Mode）
enum RunMode {
  // 未指定
  RUN_MODE_UNSPECIFIED = 0;

  // Profile Position Mode - 位置模式
  RUN_MODE_PROFILE_POSITION = 1;

  // Velocity Mode - 简单速度模式
  RUN_MODE_VELOCITY = 2;

  // Profile Velocity Mode - 速度模式（带轮廓）
  RUN_MODE_PROFILE_VELOCITY = 3;

  // Torque Mode - 转矩模式
  RUN_MODE_TORQUE = 4;

  // Homing Mode - 回零模式
  RUN_MODE_HOMING = 5;

  // Interpolation Mode - 位置插补模式
  RUN_MODE_INTERPOLATED_POSITION = 7;

  // Cyclic Synchronous Position Mode - 周期位置模式
  RUN_MODE_CYCLIC_SYNC_POSITION = 8;

  // Cyclic Synchronous Velocity Mode - 周期速度模式
  RUN_MODE_CYCLIC_SYNC_VELOCITY = 9;

  // Cyclic Synchronous Current Mode - 周期转矩模式
  RUN_MODE_CYCLIC_SYNC_CURRENT = 10;
}





// 电机状态数据
message MotorStatus {
  RunMode run_mode = 1;        // 当前运行模式


  int32 current = 2;         // 当前电流（单位：mA）
  int32 target_current = 3;  // 目标电流（单位：mA）
  int32 speed = 4;           // 当前速度，转换为度每秒：(speed / 100 / 减速比) * 360
  int32 target_speed = 5;    // 目标速度，单位同上
  int32 position = 6;        // 当前电机位置（位置转角度：(position / 65536 / 减速比) * 360）
  int32 target_position = 7; // 目标位置（非位置模式无效）
  uint32 error_state = 8;     // 错误状态位（见位说明）

  int32 speed_kp = 9;        // 速度环Kp，含模式和速度信息（bit复用）
  int32 speed_ki = 10;       // 速度环Ki，含模式和速度信息（bit复用）
  int32 speed_kd = 11;       // 速度环Kd

  int32 position_kp = 12;    // 位置环Kp
  int32 position_ki = 13;    // 位置环Ki
  int32 position_kd = 14;    // 位置环Kd

  int32 bus_voltage = 15;    // 母线电压

  int32 max_abs_current = 16; // 最大电流绝对值（单位：mA）
  int32 max_pos_current = 17; // 最大正电流（单位：mA）
  int32 min_neg_current = 18; // 最小负电流（单位：mA）

  int32 max_pos_accel = 19;   // 最大正向加速度
  int32 min_neg_accel = 20;   // 最小负向加速度
  int32 max_pos_velocity = 21; // 最大正向速度（转化为度/秒）
  int32 min_neg_velocity = 22; // 最小负向速度（转化为度/秒）

  int32 max_pos_position = 23; // 最大正向位置（角度）
  int32 min_neg_position = 24; // 最小负向位置（角度）

  int32 motor_temp = 25;      // 电机温度（单位：摄氏度）
  int32 board_temp = 26;      // 电路板温度（单位：摄氏度）

  int32 current_kp = 27;      // 电流P
  int32 current_ki = 28;      // 电流I
  int32 current_kd = 29;      // 电流D

  int32 motor_type = 30;      // 电机型号（复合字段，包含刹车、ACTUATOR_TYPE等）
  int32 motor_version = 31;   // 电机版本号（软件+硬件，16进制格式）
  int32 software_version = 32;// 软件版本号（16进制格式）

  int32 position_offset = 33; // 当前位置偏移（编码器位置 - 偏移值）
  bytes csp_data = 34;        // 获取CSP，8字节数据
  int32 encoder_voltage = 35; // 编码器电池电压（新版硬件支持）
  int32 encoder_state = 36;   // 编码器状态（双编码器=外圈位置，单编码器=状态）

  int32 overvoltage_limit = 37;    // 过压阈值（单位：V）
  int32 undervoltage_limit = 38;  // 欠压阈值（单位：V）
  int32 coil_over_temp = 39;      // 电机线圈过温阈值（单位：℃）
  int32 driver_over_temp = 40;    // 驱动板过温阈值（单位：℃）

  /* ---------------------
   * CANOPEN 特有的参数
   * --------------------*/
  SdoFrame sdo_response = 41;
  NmtState nmt_state = 42;
  // 只保留值，具体值在使用的时候使用联合体去解析
  uint32 ctrl_word = 43;
  uint32  status_word = 44;

}


