/** * @file lisa_ui_llm_primary.h * @brief LLM UI主要组件头文件 * * 继承自LLM UI基础组件,提供具体的任务栏元素实现, * 包括WiFi图标、状态文本和电量图标,以及容器中的emoji动画和文本显示。 * * @version 1.0.0 * @date 2024 * @author Lisa UI Team */ #ifndef __LISA_UI_LLM_PRIMARY_H__ #define __LISA_UI_LLM_PRIMARY_H__ #ifdef __cplusplus extern "C" { #endif /*=========================================== * 包含文件 *==========================================*/ #include "lisa_ui_llm_base.h" #include "lvgl.h" #include #include /*=========================================== * 宏定义 *==========================================*/ /** 状态文本最大长度 */ #define LISA_UI_LLM_PRIMARY_MAX_STATUS_LENGTH 32 /** 内容文本最大长度 */ #define LISA_UI_LLM_PRIMARY_MAX_CONTENT_LENGTH 256 /** 类型检查宏 */ #define LISA_UI_LLM_PRIMARY_CLASS_CHECK(obj) \ (lv_obj_has_class(obj, &lisa_ui_llm_primary_class)) /** 根据每帧时长计算总动画时长的辅助宏 */ #define LISA_UI_LLM_DURATION_BY_FRAME(frame_duration_ms, frame_count) \ ((frame_duration_ms) * (frame_count)) /*=========================================== * 数据结构 *==========================================*/ /** * @brief emoji 动画类型枚举 */ typedef enum { LISA_UI_EMOJI_UNKNOW = 0, LISA_UI_EMOJI_LOVE, LISA_UI_EMOJI_SAD, LISA_UI_EMOJI_LAUGH, LISA_UI_EMOJI_SQUINT, LISA_UI_EMOJI_ANGRY, LISA_UI_EMOJI_EYE, LISA_UI_EMOJI_BLINK, LISA_UI_EMOJI_HUG, LISA_UI_EMOJI_PUZZLED, LISA_UI_EMOJI_WAKEUP, LISA_UI_EMOJI_SLEEPY, LISA_UI_EMOJI_WAIT, LISA_UI_EMOJI_BATTERY, LISA_UI_EMOJI_CHARGING, LISA_UI_EMOJI_START_BATTERY_CHANGE, LISA_UI_EMOJI_HAPPY, LISA_UI_EMOJI_CUTE, LISA_UI_EMOJI_MAX, } lisa_ui_emoji_type_e; /** * @brief LLM UI主要组件结构体 * * 继承自LLM UI基础组件,添加具体的任务栏元素和容器内容 */ struct lisa_ui_llm_primary { lisa_ui_llm_base_t base_obj; /*!< 基础对象 */ /* 任务栏元素 */ lv_obj_t *wifi_icon; /*!< WiFi图标 */ lv_obj_t *status_label; /*!< 状态文本标签 */ lv_obj_t *battery_icon; /*!< 电量图标 */ /* 容器内容元素 */ lv_obj_t *emoji_container; /*!< emoji 动画容器 */ lv_obj_t *emoji_img; /*!< emoji 动画图片 */ lv_obj_t *content_container; /*!< 内容文本容器 */ lv_obj_t *content_label; /*!< 内容文本标签 */ /* 动画相关 */ const void **emoji_images; /*!< emoji 图片数组 */ uint32_t emoji_images_count; /*!< emoji 图片数量 */ uint32_t current_emoji_frame; /*!< 当前动画帧 */ uint32_t first_frame_delay; /*!< 第一帧延迟时间(毫秒) */ uint32_t frame_duration; /*!< 每帧时长(毫秒) */ lv_timer_t *emoji_timer; /*!< emoji动画定时器 */ bool is_first_frame_delayed; /*!< 是否正在第一帧延迟中 */ /* 循环播放控制 */ uint32_t loop_count; /*!< 当前循环次数 */ uint32_t target_loops; /*!< 目标循环次数,0表示无限循环 */ bool loop_mode_enabled; /*!< 是否启用循环模式 */ }; /** LLM UI主要组件类型定义 */ typedef struct lisa_ui_llm_primary lisa_ui_llm_primary_t; /*=========================================== * 全局变量声明 *==========================================*/ /** LLM UI主要组件类定义 */ extern const lv_obj_class_t lisa_ui_llm_primary_class; /*=========================================== * 函数声明 *==========================================*/ /** * @brief 创建LLM UI主要组件 * * @param parent 父对象,如果为NULL则使用当前活动屏幕 * @return lv_obj_t* 创建的LLM UI主要组件对象,失败返回NULL * * @note 该函数会自动创建任务栏的所有元素和容器内容 * * @code * // 创建LLM UI主要组件 * lv_obj_t *llm_ui = lisa_ui_llm_primary_create(lv_scr_act()); * if (llm_ui != NULL) { * // 组件创建成功,包含完整的任务栏和内容区域 * } * @endcode */ lv_obj_t *lisa_ui_llm_primary_create(lv_obj_t *parent); /** * @brief 获取WiFi图标对象 * * @param obj LLM UI主要组件对象 * @return lv_obj_t* WiFi图标对象,失败返回NULL */ lv_obj_t *lisa_ui_llm_primary_wifi_icon_get(lv_obj_t *obj); /** * @brief 获取状态文本标签对象 * * @param obj LLM UI主要组件对象 * @return lv_obj_t* 状态文本标签对象,失败返回NULL */ lv_obj_t *lisa_ui_llm_primary_status_label_get(lv_obj_t *obj); /** * @brief 获取电量图标对象 * * @param obj LLM UI主要组件对象 * @return lv_obj_t* 电量图标对象,失败返回NULL */ lv_obj_t *lisa_ui_llm_primary_battery_icon_get(lv_obj_t *obj); /** * @brief 获取emoji动画图片对象 * * @param obj LLM UI主要组件对象 * @return lv_obj_t* emoji动画图片对象,失败返回NULL */ lv_obj_t *lisa_ui_llm_primary_emoji_img_get(lv_obj_t *obj); /** * @brief 获取内容文本标签对象 * * @param obj LLM UI主要组件对象 * @return lv_obj_t* 内容文本标签对象,失败返回NULL */ lv_obj_t *lisa_ui_llm_primary_content_label_get(lv_obj_t *obj); /** * @brief 设置状态文本 * * @param obj LLM UI主要组件对象 * @param status 状态文本,如果为NULL则清空状态 * */ void lisa_ui_llm_primary_set_status_text(lv_obj_t *obj, const char *status); /** * @brief 设置内容文本 * * @param obj LLM UI主要组件对象 * @param content 内容文本,如果为NULL则清空内容 * */ void lisa_ui_llm_primary_set_content_text(lv_obj_t *obj, const char *content); /** * @brief 设置内容文本(追加) * * @param obj LLM UI主要组件对象 * @param content 内容文本,如果为NULL则清空内容 * */ void lisa_ui_llm_primary_add_content_text(lv_obj_t *obj, const char *content); /** * @brief 设置WiFi图标显示状态 * * @param obj LLM UI主要组件对象 * @param img_path 图片路径,如果为NULL则不显示WiFi图标 */ void lisa_ui_llm_primary_set_wifi_img(lv_obj_t *obj, const void *img_path); /** * @brief 设置电量图标显示 * * @param obj LLM UI主要组件对象 * @param img_path 图片路径,如果为NULL则不显示电量图标 */ void lisa_ui_llm_primary_set_battery_img(lv_obj_t *obj, const void *img_path); /** * @brief 启动emoji动画 * * @param obj LLM UI主要组件对象 */ void lisa_ui_llm_primary_start_emoji_animation(lv_obj_t *obj); /** * @brief 停止emoji动画 * * @param obj LLM UI主要组件对象 */ void lisa_ui_llm_primary_stop_emoji_animation(lv_obj_t *obj); /** * @brief 设置自定义emoji动画图片 * * @param obj LLM UI主要组件对象 * @param images 图片数组指针 * @param images_count 图片数量 * @param duration 动画时长(毫秒) * @param first_frame_delay 第一帧停留时间(毫秒),0表示无延迟 */ void lisa_ui_llm_primary_set_custom_emoji_animation(lv_obj_t *obj, const void **images, uint32_t images_count, uint32_t duration, uint32_t first_frame_delay); /** * @brief 设置emoji动画循环参数 * * @param obj LLM UI主要组件对象 * @param loop_count 循环次数,0表示无限循环 */ void lisa_ui_llm_primary_set_loop_count(lv_obj_t *obj, uint32_t loop_count); /*=========================================== * 内联函数 *==========================================*/ /** * @brief 检查对象是否为LLM UI主要组件类型 * * @param obj 要检查的对象 * @return true 是LLM UI主要组件类型 * @return false 不是LLM UI主要组件类型 */ static inline bool lisa_ui_llm_primary_is_valid(lv_obj_t *obj) { return (obj != NULL) && LISA_UI_LLM_PRIMARY_CLASS_CHECK(obj); } #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __LISA_UI_LLM_PRIMARY_H__ */