feat: GIF动画表情系统 + 情绪映射增强 + HTTPS音频中止修复

一、新增功能:
1、新增8种GIF动画表情(200x89) + 3种叠加图标(45x45),实现22种情绪标签到GIF的映射表;
2、新增30+组英文近义词情绪fallback映射(如worried→sad),防止AI使用非标准标签时GIF无法切换;
3、新增HTTPS中止后诊断日志,自动追踪前20帧音频处理流程便于定位无声问题;

二、Bug修复:
4、修复HTTPS播放中止后RTC音频解码参数未恢复(16000/60→8000/20),通过background_task_串行化恢复;
5、修复AbortHttpsPlayback解码器竞态崩溃,将重置/恢复/DMA flush全部串行化执行;
6、修复LVGL gifdec不支持无全局颜色表GIF的问题,支持仅使用局部颜色表的压缩GIF;
7、修复GIF透明区域显示黑色方块,canvas初始alpha改为0x00;
8、修复lv_gif定时器gif对象为NULL时的空指针崩溃;

三、优化:
9、情绪标签从等待is_final改为第一条字幕即时触发GIF切换,新增去重和回复结束自动恢复neutral;
10、对话状态表情映射优化:THINKING→thinking、ANSWERING→happy、INTERRUPTED→surprised;
11、CPU核心绑定:LVGL任务Core0,音频循环Core1,避免GIF解码与音频争抢;
12、中文情绪词映射扩展,新增担心/心疼/着急等映射;

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Rdzleo 2026-03-19 15:28:14 +08:00
parent da098bf482
commit 919bf8f28f
22 changed files with 39808 additions and 90 deletions

1
.gitignore vendored
View File

@ -21,3 +21,4 @@ sdkconfig.old
05-最新日志.txt
07-uniapp最新日志.txt
/Dzbj_ESP32_S3
/esp-brookesia-master

View File

@ -53,7 +53,7 @@ set(SOURCES "audio_codecs/audio_codec.cc"
"ui/images/ui_img_s12_png.c"
"ui/images/ui_img_s13_png.c"
"ui/images/ui_img_s14_png.c"
# emoji
# emoji PNG
"ui/images/ui_img_neutral_png.c"
"ui/images/ui_img_happy_png.c"
"ui/images/ui_img_sad_png.c"
@ -61,6 +61,19 @@ set(SOURCES "audio_codecs/audio_codec.cc"
"ui/images/ui_img_crying_png.c"
"ui/images/ui_img_funny_png.c"
"ui/images/ui_img_laughing_png.c"
# GIF 200x89
"ui/images/my_emotion/emotion_angry_200_89.c"
"ui/images/my_emotion/emotion_blink1_200_89.c"
"ui/images/my_emotion/emotion_blink_fast_200_89.c"
"ui/images/my_emotion/emotion_blink_slow_200_89.c"
"ui/images/my_emotion/emotion_dizzy_200_89.c"
"ui/images/my_emotion/emotion_happy_200_89.c"
"ui/images/my_emotion/emotion_sad_200_89.c"
"ui/images/my_emotion/emotion_sleep_200_89.c"
# GIF 45x45
"ui/images/my_icon/icon_emotion_confused_45.c"
"ui/images/my_icon/icon_emotion_sleep_45.c"
"ui/images/my_icon/icon_emotion_thinking_45.c"
)
set(INCLUDE_DIRS "." "display" "audio_codecs" "protocols" "audio_processing" "audio" "dzbj" "ui")

View File

@ -35,6 +35,9 @@
#define TAG "Application"
#define MAC_TAG "BluetoothMAC"
// AI 对话界面 GIF 动画控制(纯 C 函数)
extern "C" void ai_chat_resume_animation(void);
// 设备空闲无对话状态 倒计时
#define DIALOG_IDLE_COUNTDOWN_SECONDS 40
@ -621,7 +624,7 @@ void Application::Start() {
Application* app = (Application*)arg;
app->AudioLoop();
vTaskDelete(NULL);
}, "audio_loop", 4096 * 3, this, 8, &audio_loop_task_handle_, realtime_chat_enabled_ ? 1 : 0);
}, "audio_loop", 4096 * 3, this, 8, &audio_loop_task_handle_, 1); // 始终绑定 Core 1与 LVGL(Core0) 隔离避免 GIF 解码争抢
/* Start the main loop */
xTaskCreatePinnedToCore([](void* arg) {
@ -1257,19 +1260,19 @@ void Application::Start() {
display->SetStatus("聆听中...");
break;
case 2: // THINKING
display->SetEmotion("neutral");
display->SetEmotion("thinking");
display->SetStatus("思考中...");
break;
case 3: // ANSWERING
display->SetEmotion("laughing");
display->SetEmotion("happy");
display->SetStatus("说话中...");
break;
case 4: // INTERRUPTED
display->SetEmotion("funny");
display->SetEmotion("surprised");
display->SetStatus("聆听中...");
break;
case 5: // ANSWER_FINISH
display->SetEmotion("happy");
display->SetEmotion("neutral");
display->SetStatus("聆听中...");
break;
}
@ -1298,8 +1301,9 @@ void Application::Start() {
std::string msg = text->valuestring;
std::string emotion_str;
// 提取并剥离字幕开头的情绪标签(如 "(平静)今天..."
// 实际 UTF-8= 0xEF 0xBC 0x88= 0xEF 0xBC 0x89
// 提取并剥离字幕开头的情绪标签
// 格式: "happy今天..." 或 "(平静)今天..."
// UTF-8= 0xEF 0xBC 0x88= 0xEF 0xBC 0x89
if (!is_user && msg.size() >= 6) {
const char* p = msg.c_str();
// 检查是否以全角左括号(开头
@ -1317,41 +1321,111 @@ void Application::Start() {
}
}
// 如果提取到情绪标签,映射到 emoji
if (!emotion_str.empty() && is_final) {
// 中文情绪词 → emoji 映射
struct { const char* keyword; const char* emoji; } emotion_map[] = {
{"开心", "happy"}, {"高兴", "happy"}, {"愉快", "happy"}, {"喜悦", "happy"},
{"兴奋", "happy"}, {"快乐", "happy"}, {"欢喜", "happy"},
{"平静", "neutral"}, {"冷静", "neutral"}, {"沉思", "neutral"},
{"思考", "neutral"}, {"疑惑", "neutral"}, {"好奇", "neutral"},
{"伤心", "sad"}, {"悲伤", "sad"}, {"难过", "sad"}, {"失落", "sad"},
{"忧伤", "sad"}, {"惆怅", "sad"}, {"低落", "sad"},
{"生气", "angry"}, {"愤怒", "angry"}, {"恼怒", "angry"}, {"不满", "angry"},
{"烦躁", "angry"}, {"气愤", "angry"},
{"哭泣", "crying"}, {"大哭", "crying"}, {"委屈", "crying"}, {"心疼", "crying"},
{"搞笑", "funny"}, {"调皮", "funny"}, {"惊讶", "funny"}, {"吃惊", "funny"},
{"俏皮", "funny"}, {"得意", "funny"}, {"无奈", "funny"},
{"大笑", "laughing"}, {"哈哈", "laughing"}, {"", "laughing"},
{"开怀", "laughing"}, {"爆笑", "laughing"},
};
// 去重用:记录当前轮次已设置的情绪,避免中间字幕重复触发
static std::string last_subtitle_emotion;
// 即时处理情绪标签(不等 is_final第一条字幕就触发 GIF 切换)
if (!emotion_str.empty()) {
const char* mapped_emoji = nullptr;
for (auto& entry : emotion_map) {
if (emotion_str.find(entry.keyword) != std::string::npos) {
mapped_emoji = entry.emoji;
// 英文情绪名直接使用(如 "happy"、"sleepy"
static const char* valid_emotions[] = {
"neutral", "happy", "sad", "angry", "thinking",
"confused", "surprised", "sleepy", "dizzy",
"embarrassed", "laughing", "funny", "crying",
"loving", "relaxed", "shocked", "curious", "blink",
"silly", "confident",
};
for (auto& valid : valid_emotions) {
if (emotion_str == valid) {
mapped_emoji = valid;
break;
}
}
if (mapped_emoji) {
// 回退1英文近义词映射AI可能使用非标准英文标签
if (!mapped_emoji) {
struct { const char* alias; const char* emoji; } en_fallback[] = {
{"worried", "sad"}, {"anxious", "sad"}, {"nervous", "sad"},
{"excited", "happy"}, {"joyful", "happy"}, {"cheerful", "happy"},
{"scared", "shocked"}, {"afraid", "shocked"}, {"fearful", "shocked"},
{"proud", "confident"}, {"determined", "confident"},
{"annoyed", "angry"}, {"frustrated", "angry"}, {"irritated", "angry"},
{"shy", "embarrassed"}, {"awkward", "embarrassed"},
{"bored", "sleepy"}, {"tired", "sleepy"}, {"exhausted", "sleepy"},
{"playful", "silly"}, {"mischievous", "silly"}, {"naughty", "silly"},
{"gentle", "loving"}, {"warm", "loving"}, {"tender", "loving"},
{"calm", "relaxed"}, {"peaceful", "relaxed"}, {"chill", "relaxed"},
{"puzzled", "confused"}, {"lost", "confused"},
{"amazed", "surprised"}, {"astonished", "surprised"},
{"moved", "crying"}, {"touched", "crying"},
{"hilarious", "laughing"}, {"amused", "laughing"},
};
for (auto& entry : en_fallback) {
if (emotion_str == entry.alias) {
mapped_emoji = entry.emoji;
ESP_LOGI(TAG, "英文近义词映射: %s → %s", entry.alias, entry.emoji);
break;
}
}
}
// 回退2中文情绪词映射兼容旧 prompt
if (!mapped_emoji) {
struct { const char* keyword; const char* emoji; } cn_map[] = {
{"开心", "happy"}, {"高兴", "happy"}, {"快乐", "happy"},
{"平静", "neutral"}, {"冷静", "neutral"}, {"正常", "neutral"},
{"思考", "thinking"}, {"沉吟", "thinking"},
{"困惑", "confused"}, {"疑惑", "confused"},
{"好奇", "curious"}, {"感兴趣", "curious"},
{"惊讶", "surprised"}, {"吃惊", "surprised"},
{"震惊", "shocked"}, {"没想到", "shocked"},
{"伤心", "sad"}, {"难过", "sad"}, {"失落", "sad"},
{"生气", "angry"}, {"愤怒", "angry"}, {"不满", "angry"},
{"尴尬", "embarrassed"}, {"害羞", "embarrassed"}, {"脸红", "blink"},
{"撒娇", "blink"}, {"卖萌", "blink"},
{"大笑", "laughing"}, {"哈哈", "laughing"},
{"搞笑", "funny"}, {"滑稽", "funny"}, {"逗趣", "funny"},
{"哭泣", "crying"}, {"感动", "crying"},
{"喜欢", "loving"}, {"", "loving"},
{"放松", "relaxed"}, {"悠闲", "relaxed"},
{"自信", "confident"}, {"肯定", "confident"},
{"调皮", "silly"}, {"搞怪", "silly"},
{"困倦", "sleepy"}, {"犯困", "sleepy"}, {"", "sleepy"}, {"疲倦", "sleepy"},
{"头晕", "dizzy"}, {"眩晕", "dizzy"},
{"担心", "sad"}, {"心疼", "sad"}, {"着急", "sad"},
};
for (auto& entry : cn_map) {
if (emotion_str.find(entry.keyword) != std::string::npos) {
mapped_emoji = entry.emoji;
break;
}
}
}
// 去重:同一情绪不重复设置(中间字幕每条都带相同标签)
if (mapped_emoji && last_subtitle_emotion != mapped_emoji) {
last_subtitle_emotion = mapped_emoji;
ESP_LOGI(TAG, "字幕情绪: %s → %s", emotion_str.c_str(), mapped_emoji);
Schedule([this, display, emo = std::string(mapped_emoji)]() {
display->SetEmotion(emo.c_str());
});
} else {
} else if (!mapped_emoji) {
ESP_LOGW(TAG, "未映射的字幕情绪: %s", emotion_str.c_str());
}
}
// AI 回复结束时自动恢复 neutral对齐喵伴 speaking_signal(false) 机制)
if (is_final && !is_user) {
if (last_subtitle_emotion != "neutral") {
last_subtitle_emotion = "neutral";
ESP_LOGI(TAG, "AI回复结束表情恢复 neutral");
Schedule([this, display]() {
display->SetEmotion("neutral");
});
}
}
const char* role = is_user ? "USER" : "AI";
ESP_LOGI(TAG, "%s %s: %s", is_final ? "📝" : "..", role, msg.c_str());
@ -2139,6 +2213,16 @@ void Application::OnAudioOutput() {
int src_rate = decoded ? opus_decoder_->sample_rate() : (protocol_ ? protocol_->server_sample_rate() : 16000);
static bool first_play_logged = false;
// 🔍 HTTPS中止后诊断日志追踪前N帧音频处理流程
int dbg = post_abort_debug_frames_.load();
if (dbg > 0) {
post_abort_debug_frames_.fetch_sub(1);
ESP_LOGI(TAG, "🔍 中止后音频[%d]: pcm=%zu样本 src_rate=%d treat_pcm=%d decoded=%d opus_frame=%d pipeline=%d output_en=%d",
20 - dbg + 1, pcm.size(), src_rate, (int)treat_as_pcm, (int)decoded,
(int)is_opus_frame, (player_pipeline_ != nullptr), codec->output_enabled());
}
if (player_pipeline_) {
player_pipeline_set_src_rate(player_pipeline_, src_rate);
int bytes = (int)(pcm.size() * sizeof(int16_t));
@ -2478,7 +2562,7 @@ void Application::AbortSpeaking(AbortReason reason) {
is_aborting_.store(false);
}
// 中止HTTPS音频播放清空队列、重置解码器、清除标志、DMA flush
// 中止HTTPS音频播放清空队列、重置解码器、恢复RTC参数、清除标志、DMA flush
void Application::AbortHttpsPlayback(const char* reason) {
ESP_LOGI(TAG, "🔴 %s中止HTTPS音频播放", reason);
https_playback_abort_.store(true);
@ -2489,23 +2573,58 @@ void Application::AbortHttpsPlayback(const char* reason) {
audio_decode_queue_.clear();
}
}
ResetDecoder();
// 先清除播放标志,让 background_task_ 中残留的 lambda 尽快跳过
opus_playback_active_.store(false);
https_playback_active_.store(false);
ESP_LOGI(TAG, "🔴 HTTPS播放标志已清除RTC音频通道已打开");
// DMA flush用独立任务立即清空I2S DMA缓冲区
// 不能用background_task_RTC音频lambda会持续占用它导致延迟数秒
xTaskCreate([](void* arg) {
auto codec = Board::GetInstance().GetAudioCodec();
if (codec) {
ESP_LOGI(TAG, "DMA flush: output_enabled=%d", codec->output_enabled());
codec->EnableOutput(false);
vTaskDelay(pdMS_TO_TICKS(10));
codec->EnableOutput(true);
ESP_LOGI(TAG, "🔇 音频输出已重置DMA缓冲区已清空");
// 启用诊断日志追踪中止后前20帧RTC音频的处理流程
post_abort_debug_frames_.store(20);
// 🔧 关键修复:通过 background_task_ 串行化解码器操作,避免与音频处理 lambda 竞态
// 直接调用 SetDecodeSampleRate 会在 RTC 回调线程上 reset opus_decoder_
// 而 background_task_ 线程可能正在 opus_decoder_->Decode(),导致 LoadProhibited 崩溃
if (background_task_) {
int srv_rate = 0, srv_dur = 0;
if (protocol_) {
srv_rate = protocol_->server_sample_rate();
srv_dur = protocol_->server_frame_duration();
}
vTaskDelete(NULL);
}, "dma_flush", 4096, NULL, 10, NULL);
background_task_->Schedule([this, srv_rate, srv_dur]() {
// 在 background_task_ 线程内安全重置解码器
{
std::lock_guard<std::mutex> lock(mutex_);
opus_decoder_->ResetState();
audio_decode_queue_.clear();
last_output_time_ = std::chrono::steady_clock::now();
}
// 恢复RTC音频解码参数HTTPS播放会修改为16000/60需恢复为RTC的8000/20
if (srv_rate > 0 && srv_dur > 0) {
SetDecodeSampleRate(srv_rate, srv_dur);
ESP_LOGI(TAG, "🔧 已恢复RTC解码参数: %dHz/%dms", srv_rate, srv_dur);
}
// DMA flush在同一线程中执行确保与 codec 写入串行
auto codec = Board::GetInstance().GetAudioCodec();
if (codec) {
codec->EnableOutput(false);
vTaskDelay(pdMS_TO_TICKS(20));
codec->EnableOutput(true);
ESP_LOGI(TAG, "🔇 DMA缓冲区已清空解码器已重置");
}
});
} else {
// fallback无 background_task_ 时直接操作(吧唧模式不走此路径)
ResetDecoder();
if (protocol_) {
int srv_rate = protocol_->server_sample_rate();
int srv_dur = protocol_->server_frame_duration();
if (srv_rate > 0 && srv_dur > 0) {
SetDecodeSampleRate(srv_rate, srv_dur);
}
}
}
}
// 通过HTTPS下载JSON并播放音频故事/歌曲等)
@ -3168,6 +3287,19 @@ void Application::HttpsApiPlayback(const char* api_url_base, const char* tag, co
app.https_playback_active_.store(false);
app.https_playback_abort_.store(false);
app.opus_playback_active_.store(false);
// 🔧 修复:通过 background_task_ 恢复RTC解码参数避免与音频处理 lambda 竞态
if (app.background_task_ && app.protocol_) {
int srv_rate = app.protocol_->server_sample_rate();
int srv_dur = app.protocol_->server_frame_duration();
if (srv_rate > 0 && srv_dur > 0) {
app.background_task_->Schedule([&app, srv_rate, srv_dur, tag]() {
app.SetDecodeSampleRate(srv_rate, srv_dur);
ESP_LOGI(TAG, "[%s] 已恢复RTC解码参数: %dHz/%dms", tag, srv_rate, srv_dur);
});
}
}
ESP_LOGI(TAG, "[%s] 播放结束, 堆: %lu", tag,
(unsigned long)esp_get_free_heap_size());
vTaskDelete(NULL);

View File

@ -152,6 +152,7 @@ private:
std::atomic<bool> opus_playback_active_{false};// Opus解码播放活跃标志WS/HTTPS共用
std::atomic<bool> https_playback_active_{false};// HTTPS音频播放进行中标志
std::atomic<bool> https_playback_abort_{false};// HTTPS音频播放中止标志
std::atomic<int> post_abort_debug_frames_{0};// HTTPS中止后诊断日志计数追踪前N帧音频
bool aborted_ = false;
bool voice_detected_ = false;
bool audio_paused_ = false; // 音频暂停状态标志

View File

@ -49,6 +49,7 @@ extern "C" void init_spiffs_image_list(void);
// AI 对话屏幕初始化(纯 C避免 lv_font_t 冲突)
extern "C" void ai_chat_screen_init(void);
extern "C" void ai_chat_resume_animation(void);
// 背光初始化pages_pwm.h 包含 LVGL 头文件,不能直接 include
extern "C" void pwm_init(void);

View File

@ -103,6 +103,7 @@ SpiLcdDisplay::SpiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_h
ESP_LOGI(TAG, "Initialize LVGL port");
lvgl_port_cfg_t port_cfg = ESP_LVGL_PORT_INIT_CONFIG();
port_cfg.task_priority = 1;
port_cfg.task_affinity = 0; // 绑定 Core 0与 WiFi/BLE 同核,让 Core 1 专供音频
port_cfg.timer_period_ms = 50;
lvgl_port_init(&port_cfg);

View File

@ -1,12 +1,37 @@
#include "ai_chat_ui.h"
#include "lvgl.h"
#include "esp_lvgl_port.h"
#include "esp_log.h"
#include <string.h>
// lv_gif API 通过 lvgl.h 自动包含LV_USE_GIF=y 时)
static const char *TAG = "AI_CHAT_UI";
// 声明阿里巴巴普惠体 20px 4bppGB2312 简体中文+ASCII
LV_FONT_DECLARE(font_puhui_20_4);
// 声明 emoji 图片资源
#if LV_USE_GIF
// 需要访问 lv_gif_t 内部结构(暂停/恢复定时器)
#include "extra/libs/gif/lv_gif.h"
// 声明 GIF 表情资源压缩优化200x89
LV_IMG_DECLARE(emotion_angry_200_89);
LV_IMG_DECLARE(emotion_blink1_200_89);
LV_IMG_DECLARE(emotion_blink_fast_200_89);
LV_IMG_DECLARE(emotion_blink_slow_200_89);
LV_IMG_DECLARE(emotion_dizzy_200_89);
LV_IMG_DECLARE(emotion_happy_200_89);
LV_IMG_DECLARE(emotion_sad_200_89);
LV_IMG_DECLARE(emotion_sleep_200_89);
// 声明 GIF 图标资源压缩优化45x45
LV_IMG_DECLARE(icon_emotion_confused_45);
LV_IMG_DECLARE(icon_emotion_sleep_45);
LV_IMG_DECLARE(icon_emotion_thinking_45);
#endif
// 声明旧 PNG 表情资源LV_USE_GIF 未启用时的回退)
LV_IMG_DECLARE(ui_img_neutral_png);
LV_IMG_DECLARE(ui_img_happy_png);
LV_IMG_DECLARE(ui_img_sad_png);
@ -17,12 +42,54 @@ LV_IMG_DECLARE(ui_img_laughing_png);
// 屏幕和控件
static lv_obj_t *ai_screen = NULL;
static lv_obj_t *emoji_img = NULL;
static lv_obj_t *status_label = NULL;
static lv_obj_t *chat_label = NULL;
// 背景色
#define BG_COLOR 0x121212
#if LV_USE_GIF
static lv_obj_t *gif_emotion = NULL; // GIF 表情对象
static lv_obj_t *gif_icon = NULL; // GIF 图标对象(叠加在表情右上角)
static bool gif_animation_paused = false;
#else
static lv_obj_t *emoji_img = NULL; // 旧 PNG 表情
#endif
// 背景色(纯黑,与 GIF 背景一致避免色差)
#define BG_COLOR 0x000000
// 表情→GIF 映射表
typedef struct {
const char *name;
const lv_img_dsc_t *emotion_gif;
const lv_img_dsc_t *icon_gif; // NULL 表示无叠加图标
} emotion_gif_entry_t;
#if LV_USE_GIF
static const emotion_gif_entry_t emotion_gif_map[] = {
{"neutral", &emotion_blink_slow_200_89, NULL},
{"happy", &emotion_happy_200_89, NULL},
{"laughing", &emotion_happy_200_89, NULL},
{"funny", &emotion_happy_200_89, NULL},
{"loving", &emotion_happy_200_89, NULL},
{"relaxed", &emotion_happy_200_89, NULL},
{"delicious", &emotion_happy_200_89, NULL},
{"kissy", &emotion_happy_200_89, NULL},
{"confident", &emotion_happy_200_89, NULL},
{"sad", &emotion_sad_200_89, NULL},
{"crying", &emotion_sad_200_89, NULL},
{"angry", &emotion_angry_200_89, NULL},
{"surprised", &emotion_blink_fast_200_89, NULL},
{"shocked", &emotion_blink_fast_200_89, NULL},
{"silly", &emotion_blink_fast_200_89, NULL},
{"embarrassed", &emotion_blink_fast_200_89, &icon_emotion_thinking_45},
{"thinking", &emotion_blink_fast_200_89, &icon_emotion_thinking_45},
{"confused", &emotion_blink_fast_200_89, &icon_emotion_confused_45},
{"curious", &emotion_blink_fast_200_89, &icon_emotion_confused_45},
{"dizzy", &emotion_dizzy_200_89, NULL},
{"blink", &emotion_blink1_200_89, NULL},
{"sleepy", &emotion_sleep_200_89, &icon_emotion_sleep_45},
};
#define EMOTION_GIF_MAP_SIZE (sizeof(emotion_gif_map) / sizeof(emotion_gif_map[0]))
#endif
void ai_chat_screen_init(void) {
// 创建 AI 对话屏幕
@ -31,21 +98,41 @@ void ai_chat_screen_init(void) {
lv_obj_set_style_bg_opa(ai_screen, 255, 0);
lv_obj_clear_flag(ai_screen, LV_OBJ_FLAG_SCROLLABLE);
// emoji 表情图片(屏幕中央偏上)
#if LV_USE_GIF
// GIF 表情屏幕正中央200x89
gif_emotion = lv_gif_create(ai_screen);
lv_gif_set_src(gif_emotion, &emotion_blink_slow_200_89);
lv_obj_align(gif_emotion, LV_ALIGN_CENTER, 0, 0);
// 降低 GIF 定时器频率10ms→20ms平衡动画流畅度与 CPU 占用
lv_gif_t *gifobj = (lv_gif_t *)gif_emotion;
lv_timer_set_period(gifobj->timer, 20);
// GIF 图标表情上方居中45x45
// 表情高89顶边y=-44.5icon高45中心再上移几像素避免重叠
gif_icon = lv_gif_create(ai_screen);
lv_obj_align(gif_icon, LV_ALIGN_CENTER, 0, -70);
lv_obj_add_flag(gif_icon, LV_OBJ_FLAG_HIDDEN);
#else
// 旧 PNG 表情(回退方案)
emoji_img = lv_img_create(ai_screen);
lv_img_set_src(emoji_img, &ui_img_neutral_png);
lv_obj_align(emoji_img, LV_ALIGN_CENTER, 0, -55);
lv_obj_align(emoji_img, LV_ALIGN_CENTER, 0, 0);
#endif
// 状态文本(表情下方,居中)
// 状态文本(暂时隐藏GIF 模式下不需要文字
status_label = lv_label_create(ai_screen);
lv_obj_set_style_text_font(status_label, &font_puhui_20_4, 0);
lv_obj_set_style_text_color(status_label, lv_color_white(), 0);
lv_obj_set_width(status_label, 300);
lv_obj_set_style_text_align(status_label, LV_TEXT_ALIGN_CENTER, 0);
lv_label_set_text(status_label, "正在初始化...");
lv_obj_align(status_label, LV_ALIGN_CENTER, 0, 5);
lv_label_set_text(status_label, "");
lv_obj_align(status_label, LV_ALIGN_CENTER, 0, 90);
#if LV_USE_GIF
lv_obj_add_flag(status_label, LV_OBJ_FLAG_HIDDEN);
#endif
// 聊天消息文本(下半部分)
// 聊天消息文本(暂时隐藏,不显示字幕
chat_label = lv_label_create(ai_screen);
lv_obj_set_style_text_font(chat_label, &font_puhui_20_4, 0);
lv_obj_set_style_text_color(chat_label, lv_color_hex(0xAAAAAA), 0);
@ -54,6 +141,7 @@ void ai_chat_screen_init(void) {
lv_label_set_text(chat_label, "");
lv_obj_align(chat_label, LV_ALIGN_CENTER, 0, 50);
lv_label_set_long_mode(chat_label, LV_LABEL_LONG_WRAP);
lv_obj_add_flag(chat_label, LV_OBJ_FLAG_HIDDEN);
// 加载屏幕
lv_disp_load_scr(ai_screen);
@ -61,42 +149,102 @@ void ai_chat_screen_init(void) {
void ai_chat_set_status(const char* status) {
if (!status_label) return;
#if LV_USE_GIF
// GIF 模式下隐藏状态文字,仅记录日志
ESP_LOGD(TAG, "状态: %sGIF模式不显示", status);
(void)status;
#else
lvgl_port_lock(50);
lv_label_set_text(status_label, status);
lvgl_port_unlock();
#endif
}
void ai_chat_resume_animation(void) {
#if LV_USE_GIF
if (!gif_emotion || !gif_animation_paused) return;
if (!lvgl_port_lock(200)) return;
lv_gif_t *gifobj = (lv_gif_t *)gif_emotion;
lv_timer_resume(gifobj->timer);
gif_animation_paused = false;
ESP_LOGI(TAG, "GIF动画已恢复播放");
lvgl_port_unlock();
#endif
}
void ai_chat_set_emotion(const char* emotion) {
if (!emotion) return;
#if LV_USE_GIF
if (!gif_emotion) return;
if (!lvgl_port_lock(200)) {
ESP_LOGW(TAG, "LVGL锁超时跳过表情切换: %s", emotion);
return;
}
// 查找映射表
const emotion_gif_entry_t *entry = NULL;
for (int i = 0; i < EMOTION_GIF_MAP_SIZE; i++) {
if (strcmp(emotion, emotion_gif_map[i].name) == 0) {
entry = &emotion_gif_map[i];
break;
}
}
// 未找到映射,默认使用 neutral
if (!entry) {
ESP_LOGW(TAG, "未映射的GIF表情: %s, 使用 neutral", emotion);
entry = &emotion_gif_map[0]; // neutral
}
// 切换表情 GIFlv_gif_set_src 内部已自动启动播放)
lv_gif_set_src(gif_emotion, entry->emotion_gif);
// set_src 内部会重建 10ms 定时器,重新设置为 50ms 降低 CPU 占用
lv_gif_t *gifobj = (lv_gif_t *)gif_emotion;
lv_timer_set_period(gifobj->timer, 20);
gif_animation_paused = false;
// 处理叠加图标
if (entry->icon_gif) {
lv_gif_set_src(gif_icon, entry->icon_gif);
lv_gif_t *icon_gifobj = (lv_gif_t *)gif_icon;
lv_timer_set_period(icon_gifobj->timer, 20);
lv_obj_clear_flag(gif_icon, LV_OBJ_FLAG_HIDDEN);
} else {
// 隐藏图标时暂停其定时器,避免空跑浪费 CPU
lv_gif_t *icon_gifobj = (lv_gif_t *)gif_icon;
if (icon_gifobj->gif) {
lv_timer_pause(icon_gifobj->timer);
}
lv_obj_add_flag(gif_icon, LV_OBJ_FLAG_HIDDEN);
}
ESP_LOGI(TAG, "GIF表情切换: %s%s", emotion, entry->icon_gif ? " +图标" : "");
lvgl_port_unlock();
#else
// 旧 PNG 回退逻辑
if (!emoji_img) return;
lvgl_port_lock(50);
const lv_img_dsc_t *img = &ui_img_neutral_png;
if (strcmp(emotion, "neutral") == 0) {
img = &ui_img_neutral_png;
} else if (strcmp(emotion, "happy") == 0) {
img = &ui_img_happy_png;
} else if (strcmp(emotion, "sad") == 0) {
img = &ui_img_sad_png;
} else if (strcmp(emotion, "angry") == 0) {
img = &ui_img_angry_png;
} else if (strcmp(emotion, "surprised") == 0) {
img = &ui_img_funny_png;
} else if (strcmp(emotion, "thinking") == 0) {
img = &ui_img_neutral_png;
} else if (strcmp(emotion, "crying") == 0) {
img = &ui_img_crying_png;
} else if (strcmp(emotion, "laughing") == 0) {
img = &ui_img_laughing_png;
}
if (strcmp(emotion, "neutral") == 0) img = &ui_img_neutral_png;
else if (strcmp(emotion, "happy") == 0) img = &ui_img_happy_png;
else if (strcmp(emotion, "sad") == 0) img = &ui_img_sad_png;
else if (strcmp(emotion, "angry") == 0) img = &ui_img_angry_png;
else if (strcmp(emotion, "surprised") == 0) img = &ui_img_funny_png;
else if (strcmp(emotion, "crying") == 0) img = &ui_img_crying_png;
else if (strcmp(emotion, "laughing") == 0) img = &ui_img_laughing_png;
lv_img_set_src(emoji_img, img);
lvgl_port_unlock();
#endif
}
void ai_chat_set_chat_message(const char* role, const char* content) {
if (!chat_label) return;
lvgl_port_lock(50);
lv_label_set_text(chat_label, content ? content : "");
lvgl_port_unlock();
// 字幕暂时隐藏,不更新内容
// 后续恢复时去掉 return 和 ai_chat_screen_init 中的 LV_OBJ_FLAG_HIDDEN
(void)role;
(void)content;
}

View File

@ -17,6 +17,10 @@ void ai_chat_set_emotion(const char* emotion);
// 更新聊天消息(预留接口)
void ai_chat_set_chat_message(const char* role, const char* content);
// 恢复 GIF 动画播放(开机音频播放完成后调用)
void ai_chat_resume_animation(void);
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,340 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_ICON_EMOTION_SLEEP_45
#define LV_ATTRIBUTE_IMG_ICON_EMOTION_SLEEP_45
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ICON_EMOTION_SLEEP_45 uint8_t icon_emotion_sleep_45_map[] = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x2d, 0x00, 0x2d, 0x00, 0xf6, 0x05, 0x00,
0x00, 0x04, 0x00, 0x08, 0x04, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x08,
0x0c, 0x08, 0x10, 0x0c, 0x10, 0x18, 0x18, 0x18, 0x18, 0x14, 0x18, 0x10, 0x14,
0x10, 0x21, 0x20, 0x21, 0x18, 0x1c, 0x18, 0x21, 0x1c, 0x21, 0x21, 0x24, 0x21,
0x29, 0x24, 0x29, 0x29, 0x2c, 0x29, 0x29, 0x28, 0x29, 0x31, 0x2c, 0x31, 0x31,
0x30, 0x31, 0x31, 0x34, 0x31, 0x39, 0x38, 0x39, 0x39, 0x34, 0x39, 0x39, 0x3c,
0x39, 0x52, 0x55, 0x52, 0x42, 0x41, 0x42, 0x52, 0x51, 0x52, 0x42, 0x45, 0x42,
0x4a, 0x49, 0x4a, 0x4a, 0x4d, 0x4a, 0x5a, 0x59, 0x5a, 0x73, 0x71, 0x73, 0x6b,
0x69, 0x6b, 0x63, 0x65, 0x63, 0x6b, 0x6d, 0x6b, 0x6b, 0x65, 0x6b, 0x63, 0x61,
0x63, 0x5a, 0x5d, 0x5a, 0x73, 0x6d, 0x73, 0x4a, 0x45, 0x4a, 0x5a, 0x55, 0x5a,
0x42, 0x3c, 0x42, 0x52, 0x4d, 0x52, 0x4a, 0x51, 0x4a, 0x63, 0x69, 0x63, 0x63,
0x5d, 0x63, 0x73, 0x75, 0x73, 0x7b, 0x79, 0x7b, 0x7b, 0x75, 0x7b, 0x73, 0x79,
0x73, 0x94, 0x96, 0x94, 0x9c, 0x9a, 0x9c, 0x8c, 0x8e, 0x8c, 0x94, 0x92, 0x94,
0x8c, 0x8a, 0x8c, 0x7b, 0x7d, 0x7b, 0x9c, 0x9e, 0x9c, 0xbd, 0xbe, 0xbd, 0xbd,
0xba, 0xbd, 0xc6, 0xc3, 0xc6, 0xd6, 0xd7, 0xd6, 0xce, 0xcf, 0xce, 0xce, 0xd3,
0xce, 0xd6, 0xd3, 0xd6, 0xc6, 0xc7, 0xc6, 0xad, 0xae, 0xad, 0xb5, 0xb6, 0xb5,
0xb5, 0xb2, 0xb5, 0xce, 0xcb, 0xce, 0xa5, 0xaa, 0xa5, 0xbd, 0xc3, 0xbd, 0x84,
0x82, 0x84, 0x84, 0x86, 0x84, 0x39, 0x41, 0x39, 0xa5, 0xa2, 0xa5, 0xa5, 0xa6,
0xa5, 0xde, 0xdf, 0xde, 0xde, 0xdb, 0xde, 0x9c, 0x96, 0x9c, 0x84, 0x8a, 0x84,
0xe7, 0xe3, 0xe7, 0xad, 0xaa, 0xad, 0x8c, 0x86, 0x8c, 0x9c, 0xa2, 0x9c, 0xb5,
0xba, 0xb5, 0xa5, 0x9e, 0xa5, 0x5a, 0x61, 0x5a, 0xe7, 0xe7, 0xe7, 0xef, 0xef,
0xef, 0xf7, 0xf7, 0xf7, 0xe7, 0xeb, 0xe7, 0xf7, 0xf3, 0xf7, 0x7b, 0x82, 0x7b,
0x94, 0x8e, 0x94, 0x84, 0x7d, 0x84, 0xbd, 0xb6, 0xbd, 0xad, 0xa6, 0xad, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xce, 0xc7, 0xce, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xfe, 0x2e, 0x47, 0x49, 0x46,
0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x77,
0x69, 0x74, 0x68, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x65,
0x7a, 0x67, 0x69, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x65, 0x00, 0x21, 0xff, 0x0b, 0x4e, 0x45, 0x54, 0x53, 0x43,
0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, 0x03, 0x01, 0x00, 0x00, 0x00, 0x21, 0xf9,
0x04, 0x05, 0x20, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00,
0x2d, 0x00, 0x00, 0x07, 0xf5, 0x80, 0x5f, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x87, 0x09,
0x1c, 0x17, 0x04, 0xa9, 0x1c, 0x3b, 0x4e, 0x42, 0x31, 0x22, 0x1a, 0x0e, 0x03,
0xa4, 0x22, 0x62, 0x56, 0x61, 0x60, 0x57, 0x55, 0x37, 0x49, 0x45, 0x1a, 0x0a,
0xa1, 0x08, 0x17, 0x2c, 0x31, 0x40, 0x55, 0xc1, 0x61, 0x56, 0x3a, 0x3e, 0x32,
0x15, 0xa3, 0x03, 0x0c, 0x1a, 0x30, 0x42, 0x4e, 0x57, 0x60, 0x56, 0x45, 0x00,
0xa6, 0x09, 0x31, 0xdf, 0x3c, 0x1c, 0xa6, 0x1b, 0x3f, 0xc0, 0x3a, 0x1f, 0x07,
0xa4, 0x04, 0x23, 0x42, 0xd2, 0x52, 0x16, 0xa5, 0x0a, 0x45, 0x3a, 0xd2, 0x48,
0xd7, 0xa4, 0x17, 0x48, 0xb2, 0x5c, 0xe1, 0xc1, 0x82, 0x17, 0x29, 0x0d, 0x37,
0xae, 0x5c, 0xf1, 0x31, 0x42, 0x00, 0xa9, 0x04, 0x2c, 0xf6, 0x59, 0x89, 0x32,
0x61, 0xdc, 0x28, 0x03, 0x31, 0xbc, 0x29, 0x91, 0x81, 0x20, 0xde, 0x3a, 0x60,
0x42, 0x44, 0x18, 0x88, 0xa7, 0x62, 0xc7, 0x15, 0x2b, 0x41, 0x2e, 0x94, 0x1a,
0x50, 0x63, 0x89, 0x34, 0x6b, 0xa6, 0x2a, 0xd0, 0x43, 0xf9, 0x41, 0x82, 0x43,
0x52, 0x18, 0xf6, 0x09, 0x53, 0xb2, 0xe3, 0x07, 0x8b, 0x8a, 0xa2, 0x0e, 0x68,
0x68, 0x01, 0x44, 0x09, 0xb0, 0x30, 0x27, 0x77, 0x20, 0x69, 0xc1, 0x01, 0x42,
0x28, 0x01, 0x0c, 0x3e, 0x38, 0xdb, 0x71, 0x34, 0x8b, 0x12, 0x1b, 0x06, 0x83,
0x5e, 0x08, 0x41, 0x23, 0x48, 0x15, 0x94, 0x01, 0x52, 0x25, 0xc0, 0xa0, 0xa1,
0x15, 0xa7, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00, 0x2c,
0x15, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x00, 0x02, 0x2a, 0x9c, 0x6f,
0x00, 0x88, 0xa1, 0x02, 0xd9, 0x83, 0x54, 0xb4, 0xba, 0xde, 0x5d, 0xc7, 0x71,
0xd6, 0x45, 0xe0, 0x36, 0x92, 0xe5, 0xa0, 0x9d, 0xa8, 0x78, 0xb2, 0xa5, 0xa7,
0xae, 0x71, 0x9a, 0xd0, 0xf0, 0x44, 0x85, 0x58, 0x00, 0x62, 0xed, 0x07, 0x2a,
0x00, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x09, 0x00, 0x2c, 0x15, 0x00,
0x0f, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x04, 0x45, 0x30, 0xc9, 0x99, 0x80,
0x20, 0x34, 0x07, 0x32, 0xd0, 0x41, 0x02, 0x65, 0x71, 0xde, 0xf7, 0x05, 0x54,
0x51, 0x0e, 0xc4, 0xf6, 0x69, 0x6d, 0xfa, 0x66, 0x9a, 0x87, 0xd2, 0x32, 0x86,
0x4f, 0x40, 0x77, 0xef, 0x95, 0x19, 0x30, 0xe1, 0x1b, 0x06, 0x41, 0x38, 0x00,
0x0f, 0x39, 0xec, 0x31, 0x45, 0x39, 0xde, 0xc5, 0x26, 0x71, 0x5e, 0xa6, 0xa6,
0xc2, 0xcd, 0xb9, 0xf2, 0x29, 0x97, 0xd9, 0x6f, 0x52, 0x20, 0xa6, 0x45, 0x00,
0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0c, 0x00, 0x2c, 0x14, 0x00, 0x0f,
0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x04, 0x55, 0x90, 0xc9, 0x29, 0x03, 0x19,
0x80, 0x52, 0x20, 0x86, 0x59, 0x89, 0x52, 0x68, 0xcc, 0x65, 0x28, 0xc9, 0x82,
0x26, 0xc2, 0x76, 0x80, 0x8a, 0x81, 0x0d, 0x21, 0x89, 0x1c, 0x45, 0xc6, 0x00,
0xdf, 0x40, 0x92, 0x82, 0x58, 0xeb, 0x47, 0xa1, 0x21, 0x88, 0x9a, 0x13, 0x01,
0x39, 0x29, 0xa8, 0x98, 0x95, 0x1e, 0xb4, 0x14, 0x0a, 0x4c, 0x11, 0x35, 0x68,
0x00, 0x05, 0xb4, 0x25, 0x10, 0x3a, 0xcb, 0xcd, 0x60, 0x8d, 0x7e, 0x3b, 0x87,
0x55, 0x6c, 0x03, 0x6a, 0x87, 0x70, 0x40, 0x35, 0x06, 0x09, 0x18, 0x60, 0x74,
0xa4, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x05, 0x00, 0x2c, 0x14,
0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x05, 0x5d, 0x60, 0x21, 0x8e,
0xa2, 0x80, 0x18, 0x64, 0x5a, 0x10, 0x06, 0xe3, 0x40, 0x0f, 0x92, 0x9a, 0x8a,
0xfb, 0xda, 0x44, 0x9a, 0x3c, 0x30, 0x63, 0x0c, 0x08, 0x07, 0x03, 0x40, 0x02,
0xd4, 0x0e, 0x81, 0xd1, 0xee, 0xa0, 0x52, 0x11, 0x1e, 0x8d, 0xa6, 0xca, 0x20,
0x24, 0x4a, 0x4b, 0xae, 0xc1, 0x75, 0x74, 0x80, 0x5a, 0xb7, 0xcb, 0x2d, 0xb6,
0x21, 0x10, 0x17, 0xa8, 0x0a, 0xb3, 0x00, 0xaa, 0x9d, 0xa5, 0x82, 0xe9, 0x02,
0xc0, 0xb4, 0x1b, 0x92, 0x96, 0xac, 0x5d, 0x2f, 0x51, 0xc6, 0xf6, 0x6e, 0x0a,
0x48, 0x49, 0x23, 0x4f, 0x37, 0x08, 0x7d, 0x52, 0x06, 0x3f, 0x57, 0x21, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x08, 0x00, 0x2c, 0x14, 0x00, 0x0f, 0x00,
0x10, 0x00, 0x13, 0x00, 0x00, 0x05, 0x66, 0x20, 0x22, 0x8e, 0x22, 0xa1, 0x30,
0x02, 0x49, 0x0a, 0x47, 0xe2, 0x4c, 0xd5, 0x74, 0xa8, 0x66, 0x13, 0xc1, 0xb8,
0xbc, 0xbe, 0x71, 0x94, 0x18, 0x8b, 0x49, 0x44, 0x85, 0xb0, 0x19, 0x04, 0x00,
0x44, 0xe0, 0xb5, 0x20, 0x26, 0x57, 0xc2, 0x01, 0x51, 0x05, 0x48, 0x4c, 0x1a,
0x53, 0xda, 0x6d, 0x96, 0x1d, 0x05, 0x1d, 0xdd, 0xd1, 0x52, 0x17, 0x56, 0x46,
0xcb, 0x63, 0x14, 0x5a, 0x42, 0xe1, 0x8a, 0x0b, 0x2a, 0xc5, 0x35, 0xa0, 0x1c,
0x9c, 0x28, 0x11, 0xf8, 0xe8, 0x21, 0x1b, 0xb8, 0x28, 0x3d, 0x0e, 0x7a, 0x66,
0x31, 0x39, 0x0f, 0x0a, 0x83, 0x25, 0x80, 0x78, 0x88, 0x4f, 0x4e, 0x09, 0x09,
0x03, 0x74, 0x68, 0x65, 0x21, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0b,
0x00, 0x2c, 0x14, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x06, 0x7c,
0xc0, 0x85, 0x70, 0x28, 0x1c, 0x38, 0x24, 0x05, 0xe2, 0x10, 0x50, 0x50, 0x38,
0x2e, 0x98, 0x28, 0x43, 0x69, 0x9c, 0x64, 0xa2, 0x58, 0x94, 0x82, 0x48, 0x80,
0x5a, 0x30, 0x99, 0x08, 0xc3, 0x01, 0x0e, 0x70, 0x29, 0x97, 0x46, 0x72, 0x21,
0x38, 0x61, 0x1c, 0xca, 0xf8, 0x02, 0x81, 0xd2, 0x18, 0xe4, 0xca, 0x08, 0x66,
0x22, 0xc0, 0x0f, 0x07, 0x57, 0x09, 0x7e, 0x43, 0x0f, 0x65, 0x83, 0x6c, 0x15,
0x6f, 0x87, 0x73, 0x29, 0x76, 0x8b, 0x7a, 0x14, 0x66, 0x83, 0x80, 0x1b, 0x82,
0x5c, 0x03, 0x00, 0x44, 0x85, 0x15, 0x7d, 0x02, 0x06, 0x0f, 0x13, 0x1b, 0x8e,
0x42, 0x6d, 0x6f, 0x06, 0x12, 0x5e, 0x16, 0x1a, 0x15, 0x08, 0x43, 0x06, 0x1b,
0x26, 0xa2, 0x5f, 0xab, 0x0f, 0x07, 0x7d, 0xae, 0x29, 0xaa, 0x61, 0x03, 0x7e,
0x04, 0x11, 0x11, 0x0a, 0xb7, 0x71, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
0x00, 0x08, 0x00, 0x2c, 0x14, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x13, 0x00, 0x00,
0x06, 0x88, 0x40, 0x84, 0x70, 0x48, 0x04, 0x10, 0x8f, 0x43, 0x80, 0x61, 0x92,
0x19, 0x20, 0x85, 0x87, 0xc6, 0x85, 0xe3, 0x01, 0x79, 0x22, 0xc7, 0xa5, 0x66,
0x54, 0xed, 0x7a, 0x1a, 0xc4, 0x82, 0xa9, 0xcb, 0xb9, 0x44, 0x26, 0x1e, 0x8e,
0xa0, 0x58, 0xc2, 0x60, 0x85, 0x04, 0x0c, 0x68, 0xf2, 0x34, 0x0e, 0x15, 0x9e,
0x15, 0xe3, 0xc9, 0xf6, 0x68, 0xf8, 0x44, 0x06, 0x5c, 0x0e, 0x80, 0x43, 0x14,
0x69, 0x04, 0x85, 0x42, 0x72, 0x12, 0x8a, 0x08, 0x06, 0x2a, 0x23, 0x0a, 0x8a,
0x02, 0x17, 0x20, 0x25, 0x6b, 0x85, 0x82, 0x1f, 0x84, 0x61, 0x06, 0x01, 0x49,
0x68, 0x1b, 0x89, 0x05, 0x0c, 0x14, 0x1b, 0x1f, 0x23, 0x09, 0x43, 0x62, 0x57,
0x0c, 0x53, 0x22, 0x1d, 0x20, 0x22, 0x18, 0x0b, 0x43, 0x09, 0x1f, 0x24, 0x22,
0x21, 0x56, 0x22, 0x1a, 0x13, 0x09, 0x89, 0xb7, 0x2a, 0xba, 0x1c, 0x15, 0x9f,
0x7c, 0x03, 0x27, 0x27, 0x0c, 0xc2, 0x48, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05,
0x04, 0x00, 0x02, 0x00, 0x2c, 0x14, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00,
0x00, 0x06, 0x80, 0x40, 0x81, 0x70, 0x28, 0x54, 0x54, 0x34, 0x08, 0xe2, 0x30,
0x60, 0x70, 0x64, 0x56, 0x9d, 0x56, 0x47, 0xa2, 0x34, 0x62, 0x3e, 0x2c, 0xa9,
0xe7, 0xd5, 0x79, 0x10, 0x07, 0xa3, 0x2c, 0x6b, 0x55, 0x92, 0x54, 0xc6, 0x4a,
0xc1, 0x86, 0x43, 0x19, 0x0c, 0x39, 0xac, 0x4a, 0x3a, 0xa0, 0x4c, 0x74, 0x3e,
0xe9, 0x7c, 0x86, 0x85, 0x22, 0xe4, 0x89, 0x0a, 0x1f, 0x20, 0x11, 0x7f, 0x44,
0x67, 0x23, 0x85, 0x44, 0x70, 0x13, 0x89, 0x43, 0x77, 0x09, 0x8d, 0x6a, 0x2f,
0x1b, 0x91, 0x02, 0x21, 0x83, 0x4a, 0x03, 0x0a, 0x4a, 0x67, 0x16, 0x04, 0x00,
0x03, 0x0f, 0x15, 0x18, 0x20, 0x1f, 0x0c, 0x43, 0x60, 0x71, 0x0f, 0x1a, 0x23,
0x20, 0x2d, 0x2d, 0x2a, 0x16, 0x90, 0x42, 0x0c, 0xae, 0x5b, 0x2e, 0xb0, 0x18,
0x15, 0xa7, 0x4a, 0xb6, 0x1f, 0x17, 0x9b, 0x7f, 0x08, 0x17, 0x19, 0x5e, 0x7f,
0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0a, 0x00, 0x2c, 0x14, 0x00,
0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x07, 0x97, 0x80, 0x0a, 0x82, 0x83,
0x82, 0x09, 0x1a, 0x1c, 0x06, 0x84, 0x83, 0x02, 0x09, 0x12, 0x16, 0x2f, 0x34,
0x33, 0x34, 0x15, 0x84, 0x00, 0x86, 0x1f, 0x2d, 0x32, 0x30, 0x34, 0x45, 0x92,
0x12, 0x84, 0x08, 0x1d, 0x91, 0x32, 0x2c, 0x16, 0x17, 0x1a, 0xa4, 0x05, 0xa0,
0x54, 0x20, 0x17, 0x08, 0x01, 0x0a, 0x03, 0x20, 0x5b, 0x1b, 0x8a, 0x0a, 0x02,
0x8a, 0x0c, 0x34, 0x35, 0x11, 0xb6, 0xb6, 0x1c, 0x32, 0x22, 0xaa, 0xbe, 0x83,
0x0c, 0x2d, 0x46, 0x94, 0xc4, 0x83, 0xa8, 0x1d, 0x03, 0xca, 0x82, 0x04, 0xb3,
0x19, 0xcf, 0x85, 0x9c, 0x0f, 0xd4, 0x0a, 0x26, 0x33, 0x23, 0x04, 0xd4, 0x0b,
0x35, 0xc8, 0x8a, 0x08, 0x09, 0xb8, 0xcb, 0x32, 0x1e, 0xaf, 0x07, 0x11, 0x1a,
0x1f, 0x46, 0x2d, 0x0e, 0x83, 0xa1, 0x5b, 0x17, 0x8e, 0xa2, 0x30, 0x33, 0x45,
0x1e, 0xd7, 0x82, 0x10, 0x50, 0x4c, 0x45, 0xa3, 0x8a, 0x88, 0xd0, 0xe0, 0xc0,
0xd9, 0xa0, 0x08, 0x91, 0xdc, 0x61, 0x60, 0xa0, 0xcc, 0x00, 0x06, 0x0b, 0x11,
0x0c, 0xda, 0x0a, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00,
0x2c, 0x14, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x07, 0x9a, 0x80,
0x00, 0x82, 0x83, 0x82, 0x0c, 0x16, 0x1f, 0x0a, 0x84, 0x84, 0x0c, 0x15, 0x54,
0x46, 0x36, 0x48, 0x31, 0x25, 0x8a, 0x0d, 0x18, 0x1d, 0x34, 0x51, 0x4f, 0x36,
0x33, 0x91, 0x13, 0x84, 0x06, 0x45, 0x53, 0x43, 0x36, 0x45, 0x22, 0x1a, 0x26,
0x48, 0x45, 0x8a, 0x00, 0x1e, 0x35, 0x1b, 0x06, 0x83, 0x2d, 0x48, 0x16, 0xab,
0xab, 0x0e, 0x31, 0x32, 0x9e, 0xb5, 0x83, 0x04, 0x22, 0x48, 0x20, 0x03, 0xbb,
0x83, 0x0f, 0x4d, 0x30, 0x17, 0xc2, 0x83, 0x18, 0x36, 0x35, 0x08, 0xc8, 0x00,
0x05, 0x2d, 0x36, 0x1b, 0xce, 0x00, 0x0c, 0x9b, 0x0e, 0xce, 0xbd, 0xbf, 0x05,
0xce, 0x0c, 0x32, 0x33, 0x19, 0x8a, 0x07, 0x0f, 0x04, 0x84, 0x16, 0xcb, 0x07,
0x00, 0x06, 0x14, 0x16, 0x1d, 0x30, 0x34, 0x12, 0x83, 0x07, 0xb2, 0x1a, 0x13,
0x1f, 0x35, 0x30, 0x43, 0x49, 0x33, 0x2d, 0x10, 0x83, 0x12, 0x31, 0xbc, 0xcc,
0x08, 0xb8, 0x8f, 0x84, 0x85, 0x08, 0x8a, 0x28, 0x40, 0x7a, 0x37, 0xc2, 0x81,
0x80, 0x5d, 0x0a, 0x46, 0x88, 0x98, 0xd0, 0xac, 0x56, 0x20, 0x00, 0x21, 0xf9,
0x04, 0x05, 0x04, 0x00, 0x02, 0x00, 0x2c, 0x14, 0x00, 0x0f, 0x00, 0x10, 0x00,
0x13, 0x00, 0x00, 0x07, 0xa1, 0x80, 0x02, 0x82, 0x83, 0x82, 0x0e, 0x22, 0x2e,
0x0c, 0x84, 0x83, 0x04, 0x0f, 0x19, 0x20, 0x30, 0x41, 0x38, 0x41, 0x18, 0x8a,
0x0e, 0x23, 0x45, 0x36, 0x52, 0x39, 0x41, 0x43, 0x37, 0x41, 0x19, 0x8a, 0x90,
0x44, 0x52, 0x30, 0x1d, 0x16, 0x22, 0x38, 0x4c, 0x03, 0x84, 0x03, 0x2d, 0x32,
0x16, 0x0a, 0x82, 0x08, 0x34, 0x52, 0x22, 0x8a, 0x02, 0x04, 0x01, 0x83, 0x00,
0x11, 0x3f, 0x48, 0x17, 0xb7, 0x8a, 0x05, 0x20, 0x38, 0x35, 0x08, 0xc1, 0x84,
0x11, 0x36, 0x3f, 0x28, 0xc8, 0x84, 0x23, 0x40, 0x33, 0x06, 0xce, 0xb2, 0x32,
0x38, 0x1c, 0xd4, 0x85, 0x40, 0x49, 0x14, 0xd9, 0xc3, 0x37, 0x2d, 0xab, 0xd4,
0x0e, 0x48, 0x4f, 0x94, 0x84, 0x06, 0x10, 0x84, 0x01, 0xa8, 0x4d, 0x06, 0x00,
0x0a, 0x27, 0x54, 0x45, 0xbe, 0x15, 0x83, 0x0a, 0xd6, 0x26, 0x17, 0x2c, 0x33,
0x4f, 0xa3, 0x49, 0x4d, 0x26, 0x0c, 0xaa, 0xf0, 0xe3, 0xc6, 0x90, 0x48, 0x06,
0x6b, 0x88, 0x98, 0x70, 0x80, 0xd0, 0x91, 0x48, 0x4f, 0x62, 0xa8, 0xa0, 0x96,
0x00, 0x44, 0x87, 0x13, 0xd3, 0xb2, 0xe9, 0xa2, 0x16, 0x08, 0x00, 0x21, 0xf9,
0x04, 0x05, 0x38, 0x00, 0x05, 0x00, 0x2c, 0x14, 0x00, 0x0e, 0x00, 0x10, 0x00,
0x14, 0x00, 0x00, 0x07, 0xaa, 0x80, 0x05, 0x82, 0x83, 0x84, 0x02, 0x84, 0x87,
0x83, 0x01, 0x15, 0x45, 0x30, 0x0e, 0x88, 0x05, 0x03, 0x13, 0x1c, 0x32, 0x39,
0x55, 0x56, 0x55, 0x21, 0x87, 0x15, 0x2d, 0x49, 0x42, 0x56, 0x57, 0x55, 0x3a,
0x97, 0x16, 0x84, 0x09, 0x37, 0x58, 0x57, 0x56, 0x44, 0x33, 0x20, 0x35, 0x58,
0x44, 0x06, 0x84, 0x08, 0x36, 0x40, 0x20, 0x0c, 0x86, 0x06, 0x41, 0x56, 0x35,
0x88, 0x03, 0x86, 0x83, 0x17, 0x4e, 0x3c, 0x18, 0x8f, 0xb2, 0x33, 0x56, 0x48,
0x0a, 0xc5, 0x83, 0x15, 0x42, 0x4a, 0x22, 0xcb, 0x83, 0x2d, 0x55, 0x38, 0x09,
0xd1, 0x90, 0x40, 0x58, 0x2c, 0xd7, 0x00, 0x14, 0xa1, 0x25, 0xd7, 0x08, 0x32,
0x59, 0x31, 0xb1, 0xd1, 0x12, 0x3b, 0x4b, 0x1f, 0x87, 0x09, 0x13, 0x03, 0x89,
0xae, 0x3f, 0x09, 0x01, 0x0f, 0x18, 0x35, 0x43, 0x4a, 0x42, 0x1b, 0x83, 0x0c,
0xba, 0x1d, 0x26, 0x30, 0x70, 0x2c, 0x49, 0xd5, 0x23, 0x08, 0x38, 0x41, 0x1b,
0x94, 0x5c, 0xd1, 0xa1, 0xe4, 0x93, 0x0e, 0x24, 0x35, 0x34, 0x28, 0x1b, 0x84,
0xc1, 0xc9, 0x95, 0x7c, 0x34, 0x8e, 0x10, 0x28, 0xe6, 0x80, 0xc6, 0x0c, 0x0b,
0xf3, 0xb8, 0x01, 0x88, 0x16, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
0x02, 0x00, 0x2c, 0x1f, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x00, 0x02,
0x18, 0x94, 0x11, 0x20, 0x6a, 0x8d, 0xcf, 0xda, 0x41, 0xd2, 0x85, 0x3a, 0xf1,
0xba, 0x98, 0x76, 0x5e, 0x25, 0x9a, 0x17, 0x42, 0xa4, 0x64, 0x0a, 0x05, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x06, 0x00, 0x2c, 0x1f, 0x00, 0x02, 0x00,
0x0b, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x23, 0x68, 0x26, 0x53, 0xf2, 0x40, 0x29,
0xf0, 0x5c, 0x23, 0x41, 0x6a, 0x36, 0xb2, 0x5e, 0xd7, 0x07, 0x3a, 0x22, 0x17,
0x7d, 0x41, 0xb8, 0x71, 0x25, 0x5b, 0x76, 0xe2, 0x74, 0x39, 0x90, 0x44, 0x55,
0x96, 0x92, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x09, 0x00, 0x2c,
0x1f, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x00, 0x04, 0x2f, 0x30, 0xa5,
0x62, 0xce, 0x28, 0x22, 0x00, 0x99, 0x02, 0xb9, 0x47, 0x85, 0x08, 0x9c, 0x04,
0x00, 0x44, 0x45, 0x96, 0x5d, 0xb8, 0x96, 0x82, 0xcb, 0x4a, 0xe1, 0xdc, 0x0e,
0xc1, 0x4c, 0xe1, 0x7a, 0x65, 0xa7, 0xbc, 0x9e, 0x08, 0x97, 0x31, 0xa1, 0x3e,
0xa0, 0x83, 0xcd, 0x28, 0x89, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
0x0e, 0x00, 0x2c, 0x1e, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x04,
0x39, 0xd0, 0x49, 0xc4, 0x96, 0x41, 0x43, 0x04, 0x29, 0x05, 0x52, 0x4b, 0x52,
0x29, 0x05, 0xc7, 0x05, 0x9e, 0x28, 0x98, 0xa7, 0xca, 0x4e, 0xee, 0x3b, 0xc4,
0xec, 0xbc, 0xac, 0x6c, 0x40, 0x19, 0xc0, 0xab, 0x33, 0xbc, 0x97, 0xe3, 0x00,
0xdc, 0xf8, 0x28, 0x8d, 0x84, 0xe2, 0x92, 0x39, 0x79, 0x0e, 0x06, 0x50, 0xd1,
0x81, 0x33, 0x01, 0x50, 0x92, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x08, 0x00,
0x05, 0x00, 0x2c, 0x1e, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x00, 0x05,
0x46, 0x60, 0x21, 0x02, 0x62, 0x69, 0x8a, 0x8a, 0x14, 0x35, 0x89, 0x31, 0x08,
0xa4, 0x38, 0x30, 0x4e, 0xa4, 0x52, 0x0e, 0x72, 0x02, 0xc2, 0x4c, 0x49, 0xba,
0x53, 0xe1, 0x60, 0x3b, 0x08, 0x87, 0x2a, 0xe3, 0x2e, 0x15, 0x21, 0x08, 0x01,
0xcc, 0xc1, 0x93, 0x81, 0x13, 0x4c, 0xab, 0xd7, 0x07, 0x21, 0x66, 0x02, 0x50,
0x27, 0xaa, 0x07, 0x43, 0x11, 0x2c, 0xf4, 0x0c, 0x09, 0x9a, 0xcd, 0x11, 0x30,
0xef, 0x02, 0x04, 0x67, 0x21, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
0x04, 0x00, 0x2c, 0x1e, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x00, 0x07,
0x60, 0x80, 0x04, 0x82, 0x01, 0x00, 0x82, 0x86, 0x87, 0x00, 0x13, 0x2b, 0x18,
0x17, 0x13, 0x0e, 0x0c, 0x08, 0x01, 0x86, 0x09, 0x17, 0x1b, 0x18, 0x1c, 0x22,
0x23, 0x1b, 0x0f, 0x87, 0x04, 0x01, 0x03, 0x0b, 0x13, 0x23, 0x1c, 0x0c, 0x9d,
0x82, 0x0c, 0x16, 0xa4, 0xa6, 0x00, 0x0e, 0x1c, 0x16, 0x9c, 0x9d, 0x01, 0x12,
0xa3, 0x08, 0xab, 0x14, 0x1c, 0x1b, 0x09, 0xab, 0x27, 0x9a, 0xb5, 0x9d, 0x03,
0x47, 0xbd, 0xb6, 0x22, 0x25, 0x06, 0x02, 0x85, 0x88, 0x17, 0x23, 0x99, 0x8c,
0x8d, 0x0c, 0xc8, 0xa0, 0x11, 0x27, 0x19, 0x1b, 0x98, 0x1b, 0x05, 0x9e, 0x88,
0x02, 0x03, 0x06, 0x06, 0x82, 0x81, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
0x05, 0x00, 0x2c, 0x1e, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x06,
0x59, 0xc0, 0x82, 0xf0, 0x02, 0x12, 0x6d, 0x2e, 0x92, 0x87, 0x42, 0x20, 0x2c,
0x38, 0x36, 0x1c, 0x51, 0x88, 0x04, 0x1a, 0x39, 0x9a, 0x42, 0x81, 0x81, 0x41,
0xf4, 0x3c, 0xb0, 0x59, 0xc8, 0xc7, 0x13, 0x01, 0x0b, 0x25, 0xa1, 0x4f, 0x04,
0x60, 0xae, 0x78, 0x44, 0x06, 0x73, 0xc1, 0xcd, 0x61, 0x98, 0x09, 0x1a, 0x90,
0x25, 0x0e, 0x46, 0xe4, 0x31, 0x08, 0x72, 0x19, 0x1d, 0x18, 0x09, 0x04, 0x01,
0x60, 0x78, 0x1d, 0x8b, 0x23, 0x18, 0x47, 0x57, 0x42, 0x07, 0x0d, 0x15, 0x1a,
0x18, 0x51, 0x1d, 0x1c, 0x03, 0x77, 0x04, 0x08, 0x0a, 0x4b, 0x05, 0x41, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x02, 0x00, 0x2c, 0x1e, 0x00, 0x02, 0x00,
0x0c, 0x00, 0x0d, 0x00, 0x00, 0x06, 0x4f, 0x40, 0x81, 0x30, 0xc3, 0x0a, 0x99,
0x4a, 0x13, 0x87, 0x70, 0x29, 0xc0, 0x88, 0x3c, 0x20, 0x57, 0x31, 0xc2, 0x5c,
0x3e, 0x4a, 0xac, 0x8e, 0xb2, 0x2a, 0x88, 0x44, 0x25, 0x00, 0x2e, 0x05, 0x04,
0x92, 0x70, 0x05, 0x97, 0xa2, 0xe2, 0x9c, 0x16, 0x3d, 0xb8, 0x05, 0x14, 0x8b,
0xb3, 0xae, 0x1e, 0xe4, 0x16, 0x03, 0x37, 0x80, 0x4f, 0x14, 0xe0, 0x18, 0x2d,
0x82, 0x1f, 0x1c, 0x18, 0x25, 0x11, 0x01, 0x56, 0x17, 0x29, 0x1c, 0x4f, 0x2d,
0x22, 0x67, 0x42, 0x06, 0x09, 0x0b, 0x42, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05,
0x04, 0x00, 0x07, 0x00, 0x2c, 0x1e, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0e, 0x00,
0x00, 0x07, 0x65, 0x80, 0x07, 0x82, 0x07, 0x01, 0x83, 0x86, 0x83, 0x1c, 0x30,
0x46, 0x20, 0x1c, 0x1a, 0x15, 0x0f, 0x04, 0x83, 0x15, 0x20, 0x35, 0x46, 0x32,
0x31, 0x8a, 0x17, 0x87, 0x04, 0x09, 0x11, 0x89, 0x32, 0x15, 0x87, 0x82, 0x17,
0x34, 0x32, 0x9a, 0x9b, 0x25, 0x32, 0x34, 0xa7, 0x86, 0x04, 0x16, 0x33, 0x46,
0x0c, 0x00, 0x9b, 0xaf, 0x35, 0x12, 0xa2, 0x03, 0x1f, 0x30, 0x1d, 0x0c, 0xa2,
0x0b, 0x21, 0xbb, 0x09, 0xa2, 0x02, 0x22, 0x31, 0x1d, 0x10, 0x08, 0x02, 0x9b,
0x1e, 0x30, 0x98, 0x45, 0x1d, 0x1e, 0x1c, 0x27, 0xca, 0x07, 0x0a, 0x12, 0x18,
0x1f, 0x94, 0x97, 0x35, 0x06, 0x82, 0xb3, 0xde, 0x08, 0x9d, 0x90, 0x07, 0x81,
0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x05, 0x00, 0x2c, 0x1e, 0x00, 0x02,
0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x07, 0x66, 0x80, 0x05, 0x05, 0x01, 0x21,
0x49, 0x33, 0x2c, 0x1f, 0x16, 0x19, 0x0e, 0x03, 0x82, 0x00, 0x17, 0x2d, 0x34,
0x30, 0x36, 0x4f, 0x43, 0x32, 0x1a, 0x82, 0x8e, 0x03, 0x0c, 0x13, 0x1f, 0x49,
0x51, 0x19, 0x99, 0x99, 0x01, 0x25, 0x93, 0x1b, 0xa2, 0x8e, 0x1b, 0x31, 0x31,
0x1a, 0x02, 0xa8, 0x05, 0x23, 0x51, 0x33, 0x0f, 0xaf, 0x03, 0x2b, 0xb2, 0x15,
0xb5, 0x1d, 0x49, 0x35, 0x0e, 0xaf, 0x09, 0xbb, 0x2d, 0x0c, 0xba, 0x3f, 0x35,
0x12, 0x06, 0x02, 0x00, 0xa2, 0x07, 0x2c, 0x49, 0x43, 0x48, 0x32, 0x35, 0x88,
0xa1, 0x83, 0x09, 0x15, 0x1c, 0x1d, 0x35, 0x34, 0x94, 0x50, 0x0b, 0xaf, 0x05,
0x06, 0x0c, 0x11, 0xbe, 0x05, 0x81, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
0x00, 0x00, 0x2c, 0x1e, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x00, 0x07,
0x65, 0x80, 0x00, 0x82, 0x02, 0x02, 0x82, 0x86, 0x87, 0x00, 0x1d, 0x52, 0x49,
0x46, 0x1d, 0x23, 0x1b, 0x12, 0x87, 0x1a, 0x50, 0x36, 0x49, 0x3f, 0x37, 0x38,
0x53, 0x18, 0x88, 0x00, 0x0f, 0x17, 0x8a, 0x41, 0x1a, 0x9c, 0x02, 0x1b, 0x4f,
0x41, 0x16, 0x9c, 0x00, 0x1c, 0x3f, 0x4f, 0x9b, 0x88, 0x05, 0x1e, 0x40, 0x49,
0x11, 0xa9, 0xb1, 0x31, 0x17, 0x9c, 0x06, 0x35, 0x52, 0x32, 0xb4, 0x88, 0x0c,
0xbb, 0x46, 0x0f, 0xa3, 0x35, 0x44, 0x34, 0x13, 0x06, 0x04, 0x88, 0x06, 0x45,
0x38, 0x98, 0x48, 0x32, 0x45, 0x1d, 0x1b, 0x05, 0x82, 0x0c, 0x17, 0x1f, 0x35,
0x34, 0x31, 0x97, 0x30, 0x09, 0xa3, 0x0a, 0x0f, 0x13, 0xbe, 0x81, 0x00, 0x21,
0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0x00, 0x02, 0x00, 0x0c,
0x00, 0x0d, 0x00, 0x00, 0x07, 0x58, 0x80, 0x00, 0x82, 0x2c, 0x37, 0x43, 0x34,
0x2c, 0x22, 0x82, 0x8a, 0x00, 0x1b, 0x32, 0x48, 0x4f, 0x40, 0x39, 0x39, 0x49,
0x8b, 0x82, 0x08, 0x0e, 0x00, 0x2c, 0x39, 0x38, 0x1b, 0x95, 0x82, 0x16, 0x41,
0x5d, 0x26, 0x9e, 0x82, 0x40, 0x41, 0x16, 0x9e, 0x03, 0x20, 0x85, 0xa4, 0x08,
0xab, 0x48, 0x19, 0xa4, 0x45, 0x37, 0x30, 0xa4, 0x00, 0x45, 0x39, 0x32, 0xad,
0x00, 0x3e, 0x32, 0x15, 0x0a, 0xb2, 0x37, 0x3e, 0x38, 0x49, 0x33, 0x46, 0x2c,
0x18, 0x8b, 0x19, 0x1e, 0x45, 0x32, 0x51, 0x91, 0x36, 0x0c, 0xa9, 0x8a, 0x12,
0x02, 0x00, 0x81, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2c,
0x1f, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x00, 0x07, 0x63, 0x80, 0x01,
0x01, 0x35, 0x3b, 0x40, 0x30, 0x35, 0x1e, 0x16, 0x13, 0x08, 0x82, 0x18, 0x30,
0x3f, 0x38, 0x39, 0x3c, 0x3b, 0x3f, 0x1c, 0x82, 0x82, 0x07, 0x11, 0x1a, 0x84,
0x3e, 0x16, 0x97, 0x97, 0x1c, 0x37, 0x3e, 0x2b, 0x9f, 0x82, 0x22, 0x44, 0x37,
0x23, 0xa5, 0x01, 0x2c, 0x42, 0x38, 0x12, 0xab, 0x2f, 0x3e, 0x3f, 0x1a, 0xa5,
0x0a, 0x32, 0x3b, 0x36, 0x14, 0x00, 0x9f, 0x0f, 0xb8, 0x30, 0x0e, 0xab, 0x34,
0x3a, 0x30, 0x17, 0x09, 0x03, 0xa5, 0x33, 0x3b, 0x3d, 0x42, 0x41, 0x36, 0x33,
0x35, 0x1c, 0xc8, 0x0f, 0x1b, 0x1d, 0x32, 0x31, 0x3f, 0x92, 0x43, 0x0f, 0xab,
0x09, 0x0e, 0x27, 0x13, 0x82, 0x81, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
0x00, 0x00, 0x2c, 0x1f, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x00, 0x07,
0x59, 0x80, 0x00, 0x00, 0x45, 0x3d, 0x37, 0x30, 0x45, 0x20, 0x1c, 0x15, 0x07,
0x82, 0x16, 0x31, 0x41, 0x37, 0x42, 0x3a, 0x3a, 0x40, 0x23, 0x82, 0x97, 0x82,
0x84, 0x3b, 0x26, 0x98, 0x82, 0x23, 0x3e, 0x42, 0x22, 0x01, 0x9d, 0x1f, 0x3e,
0x39, 0x22, 0x9d, 0x00, 0x2d, 0x3c, 0x37, 0x13, 0xa9, 0xab, 0x41, 0x1b, 0xa9,
0x00, 0x3d, 0x49, 0xae, 0x98, 0x0e, 0x33, 0x3a, 0x31, 0x11, 0xa9, 0x32, 0x4a,
0x36, 0x97, 0xa3, 0x97, 0x4c, 0x93, 0x85, 0x48, 0x87, 0x98, 0x28, 0x2c, 0x33,
0x48, 0x41, 0x3e, 0x4b, 0x3f, 0xa9, 0x03, 0x00, 0x11, 0x17, 0x97, 0x81, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2c, 0x1e, 0x00, 0x02, 0x00,
0x0c, 0x00, 0x0d, 0x00, 0x00, 0x07, 0x5d, 0x80, 0x01, 0x82, 0x46, 0x4b, 0x44,
0x36, 0x46, 0x1d, 0x23, 0x27, 0x06, 0x82, 0x82, 0x51, 0x38, 0x39, 0x3b, 0x4a,
0x4a, 0x37, 0x22, 0x8d, 0x97, 0x1b, 0x84, 0x3d, 0x1c, 0x97, 0x8d, 0x22, 0x42,
0x3c, 0x1f, 0x9d, 0x82, 0x1e, 0x3b, 0x42, 0xa2, 0x9d, 0x08, 0x35, 0x3a, 0x39,
0x15, 0xa3, 0x01, 0x5a, 0x3a, 0x38, 0x28, 0xa3, 0x0b, 0x30, 0x3a, 0x4f, 0xaf,
0x10, 0x4c, 0x4a, 0x53, 0xaf, 0x01, 0x33, 0x55, 0x48, 0x19, 0xaf, 0x0a, 0x31,
0x93, 0xb2, 0x49, 0x31, 0x50, 0x23, 0x8d, 0x0e, 0x18, 0x2f, 0x30, 0x49, 0x40,
0x3b, 0x4e, 0x40, 0xa3, 0x00, 0x97, 0xae, 0x01, 0x81, 0x00, 0x21, 0xf9, 0x04,
0x05, 0x60, 0x00, 0x00, 0x00, 0x2c, 0x1f, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x0c,
0x00, 0x00, 0x07, 0x37, 0x80, 0x00, 0x82, 0x00, 0x3e, 0x83, 0x86, 0x1c, 0x48,
0x37, 0x39, 0x3d, 0x86, 0x8d, 0x28, 0x4d, 0x4a, 0x8d, 0x83, 0x3b, 0x3a, 0x92,
0x00, 0x3c, 0x96, 0x99, 0x06, 0x83, 0x18, 0x86, 0x09, 0x00, 0x91, 0x99, 0x48,
0xa2, 0x25, 0x92, 0x36, 0x4a, 0x4e, 0x4b, 0x39, 0x43, 0x36, 0x34, 0x2b, 0x82,
0x16, 0x2d, 0x82, 0x38, 0x83, 0x0e, 0x81, 0x00, 0x3b
};
const lv_img_dsc_t icon_emotion_sleep_45 = {
.header.cf = LV_IMG_CF_RAW_CHROMA_KEYED,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 45,
.header.h = 45,
.data_size = 3961,
.data = icon_emotion_sleep_45_map,
};

View File

@ -0,0 +1,230 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_ICON_EMOTION_THINKING_45
#define LV_ATTRIBUTE_IMG_ICON_EMOTION_THINKING_45
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ICON_EMOTION_THINKING_45 uint8_t icon_emotion_thinking_45_map[] = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x2d, 0x00, 0x2d, 0x00, 0xf5, 0x00, 0x00,
0x00, 0x04, 0x00, 0x08, 0x04, 0x08, 0x08, 0x08, 0x08, 0x10, 0x0c, 0x10, 0x08,
0x0c, 0x08, 0x10, 0x14, 0x10, 0x18, 0x18, 0x18, 0x18, 0x14, 0x18, 0x10, 0x10,
0x10, 0x18, 0x1c, 0x18, 0x21, 0x20, 0x21, 0x29, 0x28, 0x29, 0x29, 0x2c, 0x29,
0x21, 0x24, 0x21, 0x31, 0x30, 0x31, 0x39, 0x38, 0x39, 0x42, 0x41, 0x42, 0x4a,
0x49, 0x4a, 0x5a, 0x59, 0x5a, 0x52, 0x4d, 0x52, 0x39, 0x3c, 0x39, 0x63, 0x65,
0x63, 0xbd, 0xbe, 0xbd, 0xde, 0xdf, 0xde, 0xff, 0xff, 0xff, 0xa5, 0xa6, 0xa5,
0x9c, 0x9e, 0x9c, 0x94, 0x92, 0x94, 0x7b, 0x7d, 0x7b, 0x73, 0x79, 0x73, 0x8c,
0x8e, 0x8c, 0xd6, 0xd7, 0xd6, 0xc6, 0xc7, 0xc6, 0x73, 0x6d, 0x73, 0xf7, 0xf7,
0xf7, 0xad, 0xae, 0xad, 0x42, 0x3c, 0x42, 0xb5, 0xb6, 0xb5, 0x84, 0x86, 0x84,
0x6b, 0x71, 0x6b, 0x63, 0x5d, 0x63, 0x6b, 0x69, 0x6b, 0xce, 0xcf, 0xce, 0x7b,
0x82, 0x7b, 0xef, 0xef, 0xef, 0x63, 0x69, 0x63, 0x6b, 0x65, 0x6b, 0xe7, 0xe7,
0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xfe, 0x27,
0x47, 0x49, 0x46, 0x20, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69,
0x74, 0x68, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x65, 0x7a,
0x67, 0x69, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x70, 0x65, 0x65, 0x64,
0x00, 0x21, 0xff, 0x0b, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, 0x32,
0x2e, 0x30, 0x03, 0x01, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00,
0x03, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x00, 0x06,
0x5d, 0x40, 0x98, 0x70, 0x48, 0x2c, 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, 0x6c,
0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x4a, 0xad, 0x5a, 0xaf, 0xd8, 0xac, 0x76, 0xcb,
0xed, 0x7a, 0xbf, 0xe0, 0xb0, 0x78, 0x4c, 0x2e, 0x9b, 0xcf, 0x68, 0xb3, 0x60,
0xbd, 0x3e, 0x23, 0x20, 0x91, 0x38, 0x04, 0x60, 0x4e, 0x48, 0x2a, 0xad, 0x8a,
0x84, 0x5e, 0xb6, 0xbb, 0x52, 0x2e, 0x7b, 0x75, 0x77, 0x80, 0x82, 0x7d, 0x11,
0x12, 0x89, 0x11, 0x7c, 0x65, 0x0a, 0x0d, 0x8f, 0x0a, 0x69, 0x92, 0x93, 0x94,
0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
0xa2, 0x30, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c,
0x02, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x03, 0x02, 0x58, 0x09,
0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x13,
0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1d, 0x40, 0x80, 0x80, 0x30, 0x28,
0x1a, 0x26, 0x92, 0xe4, 0xa4, 0x91, 0xe2, 0x38, 0x53, 0x4c, 0x27, 0x07, 0xda,
0x7c, 0x2a, 0x24, 0xa9, 0xac, 0x44, 0xd0, 0x60, 0x78, 0x17, 0x41, 0x00, 0x21,
0xf9, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x06,
0x00, 0x07, 0x00, 0x00, 0x06, 0x1f, 0x40, 0x00, 0x01, 0x41, 0x24, 0x24, 0x24,
0xa1, 0xd3, 0x49, 0xb2, 0xe0, 0x78, 0x36, 0x1b, 0x0e, 0xc3, 0x09, 0x95, 0x52,
0xa3, 0x8d, 0x14, 0x67, 0xdb, 0x22, 0x30, 0x1c, 0xe0, 0x45, 0x10, 0x00, 0x21,
0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x07,
0x00, 0x07, 0x00, 0x00, 0x06, 0x24, 0x40, 0x00, 0x62, 0x58, 0x00, 0x00, 0x1a,
0x2e, 0x8e, 0x32, 0x05, 0x70, 0x78, 0x34, 0x99, 0x8c, 0x27, 0xe0, 0x8c, 0x4a,
0xa9, 0x9e, 0xa8, 0x66, 0xba, 0xe8, 0x78, 0xbe, 0x9d, 0xc0, 0xc0, 0xf1, 0x28,
0x3b, 0x00, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x01, 0x00, 0x2c,
0x02, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x22, 0x40, 0x00,
0xa2, 0x40, 0x44, 0x2c, 0x42, 0xa6, 0x64, 0xe8, 0xa1, 0x19, 0x95, 0x4a, 0x9b,
0x80, 0xe6, 0x59, 0xd2, 0x04, 0x36, 0x54, 0x0d, 0xc3, 0xb4, 0xd1, 0x68, 0x4c,
0x81, 0x07, 0x64, 0xfc, 0x08, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00,
0x00, 0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x06,
0x24, 0x40, 0x40, 0xc1, 0x40, 0x44, 0x00, 0x18, 0x9c, 0x8d, 0x92, 0x13, 0xa0,
0x64, 0x2c, 0x16, 0x50, 0x46, 0xe0, 0x8c, 0x4a, 0xa9, 0x4f, 0xe8, 0x48, 0xe0,
0xf0, 0x64, 0xbe, 0x9e, 0x00, 0x82, 0x12, 0x29, 0x53, 0x00, 0x41, 0x00, 0x21,
0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x06,
0x00, 0x07, 0x00, 0x00, 0x06, 0x1c, 0x40, 0x80, 0x50, 0x78, 0x70, 0x98, 0x34,
0x9a, 0x8d, 0x89, 0x34, 0x02, 0xa9, 0x54, 0x23, 0xc8, 0xe8, 0x09, 0x95, 0x52,
0x85, 0x9b, 0x91, 0x76, 0x33, 0x14, 0x92, 0x82, 0x00, 0x21, 0xf9, 0x04, 0x05,
0x02, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00,
0x00, 0x05, 0x1e, 0x20, 0x70, 0x24, 0x24, 0x60, 0x6e, 0x59, 0xba, 0x01, 0x90,
0x75, 0xbd, 0x96, 0xe9, 0xc2, 0xf2, 0x7b, 0x59, 0xc2, 0x93, 0x59, 0xbc, 0x26,
0x1c, 0x90, 0x89, 0x10, 0x02, 0x08, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02,
0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00,
0x06, 0x1d, 0x40, 0x80, 0x41, 0x41, 0x34, 0x3c, 0x00, 0xa5, 0xa4, 0x26, 0xa2,
0x62, 0x39, 0x55, 0x4c, 0x27, 0x0b, 0xda, 0x7c, 0x42, 0x46, 0xaa, 0xec, 0xc8,
0x10, 0x91, 0x78, 0x23, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00,
0x00, 0x2c, 0x02, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1b,
0xc0, 0x00, 0x60, 0x48, 0xd4, 0x58, 0x2c, 0xa5, 0xcc, 0x50, 0xc4, 0x1c, 0x7e,
0x98, 0xa2, 0x0f, 0xe0, 0xc9, 0x94, 0x96, 0xa6, 0x9f, 0x2b, 0x11, 0x30, 0x09,
0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00,
0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x05, 0x18, 0x20, 0x20, 0x8a, 0x09,
0x95, 0x59, 0x68, 0x36, 0x7d, 0x00, 0x86, 0x7d, 0xd3, 0xe5, 0x62, 0xd7, 0x3a,
0x5f, 0xe2, 0xa7, 0x8b, 0xd3, 0x38, 0x85, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02,
0x00, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x15, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00,
0x05, 0x07, 0x20, 0x80, 0x5d, 0x23, 0x66, 0x01, 0x21, 0x00, 0x21, 0xf9, 0x04,
0x05, 0x24, 0x00, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x19, 0x00, 0x01, 0x00, 0x01,
0x00, 0x00, 0x06, 0x03, 0x40, 0x54, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02,
0x00, 0x03, 0x00, 0x2c, 0x14, 0x00, 0x14, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
0x02, 0x07, 0x84, 0x31, 0x71, 0x27, 0xba, 0xac, 0x0a, 0x00, 0x21, 0xf9, 0x04,
0x05, 0x02, 0x00, 0x05, 0x00, 0x2c, 0x13, 0x00, 0x14, 0x00, 0x06, 0x00, 0x06,
0x00, 0x00, 0x03, 0x0d, 0x58, 0xb2, 0x3c, 0xe4, 0x01, 0x38, 0x28, 0x69, 0x7d,
0x41, 0x81, 0x5d, 0x12, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x02, 0x00,
0x2c, 0x13, 0x00, 0x14, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x04, 0x12, 0x10,
0x10, 0x44, 0x49, 0x38, 0x05, 0x0f, 0x90, 0x8d, 0xd9, 0x98, 0x07, 0x76, 0x84,
0x10, 0x9c, 0x67, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x01, 0x00,
0x2c, 0x13, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x04, 0x18, 0x30,
0x04, 0x40, 0xa7, 0x51, 0x2a, 0x15, 0xd2, 0x96, 0x37, 0x43, 0xc7, 0x2c, 0xa0,
0xe7, 0x29, 0x82, 0x72, 0x1e, 0x00, 0x31, 0xbc, 0x42, 0x04, 0x00, 0x21, 0xf9,
0x04, 0x05, 0x02, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x13, 0x00, 0x07, 0x00,
0x07, 0x00, 0x00, 0x04, 0x19, 0x30, 0x80, 0x09, 0x82, 0x55, 0x2d, 0x9f, 0x80,
0x16, 0x73, 0x4e, 0x02, 0x0c, 0x1e, 0xa8, 0x70, 0x9f, 0x79, 0x79, 0x8b, 0x21,
0x0d, 0xf0, 0x60, 0x45, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x04, 0x00,
0x2c, 0x13, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x05, 0x1f, 0x20,
0x11, 0x8c, 0x23, 0x81, 0x38, 0x8f, 0xe3, 0x34, 0x84, 0x01, 0x41, 0x51, 0xe4,
0x00, 0x6e, 0x2c, 0xd3, 0x70, 0x3c, 0x17, 0x0f, 0xf5, 0x2e, 0xa2, 0x82, 0x61,
0x38, 0x20, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00,
0x2c, 0x13, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x05, 0x1a, 0x20,
0x00, 0x10, 0x23, 0x90, 0x40, 0x51, 0xea, 0x34, 0x52, 0xe5, 0x52, 0x4b, 0xfb,
0xb2, 0x6e, 0x05, 0x25, 0xe9, 0x34, 0x3d, 0x44, 0xa2, 0xfc, 0x87, 0x10, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x04, 0x00, 0x2c, 0x13, 0x00, 0x13, 0x00,
0x07, 0x00, 0x07, 0x00, 0x00, 0x06, 0x22, 0x40, 0x82, 0x40, 0x38, 0x18, 0x2a,
0x22, 0x92, 0xe4, 0x03, 0xc0, 0x70, 0x75, 0x9e, 0x91, 0x40, 0xf3, 0xd9, 0x89,
0x4e, 0xa1, 0x80, 0x86, 0xa4, 0xc2, 0x85, 0x00, 0x08, 0x8d, 0x85, 0xd8, 0x40,
0x08, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x02, 0x00, 0x2c, 0x13,
0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x06, 0x25, 0x40, 0x00, 0x41,
0x40, 0x24, 0x36, 0x26, 0x15, 0x94, 0x80, 0x04, 0x70, 0x84, 0x38, 0xd0, 0x49,
0xc0, 0xc9, 0x31, 0x99, 0xa4, 0x4e, 0xd3, 0x8a, 0x23, 0x5d, 0xa0, 0x4e, 0x60,
0x41, 0x60, 0xb0, 0x60, 0x98, 0x13, 0x82, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05,
0x02, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00,
0x00, 0x06, 0x23, 0x40, 0x00, 0xa2, 0x30, 0x04, 0x00, 0x1c, 0x27, 0x8e, 0x72,
0x12, 0xa0, 0x6c, 0x32, 0xd0, 0x53, 0x00, 0xf2, 0x8c, 0x4e, 0xab, 0x19, 0xe9,
0xc3, 0xe4, 0xe9, 0x4a, 0x02, 0x08, 0x07, 0x65, 0xbc, 0x00, 0x04, 0x01, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x13, 0x00,
0x07, 0x00, 0x07, 0x00, 0x00, 0x06, 0x23, 0x40, 0x40, 0xc1, 0x40, 0x24, 0x00,
0x1e, 0x9c, 0x8d, 0xc7, 0x83, 0x02, 0x44, 0x32, 0x96, 0x28, 0x47, 0xf0, 0x8c,
0x5a, 0xa6, 0x55, 0xa9, 0x80, 0xe4, 0xc9, 0x68, 0x32, 0x29, 0x21, 0x05, 0x42,
0x66, 0x00, 0x82, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c,
0x13, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1f, 0xc0, 0xc0,
0xc1, 0x40, 0x1c, 0x50, 0x3c, 0x9a, 0x64, 0x25, 0x52, 0x52, 0x39, 0x4d, 0x93,
0xe6, 0x33, 0xea, 0x54, 0x79, 0x20, 0x9a, 0xd1, 0xa8, 0xd4, 0x31, 0x40, 0x22,
0x60, 0x47, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c,
0x13, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1d, 0x40, 0x80,
0x21, 0x41, 0x04, 0x40, 0x36, 0x99, 0x64, 0x68, 0x02, 0xba, 0x5c, 0x3e, 0x1b,
0xa6, 0x13, 0x2a, 0x7d, 0x46, 0x33, 0x96, 0x2c, 0x47, 0x11, 0x99, 0x78, 0x01,
0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00,
0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x06, 0x22, 0x40, 0x00, 0x40, 0x41,
0x44, 0x08, 0x35, 0xa5, 0xd2, 0xa8, 0x03, 0x90, 0x7c, 0x5e, 0xac, 0x97, 0x46,
0xe0, 0x64, 0x45, 0xa7, 0xd5, 0xab, 0xb0, 0x04, 0x52, 0x81, 0x4c, 0x02, 0xa1,
0xf8, 0x01, 0x08, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00,
0x2c, 0x13, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1e, 0x40,
0x40, 0x02, 0x40, 0x2c, 0x02, 0x2c, 0xa5, 0x12, 0x47, 0x40, 0x64, 0x39, 0x8d,
0x00, 0x11, 0x2b, 0x23, 0x40, 0x15, 0xa7, 0x82, 0x89, 0x45, 0xc5, 0x35, 0x4a,
0x24, 0xc5, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c,
0x13, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1f, 0x40, 0x01,
0x60, 0x48, 0x8c, 0x64, 0x2c, 0xc8, 0x61, 0xe5, 0x22, 0xc2, 0x88, 0x32, 0x82,
0x25, 0xc6, 0x09, 0x95, 0x3a, 0x47, 0xc4, 0x8f, 0xd6, 0x33, 0x9c, 0x48, 0xbe,
0x14, 0x40, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x10, 0x00, 0x00, 0x00, 0x2c,
0x15, 0x00, 0x14, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x06, 0x0d, 0x40, 0x80,
0xd0, 0x84, 0x11, 0x1a, 0x8b, 0xc6, 0x24, 0x00, 0x65, 0x0c, 0x02, 0x00, 0x21,
0xf9, 0x04, 0x05, 0x02, 0x00, 0x03, 0x00, 0x2c, 0x24, 0x00, 0x14, 0x00, 0x06,
0x00, 0x06, 0x00, 0x00, 0x02, 0x0a, 0x44, 0x8e, 0xa2, 0xcb, 0xd6, 0xbe, 0xc6,
0x00, 0x72, 0x14, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x09, 0x00, 0x2c,
0x24, 0x00, 0x14, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x04, 0x10, 0x50, 0xa0,
0x89, 0xa4, 0x39, 0xd8, 0x5e, 0xa3, 0xef, 0xd0, 0x85, 0x00, 0x04, 0x64, 0x90,
0x44, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x05, 0x00, 0x2c, 0x24, 0x00,
0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x04, 0x16, 0xb0, 0x80, 0x09, 0xca,
0x48, 0x4a, 0x25, 0x74, 0x96, 0x5f, 0x47, 0xf7, 0x85, 0x1f, 0x88, 0x64, 0x19,
0x12, 0x08, 0x2c, 0x1b, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00,
0x00, 0x2c, 0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x04, 0x19,
0x10, 0x04, 0x20, 0x81, 0x59, 0x78, 0x19, 0xf5, 0xdc, 0x7b, 0x09, 0xf7, 0x3d,
0x8a, 0xf8, 0x29, 0x86, 0xa3, 0x3a, 0x86, 0x80, 0xbc, 0x48, 0x10, 0x01, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x24, 0x00, 0x13, 0x00,
0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1f, 0x40, 0x00, 0x20, 0x20, 0x14, 0x3a,
0x8e, 0x8c, 0x44, 0x83, 0x44, 0xa1, 0x90, 0x1a, 0x4b, 0x88, 0x14, 0x4a, 0x92,
0x42, 0x1a, 0x89, 0x87, 0xf6, 0x91, 0x10, 0x14, 0xbe, 0x05, 0x41, 0x10, 0x00,
0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x01, 0x00, 0x2c, 0x24, 0x00, 0x13, 0x00,
0x06, 0x00, 0x07, 0x00, 0x00, 0x05, 0x18, 0x20, 0x20, 0x8c, 0xe3, 0x02, 0x9d,
0xd0, 0xe2, 0x48, 0xac, 0xe4, 0xac, 0xed, 0xdb, 0xba, 0x4c, 0x64, 0x47, 0x0c,
0xa2, 0xec, 0x09, 0x12, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00,
0x00, 0x2c, 0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1f,
0xc0, 0xc0, 0x80, 0x40, 0x0c, 0x38, 0x26, 0x12, 0xc9, 0xc4, 0x01, 0xe9, 0x38,
0x43, 0x90, 0x26, 0x87, 0x03, 0x95, 0x52, 0x23, 0x94, 0x8a, 0xb6, 0x42, 0x31,
0x2c, 0xbe, 0x8b, 0x43, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00,
0x00, 0x2c, 0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1f,
0x40, 0x00, 0x62, 0x88, 0x00, 0x40, 0x52, 0xa1, 0x24, 0x64, 0xe2, 0x69, 0x7a,
0x24, 0x12, 0xe7, 0x33, 0xba, 0xa9, 0x4a, 0x22, 0x9c, 0x2c, 0x27, 0x92, 0x70,
0x38, 0x1e, 0x0e, 0x45, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00,
0x00, 0x2c, 0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x05, 0x1b,
0xa0, 0x00, 0x14, 0x00, 0x20, 0x44, 0x1d, 0xa7, 0x46, 0x95, 0x96, 0x65, 0x5a,
0xd5, 0xbe, 0xf1, 0x0c, 0x57, 0x93, 0xa7, 0x7b, 0x93, 0xf2, 0x50, 0x40, 0x45,
0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x24, 0x00,
0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x20, 0x40, 0x40, 0x61, 0x58,
0x00, 0x4c, 0x56, 0x26, 0x13, 0x67, 0x92, 0xca, 0x8c, 0x46, 0x99, 0x56, 0xf3,
0x19, 0x9d, 0x42, 0x53, 0x92, 0x8d, 0x76, 0x23, 0x69, 0x50, 0x28, 0x24, 0x4a,
0x23, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x24,
0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x20, 0x40, 0x80, 0x61,
0x68, 0x20, 0x48, 0x36, 0x48, 0x8f, 0x84, 0x03, 0x6a, 0x82, 0x3a, 0x1c, 0x4b,
0xd3, 0xc2, 0x89, 0x4e, 0x39, 0x95, 0x8c, 0x36, 0x53, 0x59, 0x40, 0x22, 0x11,
0xc8, 0x22, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x2c,
0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x20, 0x40, 0x02,
0x20, 0x91, 0x00, 0x10, 0x2a, 0x99, 0x64, 0xa6, 0x62, 0xfa, 0x5c, 0x2e, 0x1f,
0x53, 0xf3, 0x19, 0x9d, 0x42, 0x4d, 0xa1, 0x92, 0xc5, 0x52, 0x3a, 0x39, 0x26,
0xe0, 0x08, 0x23, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00,
0x2c, 0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1f, 0xc0,
0x41, 0x42, 0x91, 0x48, 0x00, 0x52, 0xa3, 0xe4, 0xd1, 0xf3, 0x6a, 0x5e, 0x3c,
0x9b, 0x8b, 0x13, 0x2a, 0x7d, 0x3d, 0x39, 0x16, 0x10, 0xc8, 0xd2, 0x71, 0x4c,
0xbe, 0x13, 0x47, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00,
0x2c, 0x24, 0x00, 0x13, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x06, 0x21, 0x40,
0x04, 0x40, 0xa1, 0x00, 0x20, 0x42, 0x25, 0x8b, 0x65, 0x74, 0xda, 0xb0, 0x44,
0x22, 0xd6, 0xc6, 0x09, 0x95, 0x52, 0xa3, 0x9a, 0x95, 0x4a, 0xf5, 0x51, 0x71,
0x1e, 0x92, 0xb0, 0x04, 0x10, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x02, 0x00,
0x00, 0x00, 0x2c, 0x24, 0x00, 0x14, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x06,
0x16, 0xc0, 0x0e, 0x60, 0x58, 0x0a, 0x69, 0x44, 0x48, 0x11, 0xe0, 0x88, 0xc1,
0x28, 0x35, 0x80, 0xe6, 0xd0, 0x04, 0xf8, 0x0c, 0x57, 0x41, 0x00, 0x21, 0xf9,
0x04, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x00, 0x13, 0x00, 0x05, 0x00,
0x06, 0x00, 0x00, 0x06, 0x12, 0x40, 0x80, 0x50, 0x21, 0x2c, 0x76, 0x44, 0x18,
0x4c, 0xb1, 0xa8, 0x41, 0x62, 0x44, 0x9a, 0xcf, 0x32, 0x08, 0x00, 0x3b
};
const lv_img_dsc_t icon_emotion_thinking_45 = {
.header.cf = LV_IMG_CF_RAW_CHROMA_KEYED,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 45,
.header.h = 45,
.data_size = 2534,
.data = icon_emotion_thinking_45_map,
};

View File

@ -94,14 +94,16 @@ static gd_GIF * gif_open(gd_GIF * gif_base)
f_gif_read(gif_base, &fdsz, 1);
/* Presence of GCT */
if (!(fdsz & 0x80)) {
LV_LOG_WARN("no global color table\n");
goto fail;
/* 无全局颜色表,各帧使用局部颜色表 */
depth = 1;
gct_sz = 0;
} else {
/* Color Space's Depth */
depth = ((fdsz >> 4) & 7) + 1;
/* Ignore Sort Flag. */
/* GCT Size */
gct_sz = 1 << ((fdsz & 0x07) + 1);
}
/* Color Space's Depth */
depth = ((fdsz >> 4) & 7) + 1;
/* Ignore Sort Flag. */
/* GCT Size */
gct_sz = 1 << ((fdsz & 0x07) + 1);
/* Background Color Index */
f_gif_read(gif_base, &bgidx, 1);
/* Aspect Ratio */
@ -122,7 +124,14 @@ static gd_GIF * gif_open(gd_GIF * gif_base)
gif->depth = depth;
/* Read GCT */
gif->gct.size = gct_sz;
f_gif_read(gif, gif->gct.colors, 3 * gif->gct.size);
if (gct_sz > 0) {
f_gif_read(gif, gif->gct.colors, 3 * gif->gct.size);
} else {
/* 无 GCT 时用黑色作为默认背景色 */
memset(gif->gct.colors, 0, 3);
gif->gct.size = 1;
bgidx = 0;
}
gif->palette = &gif->gct;
gif->bgindex = bgidx;
gif->canvas = (uint8_t *) &gif[1];
@ -138,25 +147,28 @@ static gd_GIF * gif_open(gd_GIF * gif_base)
}
bgcolor = &gif->palette->colors[gif->bgindex*3];
/* 初始 canvas 使用透明背景alpha=0x00
* GIF alpha=0xff
* GIF */
for (i = 0; i < gif->width * gif->height; i++) {
#if LV_COLOR_DEPTH == 32
gif->canvas[i*4 + 0] = *(bgcolor + 2);
gif->canvas[i*4 + 1] = *(bgcolor + 1);
gif->canvas[i*4 + 2] = *(bgcolor + 0);
gif->canvas[i*4 + 3] = 0xff;
gif->canvas[i*4 + 3] = 0x00;
#elif LV_COLOR_DEPTH == 16
lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
gif->canvas[i*3 + 0] = c.full & 0xff;
gif->canvas[i*3 + 1] = (c.full >> 8) & 0xff;
gif->canvas[i*3 + 2] = 0xff;
gif->canvas[i*3 + 2] = 0x00;
#elif LV_COLOR_DEPTH == 8
lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
gif->canvas[i*2 + 0] = c.full;
gif->canvas[i*2 + 1] = 0xff;
gif->canvas[i*2 + 1] = 0x00;
#elif LV_COLOR_DEPTH == 1
lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
gif->canvas[i*2 + 0] = c.ch.red > 128 ? 1 : 0;
gif->canvas[i*2 + 1] = 0xff;
gif->canvas[i*2 + 1] = 0x00;
#endif
}
gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR);

View File

@ -132,6 +132,10 @@ static void next_frame_task_cb(lv_timer_t * t)
{
lv_obj_t * obj = t->user_data;
lv_gif_t * gifobj = (lv_gif_t *) obj;
if(gifobj->gif == NULL) {
lv_timer_pause(t);
return;
}
uint32_t elaps = lv_tick_elaps(gifobj->last_call);
if(elaps < gifobj->gif->gce.delay * 10) return;

View File

@ -14,6 +14,7 @@ CONFIG_SOC_GDMA_SUPPORTED=y
CONFIG_SOC_AHB_GDMA_SUPPORTED=y
CONFIG_SOC_GPTIMER_SUPPORTED=y
CONFIG_SOC_LCDCAM_SUPPORTED=y
CONFIG_SOC_LCDCAM_CAM_SUPPORTED=y
CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y
CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y
CONFIG_SOC_MCPWM_SUPPORTED=y
@ -101,7 +102,7 @@ CONFIG_SOC_CPU_HAS_FPU=y
CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y
CONFIG_SOC_CPU_BREAKPOINTS_NUM=2
CONFIG_SOC_CPU_WATCHPOINTS_NUM=2
CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64
CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40
CONFIG_SOC_SIMD_PREFERRED_DATA_ALIGNMENT=16
CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096
CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16
@ -208,7 +209,7 @@ CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y
CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y
CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y
CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y
CONFIG_SOC_SDM_GROUPS=y
CONFIG_SOC_SDM_GROUPS=1
CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8
CONFIG_SOC_SDM_CLK_SUPPORT_APB=y
CONFIG_SOC_SPI_PERIPH_NUM=3
@ -369,6 +370,9 @@ CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y
CONFIG_SOC_BLUFI_SUPPORTED=y
CONFIG_SOC_ULP_HAS_ADC=y
CONFIG_SOC_PHY_COMBO_MODULE=y
CONFIG_SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV=y
CONFIG_SOC_LCDCAM_CAM_PERIPH_NUM=1
CONFIG_SOC_LCDCAM_CAM_DATA_WIDTH_MAX=16
CONFIG_IDF_CMAKE=y
CONFIG_IDF_TOOLCHAIN="gcc"
CONFIG_IDF_TOOLCHAIN_GCC=y
@ -1033,6 +1037,7 @@ CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y
CONFIG_BT_BLE_42_DTM_TEST_EN=y
CONFIG_BT_BLE_42_ADV_EN=y
CONFIG_BT_BLE_42_SCAN_EN=y
CONFIG_BT_BLE_VENDOR_HCI_EN=y
# CONFIG_BT_BLE_HIGH_DUTY_ADV_INTERVAL is not set
# CONFIG_BT_ABORT_WHEN_ALLOCATION_FAILS is not set
# end of Bluedroid Options
@ -1254,6 +1259,7 @@ CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y
# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set
# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
# CONFIG_ESP_TLS_INSECURE is not set
CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y
# end of ESP-TLS
#
@ -1281,6 +1287,12 @@ CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
# end of Common ESP-related
#
# ESP-Driver:Camera Controller Configurations
#
# CONFIG_CAM_CTLR_DVP_CAM_ISR_CACHE_SAFE is not set
# end of ESP-Driver:Camera Controller Configurations
#
# ESP-Driver:GPIO Configurations
#
@ -1598,8 +1610,11 @@ CONFIG_ESP_PHY_RF_CAL_PARTIAL=y
# CONFIG_ESP_PHY_RF_CAL_NONE is not set
# CONFIG_ESP_PHY_RF_CAL_FULL is not set
CONFIG_ESP_PHY_CALIBRATION_MODE=0
CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000
# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set
# CONFIG_ESP_PHY_RECORD_USED_TIME is not set
CONFIG_ESP_PHY_IRAM_OPT=y
# CONFIG_ESP_PHY_DEBUG is not set
# end of PHY
#
@ -2270,6 +2285,7 @@ CONFIG_MBEDTLS_DYNAMIC_BUFFER=y
# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set
# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set
# CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE is not set
# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set
CONFIG_MBEDTLS_PKCS7_C=y
# end of mbedTLS v3.x related
@ -3298,6 +3314,7 @@ CONFIG_BT_NIMBLE_COEX_PHY_CODED_TX_RX_TLIM_DIS=y
CONFIG_SW_COEXIST_ENABLE=y
CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y
CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y
# CONFIG_CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE is not set
# CONFIG_MCPWM_ISR_IN_IRAM is not set
# CONFIG_EVENT_LOOP_PROFILING is not set
CONFIG_POST_EVENTS_FROM_ISR=y