Introduces "icons" library
This commit is contained in:
61
components/nspanel_ha_blueprint/icons.cpp
Normal file
61
components/nspanel_ha_blueprint/icons.cpp
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// icons.cpp
|
||||||
|
#include "icons.h"
|
||||||
|
#include <vector>
|
||||||
|
#ifdef USE_PSRAM
|
||||||
|
#ifdef USE_ARDUINO
|
||||||
|
#include <esp32-hal-psram.h>
|
||||||
|
#else // ESP-IDF
|
||||||
|
#include <esp_heap_caps.h> // Required for heap capabilities functions
|
||||||
|
#endif // ARDUINO vs ESP-IDF
|
||||||
|
#endif // USE_PSRAM
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
std::vector<Icon> icons; // This declaration may not be necessary; see below
|
||||||
|
|
||||||
|
bool initializeIconsVector() {
|
||||||
|
Icon* allocatedMemory = nullptr;
|
||||||
|
|
||||||
|
// Try to allocate the vector in PSRAM
|
||||||
|
#ifdef USE_PSRAM
|
||||||
|
#if defined(USE_ARDUINO)
|
||||||
|
if (psramFound())
|
||||||
|
allocatedMemory = static_cast<Icon*>(ps_malloc(10 * sizeof(Icon)));
|
||||||
|
#else // ESP-IDF
|
||||||
|
allocatedMemory = static_cast<Icon*>(heap_caps_malloc(10 * sizeof(Icon), MALLOC_CAP_SPIRAM));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (allocatedMemory != nullptr) {
|
||||||
|
new (&icons) std::vector<Icon>(allocatedMemory, allocatedMemory + 10); // Placement new to initialize vector
|
||||||
|
return true; // Successfully allocated in PSRAM
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Fallback to DRAM if PSRAM allocation fails or if PSRAM is not used
|
||||||
|
allocatedMemory = static_cast<Icon*>(malloc(10 * sizeof(Icon)));
|
||||||
|
if (allocatedMemory != nullptr) {
|
||||||
|
new (&icons) std::vector<Icon>(allocatedMemory, allocatedMemory + 10); // Placement new to initialize vector
|
||||||
|
return true; // Successfully allocated in DRAM
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // Allocation failed
|
||||||
|
}
|
||||||
|
|
||||||
|
void Icon::updateIcon(const char* code, uint16_t color, bool vis) {
|
||||||
|
if (strcmp(last_icon_code, code) != 0 || last_icon_color != color || visible != vis) {
|
||||||
|
strncpy(last_icon_code, code, 4);
|
||||||
|
last_icon_code[4] = '\0';
|
||||||
|
last_icon_color = color;
|
||||||
|
visible = vis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Icon* findIcon(uint8_t page_id, const char* comp) {
|
||||||
|
for (auto& icon : icons) {
|
||||||
|
if (icon.page_id == page_id && strcmp(icon.component, comp) == 0) {
|
||||||
|
return &icon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
32
components/nspanel_ha_blueprint/icons.h
Normal file
32
components/nspanel_ha_blueprint/icons.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// icons.h
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring> // For strncpy and strcmp
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
struct Icon {
|
||||||
|
uint8_t page_id; // Page ID, placed logically before the component
|
||||||
|
char component[15]; // Component name (max 14 chars + null terminator)
|
||||||
|
char last_icon_code[5]; // UTF-8 code (4 bytes + null terminator)
|
||||||
|
uint16_t last_icon_color; // Color value
|
||||||
|
bool visible; // Visibility of the icon
|
||||||
|
|
||||||
|
// Constructor with default values
|
||||||
|
Icon(uint8_t pid, const char* comp, const char* code = "\xEF\xBF\xBF", uint16_t color = UINT16_MAX, bool vis = true)
|
||||||
|
: page_id(pid), last_icon_color(color), visible(vis) {
|
||||||
|
strncpy(const_cast<char*>(component), comp, 14); // Use const_cast to bypass const for initialization
|
||||||
|
const_cast<char*>(component)[14] = '\0'; // Ensure null termination safely
|
||||||
|
strncpy(last_icon_code, code, 4);
|
||||||
|
last_icon_code[4] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateIcon(const char* code, uint16_t color, bool vis);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern std::vector<Icon> icons; // Global list of icons
|
||||||
|
|
||||||
|
Icon* findIcon(uint8_t page_id, const char* component);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user