85 lines
3.2 KiB
C
85 lines
3.2 KiB
C
/*
|
||
ctrl_shoot Task
|
||
|
||
*/
|
||
|
||
/* Includes ----------------------------------------------------------------- */
|
||
#include "cmsis_os2.h"
|
||
#include "task/user_task.h"
|
||
/* USER INCLUDE BEGIN */
|
||
#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; /* 裁判系统发射数据 */
|
||
Shoot_AI_t shoot_forai;
|
||
/* USER STRUCT END */
|
||
|
||
/* Private function --------------------------------------------------------- */
|
||
/* 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);
|
||
/* 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);
|
||
|
||
Shoot_DumpAI(&shoot, &shoot_forai);
|
||
osMessageQueuePut(task_runtime.msgq.ai.rawdata_FromShoot, &shoot_forai, 0, 0);
|
||
|
||
|
||
/* 消费裁判系统发射数据:在线时更新热量控制参数 */
|
||
if (shoot_ref.ref_status == REF_STATUS_RUNNING) {
|
||
shoot.heatcontrol.ref_online = true;
|
||
shoot.heatcontrol.Hmax = (float)shoot_ref.robot_status.shooter_barrel_heat_limit;
|
||
shoot.heatcontrol.Hcd = (float)shoot_ref.robot_status.shooter_barrel_cooling_value;
|
||
switch (shoot.param->basic.projectileType) {
|
||
case SHOOT_PROJECTILE_17MM:
|
||
shoot.heatcontrol.Hnow = (float)shoot_ref.power_heat.shooter_17mm_barrel_heat;
|
||
shoot.heatcontrol.Hgen = 10.0f;
|
||
break;
|
||
case SHOOT_PROJECTILE_42MM:
|
||
shoot.heatcontrol.Hnow = (float)shoot_ref.power_heat.shooter_42mm_barrel_heat;
|
||
shoot.heatcontrol.Hgen = 100.0f;
|
||
break;
|
||
default:
|
||
shoot.heatcontrol.Hnow = (float)shoot_ref.power_heat.shooter_17mm_barrel_heat;
|
||
shoot.heatcontrol.Hgen = 10.0f;
|
||
break;
|
||
} } else {
|
||
shoot.heatcontrol.ref_online = false;
|
||
shoot.heatcontrol.Hmax = 0.0f;
|
||
shoot.heatcontrol.Hcd = 0.0f;
|
||
shoot.heatcontrol.Hnow = 0.0f;
|
||
}
|
||
|
||
Shoot_UpdateFeedback(&shoot);
|
||
Shoot_SetMode(&shoot,shoot_cmd.mode);
|
||
Shoot_Control(&shoot,&shoot_cmd);
|
||
|
||
/* USER CODE END */
|
||
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
|
||
}
|
||
|
||
} |