/******************************************************************************
 * @file     	bsp_task.h
 * @brief     任务组件框架
 * @version   V1
 * @copyright    
 ******************************************************************************/
 
#ifndef _BMS_TASK_H_
#define _BMS_TASK_H_

#ifdef __cplusplus
extern "C" {
#endif 

#include "kit_macro.h"

/*任务结构*/
typedef struct _task_array_t
{
    uint16_t    task_id;
    uint16_t    interval;
    uint16_t    timeout;
    uint16_t    wdog_tick;
	bool        is_time_out;
    uint16_t    stk_size;
	uint32_t    *stk_array;
    NoArgFuncCall   init_func;
    UintArgFunCall  handler_func;
    struct _task_array_t *next_task;
}task_array_t;
    
/*任务变量定义*/
#define GLOBAL_TASK_VARS(_task_name, priority, interval, timeout,stk_size, init_func, handler_func, next_task)  \
    OS_STK stack_##_task_name[stk_size]; \
    task_array_t _task_name =    \
    {   \
        (priority),    \
        (interval),      \
        (timeout), \
        0,  \
		false,  \
        stk_size, \
        stack_##_task_name,  \
        init_func, \
        handler_func, \
		next_task, \
    }\
	

/*任务变量定义*/
#define GLOBAL_TASK_VARS_CCM(_task_name, priority, interval, timeout,stk_size,init_func, handler_func,next_task)  \
    OS_STK stack_##_task_name[stk_size] __attribute__((section (".CCM_RAM"))); \
    task_array_t _task_name =    \
    {   \
        (priority),    \
        (interval),      \
        (timeout), \
        0,  \
		false,  \
        stk_size, \
        stack_##_task_name,  \
        init_func, \
        handler_func, \
		next_task, \
    }\

void bsp_task_beat_wdog(void);
void bsp_task_feed_wdog(uint32_t tick);
uint32_t bsp_task_delay_ms(uint32_t dly);
void bsp_task_set_timeout_call(UintArgFunCall call);
		
/*****************************************************************************
 * @brief       任务模板创建
 * @param[in]   void: 无
 * @return      void
 *****************************************************************************/
kit_ret_e bsp_create_task(task_array_t* task, uint8_t * name);

/*****************************************************************************
 * @brief       获取超时的任务
 * @param[in]   task_id: 任务id
 * @return      void
 *****************************************************************************/		
uint16_t bsp_task_get_wdog_timeout_tick(uint8_t task_id);
    
#ifdef __cplusplus
}
#endif

#endif