#ifndef TASK_H
#define TASK_H

#ifdef __cplusplus
extern "C" {
#endif
#include "stdint.h"

#define true 0
#define false (-1)
//平台切换相关类型重定义
typedef int64_t TaskStatus_t;
typedef uint64_t TaskTime_t;
typedef int64_t TaskCnt_t;

typedef struct TaskList Task_t;

typedef uint64_t (*PlatformTicksFunc_t)(void);

typedef void (*Task_Callback_t)(Task_t *task, void *userdata);

struct TaskList {
    Task_t *next;
    uint8_t enable;
    TaskCnt_t runcnt;
    TaskTime_t lasttime;
    TaskTime_t intervaltime;
    Task_Callback_t callback;
    void *userdata;
};

/**
 * @brief   初始化任务模块
 * @param   TicksFunc: [输入] 时间基准函数指针
 * @return  TaskStatus_t 返回任务状态
 * @example TaskInit(GetPlatformTicks);
 */
TaskStatus_t TaskInit(PlatformTicksFunc_t TicksFunc);


/**
 * @brief   创建任务
 * @param   task: [输入/输出] 任务结构体指针
 * @param   time: [输入] 间隔时间
 * @param   runcnt: [输入] 执行次数，-1为无限制执行，0为只创建不运行
 * @param   callback: [输入] 回调函数
 * @param   userdata: [输入] 用户数据传参
 * @return  TaskStatus_t 返回任务状态
 * @example TaskCreat(&myTask, 100, -1, myCallbackFunc, &myData);
 */
TaskStatus_t TaskCreat(Task_t *task, TaskTime_t time, TaskCnt_t runcnt, Task_Callback_t callback, void *userdata);

/**
 * @brief   添加任务
 * @param   task: [输入] 任务结构体指针
 * @return  TaskStatus_t 返回任务状态
 * @example TaskAdd(&myTask);
 */
TaskStatus_t TaskAdd(Task_t *task);

/**
 * @brief   删除任务
 * @param   task: [输入] 任务结构体指针
 * @return  TaskStatus_t 返回任务状态
 * @example TaskDel(&myTask);
 */
TaskStatus_t TaskDel(Task_t *task);

/**
 * @brief   重新开始停止的任务
 * @param   task: [输入] 任务结构体指针
 * @return  TaskStatus_t 返回任务状态
 * @example TaskStart(&myTask);
 */
TaskStatus_t TaskStart(Task_t *task);

/**
 * @brief   暂停任务执行
 * @param   task: [输入] 任务结构体指针
 * @return  TaskStatus_t 返回任务状态
 * @example TaskStop(&myTask);
 */
TaskStatus_t TaskStop(Task_t *task);

/**
 * @brief   重设任务执行次数
 * @param   task: [输入] 任务结构体指针
 * @param   runcnt: [输入] 新的执行次数
 * @return  TaskStatus_t 返回任务状态
 * @example TaskSetCnt(&myTask, 5);
 */
TaskStatus_t TaskSetCnt(Task_t *task, TaskCnt_t runcnt);

/**
 * @brief   重设任务间隔时间
 * @param   task: [输入] 任务结构体指针
 * @param   time: [输入] 新的间隔时间
 * @return  TaskStatus_t 返回任务状态
 * @example TaskSetTime(&myTask, 50);
 */

TaskStatus_t TaskSetTime(Task_t *task, TaskTime_t time);

/**
 * @brief   任务调度
 * @return  TaskStatus_t 返回任务状态
 * @example TaskRun();
 */
TaskStatus_t TaskRun(void);

#ifdef __cplusplus
}
#endif
#endif //TASK_H
