Problem
The standalone MQTT firmware (src/main.cpp) contains its own inline re-implementation of every frequency-management concern that was subsequently extracted into src/services/frequency_manager.cpp / FrequencyManager. This means the same logic is maintained in two places and they can silently diverge.
Duplicated symbols
main.cpp (inline) |
src/services/frequency_manager.cpp (service class) |
FEED_WDT() static helper |
FrequencyManager::feedWatchdog() |
saveFrequencyOffset(float) raw EEPROM/Preferences |
FrequencyManager::saveFrequencyOffset(float) via StorageAbstraction |
loadFrequencyOffset() raw EEPROM/Preferences |
FrequencyManager::loadFrequencyOffset() |
performDeepFrequencyScan(float, float) identical two-phase algorithm |
FrequencyManager::performDeepFrequencyScan(float, float, statusCallback) |
adaptiveFrequencyTracking(int8_t) |
FrequencyManager::adaptiveFrequencyTracking(int8_t) |
Globals: storedFrequencyOffset, autoScanEnabled, cumulativeFreqError etc. |
Statics: s_storedOffset, s_autoScanEnabled, s_cumulativeFreqError etc. |
Notable divergence already present
main.cpp performDeepFrequencyScan calls cc1101_init() and get_meter_data() directly; FrequencyManager uses injected callbacks.
main.cpp storage layer uses raw EEPROM/Preferences; FrequencyManager uses the StorageAbstraction wrapper.
FREQEST_TO_MHZ constant is defined locally in main.cpp; service class exposes it as a named constant.
Desired outcome
main.cpp should delegate all frequency-management operations to FrequencyManager:
- Register
cc1101_init and get_meter_data as callbacks via FrequencyManager::setRadioInitCallback / setMeterReadCallback.
- Call
FrequencyManager::begin(FREQUENCY) during setup instead of loadFrequencyOffset().
- Replace inline definitions in
main.cpp with calls to the corresponding FrequencyManager static methods.
- Remove duplicate global frequency state variables from
main.cpp; read from FrequencyManager::getOffset() / getTunedFrequency().
Files to change
src/main.cpp - remove inline implementations, wire up FrequencyManager
src/services/frequency_manager.h / .cpp - ensure public API covers all current main.cpp inline use
src/services/storage_abstraction.h - already abstracts EEPROM vs Preferences; main.cpp should use this
Problem
The standalone MQTT firmware (
src/main.cpp) contains its own inline re-implementation of every frequency-management concern that was subsequently extracted intosrc/services/frequency_manager.cpp/FrequencyManager. This means the same logic is maintained in two places and they can silently diverge.Duplicated symbols
main.cpp(inline)src/services/frequency_manager.cpp(service class)FEED_WDT()static helperFrequencyManager::feedWatchdog()saveFrequencyOffset(float)raw EEPROM/PreferencesFrequencyManager::saveFrequencyOffset(float)via StorageAbstractionloadFrequencyOffset()raw EEPROM/PreferencesFrequencyManager::loadFrequencyOffset()performDeepFrequencyScan(float, float)identical two-phase algorithmFrequencyManager::performDeepFrequencyScan(float, float, statusCallback)adaptiveFrequencyTracking(int8_t)FrequencyManager::adaptiveFrequencyTracking(int8_t)storedFrequencyOffset,autoScanEnabled,cumulativeFreqErroretc.s_storedOffset,s_autoScanEnabled,s_cumulativeFreqErroretc.Notable divergence already present
main.cppperformDeepFrequencyScan callscc1101_init()andget_meter_data()directly;FrequencyManageruses injected callbacks.main.cppstorage layer uses raw EEPROM/Preferences;FrequencyManageruses theStorageAbstractionwrapper.FREQEST_TO_MHZconstant is defined locally inmain.cpp; service class exposes it as a named constant.Desired outcome
main.cppshould delegate all frequency-management operations toFrequencyManager:cc1101_initandget_meter_dataas callbacks viaFrequencyManager::setRadioInitCallback/setMeterReadCallback.FrequencyManager::begin(FREQUENCY)during setup instead ofloadFrequencyOffset().main.cppwith calls to the correspondingFrequencyManagerstatic methods.main.cpp; read fromFrequencyManager::getOffset()/getTunedFrequency().Files to change
src/main.cpp- remove inline implementations, wire upFrequencyManagersrc/services/frequency_manager.h/.cpp- ensure public API covers all currentmain.cppinline usesrc/services/storage_abstraction.h- already abstracts EEPROM vs Preferences;main.cppshould use this