move into firmware subfolder
Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
28
firmware/components/led-manager/CMakeLists.txt
Normal file
28
firmware/components/led-manager/CMakeLists.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
if (DEFINED ENV{IDF_PATH})
|
||||
idf_component_register(SRCS
|
||||
src/hal_esp32/led_manager.cpp
|
||||
INCLUDE_DIRS "include"
|
||||
PRIV_REQUIRES
|
||||
u8g2
|
||||
esp_event
|
||||
persistence-manager
|
||||
)
|
||||
return()
|
||||
endif ()
|
||||
|
||||
cmake_minimum_required(VERSION 3.30)
|
||||
project(led-manager)
|
||||
|
||||
add_library(${PROJECT_NAME} STATIC
|
||||
src/hal_native/led_manager.cpp
|
||||
src/hal_native/Matrix.cpp
|
||||
)
|
||||
|
||||
include_directories(include)
|
||||
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC include)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
SDL3::SDL3
|
||||
persistence-manager
|
||||
)
|
2
firmware/components/led-manager/idf_component.yml
Executable file
2
firmware/components/led-manager/idf_component.yml
Executable file
@@ -0,0 +1,2 @@
|
||||
dependencies:
|
||||
espressif/led_strip: '~3.0.1'
|
29
firmware/components/led-manager/include/Matrix.h
Normal file
29
firmware/components/led-manager/include/Matrix.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
|
||||
#include "SDL3/SDL_render.h"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
class Matrix
|
||||
{
|
||||
public:
|
||||
explicit Matrix(SDL_WindowID windowId, SDL_Renderer *renderer, uint8_t cols, uint8_t rows);
|
||||
|
||||
[[nodiscard]] SDL_Renderer *renderer() const;
|
||||
|
||||
void Render() const;
|
||||
|
||||
[[nodiscard]] SDL_WindowID windowId() const;
|
||||
|
||||
private:
|
||||
void DrawColoredGrid() const;
|
||||
|
||||
SDL_WindowID m_windowId;
|
||||
SDL_Renderer *m_renderer;
|
||||
|
||||
uint8_t m_cols;
|
||||
uint8_t m_rows;
|
||||
|
||||
static constexpr float cellSize = 50.0f;
|
||||
static constexpr float spacing = 1.0f;
|
||||
};
|
22
firmware/components/led-manager/include/led_manager.h
Normal file
22
firmware/components/led-manager/include/led_manager.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
enum
|
||||
{
|
||||
EVENT_LED_ON,
|
||||
EVENT_LED_OFF,
|
||||
EVENT_LED_DAY,
|
||||
EVENT_LED_NIGHT,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int value;
|
||||
} led_event_data_t;
|
||||
|
||||
uint64_t wled_init();
|
||||
|
||||
uint64_t register_handler();
|
||||
|
||||
uint64_t send_event(uint32_t event, led_event_data_t *payload);
|
@@ -0,0 +1,92 @@
|
||||
#include "led_manager.h"
|
||||
|
||||
#include "esp_event.h"
|
||||
#include "esp_log.h"
|
||||
#include "led_strip.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
led_strip_handle_t led_strip;
|
||||
|
||||
static const uint32_t value = 5;
|
||||
|
||||
ESP_EVENT_DECLARE_BASE(LED_EVENTS_BASE);
|
||||
ESP_EVENT_DEFINE_BASE(LED_EVENTS_BASE);
|
||||
|
||||
esp_event_loop_handle_t loop_handle;
|
||||
|
||||
const char *TAG = "LED";
|
||||
|
||||
uint64_t wled_init(void)
|
||||
{
|
||||
led_strip_config_t strip_config = {.strip_gpio_num = CONFIG_WLED_DIN_PIN,
|
||||
.max_leds = 64,
|
||||
.led_model = LED_MODEL_WS2812,
|
||||
.color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_RGB,
|
||||
.flags = {
|
||||
.invert_out = false,
|
||||
}};
|
||||
|
||||
led_strip_rmt_config_t rmt_config = {.clk_src = RMT_CLK_SRC_DEFAULT,
|
||||
.resolution_hz = 0,
|
||||
.mem_block_symbols = 0,
|
||||
.flags = {
|
||||
.with_dma = true,
|
||||
}};
|
||||
|
||||
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
|
||||
|
||||
for (uint32_t i = 0; i < 64; i++)
|
||||
{
|
||||
led_strip_set_pixel(led_strip, i, 0, 0, 0);
|
||||
}
|
||||
led_strip_refresh(led_strip);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
void event_handler(void *arg, esp_event_base_t base, int32_t id, void *event_data)
|
||||
{
|
||||
if (id == EVENT_LED_ON || id == EVENT_LED_OFF)
|
||||
{
|
||||
auto brightness = (id == EVENT_LED_ON) ? value : 0;
|
||||
for (uint32_t i = 0; i < 64; i++)
|
||||
{
|
||||
led_strip_set_pixel(led_strip, i, brightness, brightness, brightness);
|
||||
}
|
||||
led_strip_refresh(led_strip);
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t register_handler(void)
|
||||
{
|
||||
esp_event_loop_args_t loop_args = {
|
||||
.queue_size = 2, .task_name = "led_manager", .task_priority = 5, .task_stack_size = 4096, .task_core_id = 1};
|
||||
esp_event_loop_create(&loop_args, &loop_handle);
|
||||
|
||||
esp_event_handler_register_with(loop_handle, LED_EVENTS_BASE, ESP_EVENT_ANY_ID, event_handler, NULL);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
uint64_t send_event(uint32_t event, led_event_data_t *payload)
|
||||
{
|
||||
if (payload == nullptr)
|
||||
{
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
|
||||
esp_err_t err = esp_event_post_to(loop_handle, // Event-Loop Handle
|
||||
LED_EVENTS_BASE, // Event Base
|
||||
event, // Event ID (EVENT_LED_ON, EVENT_LED_OFF, etc.)
|
||||
payload, // Daten-Pointer
|
||||
sizeof(led_event_data_t), // Datengröße
|
||||
portMAX_DELAY // Wartezeit
|
||||
);
|
||||
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE("LED", "Failed to post event: %s", esp_err_to_name(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
64
firmware/components/led-manager/src/hal_native/Matrix.cpp
Normal file
64
firmware/components/led-manager/src/hal_native/Matrix.cpp
Normal file
@@ -0,0 +1,64 @@
|
||||
#include "Matrix.h"
|
||||
|
||||
#include "SDL3/SDL.h"
|
||||
|
||||
Matrix::Matrix(uint32_t windowID, SDL_Renderer *renderer, const uint8_t cols, const uint8_t rows)
|
||||
: m_windowId(windowID), m_renderer(renderer), m_cols(cols), m_rows(rows)
|
||||
{
|
||||
}
|
||||
|
||||
SDL_Renderer *Matrix::renderer() const
|
||||
{
|
||||
return m_renderer;
|
||||
}
|
||||
|
||||
SDL_WindowID Matrix::windowId() const
|
||||
{
|
||||
return m_windowId;
|
||||
}
|
||||
|
||||
void Matrix::DrawColoredGrid() const
|
||||
{
|
||||
int i = 0;
|
||||
for (int w = 0; w < m_cols; w++)
|
||||
{
|
||||
const auto phase = w % (2 * m_rows);
|
||||
|
||||
for (int h_raw = 0; h_raw < m_rows; h_raw++)
|
||||
{
|
||||
int h;
|
||||
if (phase < m_rows)
|
||||
{
|
||||
h = h_raw;
|
||||
}
|
||||
else
|
||||
{
|
||||
h = m_rows - 1 - h_raw;
|
||||
}
|
||||
|
||||
constexpr auto rectSize = cellSize - 2.0f * spacing;
|
||||
|
||||
const auto x = static_cast<float>(w) * cellSize + spacing;
|
||||
const auto y = static_cast<float>(h) * cellSize + spacing;
|
||||
|
||||
auto rect = SDL_FRect{x, y, rectSize, rectSize};
|
||||
|
||||
i++;
|
||||
const auto red = static_cast<Uint8>(static_cast<float>(i) * 255.0f);
|
||||
const auto green = static_cast<Uint8>(static_cast<float>(i) * 255.0f);
|
||||
const auto blue = static_cast<Uint8>(static_cast<float>(i) * 255.0f);
|
||||
SDL_SetRenderDrawColor(m_renderer, red, green, blue, 255);
|
||||
SDL_RenderFillRect(m_renderer, &rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Matrix::Render() const
|
||||
{
|
||||
SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 255);
|
||||
SDL_RenderClear(m_renderer);
|
||||
|
||||
DrawColoredGrid();
|
||||
|
||||
SDL_RenderPresent(m_renderer);
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
#include "led_manager.h"
|
||||
|
||||
uint64_t wled_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t register_handler(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t send_event(uint32_t event, led_event_data_t *payload)
|
||||
{
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user