diff --git a/src/configuration/Configuration.cpp b/src/configuration/Configuration.cpp index 402056a..efc4f30 100644 --- a/src/configuration/Configuration.cpp +++ b/src/configuration/Configuration.cpp @@ -25,13 +25,18 @@ #include +#include +#include + #include "../FSHelper.h" #include "consts.h" +#include "sensors/SensorToggles.h" #include "utils.h" #define DIR_CALIBRATIONS "/calibrations" #define DIR_TEMPERATURE_CALIBRATIONS "/tempcalibrations" -#define DIR_TOGGLES "/toggles" +#define DIR_TOGGLES_OLD "/toggles" +#define DIR_TOGGLES "/sensortoggles" namespace SlimeVR::Configuration { void Configuration::setup() { @@ -123,7 +128,8 @@ void Configuration::save() { m_Logger.trace("Saving sensor toggle state for %d", i); file = LittleFS.open(path, "w"); - file.write((uint8_t*)&m_SensorToggles[i], sizeof(SensorToggleState)); + auto toggleValues = m_SensorToggles[i].getValues(); + file.write((uint8_t*)&toggleValues, sizeof(SensorToggleValues)); file.close(); } @@ -133,6 +139,18 @@ void Configuration::save() { file.close(); } + // Clean up old toggles directory + if (LittleFS.exists(DIR_TOGGLES_OLD)) { + char path[17] = DIR_TOGGLES_OLD; + char* end = path + strlen(DIR_TOGGLES_OLD); + Utils::forEachFile(DIR_TOGGLES_OLD, [&](SlimeVR::Utils::File file) { + sprintf(end, "/%s", file.name()); + LittleFS.remove(path); + file.close(); + }); + LittleFS.rmdir(DIR_TOGGLES_OLD); + } + m_Logger.debug("Saved configuration"); } @@ -226,14 +244,34 @@ void Configuration::loadSensors() { setSensor(sensorId, sensorConfig); }); + if (LittleFS.exists(DIR_TOGGLES_OLD)) { + SlimeVR::Utils::forEachFile(DIR_TOGGLES_OLD, [&](SlimeVR::Utils::File f) { + SensorToggleValues values; + // Migration for pre 0.7.0 togglestate, the values started at offset 20 and + // there were 3 of them + f.seek(20); + f.read(reinterpret_cast(&values), 3); + + uint8_t sensorId = strtoul(f.name(), nullptr, 10); + m_Logger.debug("Found sensor toggle state at index %d", sensorId); + + setSensorToggles(sensorId, SensorToggleState{values}); + }); + } + SlimeVR::Utils::forEachFile(DIR_TOGGLES, [&](SlimeVR::Utils::File f) { - SensorToggleState sensorToggleState; - f.read((uint8_t*)&sensorToggleState, sizeof(SensorToggleState)); + if (f.size() > sizeof(SensorToggleValues)) { + return; + } + SensorToggleValues values; + // With the magic of C++ default initialization, the rest of the values should + // be their default after reading + f.read(reinterpret_cast(&values), f.size()); uint8_t sensorId = strtoul(f.name(), nullptr, 10); m_Logger.debug("Found sensor toggle state at index %d", sensorId); - setSensorToggles(sensorId, sensorToggleState); + setSensorToggles(sensorId, SensorToggleState{values}); }); } diff --git a/src/sensors/SensorToggles.cpp b/src/sensors/SensorToggles.cpp index fe59e7e..848a65d 100644 --- a/src/sensors/SensorToggles.cpp +++ b/src/sensors/SensorToggles.cpp @@ -1,15 +1,18 @@ #include "SensorToggles.h" +SensorToggleState::SensorToggleState(SensorToggleValues values) + : values{values} {} + void SensorToggleState::setToggle(SensorToggles toggle, bool state) { switch (toggle) { case SensorToggles::MagEnabled: - magEnabled = state; + values.magEnabled = state; break; case SensorToggles::CalibrationEnabled: - calibrationEnabled = state; + values.calibrationEnabled = state; break; case SensorToggles::TempGradientCalibrationEnabled: - tempGradientCalibrationEnabled = state; + values.tempGradientCalibrationEnabled = state; break; } } @@ -17,11 +20,11 @@ void SensorToggleState::setToggle(SensorToggles toggle, bool state) { bool SensorToggleState::getToggle(SensorToggles toggle) const { switch (toggle) { case SensorToggles::MagEnabled: - return magEnabled; + return values.magEnabled; case SensorToggles::CalibrationEnabled: - return calibrationEnabled; + return values.calibrationEnabled; case SensorToggles::TempGradientCalibrationEnabled: - return tempGradientCalibrationEnabled; + return values.tempGradientCalibrationEnabled; } return false; } @@ -32,6 +35,8 @@ void SensorToggleState::onToggleChange( this->callback = callback; } +SensorToggleValues SensorToggleState::getValues() const { return values; } + void SensorToggleState::emitToggleChange(SensorToggles toggle, bool state) const { if (callback) { (*callback)(toggle, state); diff --git a/src/sensors/SensorToggles.h b/src/sensors/SensorToggles.h index c10aad2..a7e4cdf 100644 --- a/src/sensors/SensorToggles.h +++ b/src/sensors/SensorToggles.h @@ -35,8 +35,17 @@ enum class SensorToggles : uint16_t { TempGradientCalibrationEnabled = 3, }; +struct SensorToggleValues { + bool magEnabled = !USE_6_AXIS; + bool calibrationEnabled = true; + bool tempGradientCalibrationEnabled + = false; // disable by default, it is not clear that it really helps +}; + class SensorToggleState { public: + SensorToggleState() = default; + explicit SensorToggleState(SensorToggleValues values); void setToggle(SensorToggles toggle, bool state); [[nodiscard]] bool getToggle(SensorToggles toggle) const; @@ -44,12 +53,12 @@ public: static const char* toggleToString(SensorToggles toggle); + [[nodiscard]] SensorToggleValues getValues() const; + private: std::optional> callback; + void emitToggleChange(SensorToggles toggle, bool state) const; - bool magEnabled = !USE_6_AXIS; - bool calibrationEnabled = true; - bool tempGradientCalibrationEnabled - = false; // disable by default, it is not clear that it really helps + SensorToggleValues values; };