/*
    显示任务
*/

/* Includes ----------------------------------------------------------------- */
#include "task\user_task.h"
#include "device\can.h"
#include "task\user_task.h"
#include "bsp\led.h"
#include "bsp\buzzer.h"
#include "device\lcd.h"
#include "bsp\gpio.h"
#include "lvgl.h"          // 它为整个LVGL提供了更完整的头文件引用
#include "lv_port_disp.h"  // LVGL的显示支持
#include "lv_port_indev.h" // LVGL的触屏支持
#include "tim.h"
/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
static CAN_t can;

CAN_Sick_t sick;

/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM6)
    {
        lv_tick_inc(1); // LVGL的tick计数器
    }
}

void Task_Disp(void *argument)
{
    (void)argument;                                                     // 消除未使用参数的警告
    const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_DISP; // 50Hz
    uint32_t tick = osKernelGetTickCount();                             /* 控制任务运行频率的计时 */

    LCD_Init();
    lv_init();            // LVGL 初始化
    lv_port_disp_init();  // 注册LVGL的显示任务
    lv_port_indev_init(); // 注册LVGL的触屏检测任务
    LCD_Clear(WHITE);
    HAL_TIM_Base_Start_IT(&htim6); // 启动定时器中断

    // 按钮 1
    lv_obj_t *myBtn1 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象：当前活动屏幕
    lv_obj_set_pos(myBtn1, 170, 80);                // 设置坐标
    lv_obj_set_size(myBtn1, 60, 20);                // 设置大小

    // 按钮 1 的文本
    lv_obj_t *label_btn1 = lv_label_create(myBtn1);  // 创建文本标签，父对象：上面的btn按钮
    lv_obj_align(label_btn1, LV_ALIGN_CENTER, 0, 0); // 对齐于：父对象
    lv_label_set_text(label_btn1, "NEXT");           // 设置标签的文本

    // 按钮 2
    lv_obj_t *myBtn2 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象：当前活动屏幕
    lv_obj_set_pos(myBtn2, 170, 110);               // 设置坐标
    lv_obj_set_size(myBtn2, 60, 20);                // 设置大小

    // 按钮 2 的文本
    lv_obj_t *label_btn2 = lv_label_create(myBtn2);  // 创建文本标签，父对象：上面的btn按钮
    lv_obj_align(label_btn2, LV_ALIGN_CENTER, 0, 0); // 对齐于：父对象
    lv_label_set_text(label_btn2, "OK");

    lv_obj_t *label_sick1 = lv_label_create(lv_scr_act()); // 父对象：当前活动屏幕
    lv_obj_set_pos(label_sick1, 10, 10);                   // 设置坐标
    lv_label_set_text(label_sick1, "Sick1: 0");            // 设置初始文本

    // 创建 Sick2 标签
    lv_obj_t *label_sick2 = lv_label_create(lv_scr_act()); // 父对象：当前活动屏幕
    lv_obj_set_pos(label_sick2, 120, 10);                   // 设置坐标
    lv_label_set_text(label_sick2, "Sick2: 0");            // 设置初始文本

    // 创建 Sick3 标签
    lv_obj_t *label_sick3 = lv_label_create(lv_scr_act()); // 父对象：当前活动屏幕
    lv_obj_set_pos(label_sick3, 10, 40);                  // 设置坐标
    lv_label_set_text(label_sick3, "Sick3: 0");            // 设置初始文本

    // 创建 Sick4 标签
    lv_obj_t *label_sick4 = lv_label_create(lv_scr_act()); // 父对象：当前活动屏幕
    lv_obj_set_pos(label_sick4, 120, 40);                  // 设置坐标
    lv_label_set_text(label_sick4, "Sick4: 0");            // 设置初始文本

    // 创建 作者 标签
    lv_obj_t *label_board = lv_label_create(lv_scr_act()); // 父对象：当前活动屏幕
    lv_obj_set_pos(label_board, 10, 95);                  // 设置坐标
    lv_label_set_text(label_board, "Mini_croe");            // 设置初始文本

    lv_obj_t *label_name = lv_label_create(lv_scr_act()); // 父对象：当前活动屏幕
    lv_obj_set_pos(label_name, 10, 114);                  // 设置坐标
    lv_label_set_text(label_name, "By Robofish");            // 设置初始文本

    while (1)
    {
        tick += delay_tick; /* 计算下一个唤醒时刻 */
        // 读取数据
        lv_timer_handler(); // LVGL的定时器处理函数
        if (osMessageQueueGet(task_runtime.msgq.can.feedback.sick, &can, NULL, 100) == osOK)
        {
            osKernelLock();
            // 更新显示内容
            char buffer[16];
            snprintf(buffer, sizeof(buffer), "Sick1: %d", can.sick.named.sick[0]); // 假设 sick.value1 是 Sick1 的值
            lv_label_set_text(label_sick1, buffer);

            snprintf(buffer, sizeof(buffer), "Sick2: %d", can.sick.named.sick[1]); // 假设 sick.value2 是 Sick2 的值
            lv_label_set_text(label_sick2, buffer);

            snprintf(buffer, sizeof(buffer), "Sick3: %d", can.sick.named.sick[2]); // 假设 sick.value3 是 Sick3 的值
            lv_label_set_text(label_sick3, buffer);

            snprintf(buffer, sizeof(buffer), "Sick4: %d", can.sick.named.sick[3]); // 假设 sick.value4 是 Sick4 的值
            lv_label_set_text(label_sick4, buffer);
            osKernelUnlock();
        }

        osDelayUntil(tick); /* 运行结束，等待下一次唤醒 */
    }
}