feat: persistent settings in LittleFS JSON

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 20:08:03 +07:00
co-authored by Claude Opus 4.8
parent 5c96cfc1f3
commit 4e53e7388f
3 changed files with 76 additions and 0 deletions
+9
View File
@@ -6,6 +6,7 @@
#include "rtc_time.h" #include "rtc_time.h"
#include "forecast.h" #include "forecast.h"
#include "history.h" #include "history.h"
#include "app_settings.h"
static void i2cScan() { static void i2cScan() {
Serial.println(F("I2C scan:")); Serial.println(F("I2C scan:"));
@@ -59,6 +60,14 @@ void setup() {
historyCount(), d, classifyTrend(d)); historyCount(), d, classifyTrend(d));
else else
Serial.println(F("history: not enough data for trend")); Serial.println(F("history: not enough data for trend"));
// --- settings self-test (remove after Task 8) ---
settingsBegin();
Serial.printf("settings: alt=%.0f tz=%d lat=%.4f lon=%.4f\n",
settings.altitudeM, settings.tzOffsetMin, settings.lat, settings.lon);
settings.altitudeM += 1.0f; // change and persist to test round-trip
settingsSave();
Serial.println(F("settings: incremented altitude and saved"));
} }
void loop() { void loop() {
+52
View File
@@ -0,0 +1,52 @@
#include <LittleFS.h>
#include <ArduinoJson.h>
#include "config.h"
#include "app_settings.h"
AppSettings settings;
static const char* PATH = "/settings.json";
void settingsDefaults() {
settings.altitudeM = DEFAULT_ALTITUDE_M;
settings.tzOffsetMin = DEFAULT_TZ_OFFSET_MIN;
settings.lat = DEFAULT_LAT;
settings.lon = DEFAULT_LON;
}
static bool settingsLoad() {
File f = LittleFS.open(PATH, "r");
if (!f) return false;
JsonDocument doc;
DeserializationError err = deserializeJson(doc, f);
f.close();
if (err) return false;
settings.altitudeM = doc["altitude"] | DEFAULT_ALTITUDE_M;
settings.tzOffsetMin = doc["tz"] | DEFAULT_TZ_OFFSET_MIN;
settings.lat = doc["lat"] | DEFAULT_LAT;
settings.lon = doc["lon"] | DEFAULT_LON;
return true;
}
bool settingsSave() {
JsonDocument doc;
doc["altitude"] = settings.altitudeM;
doc["tz"] = settings.tzOffsetMin;
doc["lat"] = settings.lat;
doc["lon"] = settings.lon;
File f = LittleFS.open(PATH, "w");
if (!f) return false;
serializeJson(doc, f);
f.close();
return true;
}
void settingsBegin() {
if (!LittleFS.begin()) {
LittleFS.format();
LittleFS.begin();
}
settingsDefaults();
if (!settingsLoad()) { // first boot: persist defaults
settingsSave();
}
}
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include <Arduino.h>
struct AppSettings {
float altitudeM;
int tzOffsetMin;
float lat;
float lon;
};
extern AppSettings settings;
void settingsBegin();
bool settingsSave();
void settingsDefaults();