#pragma once #include #include #include "event_bus.h" #include "key_value_store.h" namespace roro { enum class Setting : uint8_t { SetupDone, // bool: first-boot wizard completed LongName, // string, 1..39 bytes ShortName, // string, 1..4 bytes Region, // string, a known Region ("EU868") RegionConfirmed, // bool: nothing transmits until true Timezone, // string, POSIX TZ Brightness, // int, 10..100 % DimTimeoutS, // int, 5..600, below OffTimeoutS OffTimeoutS, // int, 10..3600, above DimTimeoutS Sound, // bool ProbeMacRaw, // bool: probe-request Logs keep raw MAC addresses WifiEnabled, // bool: the Wi-Fi Service stays Connected when a Saved Network is in range GnssEnabled, // bool: the GNSS Service reads the receiver (M2, Q58) CoordinatesDms, // bool: show degrees, minutes and seconds instead of decimal degrees (Q64) LoraPreset, // int: the LoRa Scanner's Meshtastic preset, an index into the EU868 list (M3, Q95) Dns1, // string: the first DNS server, an IPv4 address (S1, Q108, Q109) Dns2, // string: the second, or empty DnsAlways, // bool: use them on Automatic (DHCP) networks too, instead of DHCP's Ntp1, // string: the first NTP server, a host name or an IPv4 address (S1, Q110) Ntp2, // string: the second, or empty GnssQuietForLora, // bool: put the GNSS receiver in standby while the LoRa radio listens (issue #20) CheckUpdates, // bool: look for a newer release on Gitea once a day (R1, Q165) Count }; // Typed, validated settings in internal flash. Every accepted change is persisted immediately and // announced with a SettingChanged event; rejected values leave the current value untouched. class Settings { public: Settings(KeyValueStore& store, EventBus& bus); // Reads every setting; missing or invalid stored values fall back to defaults. void load(); int32_t getInt(Setting s) const; bool getBool(Setting s) const; const std::string& getString(Setting s) const; bool setInt(Setting s, int32_t value); bool setBool(Setting s, bool value); bool setString(Setting s, const std::string& value); bool canTransmit() const { return getBool(Setting::RegionConfirmed); } static const char* key(Setting s); private: struct Value { int32_t i = 0; std::string str; }; bool validInt(Setting s, int32_t value) const; bool validString(Setting s, const std::string& value) const; void changed(Setting s); KeyValueStore& store_; EventBus& bus_; std::array(Setting::Count)> values_; }; } // namespace roro