/** * Settings.c * * Created on: 29 Sep 2016 * Author: Ralim * This file holds the users settings and saves / restores them to the * devices flash */ #include "Settings.h" #include "Setup.h" #include "string.h" #include "../../configuration.h" volatile systemSettingsType systemSettings; /** * Flash start OR'ed with the maximum amount of flash - 1024 bytes */ #define FLASH_ADDR (0x8000000 | 0xFC00) /** * Save Settings to flash */ void saveSettings() { // First we erase the flash FLASH_EraseInitTypeDef pEraseInit; pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES; pEraseInit.Banks = FLASH_BANK_1; pEraseInit.NbPages = 1; pEraseInit.PageAddress = FLASH_ADDR; uint32_t failingAddress = 0; HAL_IWDG_Refresh(&hiwdg); __HAL_FLASH_CLEAR_FLAG( FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY ); HAL_FLASH_Unlock(); HAL_Delay(10); HAL_IWDG_Refresh(&hiwdg); HAL_FLASHEx_Erase(&pEraseInit, &failingAddress); //^ Erase the page of flash (1024 bytes on this stm32) // erased the chunk // now we program it uint16_t *data = (uint16_t*) &systemSettings; HAL_FLASH_Unlock(); for (uint8_t i = 0; i < (sizeof(systemSettingsType) / 2); i++) { HAL_IWDG_Refresh(&hiwdg); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_ADDR + (i * 2), data[i]); } HAL_FLASH_Lock(); } /** * RestoreSettings from flash * Return: * false - if restore from flash is successfull * true - if settings are reset to its defaults */ bool restoreSettings() { // We read from flash uint16_t *data = (uint16_t*) &systemSettings; for (uint8_t i = 0; i < (sizeof(systemSettingsType) / 2); i++) { data[i] = *((uint16_t*) (FLASH_ADDR + (i * 2))); } if (systemSettings.version != SETTINGSVERSION) { // The settings version does not match. // Resetting the settings to its default. resetSettings(); return true; } return false; // Settings version from flash is correct were done } /** * lookupVoltageLevel * * Lookup function for cutoff setting -> X10 voltage * 0=DC 1=3S 2=4S 3=5S 4=6S * */ uint8_t lookupVoltageLevel(uint8_t level) { if (level == 0) { // 9V - Since iron does not function effectively below this return 90; } else { return (level * 33) + (33 * 2); } } /** * Reset Settings to its default values. */ void resetSettings() { memset((void*) &systemSettings, 0, sizeof(systemSettingsType)); systemSettings.SleepTemp = SLEEP_TEMP; // Temperature the iron sleeps at - default 150.0 C systemSettings.SleepTime = SLEEP_TIME; // How many seconds/minutes we wait until going to sleep - default 1 min systemSettings.SolderingTemp = SOLDERING_TEMP; // Default soldering temp is 320.0 C systemSettings.cutoutSetting = CUT_OUT_SETTING; // default to no cut-off voltage (or 18W for TS80) systemSettings.version = SETTINGSVERSION; // Store the version number to allow for easier upgrades systemSettings.detailedSoldering = DETAILED_SOLDERING; // Detailed soldering screen systemSettings.detailedIDLE = DETAILED_IDLE; // Detailed idle screen (off for first time users) systemSettings.OrientationMode = ORIENTATION_MODE; // Default to automatic systemSettings.sensitivity = SENSITIVITY; // Default high sensitivity systemSettings.voltageDiv = VOLTAGE_DIV; // Default divider from schematic systemSettings.ShutdownTime = SHUTDOWN_TIME; // How many minutes until the unit turns itself off systemSettings.boostModeEnabled = BOOST_MODE_ENABLED; // Default to having boost mode on as most people prefer it systemSettings.BoostTemp = BOOST_TEMP; // default to 400C systemSettings.autoStartMode = AUTO_START_MODE; // Auto start off for safety systemSettings.coolingTempBlink = COOLING_TEMP_BLINK; // Blink the temperature on the cooling screen when its > 50C systemSettings.temperatureInF = TEMPERATURE_INF; // default to 0 systemSettings.descriptionScrollSpeed = DESCRIPTION_SCROLL_SPEED; // default to slow systemSettings.powerLimitEnable = POWER_LIMIT_ENABLE; // Default to no power limit systemSettings.CalibrationOffset = CALIBRATION_OFFSET; // the adc offset in uV systemSettings.pidPowerLimit = PID_POWER_LIMIT; // Sets the max pwm power limit systemSettings.powerLimit = POWER_LIMIT; // 30 watts default limit saveSettings(); // Save default settings }