/*
  初始化

  线程都需要在此处配置任务句柄 队列ID等等 
  要在user_task.h中定义一系列参数 其中各个线程的属性在user_task.c中定

*/

/* Includes ----------------------------------------------------------------- */
#include "Device\bmi088.h"
#include "task\user_task.h"
#include "can_use.h"
#include "cmd.h"
#include "Action.h"

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

/**
 * \brief 初始 在此函数中可以初始化任务,队列,信号量等,初始化完成后,自己删除自己
 *
 * \param argument 未使用参数传递
 */
void Task_Init(void *argument) {
  (void)argument; 
////  
  Config_Get(&task_runtime.config);
	
  osKernelLock();
  /* 任务*/
  task_runtime.thread.atti_esti =
      osThreadNew(Task_AttiEsti, NULL, &attr_atti_esti);
	task_runtime.thread.dr16 =
      osThreadNew(Task_dr16,NULL,&attr_dr16);
  task_runtime.thread.can =
      osThreadNew(Task_can,NULL,&attr_can);
  task_runtime.thread.cmd =
      osThreadNew(Task_cmd,NULL,&attr_cmd);
  task_runtime.thread.nuc =
      osThreadNew(Task_nuc,NULL,&attr_nuc);
	task_runtime.thread.up=
      osThreadNew(Task_up,NULL,&attr_up);
		
			
			
	task_runtime.thread.error_detect =
	    osThreadNew(Task_error_detect,NULL,&attr_error_detect);




  /* 消息队列 */
    /* can */			
	task_runtime.msgq.can.feedback.CAN_feedback  = 
	    osMessageQueueNew(2u, sizeof(CAN_t), NULL);
	    
	task_runtime.msgq.can.feedback.shoot5065_feedback =
      osMessageQueueNew(2u, sizeof(CAN_t), NULL);
  task_runtime.msgq.can.output.shoot5065 =
      osMessageQueueNew(2u, sizeof(CAN_VescOutput_t), NULL);
				    
	task_runtime.msgq.can.output.chassis3508 = 
	    osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
			
	task_runtime.msgq.can.output.pitch6020 = 
	    osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);

	task_runtime.msgq.can.output.chassis6020 = 
	    osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
			

	/* imu */
   task_runtime.msgq.imu.accl =
      osMessageQueueNew(2u, sizeof(AHRS_Accl_t), NULL);
  task_runtime.msgq.imu.eulr =
     osMessageQueueNew(2u, sizeof(AHRS_Eulr_t), NULL);
  task_runtime.msgq.imu.gyro =
      osMessageQueueNew(2u, sizeof(AHRS_Gyro_t), NULL);
	
		/*cmd */
   task_runtime.msgq.cmd.raw.rc =
      osMessageQueueNew(3u, sizeof(CMD_RC_t), NULL);
   task_runtime.msgq.cmd.raw.nuc =
      osMessageQueueNew(3u,sizeof(CMD_NUC_t), NULL);	 

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