#include <ti_msp_dl_config.h>
#include <FreeRTOS.h>
#include <task.h>

/************* 用户模块引入部分 ************/

#include <include/user/Led.h>

// TODO

/**************** 测试部分 ***************/

// TODO

/************ FreeRtos 任务定义区 ************/

[[noreturn]] void vLedTask(void *pvParameters) {
    while (true) {
        Led::on(LED0);
        vTaskDelay(pdMS_TO_TICKS(500)); // 每500毫秒切换一次LED状态
        Led::off(LED0);
        vTaskDelay(pdMS_TO_TICKS(500)); // 每500毫秒切换一次LE+D状态
    }
}

// TODO

/***************** 主函数 ******************/

int main() {
    /*** SysConfig 初始化 ***/
    SYSCFG_DL_init();

    /*** 模块初始化 ***/

    /*** FreeRtos 任务初始化 ***/
    xTaskCreate(vLedTask, "TestLedTask", 32, nullptr, 1, nullptr);

    /*** 启动 FreeRtos ***/
    vTaskStartScheduler();

    return 0;
}

/************ FreeRtos 错误处理部分 ************/

#ifdef __cplusplus
extern "C" {
#endif

void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    /* 栈溢出时的处理代码 */
    /* 例如，打印错误信息并重置系统 */

    /* 参数:
     * xTask - 发生栈溢出的任务句柄
     * pcTaskName - 发生栈溢出的任务名称
     */

    /* 通常在这里添加一些错误处理和系统恢复的代码 */
    while (1) {
        /* 可以在此处添加错误处理代码，如闪烁LED或输出调试信息 */
    }
}

/* 在全局范围内定义存储空间 */
static StaticTask_t xIdleTaskTCB;
static StackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE];

/* 实现所需的函数 */
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
                                   StackType_t **ppxIdleTaskStackBuffer,
                                   uint32_t *pulIdleTaskStackSize) {
    /* 传递静态分配的空闲任务数据结构的地址 */
    *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;

    /* 传递静态分配的空闲任务堆栈的地址 */
    *ppxIdleTaskStackBuffer = uxIdleTaskStack;

    /* 传递堆栈大小 */
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}


/* 为定时器任务定义静态内存 */
static StaticTask_t xTimerTaskTCB;
static StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH];

void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
                                    StackType_t **ppxTimerTaskStackBuffer,
                                    uint32_t *pulTimerTaskStackSize) {
    /* 传递静态分配的定时器任务数据结构的地址 */
    *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;

    /* 传递静态分配的定时器任务堆栈的地址 */
    *ppxTimerTaskStackBuffer = uxTimerTaskStack;

    /* 传递堆栈大小 */
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}

#ifdef __cplusplus
}
#endif