From 17ac2ce0ed52874616c79c910667e41e34604826 Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期一, 31 八月 2026 13:14:12 +0800
Subject: [PATCH] add translation app

---
 xiaozhi-esp32-2.2.6/main/boards/sening-xiaozhi-s3/mqtt.c |   47 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/xiaozhi-esp32-2.2.6/main/boards/sening-xiaozhi-s3/mqtt.c b/xiaozhi-esp32-2.2.6/main/boards/sening-xiaozhi-s3/mqtt.c
index fce4e82..219255b 100644
--- a/xiaozhi-esp32-2.2.6/main/boards/sening-xiaozhi-s3/mqtt.c
+++ b/xiaozhi-esp32-2.2.6/main/boards/sening-xiaozhi-s3/mqtt.c
@@ -15,6 +15,7 @@
 #include "freertos/task.h"
 #include "mqtt_client.h"
 #include "system.h"
+#include "app_task.h"
 
 #define BOARD_MQTT_KEEPALIVE_SEC 120
 #define BOARD_MQTT_STATE_REPORT_INTERVAL_MS 5000
@@ -1222,8 +1223,20 @@
     }
 
     esp_err_t err = DS2312_Set_Alarm_Id_Saved(id->valuestring, hour, minute, second, repeat_mask);
-    return err == ESP_OK ? BoardMqtt_ResultOk("alarm updated") :
-        BoardMqtt_ResultFail(BOARD_MQTT_ERR_EXEC_FAILED, esp_err_to_name(err));
+    if (err != ESP_OK) {
+        return BoardMqtt_ResultFail(BOARD_MQTT_ERR_EXEC_FAILED, esp_err_to_name(err));
+    }
+
+    cJSON *app_id = cJSON_GetObjectItem(payload, "app_id");
+    cJSON *task_id = cJSON_GetObjectItem(payload, "task_id");
+    if (cJSON_IsString(app_id) && app_id->valuestring && app_id->valuestring[0]) {
+        const char *tid = (cJSON_IsString(task_id) && task_id->valuestring) ? task_id->valuestring : "";
+        cJSON *params = cJSON_GetObjectItem(payload, "params");
+        char *params_json = params ? cJSON_PrintUnformatted(params) : NULL;
+        Board_SavePendingTask(app_id->valuestring, tid, params_json, "schedule", id->valuestring);
+        free(params_json);
+    }
+    return BoardMqtt_ResultOk("alarm updated");
 }
 
 static board_mqtt_action_result_t BoardMqtt_HandleUnsetAlarm(cJSON *payload)
@@ -1852,6 +1865,35 @@
     return BoardMqtt_ResultOk("manifest accepted");
 }
 
+static board_mqtt_action_result_t BoardMqtt_HandleStartAppTask(cJSON *payload)
+{
+    if (!payload) {
+        return BoardMqtt_ResultFail(BOARD_MQTT_ERR_INVALID_PARAM, "missing payload");
+    }
+    cJSON *app_id = cJSON_GetObjectItem(payload, "app_id");
+    cJSON *task_id = cJSON_GetObjectItem(payload, "task_id");
+    cJSON *source = cJSON_GetObjectItem(payload, "source");
+    cJSON *params = cJSON_GetObjectItem(payload, "params");
+    if (!cJSON_IsString(app_id) || !app_id->valuestring || app_id->valuestring[0] == '\0') {
+        return BoardMqtt_ResultFail(BOARD_MQTT_ERR_INVALID_PARAM, "missing app_id");
+    }
+    const char *tid = (cJSON_IsString(task_id) && task_id->valuestring) ? task_id->valuestring : "";
+    const char *src = (cJSON_IsString(source) && source->valuestring) ? source->valuestring : "mqtt_immediate";
+    char *params_json = params ? cJSON_PrintUnformatted(params) : NULL;
+    esp_err_t err = Board_StartAppTask(app_id->valuestring, tid, params_json, src);
+    free(params_json);
+    if (err == ESP_ERR_NOT_FOUND) {
+        return BoardMqtt_ResultFail(BOARD_MQTT_ERR_NOT_FOUND, "unknown app or task");
+    }
+    if (err == ESP_ERR_INVALID_STATE) {
+        return BoardMqtt_ResultFail(BOARD_MQTT_ERR_BUSY, "preempted by higher priority task");
+    }
+    if (err != ESP_OK) {
+        return BoardMqtt_ResultFail(BOARD_MQTT_ERR_EXEC_FAILED, esp_err_to_name(err));
+    }
+    return BoardMqtt_ResultOk("app task started");
+}
+
 static board_mqtt_action_result_t BoardMqtt_DispatchAction(const char *req_id, const char *action, cJSON *payload)
 {
     if (strcmp(action, "SET_VOLUME") == 0) return BoardMqtt_HandleSetVolume(payload);
@@ -1866,6 +1908,7 @@
     if (strcmp(action, "UPDATE_MANIFEST") == 0 || strcmp(action, "SYNC_COURSE_TASK") == 0) return BoardMqtt_HandleUpdateManifest(req_id, payload);
     if (strcmp(action, "DOWNLOAD") == 0) return BoardMqtt_HandleDownload(req_id, payload);
     if (strcmp(action, "OTA_UPDATE") == 0) return BoardMqtt_HandleOtaUpdate(req_id, payload);
+    if (strcmp(action, "START_APP_TASK") == 0) return BoardMqtt_HandleStartAppTask(payload);
     return BoardMqtt_ResultFail(BOARD_MQTT_ERR_UNSUPPORTED, "unsupported action");
 }
 

--
Gitblit v1.9.1