diff --git a/flash.c b/flash.c --- a/flash.c +++ b/flash.c @@ -9,66 +9,69 @@ static void __flash_write(therm_settings_t* tosave); -#define EEPROM_MAGIC_INDEX 16 +#define EEPROM_MAGIC_INDEX 0 #define EEPROM_MAGIC_VALUE 0xbeef void flash_save(therm_settings_t* tosave) { - ssd1306_clearscreen(); - ssd1306_drawstring("Erase...", 0, 0); - HAL_Delay(100); - ssd1306_drawstring("Save...", 1, 0); __flash_write(tosave); - HAL_Delay(100); - ssd1306_drawstring("Done!", 2, 0); - HAL_Delay(500); } -void flash_restore(therm_settings_t *torestore) +void flash_restore(therm_settings_t* torestore) { - ssd1306_clearscreen(); - ssd1306_drawstring("READING SAVE", 1, 0); - if(eeprom[EEPROM_MAGIC_INDEX] != EEPROM_MAGIC_VALUE) + if(eeprom[EEPROM_MAGIC_INDEX] == EEPROM_MAGIC_VALUE) { - ssd1306_drawstring("No data to read!", 2, 0); - - return; + for(uint8_t i = 1; i <= 20; i++) { + torestore->data[i] = *(eeprom+i); + } + } + else { + // load default settings + flash_load_defaults(torestore); } - uint16_t i; - for(i=0;i<128;i++) - torestore->data[i] = *(eeprom+i); +} + +void flash_load_defaults(therm_settings_t* torestore) { - ssd1306_drawstring("READ COMPLETE", 3, 0); - + torestore->val.boottobrew = DEFAULT_BOOT_TO_BREW; + torestore->val.temp_units = DEFAULT_TEMP_UNITS; + torestore->val.windup_guard = DEFAULT_WINDUP_GUARD; + torestore->val.k_p = DEFAULT_K_P; + torestore->val.k_i = DEFAULT_K_I; + torestore->val.k_d = DEFAULT_K_D; + torestore->val.ignore_error = DEFAULT_IGNORE_ERROR; + torestore->val.setpoint_brew = DEFAULT_SETPOINT_BREW; + torestore->val.setpoint_steam = DEFAULT_SETPOINT_STEAM; } static void __flash_write(therm_settings_t* tosave) { - // Erase mem HAL_FLASH_Unlock(); + //TODO: add checksum instead of magic value + //TODO: change checksum to invalidate flash instead of erase? // Erase the FLASH pages FLASH_EraseInitTypeDef erase; - erase.TypeErase = TYPEERASE_PAGES; - erase.PageAddress = eeprom; + erase.TypeErase = TYPEERASE_PAGES; + erase.PageAddress = (uint32_t) eeprom; erase.NbPages = 1; uint32_t SectorError = 0; HAL_FLASHEx_Erase(&erase, &SectorError); CLEAR_BIT(FLASH->CR, FLASH_CR_PER); - uint16_t i; -// for(i=1;i<20;i++) - // { - // HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom+i, tosave->data[i]); - // } - HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom + EEPROM_MAGIC_INDEX, EEPROM_MAGIC_VALUE); + for(uint8_t i = 1; i <= (sizeof(therm_settings_t)/2); i++) + { + HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + i), tosave->data[i]); + } + + HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + EEPROM_MAGIC_INDEX), EEPROM_MAGIC_VALUE); HAL_FLASH_Lock(); }