88 lines
3.2 KiB
C
88 lines
3.2 KiB
C
/*
|
||
ctrl_shoot Task
|
||
|
||
*/
|
||
|
||
/* Includes ----------------------------------------------------------------- */
|
||
#include "task/user_task.h"
|
||
/* USER INCLUDE BEGIN */
|
||
#include "device/mrobot.h"
|
||
#include "module/shoot.h"
|
||
#include "module/config.h"
|
||
#include "device/referee_proto_types.h"
|
||
/* USER INCLUDE END */
|
||
|
||
/* Private typedef ---------------------------------------------------------- */
|
||
/* Private define ----------------------------------------------------------- */
|
||
/* Private macro ------------------------------------------------------------ */
|
||
/* Private variables -------------------------------------------------------- */
|
||
/* USER STRUCT BEGIN */
|
||
Shoot_t shoot;
|
||
Shoot_CMD_t shoot_cmd;
|
||
Referee_ForShoot_t shoot_ref;
|
||
/* USER STRUCT END */
|
||
|
||
/* Private function --------------------------------------------------------- */
|
||
/* USER PRIVATE CODE BEGIN */
|
||
|
||
/**
|
||
* @brief 发射模块数据打印回调
|
||
*/
|
||
static int print_shoot(const void *data, char *buf, size_t size) {
|
||
const Shoot_t *shoot = (const Shoot_t *)data;
|
||
return MRobot_Snprintf(buf, size,
|
||
" State : %d\r\n"
|
||
" Fric0 : %.1f rpm (target: %.1f)\r\n"
|
||
" Fric1 : %.1f rpm (target: %.1f)\r\n"
|
||
" Fric_Avg : %.1f rpm\r\n"
|
||
" Trig : %.1f rpm (angle: %.2f deg)\r\n"
|
||
" Output : Fric0=%.1f Fric1=%.1f Trig=%.1f\r\n",
|
||
shoot->running_state,
|
||
shoot->feedback.fric[0].rotor_speed, shoot->target_variable.fric_rpm,
|
||
shoot->feedback.fric[1].rotor_speed, shoot->target_variable.fric_rpm,
|
||
shoot->var_fric.normalized_fil_avgrpm,
|
||
shoot->feedback.trig.feedback.rotor_speed, shoot->feedback.trig.feedback.rotor_abs_angle,
|
||
shoot->output.out_fric[0], shoot->output.out_fric[1], shoot->output.outagl_trig);
|
||
return 0;
|
||
}
|
||
|
||
/* USER PRIVATE CODE END */
|
||
/* Exported functions ------------------------------------------------------- */
|
||
void Task_ctrl_shoot(void *argument) {
|
||
(void)argument; /* 未使用argument,消除警告 */
|
||
|
||
|
||
/* 计算任务运行到指定频率需要等待的tick数 */
|
||
const uint32_t delay_tick = osKernelGetTickFreq() / CTRL_SHOOT_FREQ;
|
||
|
||
osDelay(CTRL_SHOOT_INIT_DELAY); /* 延时一段时间再开启任务 */
|
||
|
||
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
|
||
/* USER CODE INIT BEGIN */
|
||
|
||
Shoot_Init(&shoot,&Config_GetRobotParam()->shoot_param,CTRL_SHOOT_FREQ);
|
||
MRobot_RegisterDevice("shoot", &shoot, print_shoot);
|
||
|
||
/* USER CODE INIT END */
|
||
|
||
while (1) {
|
||
tick += delay_tick; /* 计算下一个唤醒时刻 */
|
||
/* USER CODE BEGIN */
|
||
osMessageQueueGet(task_runtime.msgq.shoot.cmd, &shoot_cmd, NULL, 0);
|
||
osMessageQueueGet(task_runtime.msgq.shoot.ref, &shoot_ref, NULL, 0);
|
||
|
||
if (shoot_ref.ref_status == REF_STATUS_RUNNING) {
|
||
shoot.heatcontrol.Hmax = (float)shoot_ref.robot_status.shooter_barrel_heat_limit;
|
||
shoot.heatcontrol.Hcd = (float)shoot_ref.robot_status.shooter_barrel_cooling_value;
|
||
shoot.heatcontrol.Hnow = (float)shoot_ref.power_heat.shooter_42mm_barrel_heat;
|
||
shoot.heatcontrol.Hgen = 100.0f; /* 42mm弹丸每发产生热量 */
|
||
}
|
||
Shoot_UpdateFeedback(&shoot);
|
||
Shoot_SetMode(&shoot,shoot_cmd.mode);
|
||
Shoot_Control(&shoot,&shoot_cmd);
|
||
|
||
/* USER CODE END */
|
||
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
|
||
}
|
||
|
||
} |