config file

This commit is contained in:
Stefan Ostermann 2025-07-28 22:59:59 +02:00
parent be288f6a5a
commit f40483873a
4 changed files with 673 additions and 325 deletions

26
example_config.txt Normal file
View File

@ -0,0 +1,26 @@
# HannaBox Configuration File
# Values are in the format: key=value
# Lines starting with # are comments
# Audio Settings
initialVolume=7
maxVolume=15
# Power Management (times in milliseconds)
sleepTime=1800000
sleepDelay=1800000
sleepMessageDelay=1798000
# Battery Settings (voltage in millivolts)
minVoltage=3200
voltage100Percent=4200
# RFID Settings
rfidLoopInterval=25
# Playback Settings
startAtStoredProgress=true
# WiFi Settings (leave empty to use current WiFiManager)
wifiSSID=
wifiPassword=

151
src/config.cpp Normal file
View File

@ -0,0 +1,151 @@
#include "config.h"
#include "globals.h"
#include <SD.h>
// Global config instance
Config config;
const String getConfigFilePath() {
return "/" + sys_dir + "/config.txt";
}
void setDefaultConfig() {
config.initialVolume = 7;
config.maxVolume = 15;
config.sleepTime = 1800000;
config.minVoltage = 3200;
config.voltage100Percent = 4200;
config.sleepDelay = 1800000;
config.sleepMessageDelay = 1798000;
config.rfidLoopInterval = 25;
config.startAtStoredProgress = true;
config.wifiSSID[0] = '\0';
config.wifiPassword[0] = '\0';
}
bool loadConfig() {
String configPath = getConfigFilePath();
if (!SD.exists(configPath)) {
Serial.println("Config file not found, using defaults");
setDefaultConfig();
return saveConfig(); // Create config file with defaults
}
File file = SD.open(configPath, FILE_READ);
if (!file) {
Serial.println("Failed to open config file");
setDefaultConfig();
return false;
}
// Set defaults first
setDefaultConfig();
// Parse config file line by line
while (file.available()) {
String line = file.readStringUntil('\n');
line.trim();
// Skip empty lines and comments
if (line.length() == 0 || line.startsWith("#")) {
continue;
}
int separatorIndex = line.indexOf('=');
if (separatorIndex == -1) {
continue;
}
String key = line.substring(0, separatorIndex);
String value = line.substring(separatorIndex + 1);
key.trim();
value.trim();
// Parse each configuration value
if (key == "initialVolume") {
config.initialVolume = constrain(value.toInt(), 0, 21);
} else if (key == "maxVolume") {
config.maxVolume = constrain(value.toInt(), 1, 21);
} else if (key == "sleepTime") {
config.sleepTime = value.toInt();
} else if (key == "minVoltage") {
config.minVoltage = value.toInt();
} else if (key == "voltage100Percent") {
config.voltage100Percent = value.toInt();
} else if (key == "sleepDelay") {
config.sleepDelay = value.toInt();
} else if (key == "sleepMessageDelay") {
config.sleepMessageDelay = value.toInt();
} else if (key == "rfidLoopInterval") {
config.rfidLoopInterval = constrain(value.toInt(), 1, 255);
} else if (key == "startAtStoredProgress") {
config.startAtStoredProgress = (value == "1" || value.equalsIgnoreCase("true"));
} else if (key == "wifiSSID") {
strncpy(config.wifiSSID, value.c_str(), sizeof(config.wifiSSID) - 1);
config.wifiSSID[sizeof(config.wifiSSID) - 1] = '\0';
} else if (key == "wifiPassword") {
strncpy(config.wifiPassword, value.c_str(), sizeof(config.wifiPassword) - 1);
config.wifiPassword[sizeof(config.wifiPassword) - 1] = '\0';
}
}
file.close();
Serial.println("Config loaded successfully");
Serial.print("Initial Volume: "); Serial.println(config.initialVolume);
Serial.print("Max Volume: "); Serial.println(config.maxVolume);
Serial.print("Sleep Delay: "); Serial.println(config.sleepDelay);
Serial.print("RFID Interval: "); Serial.println(config.rfidLoopInterval);
return true;
}
bool saveConfig() {
String configPath = getConfigFilePath();
File file = SD.open(configPath, FILE_WRITE);
if (!file) {
Serial.println("Failed to create config file");
return false;
}
// Write config file with comments for user reference
file.println("# HannaBox Configuration File");
file.println("# Values are in the format: key=value");
file.println("# Lines starting with # are comments");
file.println("");
file.println("# Audio Settings");
file.print("initialVolume="); file.println(config.initialVolume);
file.print("maxVolume="); file.println(config.maxVolume);
file.println("");
file.println("# Power Management (times in milliseconds)");
file.print("sleepTime="); file.println(config.sleepTime);
file.print("sleepDelay="); file.println(config.sleepDelay);
file.print("sleepMessageDelay="); file.println(config.sleepMessageDelay);
file.println("");
file.println("# Battery Settings (voltage in millivolts)");
file.print("minVoltage="); file.println(config.minVoltage);
file.print("voltage100Percent="); file.println(config.voltage100Percent);
file.println("");
file.println("# RFID Settings");
file.print("rfidLoopInterval="); file.println(config.rfidLoopInterval);
file.println("");
file.println("# Playback Settings");
file.print("startAtStoredProgress="); file.println(config.startAtStoredProgress ? "true" : "false");
file.println("");
file.println("# WiFi Settings (leave empty to use current WiFiManager)");
file.print("wifiSSID="); file.println(config.wifiSSID);
file.print("wifiPassword="); file.println(config.wifiPassword);
file.close();
Serial.println("Config saved successfully");
return true;
}

30
src/config.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef CONFIG_H_
#define CONFIG_H_
#include <Arduino.h>
// Configuration structure - keep it minimal for memory efficiency
struct Config {
uint8_t initialVolume = 7;
uint8_t maxVolume = 15;
uint32_t sleepTime = 1800000; // 30 minutes in ms
uint16_t minVoltage = 3200; // mV - minimum voltage before sleep
uint16_t voltage100Percent = 4200; // mV - voltage representing 100% battery
uint32_t sleepDelay = 1800000; // 30 minutes in ms
uint32_t sleepMessageDelay = 1798000; // 2 seconds before sleep
uint8_t rfidLoopInterval = 25; // RFID check interval
bool startAtStoredProgress = true; // Resume from last position
char wifiSSID[32] = ""; // WiFi SSID (empty = use current mechanism)
char wifiPassword[64] = ""; // WiFi password (empty = use current mechanism)
};
// Global config instance
extern Config config;
// Function declarations
bool loadConfig();
bool saveConfig();
void setDefaultConfig();
const String getConfigFilePath();
#endif

File diff suppressed because it is too large Load Diff