feat: add led strip class

This commit is contained in:
Andy
2024-12-17 14:03:45 +08:00
committed by Terrence
parent 1820a83256
commit 2e6a278b0d
20 changed files with 449 additions and 133 deletions

View File

@@ -7,7 +7,7 @@
#include <udp.h>
#include <string>
#include "led.h"
#include "led_strip/led_strip_wrapper.h"
void* create_board();
class AudioCodec;
@@ -32,7 +32,7 @@ public:
virtual void StartNetwork() = 0;
virtual ~Board() = default;
virtual Led* GetBuiltinLed() = 0;
virtual LedStripWrapper* GetLedStrip() = 0;
virtual AudioCodec* GetAudioCodec() = 0;
virtual Display* GetDisplay();
virtual Http* CreateHttp() = 0;

View File

@@ -6,41 +6,29 @@
#define TAG "Led"
Led::Led(gpio_num_t gpio) {
Led::Led(gpio_num_t gpio, uint8_t max_leds) {
if (gpio == GPIO_NUM_NC) {
ESP_LOGI(TAG, "Builtin LED not connected");
return;
}
led_strip_config_t strip_config = {};
strip_config.strip_gpio_num = gpio;
strip_config.max_leds = 1;
strip_config.max_leds = max_leds;
strip_config.led_pixel_format = LED_PIXEL_FORMAT_GRB;
strip_config.led_model = LED_MODEL_WS2812;
led_strip_rmt_config_t rmt_config = {};
rmt_config.resolution_hz = 10 * 1000 * 1000; // 10MHz
max_leds_ = max_leds;
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip_));
led_strip_clear(led_strip_);
SetGrey();
esp_timer_create_args_t blink_timer_args = {
.callback = [](void *arg) {
auto led = static_cast<Led*>(arg);
led->OnBlinkTimer();
},
.arg = this,
.dispatch_method = ESP_TIMER_TASK,
.name = "Blink Timer",
.skip_unhandled_events = false,
};
ESP_ERROR_CHECK(esp_timer_create(&blink_timer_args, &blink_timer_));
}
Led::~Led() {
esp_timer_stop(blink_timer_);
if (led_strip_ != nullptr) {
led_strip_del(led_strip_);
}
@@ -58,8 +46,9 @@ void Led::TurnOn() {
}
std::lock_guard<std::mutex> lock(mutex_);
esp_timer_stop(blink_timer_);
led_strip_set_pixel(led_strip_, 0, r_, g_, b_);
for (int i = 0; i < max_leds_; i++) {
led_strip_set_pixel(led_strip_, i, r_, g_, b_);
}
led_strip_refresh(led_strip_);
}
@@ -69,47 +58,5 @@ void Led::TurnOff() {
}
std::lock_guard<std::mutex> lock(mutex_);
esp_timer_stop(blink_timer_);
led_strip_clear(led_strip_);
}
void Led::BlinkOnce() {
Blink(1, 100);
}
void Led::Blink(int times, int interval_ms) {
StartBlinkTask(times, interval_ms);
}
void Led::StartContinuousBlink(int interval_ms) {
StartBlinkTask(BLINK_INFINITE, interval_ms);
}
void Led::StartBlinkTask(int times, int interval_ms) {
if (led_strip_ == nullptr) {
return;
}
std::lock_guard<std::mutex> lock(mutex_);
esp_timer_stop(blink_timer_);
led_strip_clear(led_strip_);
blink_counter_ = times * 2;
blink_interval_ms_ = interval_ms;
esp_timer_start_periodic(blink_timer_, interval_ms * 1000);
}
void Led::OnBlinkTimer() {
std::lock_guard<std::mutex> lock(mutex_);
blink_counter_--;
if (blink_counter_ & 1) {
led_strip_set_pixel(led_strip_, 0, r_, g_, b_);
led_strip_refresh(led_strip_);
} else {
led_strip_clear(led_strip_);
if (blink_counter_ == 0) {
esp_timer_stop(blink_timer_);
}
}
}

View File

@@ -6,9 +6,6 @@
#include <atomic>
#include <mutex>
#define BLINK_INFINITE -1
#define BLINK_TASK_STOPPED_BIT BIT0
#define BLINK_TASK_RUNNING_BIT BIT1
#define DEFAULT_BRIGHTNESS 4
#define HIGH_BRIGHTNESS 16
@@ -16,12 +13,12 @@
class Led {
public:
Led(gpio_num_t gpio);
Led(gpio_num_t gpio, uint8_t max_leds);
~Led();
void BlinkOnce();
void Blink(int times, int interval_ms);
void StartContinuousBlink(int interval_ms);
led_strip_handle_t led_strip() { return led_strip_; }
uint8_t max_leds() { return max_leds_; }
void TurnOn();
void TurnOff();
void SetColor(uint8_t r, uint8_t g, uint8_t b);
@@ -30,18 +27,12 @@ public:
void SetRed(uint8_t brightness = DEFAULT_BRIGHTNESS) { SetColor(brightness, 0, 0); }
void SetGreen(uint8_t brightness = DEFAULT_BRIGHTNESS) { SetColor(0, brightness, 0); }
void SetBlue(uint8_t brightness = DEFAULT_BRIGHTNESS) { SetColor(0, 0, brightness); }
private:
std::mutex mutex_;
TaskHandle_t blink_task_ = nullptr;
uint8_t max_leds_ = -1;
led_strip_handle_t led_strip_ = nullptr;
uint8_t r_ = 0, g_ = 0, b_ = 0;
int blink_counter_ = 0;
int blink_interval_ms_ = 0;
esp_timer_handle_t blink_timer_ = nullptr;
void StartBlinkTask(int times, int interval_ms);
void OnBlinkTimer();
};
#endif // _LED_H_

View File

@@ -38,15 +38,14 @@ static std::string rssi_to_string(int rssi) {
void WifiBoard::StartNetwork() {
auto& application = Application::GetInstance();
auto display = Board::GetInstance().GetDisplay();
auto builtin_led = Board::GetInstance().GetBuiltinLed();
auto led_strip = Board::GetInstance().GetLedStrip();
// Try to connect to WiFi, if failed, launch the WiFi configuration AP
auto& wifi_station = WifiStation::GetInstance();
display->SetStatus(std::string("正在连接 ") + wifi_station.GetSsid());
wifi_station.Start();
if (!wifi_station.IsConnected()) {
builtin_led->SetBlue();
builtin_led->Blink(1000, 500);
led_strip->LightOn(kConnecting);
auto& wifi_ap = WifiConfigurationAp::GetInstance();
wifi_ap.SetSsidPrefix("Xiaozhi");
wifi_ap.Start();