diff --git a/main/boards/df-k10/df_k10_board.cc b/main/boards/df-k10/df_k10_board.cc index e0687777..2d7e6000 100644 --- a/main/boards/df-k10/df_k10_board.cc +++ b/main/boards/df-k10/df_k10_board.cc @@ -2,6 +2,7 @@ #include "k10_audio_codec.h" #include "display/lcd_display.h" #include "esp_lcd_ili9341.h" +#include "led_control.h" #include "font_awesome_symbols.h" #include "application.h" #include "button.h" @@ -37,6 +38,8 @@ private: button_driver_t* btn_a_driver_ = nullptr; button_driver_t* btn_b_driver_ = nullptr; + CircularStrip* led_strip_; + static Df_K10Board* instance_; void InitializeI2c() { @@ -242,8 +245,8 @@ private: // 物联网初始化,添加对 AI 可见设备 void InitializeIot() { - auto &thing_manager = iot::ThingManager::GetInstance(); - thing_manager.AddThing(iot::CreateThing("Speaker")); + led_strip_ = new CircularStrip(BUILTIN_LED_GPIO, 3); + new LedStripControl(led_strip_); } public: @@ -262,9 +265,8 @@ public: #endif } - virtual Led* GetLed() override { - static CircularStrip led(BUILTIN_LED_GPIO, 3); - return &led; + virtual Led* GetLed() override { + return led_strip_; } virtual AudioCodec *GetAudioCodec() override { diff --git a/main/boards/df-k10/led_control.cc b/main/boards/df-k10/led_control.cc new file mode 100644 index 00000000..ce5164a5 --- /dev/null +++ b/main/boards/df-k10/led_control.cc @@ -0,0 +1,124 @@ +#include "led_control.h" +#include "settings.h" +#include "mcp_server.h" +#include + +#define TAG "LedStripControl" + + +int LedStripControl::LevelToBrightness(int level) const { + if (level < 0) level = 0; + if (level > 8) level = 8; + return (1 << level) - 1; // 2^n - 1 +} + +StripColor LedStripControl::RGBToColor(int red, int green, int blue) { + return {static_cast(red), static_cast(green), static_cast(blue)}; +} + +LedStripControl::LedStripControl(CircularStrip* led_strip) + : led_strip_(led_strip) { + // 从设置中读取亮度等级 + Settings settings("led_strip"); + brightness_level_ = settings.GetInt("brightness", 4); // 默认等级4 + led_strip_->SetBrightness(LevelToBrightness(brightness_level_), 4); + + auto& mcp_server = McpServer::GetInstance(); + mcp_server.AddTool("self.led_strip.get_brightness", + "Get the brightness of the led strip (0-8)", + PropertyList(), [this](const PropertyList& properties) -> ReturnValue { + return brightness_level_; + }); + + mcp_server.AddTool("self.led_strip.set_brightness", + "Set the brightness of the led strip (0-8)", + PropertyList({ + Property("level", kPropertyTypeInteger, 0, 8) + }), [this](const PropertyList& properties) -> ReturnValue { + int level = properties["level"].value(); + ESP_LOGI(TAG, "Set LedStrip brightness level to %d", level); + brightness_level_ = level; + led_strip_->SetBrightness(LevelToBrightness(brightness_level_), 4); + + // 保存设置 + Settings settings("led_strip", true); + settings.SetInt("brightness", brightness_level_); + + return true; + }); + + mcp_server.AddTool("self.led_strip.set_single_color", + "Set the color of a single led.", + PropertyList({ + Property("index", kPropertyTypeInteger, 0, 2), + Property("red", kPropertyTypeInteger, 0, 255), + Property("green", kPropertyTypeInteger, 0, 255), + Property("blue", kPropertyTypeInteger, 0, 255) + }), [this](const PropertyList& properties) -> ReturnValue { + int index = properties["index"].value(); + int red = properties["red"].value(); + int green = properties["green"].value(); + int blue = properties["blue"].value(); + ESP_LOGI(TAG, "Set led strip single color %d to %d, %d, %d", + index, red, green, blue); + led_strip_->SetSingleColor(index, RGBToColor(red, green, blue)); + return true; + }); + + mcp_server.AddTool("self.led_strip.set_all_color", + "Set the color of all leds.", + PropertyList({ + Property("red", kPropertyTypeInteger, 0, 255), + Property("green", kPropertyTypeInteger, 0, 255), + Property("blue", kPropertyTypeInteger, 0, 255) + }), [this](const PropertyList& properties) -> ReturnValue { + int red = properties["red"].value(); + int green = properties["green"].value(); + int blue = properties["blue"].value(); + ESP_LOGI(TAG, "Set led strip all color to %d, %d, %d", + red, green, blue); + led_strip_->SetAllColor(RGBToColor(red, green, blue)); + return true; + }); + + mcp_server.AddTool("self.led_strip.blink", + "Blink the led strip. (闪烁)", + PropertyList({ + Property("red", kPropertyTypeInteger, 0, 255), + Property("green", kPropertyTypeInteger, 0, 255), + Property("blue", kPropertyTypeInteger, 0, 255), + Property("interval", kPropertyTypeInteger, 0, 1000) + }), [this](const PropertyList& properties) -> ReturnValue { + int red = properties["red"].value(); + int green = properties["green"].value(); + int blue = properties["blue"].value(); + int interval = properties["interval"].value(); + ESP_LOGI(TAG, "Blink led strip with color %d, %d, %d, interval %dms", + red, green, blue, interval); + led_strip_->Blink(RGBToColor(red, green, blue), interval); + return true; + }); + + mcp_server.AddTool("self.led_strip.scroll", + "Scroll the led strip. (跑马灯)", + PropertyList({ + Property("red", kPropertyTypeInteger, 0, 255), + Property("green", kPropertyTypeInteger, 0, 255), + Property("blue", kPropertyTypeInteger, 0, 255), + Property("length", kPropertyTypeInteger, 1, 7), + Property("interval", kPropertyTypeInteger, 0, 1000) + }), [this](const PropertyList& properties) -> ReturnValue { + int red = properties["red"].value(); + int green = properties["green"].value(); + int blue = properties["blue"].value(); + int interval = properties["interval"].value(); + int length = properties["length"].value(); + ESP_LOGI(TAG, "Scroll led strip with color %d, %d, %d, length %d, interval %dms", + red, green, blue, length, interval); + StripColor low = RGBToColor(4, 4, 4); + StripColor high = RGBToColor(red, green, blue); + led_strip_->Scroll(low, high, length, interval); + return true; + }); + +} diff --git a/main/boards/df-k10/led_control.h b/main/boards/df-k10/led_control.h new file mode 100644 index 00000000..30e1020c --- /dev/null +++ b/main/boards/df-k10/led_control.h @@ -0,0 +1,18 @@ +#ifndef LED_CONTROL_H +#define LED_CONTROL_H + +#include "led/circular_strip.h" + +class LedStripControl { +private: + CircularStrip* led_strip_; + int brightness_level_; // 亮度等级 (0-8) + + int LevelToBrightness(int level) const; // 将等级转换为实际亮度值 + StripColor RGBToColor(int red, int green, int blue); + +public: + explicit LedStripControl(CircularStrip* led_strip); +}; + +#endif // LED_STRIP_CONTROL_H