diff --git a/firmware/esp32/xterra-controller/app_config.cpp b/firmware/esp32/xterra-controller/app_config.cpp new file mode 100644 index 0000000..4282e4e --- /dev/null +++ b/firmware/esp32/xterra-controller/app_config.cpp @@ -0,0 +1,90 @@ +#include "app_config.h" +#include "config.h" + +AppConfig appConfig; + +void loadDefaultConfig() { + appConfig.deviceName = DEVICE_NAME; + + appConfig.relays[0] = { + "relay_1", + "Relay 1", + RELAY_STARLINK_PIN, + true + }; + + appConfig.relays[1] = { + "relay_2", + "Relay 2", + RELAY_FRIDGE_PIN, + true + }; + + appConfig.tempSensorCount = 4; + + appConfig.tempSensors[0] = { + "temp_1", + "Temperature 1", + "", + true + }; + + appConfig.tempSensors[1] = { + "temp_2", + "Temperature 2", + "", + true + }; + + appConfig.tempSensors[2] = { + "temp_3", + "Temperature 3", + "", + true + }; + + appConfig.tempSensors[3] = { + "temp_4", + "Temperature 4", + "", + true + }; + + for (int i = 4; i < MAX_TEMP_SENSORS; i++) { + appConfig.tempSensors[i] = { + "temp_" + String(i + 1), + "Temperature " + String(i + 1), + "", + false + }; + } + + appConfig.bms.enabled = true; + appConfig.bms.name = "BMS"; + appConfig.bms.address = "a5:c2:37:2c:05:dc"; + appConfig.bms.addressType = "public"; +} + +void printConfig() { + Serial.println("Config:"); + Serial.print(" Device: "); + Serial.println(appConfig.deviceName); + + Serial.println(" Relays:"); + for (int i = 0; i < MAX_RELAYS; i++) { + Serial.print(" "); + Serial.print(appConfig.relays[i].id); + Serial.print(" / "); + Serial.print(appConfig.relays[i].name); + Serial.print(" / GPIO "); + Serial.println(appConfig.relays[i].pin); + } + + Serial.println(" BMS:"); + Serial.print(" Enabled: "); + Serial.println(appConfig.bms.enabled ? "true" : "false"); + Serial.print(" Name: "); + Serial.println(appConfig.bms.name); + Serial.print(" Address: "); + Serial.println(appConfig.bms.address); +} diff --git a/firmware/esp32/xterra-controller/app_config.h b/firmware/esp32/xterra-controller/app_config.h new file mode 100644 index 0000000..2063675 --- /dev/null +++ b/firmware/esp32/xterra-controller/app_config.h @@ -0,0 +1,40 @@ +#pragma once + +#include + +#define MAX_RELAYS 2 +#define MAX_TEMP_SENSORS 8 + +struct RelayConfig { + String id; + String name; + uint8_t pin; + bool enabled; +}; + +struct TempSensorConfig { + String id; + String name; + String address; + bool enabled; +}; + +struct BmsConfig { + bool enabled; + String name; + String address; + String addressType; +}; + +struct AppConfig { + String deviceName; + RelayConfig relays[MAX_RELAYS]; + TempSensorConfig tempSensors[MAX_TEMP_SENSORS]; + int tempSensorCount; + BmsConfig bms; +}; + +extern AppConfig appConfig; + +void loadDefaultConfig(); +void printConfig(); diff --git a/firmware/esp32/xterra-controller/xterra-controller.ino b/firmware/esp32/xterra-controller/xterra-controller.ino index ce5f109..19c9b79 100644 --- a/firmware/esp32/xterra-controller/xterra-controller.ino +++ b/firmware/esp32/xterra-controller/xterra-controller.ino @@ -9,6 +9,7 @@ #include "bms.h" #include "alarms.h" #include "system_status.h" +#include "app_config.h" WebServer server(80); HardwareSerial DashboardSerial(2); @@ -131,6 +132,33 @@ void buildStatusDocument(JsonDocument& doc) { system["build_date"] = __DATE__; system["build_time"] = __TIME__; system["uptime_seconds"] = millis() / 1000; + + JsonObject configObj = doc.createNestedObject("config"); + configObj["device_name"] = appConfig.deviceName; + + JsonArray configRelays = configObj.createNestedArray("relays"); + for (int i = 0; i < MAX_RELAYS; i++) { + JsonObject relayConfig = configRelays.createNestedObject(); + relayConfig["id"] = appConfig.relays[i].id; + relayConfig["name"] = appConfig.relays[i].name; + relayConfig["pin"] = appConfig.relays[i].pin; + relayConfig["enabled"] = appConfig.relays[i].enabled; + } + + JsonObject bmsConfig = configObj.createNestedObject("bms"); + bmsConfig["enabled"] = appConfig.bms.enabled; + bmsConfig["name"] = appConfig.bms.name; + bmsConfig["address"] = appConfig.bms.address; + bmsConfig["address_type"] = appConfig.bms.addressType; + + JsonArray tempConfigs = configObj.createNestedArray("temperature_sensors"); + for (int i = 0; i < MAX_TEMP_SENSORS; i++) { + JsonObject tempConfig = tempConfigs.createNestedObject(); + tempConfig["id"] = appConfig.tempSensors[i].id; + tempConfig["name"] = appConfig.tempSensors[i].name; + tempConfig["address"] = appConfig.tempSensors[i].address; + tempConfig["enabled"] = appConfig.tempSensors[i].enabled; + } } void sendStatus(Stream& output, bool pretty = false) { @@ -333,9 +361,15 @@ void setup() { Serial.println(); Serial.println("=================================="); + + loadDefaultConfig(); + printConfig(); Serial.println("Xterra Controller Booting"); Serial.println("=================================="); + loadDefaultConfig(); + printConfig(); + pinMode(IGNITION_PIN, INPUT); initRelays();