feat: persistent settings in LittleFS JSON
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include "rtc_time.h"
|
||||
#include "forecast.h"
|
||||
#include "history.h"
|
||||
#include "app_settings.h"
|
||||
|
||||
static void i2cScan() {
|
||||
Serial.println(F("I2C scan:"));
|
||||
@@ -59,6 +60,14 @@ void setup() {
|
||||
historyCount(), d, classifyTrend(d));
|
||||
else
|
||||
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() {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
Reference in New Issue
Block a user