From 7aa5148a2becb6b98023d8b285864de4444f2667 Mon Sep 17 00:00:00 2001 From: Robofish <1683502971@qq.com> Date: Wed, 1 Oct 2025 03:39:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9can=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User/device/rc_can.c | 66 +++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/User/device/rc_can.c b/User/device/rc_can.c index 292aec4..77d9733 100644 --- a/User/device/rc_can.c +++ b/User/device/rc_can.c @@ -93,46 +93,60 @@ int8_t RC_CAN_SendData(RC_CAN_t *rc_can, RC_CAN_DataType_t data_type) { } BSP_CAN_StdDataFrame_t frame; frame.dlc = 8; + // 边界裁剪宏 + #define RC_CAN_CLAMP(x, min, max) ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x))) switch (data_type) { - case RC_CAN_DATA_JOYSTICK: + case RC_CAN_DATA_JOYSTICK: { frame.id = rc_can->param.joy_id; - frame.data[0] = (uint8_t)((int16_t)(rc_can->data.joy.ch_l_x * 32768.0f) & 0xFF); - frame.data[1] = - (uint8_t)(((int16_t)(rc_can->data.joy.ch_l_x * 32768.0f) >> 8) & 0xFF); - frame.data[2] = (uint8_t)((int16_t)(rc_can->data.joy.ch_l_y * 32768.0f) & 0xFF); - frame.data[3] = - (uint8_t)(((int16_t)(rc_can->data.joy.ch_l_y * 32768.0f) >> 8) & 0xFF); - frame.data[4] = (uint8_t)((int16_t)(rc_can->data.joy.ch_r_x * 32768.0f) & 0xFF); - frame.data[5] = - (uint8_t)(((int16_t)(rc_can->data.joy.ch_r_x * 32768.0f) >> 8) & 0xFF); - frame.data[6] = (uint8_t)((int16_t)(rc_can->data.joy.ch_r_y * 32768.0f) & 0xFF); - frame.data[7] = - (uint8_t)(((int16_t)(rc_can->data.joy.ch_r_y * 32768.0f) >> 8) & 0xFF); + float l_x = RC_CAN_CLAMP(rc_can->data.joy.ch_l_x, -0.999969f, 0.999969f); + float l_y = RC_CAN_CLAMP(rc_can->data.joy.ch_l_y, -0.999969f, 0.999969f); + float r_x = RC_CAN_CLAMP(rc_can->data.joy.ch_r_x, -0.999969f, 0.999969f); + float r_y = RC_CAN_CLAMP(rc_can->data.joy.ch_r_y, -0.999969f, 0.999969f); + int16_t l_x_i = (int16_t)(l_x * 32768.0f); + int16_t l_y_i = (int16_t)(l_y * 32768.0f); + int16_t r_x_i = (int16_t)(r_x * 32768.0f); + int16_t r_y_i = (int16_t)(r_y * 32768.0f); + frame.data[0] = (uint8_t)(l_x_i & 0xFF); + frame.data[1] = (uint8_t)((l_x_i >> 8) & 0xFF); + frame.data[2] = (uint8_t)(l_y_i & 0xFF); + frame.data[3] = (uint8_t)((l_y_i >> 8) & 0xFF); + frame.data[4] = (uint8_t)(r_x_i & 0xFF); + frame.data[5] = (uint8_t)((r_x_i >> 8) & 0xFF); + frame.data[6] = (uint8_t)(r_y_i & 0xFF); + frame.data[7] = (uint8_t)((r_y_i >> 8) & 0xFF); break; - case RC_CAN_DATA_SWITCH: + } + case RC_CAN_DATA_SWITCH: { frame.id = rc_can->param.sw_id; frame.data[0] = (uint8_t)(rc_can->data.sw.sw_l); frame.data[1] = (uint8_t)(rc_can->data.sw.sw_r); - frame.data[2] = (uint8_t)((int16_t)(rc_can->data.sw.ch_res * 32768.0f) & 0xFF); - frame.data[3] = - (uint8_t)(((int16_t)(rc_can->data.sw.ch_res * 32768.0f) >> 8) & 0xFF); + float ch_res = RC_CAN_CLAMP(rc_can->data.sw.ch_res, -0.999969f, 0.999969f); + int16_t ch_res_i = (int16_t)(ch_res * 32768.0f); + frame.data[2] = (uint8_t)(ch_res_i & 0xFF); + frame.data[3] = (uint8_t)((ch_res_i >> 8) & 0xFF); frame.data[4] = 0; // 保留字节 frame.data[5] = 0; // 保留字节 frame.data[6] = 0; // 保留字节 frame.data[7] = 0; // 保留字节 break; - case RC_CAN_DATA_MOUSE: + } + case RC_CAN_DATA_MOUSE: { frame.id = rc_can->param.mouse_id; - frame.data[0] = (uint8_t)((int16_t)(rc_can->data.mouse.x) & 0xFF); - frame.data[1] = (uint8_t)(((int16_t)(rc_can->data.mouse.x) >> 8) & 0xFF); - frame.data[2] = (uint8_t)((int16_t)(rc_can->data.mouse.y) & 0xFF); - frame.data[3] = (uint8_t)(((int16_t)(rc_can->data.mouse.y) >> 8) & 0xFF); - frame.data[4] = (uint8_t)((int16_t)(rc_can->data.mouse.z) & 0xFF); - frame.data[5] = (uint8_t)(((int16_t)(rc_can->data.mouse.z) >> 8) & 0xFF); + // 鼠标x/y/z一般为增量,若有极限也可加clamp + int16_t x = (int16_t)(rc_can->data.mouse.x); + int16_t y = (int16_t)(rc_can->data.mouse.y); + int16_t z = (int16_t)(rc_can->data.mouse.z); + frame.data[0] = (uint8_t)(x & 0xFF); + frame.data[1] = (uint8_t)((x >> 8) & 0xFF); + frame.data[2] = (uint8_t)(y & 0xFF); + frame.data[3] = (uint8_t)((y >> 8) & 0xFF); + frame.data[4] = (uint8_t)(z & 0xFF); + frame.data[5] = (uint8_t)((z >> 8) & 0xFF); frame.data[6] = (uint8_t)(rc_can->data.mouse.mouse_l ? 1 : 0); frame.data[7] = (uint8_t)(rc_can->data.mouse.mouse_r ? 1 : 0); break; - case RC_CAN_DATA_KEYBOARD: + } + case RC_CAN_DATA_KEYBOARD: { frame.id = rc_can->param.keyboard_id; frame.data[0] = (uint8_t)(rc_can->data.keyboard.key_value & 0xFF); frame.data[1] = (uint8_t)((rc_can->data.keyboard.key_value >> 8) & 0xFF); @@ -140,9 +154,11 @@ int8_t RC_CAN_SendData(RC_CAN_t *rc_can, RC_CAN_DataType_t data_type) { frame.data[2 + i] = (i < 6) ? (uint8_t)(rc_can->data.keyboard.keys[i]) : 0; } break; + } default: return DEVICE_ERR; } + #undef RC_CAN_CLAMP if (BSP_CAN_Transmit(rc_can->param.can, BSP_CAN_FORMAT_STD_DATA, frame.id, frame.data, frame.dlc) != BSP_OK) { return DEVICE_ERR;