/* rc Task */ /* Includes ----------------------------------------------------------------- */ #include "task/user_task.h" /* USER INCLUDE BEGIN */ #include "bsp/can.h" #include "device/dr16.h" #include "device/rc_can.h" #include "module/balance_chassis.h" #include "module/config.h" /* USER INCLUDE END */ /* Private typedef ---------------------------------------------------------- */ /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private variables -------------------------------------------------------- */ /* USER STRUCT BEGIN */ DR16_t dr16; RC_CAN_t rc_can; Chassis_CMD_t cmd_to_chassis; #define USE_RC_CAN /* USER STRUCT END */ /* Private function --------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */ void Task_rc(void *argument) { (void)argument; /* 未使用argument,消除警告 */ /* 计算任务运行到指定频率需要等待的tick数 */ const uint32_t delay_tick = osKernelGetTickFreq() / RC_FREQ; osDelay(RC_INIT_DELAY); /* 延时一段时间再开启任务 */ uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */ /* USER CODE INIT BEGIN */ BSP_CAN_Init(); DR16_Init(&dr16); RC_CAN_Init(&rc_can, &Config_GetRobotParam()->rc_can_param); /* USER CODE INIT END */ while (1) { tick += delay_tick; /* 计算下一个唤醒时刻 */ /* USER CODE BEGIN */ #ifdef USE_DR16 DR16_StartDmaRecv(&dr16); if (DR16_WaitDmaCplt(20)) { DR16_ParseData(&dr16); switch (dr16.data.sw_l) { case CMD_SW_UP: // 上位 cmd_to_chassis.mode = CHASSIS_MODE_RELAX; break; case CMD_SW_MID: // 中位 cmd_to_chassis.mode = CHASSIS_MODE_RECOVER; break; case CMD_SW_DOWN: // 下位 cmd_to_chassis.mode = CHASSIS_MODE_WHELL_BALANCE; break; default: cmd_to_chassis.mode = CHASSIS_MODE_RELAX; break; } cmd_to_chassis.move_vec.vx = dr16.data.ch_l_y; cmd_to_chassis.move_vec.vy = dr16.data.ch_l_x; cmd_to_chassis.move_vec.wz = dr16.data.ch_r_x; cmd_to_chassis.height = dr16.data.ch_res; } else { DR16_Offline(&dr16); cmd_to_chassis.mode = CHASSIS_MODE_RELAX; } #elif defined USE_RC_CAN RC_CAN_Update(&rc_can, RC_CAN_DATA_JOYSTICK); RC_CAN_Update(&rc_can, RC_CAN_DATA_SWITCH); if (rc_can.header.online) { switch (rc_can.data.sw.sw_l) { case RC_CAN_SW_UP: // 上位 cmd_to_chassis.mode = CHASSIS_MODE_RELAX; break; case RC_CAN_SW_MID: // 中位 cmd_to_chassis.mode = CHASSIS_MODE_RECOVER; break; case RC_CAN_SW_DOWN: // 下位 cmd_to_chassis.mode = CHASSIS_MODE_WHELL_BALANCE; break; default: cmd_to_chassis.mode = CHASSIS_MODE_RELAX; break; } cmd_to_chassis.move_vec.vx = rc_can.data.joy.ch_l_y; cmd_to_chassis.move_vec.vy = rc_can.data.joy.ch_l_x; cmd_to_chassis.move_vec.wz = rc_can.data.joy.ch_r_x; cmd_to_chassis.height = rc_can.data.sw.ch_res; } else { RC_CAN_OFFLINE(&rc_can); cmd_to_chassis.mode = CHASSIS_MODE_RELAX; } #endif osMessageQueuePut(task_runtime.msgq.Chassis_cmd, &cmd_to_chassis, 0, 0); /* USER CODE END */ osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ } }