diff --git a/ESP32/cpp/README.md b/ESP32/cpp/README.md new file mode 100644 index 0000000..9b4a82f --- /dev/null +++ b/ESP32/cpp/README.md @@ -0,0 +1,55 @@ +# 如何使用 +## Module LLM 部分 +### 1. 参考 [Module LLM 固件升级](https://docs.m5stack.com/zh_CN/guide/llm/llm/image),获取最新的 [Module LLM 底包](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/M5_LLM_ubuntu2022-02_20241203-mini.axp) (M5_LLM_ubuntu_v1.3_20241203-mini) +### 2. 使用 Windows 操作系统电脑,参考《**烧录升级**》部分,升级最新的**Module LLM 底包** +### 3. 获取最新的 [Module LLM 软件包](https://github.com/m5stack/StackFlow/releases),需要自行下载 +#### 3.1 用到的 **VLLM 模型**, llm-internvl2.5-1B-ax630c_0.3-m5stack1_arm64.deb [Github](https://github.com/m5stack/StackFlow/releases/download/v1.4.0/llm-internvl2.5-1B-ax630c_0.3-m5stack1_arm64.deb) **|** [ali-oss](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/deb/llm-internvl2.5-1B-ax630c_0.3-m5stack1_arm64.deb) +#### 3.2 用到的 **VLM 软件包**,llm-vlm_1.4-m5stack1_arm64.deb [Github](https://github.com/m5stack/StackFlow/releases/download/v1.4.0/lib-llm_1.4-m5stack1_arm64.deb) **|** [ali-oss](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/deb/llm-vlm_1.4-m5stack1_arm64.deb) +#### 3.3 用到的 **LIB 包**,lib-llm_1.4-m5stack1_arm64.deb [Github](https://github.com/m5stack/StackFlow/releases/download/v1.4.0/lib-llm_1.4-m5stack1_arm64.deb) **|** [ali-oss](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/deb/lib-llm_1.4-m5stack1_arm64.deb) +#### 3.5 用到的 **YOLO 姿态模型** llm-yolo11n-pose_0.3-m5stack1_arm64.deb [Github](https://github.com/m5stack/StackFlow/releases/download/v1.4.0/llm-yolo11n-pose_0.3-m5stack1_arm64.deb) **|** [ali-oss](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/deb/llm-yolo11n-pose_0.3-m5stack1_arm64.deb) +#### 3.6 用到的 **YOLO 手部姿态模型** llm-yolo11n-hand-pose_0.3-m5stack1_arm64.deb [Github](https://github.com/m5stack/StackFlow/releases/download/v1.4.0/llm-yolo11n-hand-pose_0.3-m5stack1_arm64.deb) **|** [ali-oss](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/deb/llm-yolo11n-hand-pose_0.3-m5stack1_arm64.deb) +#### 3.7 用到的 **YOLO 软件包** llm-yolo_1.4-m5stack1_arm64.deb [Github](https://github.com/m5stack/StackFlow/releases/download/v1.4.0/llm-yolo_1.4-m5stack1_arm64.deb) **|** [ali-oss](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/deb/llm-yolo_1.4-m5stack1_arm64.deb) +### 4. 安装需要的软件包 +#### **【方法一】** 参考《**应用升级**》 部分,通过 SD 卡自动安装 +#### **【方法二】** 参考 [调试板使用教程](https://docs.m5stack.com/zh_CN/guide/llm/llm/adb) 及以下文档 +```bash +adb push llm-internvl2.5-1B-ax630c_0.3-m5stack1_arm64.deb /opt/ +adb push llm-vlm_1.4-m5stack1_arm64.deb /opt/ +adb push lib-llm_1.4-m5stack1_arm64.deb /opt/ +adb push llm-yolo11n-pose_0.3-m5stack1_arm64.deb /opt/ +adb push llm-yolo11n-hand-pose_0.3-m5stack1_arm64.deb /opt/ +adb push llm-yolo_1.4-m5stack1_arm64.deb /opt/ +``` +```bash +adb shell +``` +```bash +ls /opt/ +``` +```bash +dpkg -i /opt/llm-internvl2.5-1B-ax630c_0.3-m5stack1_arm64.deb +dpkg -i /opt/llm-vlm_1.4-m5stack1_arm64.deb.deb +dpkg -i /opt/lib-llm_1.4-m5stack1_arm64.deb.deb +dpkg -i /opt/llm-yolo11n-pose_0.3-m5stack1_arm64.deb +dpkg -i /opt/llm-yolo11n-hand-pose_0.3-m5stack1_arm64.deb +dpkg -i /opt/llm-yolo_1.4-m5stack1_arm64.deb +``` +![Adb](./images/000.png) +### 5. 📢 配置 **Module LLM** 串口波特率,将 ModuleLLM_Development_Guide/ESP32/cpp/sys_config.json 通过 adb 上传到 Module LLM 中并**重启 ModuleLLM** +```bash +cd ESP32/cpp/ +``` +```bash +adb push sys_config.json /opt/m5stack/ +``` +⚠️ 注意:如果需要改回默认配置,只需编辑 sys_config.json 将 config_serial_baud 的值改成 115200 覆盖源文件或者删除 Module LLM /opt/m5stack/目录下的此文件 + +## CoreS3 部分 +### 使用 platformio +### 1. 参考 [platformio](https://docs.platformio.org/en/latest/) 文档安装对应平台的 **platformio** 环境 +![platformio](./images/010.png) +### 2. 打开 Module LLM ESP32 CPP项目 +![Project](./images/011.png) +### 3. 选择对应的板子及端口 +![ENV](./images/012.png) +### 4. 点击 **"✓"** 编译,点击 **"→"** 烧录,如果出现烧录失败,按住 **CoreS3** 重启按键 2s 待绿灯亮起进入下载模式,然后重新烧录 \ No newline at end of file diff --git a/ESP32/cpp/images/000.png b/ESP32/cpp/images/000.png new file mode 100644 index 0000000..78a7b09 Binary files /dev/null and b/ESP32/cpp/images/000.png differ diff --git a/ESP32/cpp/images/010.png b/ESP32/cpp/images/010.png new file mode 100644 index 0000000..8a63896 Binary files /dev/null and b/ESP32/cpp/images/010.png differ diff --git a/ESP32/cpp/images/011.png b/ESP32/cpp/images/011.png new file mode 100644 index 0000000..2f6c16f Binary files /dev/null and b/ESP32/cpp/images/011.png differ diff --git a/ESP32/cpp/images/012.png b/ESP32/cpp/images/012.png new file mode 100644 index 0000000..afbbda0 Binary files /dev/null and b/ESP32/cpp/images/012.png differ diff --git a/ESP32/cpp/src/main.cpp b/ESP32/cpp/src/main.cpp index dc441b8..a9fb3fc 100644 --- a/ESP32/cpp/src/main.cpp +++ b/ESP32/cpp/src/main.cpp @@ -97,8 +97,8 @@ struct VlmData { bool finish; }; -const int BlueButtonPin = 8; -const int RedButtonPin = 9; +const int BlueButtonPin = 1; +const int RedButtonPin = 2; static constexpr std::size_t box_count = 7; static box_t box_list[box_count]; static yolo_box_t yolo_box; @@ -147,6 +147,8 @@ void setup_lcd(void) void setup_menu(void) { // lv_obj_add_flag(returnbutton, LV_OBJ_FLAG_HIDDEN); + canvas.setTextSize(1); + canvas.setTextColor(GREEN, GREEN); lv_obj_clear_flag(background, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(initialization_state, ""); @@ -196,7 +198,7 @@ void setup_comm(void) void setup_speaker(void) { CoreS3.Speaker.begin(); - CoreS3.Speaker.setVolume(100); + CoreS3.Speaker.setVolume(50); } void setup_llm(void) @@ -213,11 +215,11 @@ void setup_llm(void) while (1) { if (module_llm.checkConnection()) break; } - if (lvgl_port_lock()) { - lv_label_set_text_fmt(initialization_state, "Reset ModuleLLM %s", loading_animation[(millis() / 500) % 4]); - lvgl_port_unlock(); - } - module_llm.sys.reset(); + // if (lvgl_port_lock()) { + // lv_label_set_text_fmt(initialization_state, "Reset ModuleLLM %s", loading_animation[(millis() / 500) % 4]); + // lvgl_port_unlock(); + // } + // module_llm.sys.reset(); if (lvgl_port_lock()) { lv_label_set_text(initialization_state, "Initialization completed"); lvgl_port_unlock(); @@ -235,14 +237,22 @@ void setup_yolo_detect(void) yolo_config.model = "yolo11n"; yolo_box.model = "yolo11n"; yolo_work_id = module_llm.yolo.setup(yolo_config, "yolo_setup"); - while (yolo_work_id == nullptr) vTaskDelay(100); - if (lvgl_port_lock()) { - lv_label_set_text(initialization_state, "Initialization yolo detection completed"); - lvgl_port_unlock(); + while (yolo_work_id.isEmpty()) vTaskDelay(100); + if (yolo_work_id == "yolo") { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo detection failed"); + lvgl_port_unlock(); + } + while (1); + } else { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo detection completed"); + lvgl_port_unlock(); + } + vTaskDelay(200); + lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } - vTaskDelay(200); - lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } void setup_yolo_pose(void) @@ -256,14 +266,22 @@ void setup_yolo_pose(void) yolo_config.model = "yolo11n-pose"; yolo_box.model = "yolo11n-pose"; yolo_work_id = module_llm.yolo.setup(yolo_config, "yolo_setup"); - while (yolo_work_id == nullptr) vTaskDelay(100); - if (lvgl_port_lock()) { - lv_label_set_text(initialization_state, "Initialization yolo pose detection completed"); - lvgl_port_unlock(); + while (yolo_work_id.isEmpty()) vTaskDelay(100); + if (yolo_work_id == "yolo") { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo pose failed"); + lvgl_port_unlock(); + } + while (1); + } else { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo pose completed"); + lvgl_port_unlock(); + } + vTaskDelay(200); + lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } - vTaskDelay(200); - lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } void setup_yolo_seg(void) @@ -277,14 +295,23 @@ void setup_yolo_seg(void) yolo_config.model = "yolo11n-seg"; yolo_box.model = "yolo11n-seg"; yolo_work_id = module_llm.yolo.setup(yolo_config, "yolo_setup"); - while (yolo_work_id == nullptr) vTaskDelay(100); - if (lvgl_port_lock()) { - lv_label_set_text(initialization_state, "Initialization yolo segmentation completed"); - lvgl_port_unlock(); + yolo_work_id = module_llm.yolo.setup(yolo_config, "yolo_setup"); + while (yolo_work_id.isEmpty()) vTaskDelay(100); + if (yolo_work_id == "yolo") { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo segmentation failed"); + lvgl_port_unlock(); + } + while (1); + } else { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo segmentation completed"); + lvgl_port_unlock(); + } + vTaskDelay(200); + lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } - vTaskDelay(200); - lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } void setup_yolo_hand(void) @@ -298,14 +325,22 @@ void setup_yolo_hand(void) yolo_config.model = "yolo11n-hand-pose"; yolo_box.model = "yolo11n-hand-pose"; yolo_work_id = module_llm.yolo.setup(yolo_config, "yolo_setup"); - while (yolo_work_id == nullptr) vTaskDelay(100); - if (lvgl_port_lock()) { - lv_label_set_text(initialization_state, "Initialization yolo hand detection completed"); - lvgl_port_unlock(); + while (yolo_work_id.isEmpty()) vTaskDelay(100); + if (yolo_work_id == "yolo") { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo hand failed"); + lvgl_port_unlock(); + } + while (1); + } else { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization yolo hand completed"); + lvgl_port_unlock(); + } + vTaskDelay(200); + lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } - vTaskDelay(200); - lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } void setup_vlm(void) @@ -315,15 +350,25 @@ void setup_vlm(void) lvgl_port_unlock(); } m5_module_llm::ApiVlmSetupConfig_t vlm_config; - vlm_work_id = module_llm.vlm.setup(vlm_config, "vlm_setup"); - while (vlm_work_id == nullptr) vTaskDelay(100); - if (lvgl_port_lock()) { - lv_label_set_text(initialization_state, "Initialization InternVL2_5-1B-MPO completed"); - lvgl_port_unlock(); + vlm_config.model = "internvl2.5-1B-364-ax630c"; + vlm_config.max_token_len = 511; + vlm_work_id = module_llm.vlm.setup(vlm_config, "vlm_setup"); + while (vlm_work_id.isEmpty()) vTaskDelay(100); + if (vlm_work_id == "vlm") { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization VLLM failed"); + lvgl_port_unlock(); + } + while (1); + } else { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization VLLM completed"); + lvgl_port_unlock(); + } + vTaskDelay(200); + // lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); + // lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } - inference = false; - button_count = 0; - vTaskDelay(200); } void setup_melotts(void) @@ -335,14 +380,22 @@ void setup_melotts(void) m5_module_llm::ApiMelottsSetupConfig_t melotts_config; melotts_config.input = {vlm_work_id}; melotts_work_id = module_llm.melotts.setup(melotts_config, "melotts_setup"); - while (melotts_work_id == nullptr) vTaskDelay(100); - if (lvgl_port_lock()) { - lv_label_set_text(initialization_state, "Initialization meloTTS completed"); - lvgl_port_unlock(); + while (melotts_work_id.isEmpty()) vTaskDelay(100); + if (melotts_work_id == "melotts") { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization meloTTS failed"); + lvgl_port_unlock(); + } + while (1); + } else { + if (lvgl_port_lock()) { + lv_label_set_text(initialization_state, "Initialization meloTTS completed"); + lvgl_port_unlock(); + } + vTaskDelay(200); + lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } - vTaskDelay(200); - lv_obj_add_flag(initialization_state, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(background, LV_OBJ_FLAG_HIDDEN); } void setup_yolo(int j) @@ -438,10 +491,21 @@ void menuBackTask(void* pvParameters) play_wav(); box_list[5].touch_id = t.id; state = 0; - vTaskDelay(100); - if (!yolo_work_id.isEmpty()) module_llm.yolo.exit(yolo_work_id); - if (!vlm_work_id.isEmpty()) module_llm.vlm.exit(vlm_work_id); - if (!melotts_work_id.isEmpty()) module_llm.melotts.exit(melotts_work_id); + vTaskDelay(200); + if (!yolo_work_id.isEmpty()) { + module_llm.yolo.exit(yolo_work_id); + yolo_work_id.clear(); + } + if (!vlm_work_id.isEmpty()) { + module_llm.vlm.exit(vlm_work_id); + vlm_work_id.clear(); + lv_textarea_set_text(vllm_output, ""); + inference = false; + } + if (!melotts_work_id.isEmpty()) { + module_llm.melotts.exit(melotts_work_id); + melotts_work_id.clear(); + } setup_menu(); } @@ -536,7 +600,7 @@ void parseJson(const char* jsonString) vlm_data.delta = jsonDoc["data"]["delta"].as(); vlm_data.finish = jsonDoc["data"]["finish"].as(); jsonDoc.clear(); - lv_obj_add_flag(photoaction, LV_OBJ_FLAG_HIDDEN); + // lv_obj_add_flag(photoaction, LV_OBJ_FLAG_HIDDEN); if (lvgl_port_lock()) { lv_obj_clear_flag(vllm_output, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(vllm_title, LV_OBJ_FLAG_HIDDEN); @@ -544,7 +608,7 @@ void parseJson(const char* jsonString) lvgl_port_unlock(); } if (vlm_data.finish) { - vTaskDelay(8000); + vTaskDelay(7000); if (lvgl_port_lock()) { lv_obj_add_flag(vllm_output, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(vllm_title, LV_OBJ_FLAG_HIDDEN); @@ -579,7 +643,6 @@ void recv_llm_data(void) void vllm_inference() { - inference = true; vlm_data.finish = false; play_camera_wav(); @@ -589,7 +652,10 @@ void vllm_inference() frame2jpg(CoreS3.Camera.fb, 50, &out_jpg, &out_jpg_len); send_camera_data(out_jpg, out_jpg_len, vlm_work_id); free(out_jpg); - module_llm.vlm.inference(vlm_work_id, "请用幽默的方式描述这张图片,字数不超过60个。"); + vTaskDelay(100); + // module_llm.vlm.inference(vlm_work_id, + // "Please describe this picture in a humorous way with a word limit of 60 words."); + module_llm.vlm.inference(vlm_work_id, "请用幽默的方式描述图片,字数不超过60个"); // 中文输出 } void action_task(void* pvParameters) @@ -626,22 +692,53 @@ void recvTask(void* pvParameters) void button_task(void* pvParameters) { + static uint32_t last_blue_press = 0; + static uint32_t last_red_press = 0; + while (true) { + uint32_t now = xTaskGetTickCount() * portTICK_PERIOD_MS; + if (!digitalRead(BlueButtonPin)) { - // play_camera_wav(); - button_count = 4; - vTaskDelay(1000); + if ((state == 2) && (inference != true)) { + vTaskDelay(20 / portTICK_PERIOD_MS); + if (!digitalRead(BlueButtonPin)) { + if (now - last_blue_press > 1000) { + button_count = 4; + last_blue_press = now; + } + } + } } + if (!digitalRead(RedButtonPin)) { - play_wav(); - state = 0; - vTaskDelay(100); - if (!yolo_work_id.isEmpty()) module_llm.yolo.exit(yolo_work_id); - if (!vlm_work_id.isEmpty()) module_llm.vlm.exit(vlm_work_id); - if (!melotts_work_id.isEmpty()) module_llm.melotts.exit(melotts_work_id); - setup_menu(); + vTaskDelay(20 / portTICK_PERIOD_MS); + if (!digitalRead(RedButtonPin)) { + if (state != 0) + if (now - last_red_press > 1000) { + state = 0; + play_wav(); + vTaskDelay(200 / portTICK_PERIOD_MS); + if (!yolo_work_id.isEmpty()) { + module_llm.yolo.exit(yolo_work_id); + yolo_work_id.clear(); + } + if (!vlm_work_id.isEmpty()) { + module_llm.vlm.exit(vlm_work_id); + vlm_work_id.clear(); + lv_textarea_set_text(vllm_output, ""); + inference = false; + } + if (!melotts_work_id.isEmpty()) { + module_llm.melotts.exit(melotts_work_id); + melotts_work_id.clear(); + } + setup_menu(); + last_red_press = now; + } + } } - vTaskDelay(100); + + vTaskDelay(20 / portTICK_PERIOD_MS); } } @@ -662,9 +759,15 @@ void cameraTask(void* pvParameters) canvas.setTextDatum(bottom_left); - canvas.drawString(yolo_box.class_name.c_str(), yolo_box.x1, yolo_box.y1 - 40); - canvas.drawFloat(yolo_box.confidence, 2, yolo_box.x2, yolo_box.y1 - 40); + char result[50]; + strcpy(result, yolo_box.class_name.c_str()); + strcat(result, " "); + sprintf(result + strlen(result), "%.2f", yolo_box.confidence); + int y1_pos = yolo_box.y1 - 40; + if (y1_pos < 24) y1_pos = 24; + + canvas.drawString(result, yolo_box.x1, y1_pos); canvas.drawRect(yolo_box.x1, yolo_box.y1 - 40, yolo_box.x2, yolo_box.y2 - 40, ORANGE); const int pose_lines[][3] = { @@ -708,37 +811,15 @@ void cameraTask(void* pvParameters) canvas.pushImage(0, 0, CoreS3.Display.width(), CoreS3.Display.height(), (uint16_t*)CoreS3.Camera.fb->buf); if (button_count > 0) { - int edgeLength = 40; - canvas.fillRect(0, 0, edgeLength, 5, RED); // 上边 - canvas.fillRect(0, 0, 5, edgeLength, RED); // 左边 - canvas.fillRect(320 - edgeLength, 0, edgeLength, 5, RED); // 上边 - canvas.fillRect(320 - 5, 0, 5, edgeLength, RED); // 右边 - canvas.fillRect(0, 240 - edgeLength, 5, edgeLength, RED); // 左边 - canvas.fillRect(0, 240 - 5, edgeLength, 5, RED); // 下边 - canvas.fillRect(320 - edgeLength, 240 - 5, edgeLength, 5, RED); // 下边 - canvas.fillRect(320 - 5, 240 - edgeLength, 5, edgeLength, RED); // 右边 - - canvas.setTextSize(2); - canvas.setTextDatum(CC_DATUM); - if (button_count == 4) { - canvas.setTextColor(GREEN, GREEN); - canvas.drawString("3", 160, 120); - } else if (button_count == 3) { - canvas.setTextColor(YELLOW, YELLOW); - canvas.drawString("2", 160, 120); - } else if (button_count == 2) { - canvas.setTextColor(RED, RED); - canvas.drawString("1", 160, 120); - } else if (button_count == 1) { - CoreS3.Display.fillScreen(BLACK); - canvas.fillRect(0, 0, 320, 10, SKYBLUE); - canvas.fillRect(0, 230, 320, 10, SKYBLUE); - canvas.fillRect(0, 0, 10, 240, SKYBLUE); - canvas.fillRect(310, 0, 10, 240, SKYBLUE); - canvas.pushRotateZoomWithAA(160, 120, random(-15, 15), 0.8, 0.8); - button_count--; - vllm_inference(); - } + CoreS3.Display.fillScreen(BLACK); + canvas.fillRect(0, 0, 320, 10, SKYBLUE); + canvas.fillRect(0, 230, 320, 10, SKYBLUE); + canvas.fillRect(0, 0, 10, 240, SKYBLUE); + canvas.fillRect(310, 0, 10, 240, SKYBLUE); + canvas.pushRotateZoomWithAA(160, 120, random(-15, 15), -0.8, 0.8); + button_count = 0; + inference = true; + vllm_inference(); } canvas.pushSprite(&M5.Display, 0, 0); CoreS3.Camera.free(); @@ -758,16 +839,18 @@ void setup_task(void) { mutex = xSemaphoreCreateMutex(); xTaskCreatePinnedToCore(recvTask, "Receive Task", 8192, NULL, 3, NULL, 1); - xTaskCreatePinnedToCore(cameraTask, "Camera Task", 8192, NULL, 2, NULL, 0); + xTaskCreatePinnedToCore(cameraTask, "Camera Task", 8192, NULL, 3, NULL, 0); xTaskCreatePinnedToCore(menuTask, "Menu Task", 8192, NULL, 1, NULL, 1); - xTaskCreatePinnedToCore(menuBackTask, "Menu Back Task", 8192, NULL, 1, NULL, 1); + xTaskCreatePinnedToCore(menuBackTask, "Menu Back Task", 8192, NULL, 1, NULL, 0); xTaskCreatePinnedToCore(button_task, "Button Task", 8192, NULL, 3, NULL, 1); - xTaskCreatePinnedToCore(action_task, "Action Task", 8192, NULL, 3, NULL, 1); + // xTaskCreatePinnedToCore(action_task, "Action Task", 8192, NULL, 3, NULL, 1); } void setup() { - CoreS3.begin(); + auto cfg = M5.config(); + cfg.output_power = true; + CoreS3.begin(cfg); lvgl_port_init(M5.Lcd); vllm_display(); setup_bsp(); diff --git a/ESP32/cpp/sys_config.json b/ESP32/cpp/sys_config.json new file mode 100644 index 0000000..b305d96 --- /dev/null +++ b/ESP32/cpp/sys_config.json @@ -0,0 +1,4 @@ +{ + "config_enable_tcp": 1, + "config_serial_baud": 1500000 +}