# HG changeset patch # User matthewreed # Date 2015-12-19 23:49:07 # Node ID 8e1189ce73afe96118c30fe0fe812f7b96e5a446 # Parent 618031ff9252978a81d8379b96c49d4dd3d7cb58 Fixed settings save and restore in flash diff --git a/config.h b/config.h --- a/config.h +++ b/config.h @@ -35,6 +35,18 @@ // Add bootloader option to top of idle screen menu #define BOOTLOADER_SHORTCUT + +#define DEFAULT_BOOT_TO_BREW 0 +#define DEFAULT_TEMP_UNITS TEMP_UNITS_FAHRENHEIT +#define DEFAULT_WINDUP_GUARD 10 +#define DEFAULT_K_P 10 +#define DEFAULT_K_I 1 +#define DEFAULT_K_D 1 +#define DEFAULT_IGNORE_ERROR 0 +#define DEFAULT_SETPOINT_BREW 70 +#define DEFAULT_SETPOINT_STEAM 70 + + #endif // vim:softtabstop=4 shiftwidth=4 expandtab diff --git a/display.c b/display.c --- a/display.c +++ b/display.c @@ -337,7 +337,7 @@ void display_process(therm_settings_t* s // Button handler if(SW_BTN_PRESSED) { - flash_save(&set); + flash_save(set); status->state = STATE_IDLE; } else { @@ -487,7 +487,8 @@ void display_process(therm_settings_t* s case RESET_RESET: { status->state = STATE_RESET; - //flash_erase(); + flash_load_defaults(set); + flash_save(set); NVIC_SystemReset(); } break; case RESET_EXIT: 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(); } diff --git a/flash.h b/flash.h --- a/flash.h +++ b/flash.h @@ -7,7 +7,8 @@ #define END_ADDR 0x08007FFF void flash_save(therm_settings_t* tosave); -void flash_restore(therm_settings_t *tosave); +void flash_restore(therm_settings_t* tosave); +void flash_load_defaults(therm_settings_t* torestore); void flash_erase(void); #endif diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -56,17 +56,6 @@ int main(void) // Init OLED over SPI ssd1306_init(); ssd1306_clearscreen(); - - // Default settings - set.val.boottobrew = 0; - set.val.temp_units = TEMP_UNITS_FAHRENHEIT; - set.val.windup_guard = 10; - set.val.k_p = 10; - set.val.k_i = 1; - set.val.k_d = 1; - set.val.ignore_error = 0; - set.val.setpoint_brew = 70; - set.val.setpoint_steam = 70; // Default status status.temp = 0;