/*
  初始化任务

  根据机器人的FLASH配置,决定生成哪些任务。
*/

/* Includes ----------------------------------------------------------------- */
#include "bsp\flash.h"
#include "bsp\usb.h"
#include "component\cmd.h"
#include "device\bmi088.h"
#include "device\can.h"
#include "device\ist8310.h"
#include "device\referee.h"
#include "module\cap.h"
#include "module\chassis.h"
#include "module\gimbal.h"
#include "module\shoot.h"
#include "task\user_task.h"

/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */

/**
 * \brief 初始化
 *
 * \param argument 未使用
 */
void Task_Init(void *argument) {
  (void)argument; /* 未使用argument,消除警告 */

  Config_Get(&task_runtime.cfg); /* 获取机器人配置 */

  osKernelLock();
  /* 创建任务 */
  task_runtime.thread.atti_esti =
      osThreadNew(Task_AttiEsti, NULL, &attr_atti_esti);
  task_runtime.thread.cli = osThreadNew(Task_CLI, NULL, &attr_cli);
  task_runtime.thread.command = osThreadNew(Task_Command, NULL, &attr_command);
  task_runtime.thread.ctrl_chassis =
      osThreadNew(Task_CtrlChassis, NULL, &attr_ctrl_chassis);
  task_runtime.thread.ctrl_gimbal =
      osThreadNew(Task_CtrlGimbal, NULL, &attr_ctrl_gimbal);
  task_runtime.thread.ctrl_shoot =
      osThreadNew(Task_CtrlShoot, NULL, &attr_ctrl_shoot);
  task_runtime.thread.info = osThreadNew(Task_Info, NULL, &attr_info);
  task_runtime.thread.monitor = osThreadNew(Task_Monitor, NULL, &attr_monitor);
  task_runtime.thread.can = osThreadNew(Task_Can, NULL, &attr_can);
  task_runtime.thread.referee = osThreadNew(Task_Referee, NULL, &attr_referee);
  task_runtime.thread.ai = osThreadNew(Task_Ai, NULL, &attr_ai);
  task_runtime.thread.rc = osThreadNew(Task_RC, NULL, &attr_rc);
  task_runtime.thread.cap = osThreadNew(Task_Cap, NULL, &attr_cap);

  /* 创建消息队列 */
  /* motor */
  task_runtime.msgq.can.feedback.chassis =
      osMessageQueueNew(2u, sizeof(CAN_t), NULL);
  task_runtime.msgq.can.feedback.gimbal =
      osMessageQueueNew(2u, sizeof(CAN_t), NULL);
  task_runtime.msgq.can.feedback.shoot =
      osMessageQueueNew(2u, sizeof(CAN_t), NULL);
  task_runtime.msgq.can.feedback.cap =
      osMessageQueueNew(2u, sizeof(CAN_t), NULL);
  task_runtime.msgq.can.output.chassis =
      osMessageQueueNew(2u, sizeof(CAN_ChassisOutput_t), NULL);
  task_runtime.msgq.can.output.gimbal =
      osMessageQueueNew(2u, sizeof(CAN_GimbalOutput_t), NULL);
  task_runtime.msgq.can.output.shoot =
      osMessageQueueNew(2u, sizeof(CAN_ShootOutput_t), NULL);
  task_runtime.msgq.can.output.cap =
      osMessageQueueNew(2u, sizeof(CAN_CapOutput_t), NULL);

  /* command */
  task_runtime.msgq.cmd.chassis =
      osMessageQueueNew(3u, sizeof(CMD_ChassisCmd_t), NULL);
  task_runtime.msgq.cmd.gimbal =
      osMessageQueueNew(3u, sizeof(CMD_GimbalCmd_t), NULL);
  task_runtime.msgq.cmd.shoot =
      osMessageQueueNew(3u, sizeof(CMD_ShootCmd_t), NULL);
  task_runtime.msgq.cmd.ai =
      osMessageQueueNew(3u, sizeof(CMD_AI_Status_t), NULL);
  task_runtime.msgq.cmd.referee = osMessageQueueNew(6u, sizeof(CMD_UI_t), NULL);

  /* atti_esti */
  task_runtime.msgq.cmd.raw.rc = osMessageQueueNew(3u, sizeof(CMD_RC_t), NULL);
  task_runtime.msgq.cmd.raw.host =
      osMessageQueueNew(3u, sizeof(CMD_Host_t), NULL);

  task_runtime.msgq.gimbal.accl =
      osMessageQueueNew(2u, sizeof(AHRS_Accl_t), NULL);
  task_runtime.msgq.gimbal.eulr_imu =
      osMessageQueueNew(2u, sizeof(AHRS_Eulr_t), NULL);
  task_runtime.msgq.gimbal.gyro =
      osMessageQueueNew(2u, sizeof(AHRS_Gyro_t), NULL);

  task_runtime.msgq.cap_info =
      osMessageQueueNew(2u, sizeof(CAN_Capacitor_t), NULL);

  /* AI */
  task_runtime.msgq.ai.quat =
      osMessageQueueNew(2u, sizeof(AHRS_Quaternion_t), NULL);

  /* 裁判系统 */
  task_runtime.msgq.referee.ai =
      osMessageQueueNew(2u, sizeof(Referee_ForAI_t), NULL);
  task_runtime.msgq.referee.chassis =
      osMessageQueueNew(2u, sizeof(Referee_ForChassis_t), NULL);
  task_runtime.msgq.referee.cap =
      osMessageQueueNew(2u, sizeof(Referee_ForCap_t), NULL);
  task_runtime.msgq.referee.shoot =
      osMessageQueueNew(2u, sizeof(Referee_ForShoot_t), NULL);

  /* UI */
  task_runtime.msgq.ui.chassis =
      osMessageQueueNew(2u, sizeof(Referee_ChassisUI_t), NULL);
  task_runtime.msgq.ui.cap =
      osMessageQueueNew(2u, sizeof(Referee_CapUI_t), NULL);
  task_runtime.msgq.ui.gimbal =
      osMessageQueueNew(2u, sizeof(Referee_GimbalUI_t), NULL);
  task_runtime.msgq.ui.shoot =
      osMessageQueueNew(2u, sizeof(Referee_ShootUI_t), NULL);
  task_runtime.msgq.ui.cmd = osMessageQueueNew(2u, sizeof(bool), NULL);

  osKernelUnlock();
  osThreadTerminate(osThreadGetId()); /* 结束自身 */
}