赞
回答
收藏
#竞赛 763 人阅读 | 0 人回复 | 2025-02-28
该用户从未签到
0
22
白丁
SUCCESS<\/p>\r\n
Back<\/a><\/p>\r\n<\/body><\/html>\r\n)html\";\r\n\r\nclass SettingUIAbility : public UIAbility {\r\nprivate:\r\n lv_obj_t *container = nullptr;\r\n lv_obj_t *date_label = nullptr;\r\n lv_obj_t *weakup_word_label = nullptr;\r\n lv_obj_t *employee_label = nullptr;\r\n lv_obj_t *distance_label = nullptr;\r\n lv_obj_t *distance_lat_label = nullptr;\r\n lv_obj_t *distance_lng_label = nullptr;\r\n lv_obj_t *speed_limit_label = nullptr;\r\n lv_obj_t *co2_limit_label = nullptr;\r\n lv_obj_t *temperature_limit_label = nullptr;\r\n\r\n String date = \"2025-02-17\";\r\n String weakup_word = \"\u4f60\u597d\u5c0f\u660e\";\r\n String employee = \"Xiao Ming\";\r\n String distance = \"XIPING\";\r\n double distance_lat = 33.387700;\r\n double distance_lng = 114.021001;\r\n float co2_limit = 0;\r\n float temperature_limit = 0;\r\n int speed_limit = 0;\r\n WebServer server{80};\r\n\r\npublic:\r\n void create_ui(lv_obj_t *parent) {\r\n displayLabel(\"Server IP: \" +\r\n std::string(WiFi.softAPIP().toString().c_str()),\r\n 10, parent);\r\n date_label = displayLabel(\"Date: \" + std::string(date.c_str()), 25, parent);\r\n\r\n weakup_word_label = displayLabel(\r\n \"Weakup Word: \" + std::string(weakup_word.c_str()), 40, parent);\r\n employee_label =\r\n displayLabel(\"Employee: \" + std::string(employee.c_str()), 55, parent);\r\n distance_label =\r\n displayLabel(\"Distance: \" + std::string(distance.c_str()), 70, parent);\r\n distance_lat_label = displayLabel(\r\n \"Distance Latitude: \" + std::to_string(distance_lat), 85, parent);\r\n distance_lng_label = displayLabel(\r\n \"Distance Longitude: \" + std::to_string(distance_lng), 100, parent);\r\n speed_limit_label = displayLabel(\r\n \"Speed Limit: \" + std::to_string(speed_limit), 115, parent);\r\n co2_limit_label =\r\n displayLabel(\"CO2 Limit: \" + std::to_string(co2_limit), 130, parent);\r\n temperature_limit_label = displayLabel(\r\n \"Temperature Limit: \" + std::to_string(temperature_limit), 145, parent);\r\n\r\n \/\/ \u9000\u51fa\u6309\u94ae\r\n lv_obj_t *btn = lv_btn_create(parent);\r\n lv_obj_t *label = lv_label_create(btn);\r\n lv_label_set_text(label, \"Exit\");\r\n lv_obj_align(btn, LV_ALIGN_BOTTOM_MID, 0, -10);\r\n lv_obj_set_size(btn, 80, 50);\r\n lv_obj_set_flex_flow(btn, LV_FLEX_FLOW_COLUMN); \/\/ \u5782\u76f4\u6392\u5217\r\n lv_obj_set_flex_align(btn, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER,\r\n LV_FLEX_ALIGN_CENTER); \/\/ \u5782\u76f4\u548c\u6c34\u5e73\u5c45\u4e2d\r\n\r\n lv_obj_add_event_cb(\r\n btn,\r\n [](lv_event_t *event) {\r\n if (lv_event_get_code(event) == LV_EVENT_CLICKED) {\r\n auto &uiHandler = SharedData::Get().uiHandler;\r\n SwitchUIAbility(uiHandler.setting_ui, uiHandler.menu_ui);\r\n }\r\n },\r\n LV_EVENT_CLICKED, NULL);\r\n }\r\n void onCreate() override {}\r\n void onShow() override {\r\n \/\/ \u8bbe\u7f6e ESP32 \u4e3a AP \u6a21\u5f0f\r\n WiFi.softAP(apSSID, apPassword);\r\n Serial.println(\"ESP32 AP Mode Started\");\r\n Serial.print(\"IP Address: \");\r\n Serial.println(WiFi.softAPIP());\r\n\r\n \/\/ SharedData::Load();\r\n date = SharedData::Get().setting.date;\r\n weakup_word = SharedData::Get().setting.weakup_word;\r\n employee = SharedData::Get().setting.employee;\r\n distance = SharedData::Get().setting.distance;\r\n distance_lat = SharedData::Get().setting.distance_lat;\r\n distance_lng = SharedData::Get().setting.distance_lng;\r\n speed_limit = SharedData::Get().setting.speed_limit;\r\n co2_limit = SharedData::Get().setting.co2_limit;\r\n temperature_limit = SharedData::Get().setting.temperature_limit;\r\n \/\/ temperature_limit\r\n printf(\"temperature_limit: %f\\n\", temperature_limit);\r\n \/\/ \u914d\u7f6e Web \u670d\u52a1\u5668\u8def\u7531\r\n server.on(\"\/\", HTTP_GET, [this]() { handleRoot(); });\r\n server.on(\"\/set\", HTTP_POST, [this]() { handleSet(); });\r\n server.begin();\r\n\r\n if (container == nullptr) {\r\n static lv_style_t cont_style;\r\n lv_style_init(&cont_style);\r\n lv_style_set_bg_opa(&cont_style, 0);\r\n lv_style_set_radius(&cont_style, 0);\r\n lv_style_set_pad_all(&cont_style, 0);\r\n\r\n container = lv_obj_create(lv_scr_act());\r\n lv_obj_set_size(container, LV_HOR_RES, LV_VER_RES);\r\n lv_obj_clear_flag(container, LV_OBJ_FLAG_SCROLLABLE);\r\n lv_obj_clear_flag(container, LV_OBJ_FLAG_GESTURE_BUBBLE);\r\n lv_obj_add_style(container, &cont_style, 0);\r\n\r\n create_ui(container);\r\n } else {\r\n lv_obj_clear_flag(container, LV_OBJ_FLAG_HIDDEN);\r\n }\r\n }\r\n\r\n void onHide() override {\r\n server.close();\r\n WiFi.softAPdisconnect();\r\n if (container != nullptr) {\r\n lv_obj_add_flag(container, LV_OBJ_FLAG_HIDDEN);\r\n }\r\n }\r\n\r\n void onForeground() override { server.handleClient(); }\r\n\r\nprivate:\r\n \/\/ \u5904\u7406\u6839\u76ee\u5f55\u8bf7\u6c42\r\n void handleRoot() {\r\n String htmlContent;\r\n htmlContent.reserve(1024);\r\n htmlContent = String(htmlRoot).c_str(); \/\/ \u62fc\u63a5HTML\u5b57\u7b26\u4e32\r\n htmlContent.replace(\"%dt%\", date);\r\n htmlContent.replace(\"%w%\", weakup_word);\r\n htmlContent.replace(\"%e%\", employee);\r\n htmlContent.replace(\"%d%\", distance);\r\n htmlContent.replace(\"%dlat%\", String(distance_lat).c_str());\r\n htmlContent.replace(\"%dlng%\", String(distance_lng).c_str());\r\n htmlContent.replace(\"%s%\", String(speed_limit).c_str());\r\n htmlContent.replace(\"%c%\", String(co2_limit).c_str());\r\n htmlContent.replace(\"%t%\", String(temperature_limit).c_str());\r\n server.send(200, \"text\/html\", htmlContent);\r\n }\r\n\r\n \/\/ \u5904\u7406\u8868\u5355\u63d0\u4ea4\r\n void handleSet() {\r\n \/\/ \u9a8c\u8bc1\u63d0\u4ea4\u7684\u53c2\u6570\u662f\u5426\u6709\u6548\r\n if (!server.hasArg(\"employee\") || !server.hasArg(\"distance_lat\") ||\r\n !server.hasArg(\"distance_lng\") || !server.hasArg(\"speed_limit\") ||\r\n !server.hasArg(\"co2_limit\") || !server.hasArg(\"temperature_limit\") ||\r\n !server.hasArg(\"date\")) {\r\n server.send(400, \"text\/html\", \"Missing configuration parameter.\");\r\n return;\r\n }\r\n\r\n date = server.arg(\"date\");\r\n updateLabel(date_label, \"Date: \" + std::string(date.c_str()));\r\n employee = server.arg(\"employee\");\r\n updateLabel(employee_label, \"Employee: \" + std::string(employee.c_str()));\r\n distance = server.arg(\"distance\");\r\n updateLabel(distance_label, \"Distance: \" + std::string(distance.c_str()));\r\n distance_lat = server.arg(\"distance_lat\").toFloat();\r\n updateLabel(distance_lat_label,\r\n \"Distance Latitude: \" + std::to_string(distance_lat));\r\n distance_lng = server.arg(\"distance_lng\").toFloat();\r\n updateLabel(distance_lng_label,\r\n \"Distance Longitude: \" + std::to_string(distance_lng));\r\n speed_limit = server.arg(\"speed_limit\").toInt();\r\n updateLabel(speed_limit_label,\r\n \"Speed Limit: \" + std::to_string(speed_limit));\r\n co2_limit = server.arg(\"co2_limit\").toFloat();\r\n updateLabel(co2_limit_label, \"CO2 Limit: \" + std::to_string(co2_limit));\r\n temperature_limit = server.arg(\"temperature_limit\").toFloat();\r\n updateLabel(temperature_limit_label,\r\n \"Temperature Limit: \" + std::to_string(temperature_limit));\r\n\r\n SharedData::Get().setting.date = date;\r\n SharedData::Get().setting.weakup_word = weakup_word;\r\n SharedData::Get().setting.employee = employee;\r\n SharedData::Get().setting.distance = distance;\r\n SharedData::Get().setting.distance_lat = distance_lat;\r\n SharedData::Get().setting.distance_lng = distance_lng;\r\n SharedData::Get().setting.speed_limit = speed_limit;\r\n SharedData::Get().setting.co2_limit = co2_limit;\r\n SharedData::Get().setting.temperature_limit = temperature_limit;\r\n\r\n SharedData::Save();\r\n\r\n \/\/ \u8fd4\u56de\u66f4\u65b0\u7684\u914d\u7f6e\r\n String response = String(htmlSet).c_str();\r\n response.replace(\"%s\", employee);\r\n server.send(200, \"text\/html\", response);\r\n }\r\n\r\n \/\/ \u521b\u5efa\u663e\u793a\u6807\u7b7e\r\n lv_obj_t *displayLabel(const std::string &text, int y_offset,\r\n lv_obj_t *parent = lv_scr_act()) {\r\n lv_obj_t *label = lv_label_create(parent);\r\n lv_label_set_text(label, text.c_str());\r\n lv_obj_align(label, LV_ALIGN_TOP_MID, 0, y_offset);\r\n return label;\r\n }\r\n\r\n \/\/ \u66f4\u65b0\u6807\u7b7e\u5185\u5bb9\r\n void updateLabel(lv_obj_t *label, const std::string &text) {\r\n lv_label_set_text(label, text.c_str());\r\n }\r\n};\r\n```\r\n\r\n##### \u6444\u50cf\u5934 UI\r\n\r\n```C++\r\n#pragma once\r\n#include \"..\/..\/..\/shared\/shared.h\"\r\n#include \"..\/utils\/page.h\"\r\n#include \"face_recognition_112_v1_s16.hpp\"\r\n#include \"face_recognition_112_v1_s8.hpp\"\r\n#include \"face_recognition_tool.hpp\"\r\n#include \"human_face_detect_mnp01.hpp\"\r\n#include \"human_face_detect_msr01.hpp\"\r\n#include \r\n#include \r\n\r\n#define FACE_ID_SAVE_NUMBER 1\r\n\r\nusing namespace mooncake;\r\n\r\nHumanFaceDetectMSR01 s1(0.1F, 0.5F, 10, 0.2F);\r\nHumanFaceDetectMNP01 s2(0.5F, 0.3F, 5);\r\n\r\nclass CameraUIAbility : public UIAbility {\r\nprivate:\r\n int8_t is_enrolling = 0;\r\n M5Canvas canvas;\r\n FaceRecognition112V1S8 recognizer;\r\n int8_t mode = 1;\r\n lv_obj_t *container = nullptr;\r\n lv_obj_t *btn_delete;\r\n\r\npublic:\r\n CameraUIAbility() : canvas(&CoreS3.Display) {}\r\n ~CameraUIAbility() {}\r\n void setMode(int8_t mode) { this->mode = mode; }\r\n void onCreate() override {\r\n if (!CoreS3.Camera.begin()) {\r\n CoreS3.Display.drawString(\"Camera Init Fail\", 0, 0);\r\n }\r\n \r\n recognizer.set_partition(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, \"fr\");\r\n recognizer.set_ids_from_flash();\r\n\r\n int enrolled_count = recognizer.get_enrolled_id_num();\r\n printf(\"enrolled_count %d\\n\", enrolled_count);\r\n }\r\n esp_err_t camera_capture_and_face_detect() {\r\n if (CoreS3.Camera.get()) {\r\n camera_fb_t *fb = CoreS3.Camera.fb;\r\n std::list &candidates =\r\n s1.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3});\r\n std::list &results =\r\n s2.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3},\r\n candidates);\r\n\r\n canvas.pushImage(0, 0, fb->width, fb->height, (uint16_t *)fb->buf);\r\n\r\n if (results.size() > 0) {\r\n int face_id = 0;\r\n fb_data_t rfb;\r\n rfb.width = fb->width;\r\n rfb.height = fb->height;\r\n rfb.data = fb->buf;\r\n rfb.bytes_per_pixel = 2;\r\n rfb.format = FB_RGB565;\r\n\r\n face_id = run_face_recognition(&rfb, &results);\r\n face_coordinate(&rfb, &results, face_id);\r\n show_face_id(face_id);\r\n int enrolled_count = recognizer.get_enrolled_id_num();\r\n if (face_id > 0 && mode) {\r\n auto &uiHandler = SharedData::Get().uiHandler;\r\n SharedData::Get().status.is_valid = true;\r\n SwitchUIAbility(uiHandler.camera_ui, uiHandler.menu_ui);\r\n }\r\n }\r\n\r\n canvas.pushSprite(0, 0);\r\n CoreS3.Camera.free();\r\n }\r\n return ESP_OK;\r\n }\r\n void createUI() {\r\n container = lv_obj_create(lv_scr_act());\r\n lv_obj_set_size(container, 80, 240);\r\n lv_obj_align(container, LV_ALIGN_RIGHT_MID, 0, 0);\r\n lv_obj_set_scrollbar_mode(container, LV_SCROLLBAR_MODE_OFF);\r\n lv_obj_set_style_border_opa(container, LV_OPA_TRANSP, LV_PART_MAIN);\r\n lv_obj_set_flex_flow(container, LV_FLEX_FLOW_COLUMN);\r\n lv_obj_set_flex_align(container, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER,\r\n LV_FLEX_ALIGN_CENTER);\r\n\r\n \/\/ \u5220\u9664\u6309\u94ae\r\n btn_delete = lv_btn_create(container);\r\n lv_obj_t *label_delete = lv_label_create(btn_delete);\r\n lv_label_set_text(label_delete, \"Delete\");\r\n lv_obj_align(btn_delete, LV_ALIGN_TOP_LEFT, 0, -10);\r\n lv_obj_set_size(btn_delete, 60, 50);\r\n lv_obj_add_flag(btn_delete, LV_OBJ_FLAG_HIDDEN);\r\n lv_obj_set_flex_flow(btn_delete, LV_FLEX_FLOW_COLUMN);\r\n lv_obj_set_flex_align(btn_delete, LV_FLEX_ALIGN_CENTER,\r\n LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);\r\n\r\n lv_obj_add_event_cb(\r\n btn_delete,\r\n [](lv_event_t *event) {\r\n if (lv_event_get_code(event) == LV_EVENT_CLICKED) {\r\n ((CameraUIAbility *)event->user_data)->recognizer.delete_id(false);\r\n ((CameraUIAbility *)event->user_data)\r\n ->recognizer.write_ids_to_flash();\r\n }\r\n },\r\n LV_EVENT_CLICKED, this);\r\n\r\n lv_obj_t *btn_enroll = lv_btn_create(container);\r\n lv_obj_t *label_enroll = lv_label_create(btn_enroll);\r\n lv_label_set_text(label_enroll, \"Enroll\");\r\n lv_obj_align(btn_enroll, LV_ALIGN_TOP_LEFT, 0, 10);\r\n lv_obj_set_size(btn_enroll, 60, 50);\r\n lv_obj_set_flex_flow(btn_enroll, LV_FLEX_FLOW_COLUMN);\r\n lv_obj_set_flex_align(btn_enroll, LV_FLEX_ALIGN_CENTER,\r\n LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);\r\n if (mode == 1) {\r\n lv_obj_add_flag(btn_enroll, LV_OBJ_FLAG_HIDDEN); \/\/ \u9690\u85cf\u5bb9\u5668\r\n } else {\r\n ;\r\n lv_obj_clear_flag(btn_enroll, LV_OBJ_FLAG_HIDDEN); \/\/ \u663e\u793a\u5bb9\u5668\r\n }\r\n\r\n lv_obj_add_event_cb(\r\n btn_enroll,\r\n [](lv_event_t *event) {\r\n if (lv_event_get_code(event) == LV_EVENT_CLICKED) {\r\n ((CameraUIAbility *)event->user_data)->is_enrolling = 1;\r\n }\r\n },\r\n LV_EVENT_CLICKED, this);\r\n\r\n lv_obj_t *btn_exit = lv_btn_create(container);\r\n lv_obj_t *label_exit = lv_label_create(btn_exit);\r\n lv_label_set_text(label_exit, \"Exit\");\r\n lv_obj_align(btn_exit, LV_ALIGN_TOP_RIGHT, 0, -10);\r\n lv_obj_set_size(btn_exit, 60, 50);\r\n lv_obj_set_flex_flow(btn_exit, LV_FLEX_FLOW_COLUMN);\r\n lv_obj_set_flex_align(btn_exit, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER,\r\n LV_FLEX_ALIGN_CENTER);\r\n\r\n lv_obj_add_event_cb(\r\n btn_exit,\r\n [](lv_event_t *event) {\r\n if (lv_event_get_code(event) == LV_EVENT_CLICKED) {\r\n auto &uiHandler = SharedData::Get().uiHandler;\r\n int mode = ((CameraUIAbility *)event->user_data)->mode;\r\n SwitchUIAbility(uiHandler.camera_ui, mode == 0\r\n ? uiHandler.menu_ui\r\n : uiHandler.splash_ui);\r\n }\r\n },\r\n LV_EVENT_CLICKED, this);\r\n }\r\n void onShow() override {\r\n canvas.createSprite(240, 240);\r\n if (container == nullptr) {\r\n this->createUI();\r\n } else {\r\n lv_obj_clear_flag(container, LV_OBJ_FLAG_HIDDEN);\r\n }\r\n }\r\n void onHide() override {\r\n if (container != nullptr) {\r\n lv_obj_add_flag(container, LV_OBJ_FLAG_HIDDEN);\r\n canvas.deleteSprite();\r\n }\r\n }\r\n void onForeground() override {\r\n int enrolled_count = recognizer.get_enrolled_id_num();\r\n if (mode == 0 && enrolled_count > 0) {\r\n lv_obj_clear_flag(btn_delete, LV_OBJ_FLAG_HIDDEN);\r\n return;\r\n } else {\r\n lv_obj_add_flag(btn_delete, LV_OBJ_FLAG_HIDDEN);\r\n }\r\n camera_capture_and_face_detect();\r\n }\r\n void face_coordinate(fb_data_t *fb, std::list *results,\r\n int face_id) {\r\n int x, y, w, h;\r\n int xf = 160, yf = 120;\r\n int i = 0;\r\n for (std::list::iterator prediction =\r\n results->begin();\r\n prediction != results->end(); prediction++, i++) {\r\n x = (int)prediction->box[0];\r\n y = (int)prediction->box[1];\r\n\r\n if (y < 0)\r\n y = 0;\r\n\r\n w = (int)prediction->box[2] - x + 1;\r\n h = (int)prediction->box[3] - y + 1;\r\n\r\n if ((x + w) > fb->width)\r\n w = fb->width - x;\r\n if ((y + h) > fb->height)\r\n h = fb->height - y;\r\n\r\n xf = x + w \/ 2;\r\n yf = y + h \/ 2;\r\n\r\n canvas.drawRect(x, y, w, h, face_id > 0 ? TFT_GREEN : TFT_RED);\r\n }\r\n }\r\n\r\n void show_face_id(int face_id) {\r\n canvas.setFont(&fonts::efontCN_12_b);\r\n canvas.setTextSize(2);\r\n canvas.setTextColor(TFT_WHITE);\r\n canvas.setCursor(10, 10);\r\n if (face_id > 0)\r\n canvas.printf(\"ID: %d %s\", face_id, SharedData::Get().setting.employee);\r\n else {\r\n canvas.printf(\"\u672a\u77e5\u5458\u5de5!\");\r\n }\r\n }\r\n\r\n int run_face_recognition(fb_data_t *fb,\r\n std::list *results) {\r\n std::vector landmarks = results->front().keypoint;\r\n int id = -1;\r\n\r\n Tensor tensor;\r\n tensor.set_element((uint8_t *)fb->data)\r\n .set_shape({fb->height, fb->width, 3})\r\n .set_auto_free(false);\r\n\r\n int enrolled_count = recognizer.get_enrolled_id_num();\r\n\r\n if (enrolled_count < FACE_ID_SAVE_NUMBER && is_enrolling) {\r\n id = recognizer.enroll_id(tensor, landmarks, \"face\", true);\r\n recognizer.write_ids_to_flash();\r\n printf(\"Enrolled ID: %d \\n\", id);\r\n is_enrolling = 0;\r\n }\r\n\r\n face_info_t recognize = recognizer.recognize(tensor, landmarks);\r\n if (recognize.id >= 0) {\r\n printf(\"ID[%u]: %.2f \\n\", recognize.id, recognize.similarity);\r\n }\r\n return recognize.id;\r\n }\r\n};\r\n```\r\n\r\n##### LLM Worker\r\n\r\n```C++\r\n#pragma once\r\n#include \"..\/..\/..\/shared\/shared.h\"\r\n#include \r\n#include \r\n#include \r\n\r\nusing namespace mooncake;\r\n\r\nclass LLMWorkerAbility : public WorkerAbility {\r\nprivate:\r\n uint32_t baud = 115200;\r\n HardwareSerial llm_serial;\r\n \/\/ String tts_work_id;\r\n String language;\r\n M5ModuleLLM module_llm;\r\n M5ModuleLLM_VoiceAssistant *voice_assistant;\r\n lv_obj_t *text_label_tip_container;\r\n lv_obj_t *text_label_tip;\r\n\r\npublic:\r\n LLMWorkerAbility() : llm_serial(2), language(\"zh_CN\") {\r\n voice_assistant = new M5ModuleLLM_VoiceAssistant(&module_llm);\r\n }\r\n ~LLMWorkerAbility() { delete voice_assistant; }\r\n void onCreate() override {\r\n text_label_tip_container = lv_obj_create(lv_scr_act());\r\n lv_obj_set_size(text_label_tip_container, 300, 50);\r\n lv_obj_align(text_label_tip_container, LV_ALIGN_TOP_MID, 0, 0);\r\n lv_obj_set_scrollbar_mode(text_label_tip_container, LV_SCROLLBAR_MODE_OFF);\r\n lv_obj_set_style_bg_color(text_label_tip_container,\r\n lv_palette_main(LV_PALETTE_GREEN), 0);\r\n lv_obj_add_flag(text_label_tip_container, LV_OBJ_FLAG_HIDDEN);\r\n\r\n text_label_tip = lv_label_create(text_label_tip_container);\r\n lv_label_set_text(text_label_tip, \"saying...\");\r\n lv_obj_align(text_label_tip, LV_ALIGN_TOP_MID, 0, 0);\r\n lv_obj_set_style_text_font(text_label_tip, &lv_font_montserrat_20, 0);\r\n lv_obj_set_style_text_color(text_label_tip, lv_color_make(255, 255, 255),\r\n 0);\r\n\r\n llm_serial.begin(baud, SERIAL_8N1, 18, 17);\r\n module_llm.begin(&llm_serial);\r\n while (1) {\r\n if (module_llm.checkConnection()) {\r\n Serial.println(\"llm_setup success\");\r\n break;\r\n }\r\n }\r\n\r\n \/\/ m5_module_llm::ApiTtsSetupConfig_t tts_config;\r\n \/\/ tts_work_id = module_llm.tts.setup(tts_config, \"tts_setup\", language);\r\n \/\/ Serial.println(\"LLMWorkerAbility created\");\r\n\r\n int ret = voice_assistant->begin(SharedData::Get().setting.weakup_word, \"\",\r\n \"zh_CN\");\r\n\r\n if (ret != MODULE_LLM_OK) {\r\n Serial.println(\"voice assistant begin failed\");\r\n }\r\n\r\n \/* Register on ASR data callback function \u663e\u793a text_label_tip_container*\/\r\n voice_assistant->onAsrDataInput(\r\n [this](String data, bool isFinish, int index) {\r\n Serial.printf(\"asr data: %s\\n\", data.c_str());\r\n lv_obj_add_flag(text_label_tip_container, LV_OBJ_FLAG_HIDDEN);\r\n lv_label_set_text(text_label_tip, \"linstening...\");\r\n if (isFinish) {\r\n lv_obj_add_flag(text_label_tip_container, LV_OBJ_FLAG_HIDDEN);\r\n Serial.printf(\"asr data finish >> \\n\");\r\n }\r\n });\r\n\r\n voice_assistant->onLlmDataInput(\r\n [this](String data, bool isFinish, int index) {\r\n lv_obj_clear_flag(text_label_tip_container, LV_OBJ_FLAG_HIDDEN);\r\n Serial.printf(\"llm data: %s\\n\", data.c_str());\r\n lv_label_set_text(text_label_tip, \"say...\");\r\n if (isFinish) {\r\n lv_obj_add_flag(text_label_tip_container, LV_OBJ_FLAG_HIDDEN);\r\n Serial.printf(\"llm data finish\\n\");\r\n }\r\n });\r\n }\r\n\r\n void onRunning() override { voice_assistant->update(); }\r\n \/\/ void play(String text) { module_llm.tts.inference(tts_work_id, text,\r\n \/\/ 10000); }\r\n void onPause() override { llm_serial.end(); }\r\n void onResume() override { llm_serial.begin(baud, SERIAL_8N1, 9, 8); }\r\n};\r\n```\r\n\r\n##### TMOS Worker\r\n\r\n```C++\r\n#include \"M5_STHS34PF80.h\"\r\n#include \r\n#include \r\n\r\nusing namespace mooncake;\r\n\r\nclass TMOSWorkerAbility : public WorkerAbility {\r\nprivate:\r\n M5_STHS34PF80 tmos;\r\n uint8_t motionHysteresis = 0;\r\n int16_t motionVal = 0, presenceVal = 0;\r\n uint16_t motionThresholdVal = 0, presenceThresholdVal = 0;\r\n sths34pf80_tmos_func_status_t status;\r\n sths34pf80_gain_mode_t gainMode;\r\n\r\npublic:\r\n sths34pf80_tmos_func_status_t getStatus() { return status; }\r\n sths34pf80_gain_mode_t getGainMode() { return gainMode; }\r\n bool isPresenceDetected() { return status.pres_flag; }\r\n bool isMotionDetected() { return status.mot_flag; }\r\n void onCreate() override {\r\n while (tmos.begin(&Wire) == false) {\r\n printf(\"Error setting up device - please check wiring.\\n\");\r\n delay(200);\r\n }\r\n\r\n tmos.setGainMode(STHS34PF80_GAIN_WIDE_MODE);\r\n tmos.setTmosODR(STHS34PF80_TMOS_ODR_AT_2Hz);\r\n tmos.setTmosSensitivity(0xff);\r\n tmos.setMotionThreshold(0xC8);\r\n tmos.setPresenceThreshold(0xC8);\r\n\r\n tmos.resetAlgo();\r\n\r\n tmos.getGainMode(&gainMode);\r\n }\r\n void onRunning() override {\r\n sths34pf80_tmos_drdy_status_t dataReady;\r\n tmos.getDataReady(&dataReady);\r\n if (dataReady.drdy == 1) {\r\n tmos.getPresenceValue(&presenceVal);\r\n tmos.getMotionValue(&motionVal);\r\n tmos.getStatus(&status);\r\n\r\n if (status.pres_flag == 1) {\r\n tmos.getPresenceValue(&presenceVal);\r\n SharedData::Get().status.is_presence = true;\r\n if (GetMooncake().extensionManager()->getUIAbilityCurrentState(\r\n SharedData::Get().uiHandler.splash_ui) ==\r\n UIAbility::State_t::StateForeground) {\r\n GetMooncake().extensionManager()->hideUIAbility(\r\n SharedData::Get().uiHandler.splash_ui);\r\n GetMooncake().extensionManager()->showUIAbility(\r\n SharedData::Get().uiHandler.camera_ui);\r\n }\r\n }\r\n\r\n if (status.mot_flag == 1) {\r\n tmos.getMotionValue(&motionVal);\r\n }\r\n }\r\n }\r\n};\r\n```\r\n\r\n**\u4ee3\u7801\u5730\u5740: \u200b**\u200b [\u4ee3\u7801\u5730\u5740](https:\/\/www.eefocus.com\/forum\/forum.php?mod=attachment&aid=MjA1ODU3NXwxYzJjZTdmY3wxNzQwOTY3NDgwfDM3ODk5OHwyMzIxOTk%3D)\r\n\r\n**\u89c6\u9891\u5730\u5740: \u200b**\u200b**\u94fe\u63a5: https:\/\/pan.baidu.com\/s\/1yRhPv3BXbSlQB9YuatgIfw?pwd=qhs4 \u63d0\u53d6\u7801: qhs4 \u590d\u5236\u8fd9\u6bb5\u5185\u5bb9\u540e\u6253\u5f00\u767e\u5ea6\u7f51\u76d8\u624b\u673aApp\uff0c\u64cd\u4f5c\u66f4\u65b9\u4fbf\u54e6\u200b**\r\n\r\n"][0], { cdn: "/forum/source/plugin/sf_markdown/dist/vditor", transform: function(h) { return h.replace(new RegExp('<ignore_js_op>
</ignore_js_op>', 'g'), '
') } })
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
eefocus_4062116
发表主题 0
陈工-创龙科技 2025-11-06
maoyanmcu 2025-11-05
eefocus_3839331 2025-11-05
eefocus_4173958 2025-11-05
陈工-创龙科技 2025-11-04
查看 »