#include "hardware_config.hpp" #include #include #include #include HardwareConfigRepo::HardwareConfigRepo() { setDefaults(); } HardwareConfigRepo::~HardwareConfigRepo() { // Cleanup if needed } void HardwareConfigRepo::setChangeCallback(std::function callback) { changeCallback_ = callback; } void HardwareConfigRepo::setDefaults() { data_.hold_duration_ms = DEFAULT_HOLD_DURATION_MS; data_.override = DEFAULT_OVERRIDE; data_.relay_pin = DEFAULT_RELAY_PIN; data_.sensor_rx_pin = DEFAULT_SENSOR_RX_PIN; data_.sensor_tx_pin = DEFAULT_SENSOR_TX_PIN; // Initialize LedConfig to defaults (empty) // Nanopb initializes to zero, so ok } bool HardwareConfigRepo::fileExists() { return LittleFS.exists(filename_); } bool HardwareConfigRepo::load() { if (!LittleFS.begin()) { LOG_ERROR("HardwareConfigRepo: LittleFS mount failed"); setDefaults(); return false; } if (!fileExists()) { // File doesn't exist, use defaults setDefaults(); runCallback(); return true; } File file = LittleFS.open(filename_, "r"); if (!file) { LOG_ERROR("Failed to open hardware config file for reading"); setDefaults(); return false; } // Read file into buffer size_t fileSize = file.size(); uint8_t buffer[fileSize]; file.read(buffer, fileSize); file.close(); // Decode protobuf pb_istream_t stream = pb_istream_from_buffer(buffer, fileSize); bool status = pb_decode(&stream, hardware_HardwareConfig_fields, &data_); if (!status) { LOG_ERROR("Failed to decode hardware config protobuf"); setDefaults(); return false; } runCallback(); return true; } bool HardwareConfigRepo::save() { if (!LittleFS.begin()) { LOG_ERROR("HardwareConfigRepo: LittleFS mount failed"); return false; } // Encode to buffer first to get size size_t bufferSize = 0; pb_get_encoded_size(&bufferSize, hardware_HardwareConfig_fields, &data_); uint8_t buffer[bufferSize]; pb_ostream_t stream = pb_ostream_from_buffer(buffer, bufferSize); bool status = pb_encode(&stream, hardware_HardwareConfig_fields, &data_); if (!status) { LOG_ERROR("Failed to encode hardware config protobuf"); return false; } // Write to file File file = LittleFS.open(filename_, "w"); if (!file) { LOG_ERROR("Failed to open hardware config file for writing"); return false; } size_t bytesWritten = file.write(buffer, bufferSize); file.close(); if (bytesWritten != bufferSize) { LOG_ERROR("Failed to write complete hardware config file"); return false; } runCallback(); return true; } void HardwareConfigRepo::setData(const hardware_HardwareConfig& newData) { data_ = newData; save(); // Persist immediately } void HardwareConfigRepo::resetToDefaults() { setDefaults(); save(); } void HardwareConfigRepo::runCallback() { if (changeCallback_) { changeCallback_(data_); } } HardwareConfigRepo hardwareConfigRepo;