// // 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 { public: Config_Store(); 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(); } void saveToFlash() { uint32_t data[10]; 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(); StoreInFlash(0x08060000, data, 10); }; void resetDefaults(); void loadFromFlash() { this->RefillBelow.setValue(*(uint32_t *)0x08060000); }; 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