Skip to main content

piper_protocol/
ids.rs

1//! CAN ID 常量定义和枚举
2//!
3//! 定义所有协议帧的 CAN ID 常量,并提供 ID 分类功能。
4
5/// 反馈帧 ID 范围
6pub const FEEDBACK_BASE_ID: u32 = 0x2A1;
7pub const FEEDBACK_END_ID: u32 = 0x2A8;
8
9/// 控制帧 ID 范围
10pub const CONTROL_BASE_ID: u32 = 0x150;
11pub const CONTROL_END_ID: u32 = 0x15F;
12
13/// 配置帧 ID 范围
14pub const CONFIG_BASE_ID: u32 = 0x470;
15pub const CONFIG_END_ID: u32 = 0x47E; // 注意:包含 0x47D 和 0x47E
16
17// ============================================================================
18// 反馈帧 ID 常量
19// ============================================================================
20
21/// 机械臂状态反馈
22pub const ID_ROBOT_STATUS: u32 = 0x2A1;
23
24/// 机械臂末端位姿反馈
25pub const ID_END_POSE_1: u32 = 0x2A2;
26pub const ID_END_POSE_2: u32 = 0x2A3;
27pub const ID_END_POSE_3: u32 = 0x2A4;
28
29/// 机械臂关节反馈
30pub const ID_JOINT_FEEDBACK_12: u32 = 0x2A5;
31pub const ID_JOINT_FEEDBACK_34: u32 = 0x2A6;
32pub const ID_JOINT_FEEDBACK_56: u32 = 0x2A7;
33
34/// 夹爪反馈
35pub const ID_GRIPPER_FEEDBACK: u32 = 0x2A8;
36
37/// 关节驱动器高速反馈(0x251~0x256)
38pub const ID_JOINT_DRIVER_HIGH_SPEED_BASE: u32 = 0x251;
39
40/// 关节驱动器低速反馈(0x261~0x266)
41pub const ID_JOINT_DRIVER_LOW_SPEED_BASE: u32 = 0x261;
42
43/// 关节末端速度/加速度反馈(0x481~0x486)
44pub const ID_JOINT_END_VELOCITY_ACCEL_BASE: u32 = 0x481;
45
46/// 固件版本读取反馈
47pub const ID_FIRMWARE_READ: u32 = 0x4AF;
48
49// ============================================================================
50// 控制帧 ID 常量
51// ============================================================================
52
53/// 快速急停/轨迹指令
54pub const ID_EMERGENCY_STOP: u32 = 0x150;
55
56/// 控制模式指令
57pub const ID_CONTROL_MODE: u32 = 0x151;
58
59/// 末端位姿控制指令
60pub const ID_END_POSE_CONTROL_1: u32 = 0x152;
61pub const ID_END_POSE_CONTROL_2: u32 = 0x153;
62pub const ID_END_POSE_CONTROL_3: u32 = 0x154;
63
64/// 关节控制指令
65pub const ID_JOINT_CONTROL_12: u32 = 0x155;
66pub const ID_JOINT_CONTROL_34: u32 = 0x156;
67pub const ID_JOINT_CONTROL_56: u32 = 0x157;
68
69/// 圆弧模式坐标序号更新指令
70pub const ID_ARC_POINT: u32 = 0x158;
71
72/// 夹爪控制指令
73pub const ID_GRIPPER_CONTROL: u32 = 0x159;
74
75/// MIT 控制指令(0x15A~0x15F)
76pub const ID_MIT_CONTROL_BASE: u32 = 0x15A;
77
78/// 灯光控制指令
79pub const ID_LIGHT_CONTROL: u32 = 0x121;
80
81/// 固件升级模式设定指令
82pub const ID_FIRMWARE_UPGRADE: u32 = 0x422;
83
84// ============================================================================
85// 配置帧 ID 常量
86// ============================================================================
87
88/// 随动主从模式设置指令
89pub const ID_MASTER_SLAVE_MODE: u32 = 0x470;
90
91/// 电机使能/失能设置指令
92pub const ID_MOTOR_ENABLE: u32 = 0x471;
93
94/// 查询电机限制指令
95pub const ID_QUERY_MOTOR_LIMIT: u32 = 0x472;
96
97/// 反馈当前电机限制角度/最大速度
98pub const ID_MOTOR_LIMIT_FEEDBACK: u32 = 0x473;
99
100/// 设置电机限制指令
101pub const ID_SET_MOTOR_LIMIT: u32 = 0x474;
102
103/// 关节设置指令
104pub const ID_JOINT_SETTING: u32 = 0x475;
105
106/// 设置指令应答
107pub const ID_SETTING_RESPONSE: u32 = 0x476;
108
109/// 参数查询与设置指令
110pub const ID_PARAMETER_QUERY_SET: u32 = 0x477;
111
112/// 反馈当前末端速度/加速度参数
113pub const ID_END_VELOCITY_ACCEL_FEEDBACK: u32 = 0x478;
114
115/// 设置末端速度/加速度参数
116pub const ID_SET_END_VELOCITY_ACCEL: u32 = 0x479;
117
118/// 碰撞防护等级设置指令
119pub const ID_COLLISION_PROTECTION_LEVEL: u32 = 0x47A;
120
121/// 碰撞防护等级设置反馈
122pub const ID_COLLISION_PROTECTION_LEVEL_FEEDBACK: u32 = 0x47B;
123
124/// 反馈当前电机最大加速度限制
125pub const ID_MOTOR_MAX_ACCEL_FEEDBACK: u32 = 0x47C;
126
127/// 夹爪/示教器参数设置指令
128pub const ID_GRIPPER_TEACH_PARAMS: u32 = 0x47D;
129
130/// 夹爪/示教器参数反馈
131pub const ID_GRIPPER_TEACH_PARAMS_FEEDBACK: u32 = 0x47E;
132
133// ============================================================================
134// ID 分类枚举
135// ============================================================================
136
137/// CAN 帧类型分类
138#[derive(Debug, Clone, Copy, PartialEq, Eq)]
139pub enum FrameType {
140    /// 反馈帧
141    Feedback,
142    /// 控制帧
143    Control,
144    /// 配置帧
145    Config,
146    /// 未知类型
147    Unknown,
148}
149
150impl FrameType {
151    /// 根据 CAN ID 判断帧类型
152    pub fn from_id(id: u32) -> Self {
153        match id {
154            // 反馈帧范围
155            0x2A1..=0x2A8 | 0x251..=0x256 | 0x261..=0x266 | 0x481..=0x486 | 0x4AF => {
156                FrameType::Feedback
157            },
158            // 控制帧范围(注意:在主从模式下,0x151, 0x155-0x157, 0x159 也可能作为反馈解析)
159            0x150..=0x15F => FrameType::Control,
160            // 配置帧范围
161            0x470..=0x47E => FrameType::Config,
162            // 未知类型
163            _ => FrameType::Unknown,
164        }
165    }
166}
167
168#[cfg(test)]
169mod tests {
170    use super::*;
171
172    #[test]
173    fn test_frame_type_feedback() {
174        assert_eq!(FrameType::from_id(0x2A1), FrameType::Feedback);
175        assert_eq!(FrameType::from_id(0x2A8), FrameType::Feedback);
176        assert_eq!(FrameType::from_id(0x251), FrameType::Feedback);
177        assert_eq!(FrameType::from_id(0x256), FrameType::Feedback);
178        assert_eq!(FrameType::from_id(0x261), FrameType::Feedback);
179        assert_eq!(FrameType::from_id(0x266), FrameType::Feedback);
180        assert_eq!(FrameType::from_id(0x481), FrameType::Feedback);
181        assert_eq!(FrameType::from_id(0x486), FrameType::Feedback);
182    }
183
184    #[test]
185    fn test_frame_type_control() {
186        assert_eq!(FrameType::from_id(0x150), FrameType::Control);
187        assert_eq!(FrameType::from_id(0x15F), FrameType::Control);
188        assert_eq!(FrameType::from_id(0x151), FrameType::Control);
189        assert_eq!(FrameType::from_id(0x155), FrameType::Control);
190    }
191
192    #[test]
193    fn test_frame_type_config() {
194        assert_eq!(FrameType::from_id(0x470), FrameType::Config);
195        assert_eq!(FrameType::from_id(0x47E), FrameType::Config);
196        assert_eq!(FrameType::from_id(0x471), FrameType::Config);
197        assert_eq!(FrameType::from_id(0x47D), FrameType::Config);
198    }
199
200    #[test]
201    fn test_frame_type_unknown() {
202        assert_eq!(FrameType::from_id(0x100), FrameType::Unknown);
203        assert_eq!(FrameType::from_id(0x999), FrameType::Unknown);
204        assert_eq!(FrameType::from_id(0x121), FrameType::Unknown); // 灯光控制,辅助功能
205        assert_eq!(FrameType::from_id(0x422), FrameType::Unknown); // 固件升级,辅助功能
206    }
207
208    #[test]
209    fn test_id_constants() {
210        // 验证一些关键 ID 常量
211        assert_eq!(ID_ROBOT_STATUS, 0x2A1);
212        assert_eq!(ID_EMERGENCY_STOP, 0x150);
213        assert_eq!(ID_MOTOR_ENABLE, 0x471);
214    }
215}