mirror of
https://github.com/78/xiaozhi-esp32.git
synced 2026-02-27 14:26:36 +00:00
94 lines
3.1 KiB
C++
94 lines
3.1 KiB
C++
#include <cJSON.h>
|
|
#include <esp_log.h>
|
|
|
|
#include <cstring>
|
|
|
|
#include "application.h"
|
|
#include "board.h"
|
|
#include "config.h"
|
|
#include "mcp_server.h"
|
|
#include "sdkconfig.h"
|
|
#include "settings.h"
|
|
#include "display.h"
|
|
|
|
#define TAG "MCPController"
|
|
|
|
class MCPController {
|
|
public:
|
|
MCPController() {
|
|
RegisterMcpTools();
|
|
ESP_LOGI(TAG, "注册MCP工具");
|
|
}
|
|
|
|
void RegisterMcpTools() {
|
|
auto& mcp_server = McpServer::GetInstance();
|
|
ESP_LOGI(TAG, "开始注册MCP工具...");
|
|
|
|
mcp_server.AddTool(
|
|
"self.AEC.set_mode",
|
|
"设置AEC对话打断模式。当用户意图切换对话打断模式时或者用户觉得ai对话容易被打断时或者用户觉得无法实现对话打断时都使用此工具。\n"
|
|
"参数:\n"
|
|
" `mode`: 对话打断模式,可选值只有`kAecOff`(关闭)和`kAecOnDeviceSide`(开启)\n"
|
|
"返回值:\n"
|
|
" 反馈状态信息,不需要确认,立即播报相关数据\n",
|
|
PropertyList({
|
|
Property("mode", kPropertyTypeString)
|
|
}),
|
|
[](const PropertyList& properties) -> ReturnValue {
|
|
auto mode = properties["mode"].value<std::string>();
|
|
auto& app = Application::GetInstance();
|
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
|
if (mode == "kAecOff") {
|
|
app.SetAecMode(kAecOff);
|
|
return "{\"success\": true, \"message\": \"AEC对话打断模式已关闭\"}";
|
|
}else {
|
|
auto& board = Board::GetInstance();
|
|
app.SetAecMode(kAecOnDeviceSide);
|
|
|
|
return "{\"success\": true, \"message\": \"AEC对话打断模式已开启\"}";
|
|
}
|
|
}
|
|
);
|
|
|
|
mcp_server.AddTool(
|
|
"self.AEC.get_mode",
|
|
"获取AEC对话打断模式状态。当用户意图获取对话打断模式状态时使用此工具。\n"
|
|
"返回值:\n"
|
|
" 反馈状态信息,不需要确认,立即播报相关数据\n",
|
|
PropertyList(),
|
|
[](const PropertyList&) -> ReturnValue {
|
|
auto& app = Application::GetInstance();
|
|
const bool is_currently_off = (app.GetAecMode() == kAecOff);
|
|
if (is_currently_off) {
|
|
return "{\"success\": true, \"message\": \"AEC对话打断模式处于关闭状态\"}";
|
|
}else {
|
|
return "{\"success\": true, \"message\": \"AEC对话打断模式处于开启状态\"}";
|
|
}
|
|
}
|
|
);
|
|
|
|
mcp_server.AddTool(
|
|
"self.res.esp_restart",
|
|
"重启设备。当用户意图重启设备时使用此工具。\n",
|
|
PropertyList(),
|
|
[](const PropertyList&) -> ReturnValue {
|
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
|
// Reboot the device
|
|
esp_restart();
|
|
return true;
|
|
}
|
|
);
|
|
|
|
ESP_LOGI(TAG, "MCP工具注册完成");
|
|
}
|
|
|
|
};
|
|
|
|
static MCPController* g_mcp_controller = nullptr;
|
|
|
|
void InitializeMCPController() {
|
|
if (g_mcp_controller == nullptr) {
|
|
g_mcp_controller = new MCPController();
|
|
ESP_LOGI(TAG, "注册MCP工具");
|
|
}
|
|
} |