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 "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() {
|
||||||
|
|||||||
@@ -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