// // Created by robtor on 05.01.23. // #ifndef FLOATPUMP_CONFIG_STORE_H #define FLOATPUMP_CONFIG_STORE_H #include #include "stm32f4xx_hal.h" namespace floatpump { class Config_Store { private: const uint32_t startAddr = 0x08060000; static uint32_t StoreInFlash(uint32_t StartAddress, uint32_t *Data, uint16_t nData) { uint16_t progr = 0; HAL_FLASH_Unlock(); FLASH_Erase_Sector(FLASH_SECTOR_7, VOLTAGE_RANGE_1); while (progr < nData) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, StartAddress, Data[progr]) == HAL_OK) { progr++; StartAddress += 4; } else { return HAL_FLASH_GetError(); } } HAL_FLASH_Lock(); return 0; } static uint32_t ReadFromFlash(uint32_t StartAddress, uint32_t *Data, uint16_t nData) { uint16_t progr = 0; while (progr < nData) { Data[progr] = *(uint32_t *) StartAddress; progr++; StartAddress += 4; } return 0; } Config_Store() = default; Config_Store(Config_Store const &) = delete; Config_Store(Config_Store const &&) = delete; void operator=(Config_Store const &) = delete; void operator=(Config_Store const &&) = delete; public: static Config_Store &getInstance() { static Config_Store instance; return instance; } void saveToFlash() { uint32_t data[11]; data[0] = TankCalibLow.getValue(); data[1] = TankCalibHigh.getValue(); data[2] = TankMinLevel.getValue(); data[3] = TankHysteresis.getValue(); data[4] = TankPumpInvert.getValue(); data[5] = RefillEnable.getValue(); data[6] = RefillBlockInvert.getValue(); data[7] = RefillBlockEnable.getValue(); data[8] = RefillBelow.getValue(); data[9] = RefillHysteresis.getValue(); data[10] = RefillCooldown.getValue(); StoreInFlash(startAddr, data, 11); return; }; void resetDefaults(); void loadFromFlash() { uint32_t data[11]; ReadFromFlash(startAddr, data, 11); TankCalibLow.setValue(data[0]); TankCalibHigh.setValue(data[1]); TankMinLevel.setValue(data[2]); TankHysteresis.setValue(data[3]); TankPumpInvert.setValue(data[4]); RefillEnable.setValue(data[5]); RefillBlockInvert.setValue(data[6]); RefillBlockEnable.setValue(data[7]); RefillBelow.setValue(data[8]); RefillHysteresis.setValue(data[9]); RefillCooldown.setValue(data[10]); return; }; template class Config_Object { public: Config_Object(T initialValue) : m_data(initialValue) {}; T getValue() { return m_data; } void setValue(T newValue) { m_data = newValue; } T *getLink() { return &m_data; } private: T m_data; }; Config_Object TankCalibLow = Config_Object(0); Config_Object TankCalibHigh = Config_Object(65535); Config_Object TankMinLevel = Config_Object(20); Config_Object TankHysteresis = Config_Object(5); //Config_Object TankCooldown = Config_Object(5); //Config_Object TankZeroLevelCM = Config_Object(0); //Config_Object TankFullLevelCM = Config_Object(200); Config_Object TankPumpInvert = Config_Object(false); Config_Object RefillEnable = Config_Object(false); Config_Object RefillBlockInvert = Config_Object(false); Config_Object RefillBlockEnable = Config_Object(true); Config_Object RefillBelow = Config_Object(false); Config_Object RefillHysteresis = Config_Object(false); Config_Object RefillCooldown = Config_Object(60); }; } // floatpump #endif //FLOATPUMP_CONFIG_STORE_H