Files @ 9294a623e8e5
Branch filter:

Location: therm/flash.c - annotation

Ethan Zonca
Added support for both heaters and coolers as well as thermostatic control
#include "flash.h"

__attribute__((__section__(".eeprom"))) uint16_t eeprom[512];

#define MAGIC_NUMBER 0x0BAE

static void __flash_write(therm_settings_t* tosave);

void flash_save(therm_settings_t* tosave)
{
    __flash_write(tosave);
}

void flash_restore(therm_settings_t* torestore)
{
	//read flash and calculate checksum
	uint16_t checksum = MAGIC_NUMBER;
	uint16_t i;
    for(i = 0; i < (sizeof(therm_settings_t)/2); i++)
	{
		torestore->data[i] = eeprom[i];
		checksum ^= torestore->data[i];
	}

    //if checksum doesn't match, load default settings
    if((checksum ^ eeprom[i+1]) != 0) {
    	flash_load_defaults(torestore);
    }
}

void flash_load_defaults(therm_settings_t* torestore) {

	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.temp_offset = DEFAULT_TEMP_OFFSET;
	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();

    // Erase the FLASH pages
    FLASH_EraseInitTypeDef erase;
    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);

    // write to flash and calculate the checksum
    uint16_t checksum = MAGIC_NUMBER;
    uint16_t i;
    for(i = 0; i < (sizeof(therm_settings_t)/2); i++)
	{
		HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i], tosave->data[i]);
    	checksum ^= tosave->data[i];
	}

    // write the checksum
    HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i+1], checksum);

    HAL_FLASH_Lock();
}


// vim:softtabstop=4 shiftwidth=4 expandtab