// utilities.cpp #include "utilities.h" #include #include #ifdef USE_ESP_IDF #include "esp_heap_caps.h" #elif defined(USE_ARDUINO) #include "esp32-hal-psram.h" #endif // ESP-IDF vs ARDUINO namespace nspanel_ha_blueprint { UtilitiesGroupValues *UtilitiesGroups = nullptr; void resetUtilitiesGroups() { // Dynamically allocate the UtilitiesGroups array in PSRAM #ifdef USE_ESP_IDF UtilitiesGroups = static_cast(heap_caps_malloc(8 * sizeof(UtilitiesGroupValues), MALLOC_CAP_SPIRAM)); #elif defined(USE_ARDUINO) UtilitiesGroups = static_cast(ps_malloc(8 * sizeof(UtilitiesGroupValues))); #endif // ESP-IDF vs ARDUINO if (!UtilitiesGroups) UtilitiesGroups = new UtilitiesGroupValues[8]; // Fallback to internal SRAM if PSRAM is not available or not supported if (!UtilitiesGroups) return; // Fail nicely if no memory is available const UtilitiesGroupValues initialUtilitiesGroups[8] = { { "grid", "\0", "\0", 0 }, { "group01", "\0", "\0", 0 }, { "group02", "\0", "\0", 0 }, { "group03", "\0", "\0", 0 }, { "group04", "\0", "\0", 0 }, { "group05", "\0", "\0", 0 }, { "group06", "\0", "\0", 0 }, { "home", "\0", "\0", 0 } }; for (size_t i = 0; i < 8; ++i) { std::strcpy(UtilitiesGroups[i].group_id, initialUtilitiesGroups[i].group_id); std::strcpy(UtilitiesGroups[i].value1, initialUtilitiesGroups[i].value1); std::strcpy(UtilitiesGroups[i].value2, initialUtilitiesGroups[i].value2); UtilitiesGroups[i].direction = initialUtilitiesGroups[i].direction; } } void cleanupUtilitiesGroups() { if (UtilitiesGroups != nullptr) { free(UtilitiesGroups); // Compatible with both heap_caps_malloc and ps_malloc UtilitiesGroups = nullptr; // Prevent dangling pointers } } uint8_t findUtilitiesGroupIndex(const char* group_id) { int low = 0; int high = 7; // Directly use the number of elements in UtilitiesGroups - 1 while (low <= high) { int mid = low + (high - low) / 2; int cmp = std::strcmp(UtilitiesGroups[mid].group_id, group_id); if (cmp < 0) { low = mid + 1; } else if (cmp > 0) { high = mid - 1; } else { return static_cast(mid); // Found } } return UINT8_MAX; // Not found } } // namespace nspanel_ha_blueprint