Mini_croe_Sick/User/task/disp.c

123 lines
5.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
显示任务
*/
/* 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); /* 运行结束,等待下一次唤醒 */
}
}