Changeset - 45ee045c249f
[Not reviewed]
cortex-f0
0 7 0
matthewreed - 9 years ago 2015-12-22 22:39:09

Added checksum to flash write and restore functions and load default settings
7 files changed with 40 insertions and 32 deletions:
0 comments (0 inline, 0 general)
config.h
Show inline comments
 
@@ -33,20 +33,21 @@
 
#define hal_init() HAL_Init()
 

	
 
// 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_TEMP_OFFSET 0
 
#define DEFAULT_IGNORE_ERROR 0
 
#define DEFAULT_SETPOINT_BREW 70
 
#define DEFAULT_SETPOINT_STEAM 70
 

	
 

	
 
#endif
 

	
 
// vim:softtabstop=4 shiftwidth=4 expandtab 
display.c
Show inline comments
 
@@ -26,25 +26,25 @@ static uint8_t sw_right_last = 0;
 
// Buttonpress macros
 
#define SW_BTN_PRESSED (sw_btn_last == 0 && sw_btn == 1) // rising edge on buttonpress
 
#define SW_UP_PRESSED (sw_up_last == 0 && sw_up == 1)
 
#define SW_DOWN_PRESSED (sw_down_last == 0 && sw_down == 1)
 
#define SW_LEFT_PRESSED (sw_left_last == 0 && sw_left == 1)
 
#define SW_RIGHT_PRESSED (sw_right_last == 0 && sw_right == 1)
 

	
 

	
 
// States
 
static uint8_t trigger_drawsetpoint = 1;
 
static int16_t last_temp = 21245;
 
static uint8_t goto_mode = MODE_HEAT;
 
static uint8_t reset_mode = RESET_RESET;
 
static uint8_t reset_mode = RESET_REBOOT;
 

	
 

	
 

	
 
// Display state machine
 
void display_process(therm_settings_t* set, therm_status_t* status)
 
{
 
    uint8_t last_state = status->state;
 
    
 
    uint8_t temp_changed = status->temp != last_temp;
 
    last_temp = status->temp;
 

	
 
    uint8_t sw_btn = !HAL_GPIO_ReadPin(SW_BTN);
 
@@ -100,25 +100,25 @@ void display_process(therm_settings_t* s
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                switch(goto_mode) {
 
                    case MODE_HEAT:
 
                        status->state = STATE_PREHEAT;
 
                        break;
 
                    case MODE_SETUP:
 
                        status->state = STATE_SETP;
 
                        break;
 
                    case MODE_RESET:
 
                        status->state = STATE_RESET;
 
                        reset_mode = RESET_RESET;
 
                        reset_mode = RESET_REBOOT;
 
                        break;
 
					#ifdef BOOTLOADER_SHORTCUT
 
                    case MODE_BOOTLOADER:
 
                        ssd1306_clearscreen();
 
                        ssd1306_drawstring("Bootloader Entered", 0, 0);
 
                        ssd1306_drawstring("Device won't boot", 2, 0);
 
                        ssd1306_drawstring("until reflashed!", 3, 0);
 
                        bootloader_enter(); // Resets into bootloader
 
                        status->state = STATE_RESET; // Just in case
 
                        break;
 
					#endif
 
                    default:
 
@@ -448,58 +448,67 @@ void display_process(therm_settings_t* s
 

	
 
        // Reset state
 
        case STATE_RESET:
 
        {
 
            // Write text to OLED
 
            // [ therm :: reset ]
 
            ssd1306_drawstring("therm :: reset ", 0, 40);
 
            status->pid_enabled = 0;
 

	
 
            ssd1306_drawlogo();
 

	
 
            switch(reset_mode) {
 
				case RESET_RESET:
 
				case RESET_DEFAULTS:
 
				{
 
					ssd1306_drawstring("-> reset     ", 1, 40);
 
					ssd1306_drawstring("-> defaults   ", 1, 40);
 
				} break;
 
                case RESET_BOOTLOADER:
 
                {
 
                    ssd1306_drawstring("-> bootloader", 1, 40);
 
                } break;
 
                case RESET_REBOOT:
 
                {
 
                    ssd1306_drawstring("-> reboot     ", 1, 40);
 
                } break;
 
                case RESET_EXIT:
 
                {
 
                    ssd1306_drawstring("-> exit      ", 1, 40);
 
                } break;
 
            }
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                switch(reset_mode) {
 
                    case RESET_BOOTLOADER:
 
                    {
 
                        ssd1306_clearscreen();
 
                        ssd1306_drawstring("Bootloader Entered", 0, 0);
 
                        ssd1306_drawstring("Device won't boot", 2, 0);
 
                        ssd1306_drawstring("until reflashed!", 3, 0);
 
                        HAL_Delay(1000);
 
                        bootloader_enter(); // Resets into bootloader
 
                        status->state = STATE_RESET; // Just in case
 
                    } break;
 
                    case RESET_RESET:
 
                    case RESET_DEFAULTS:
 
                    {
 
                        status->state = STATE_RESET;
 
                        flash_load_defaults(set);
 
                        flash_save(set);
 
                        NVIC_SystemReset();
 
                    } break;
 
                    case RESET_REBOOT:
 
                    {
 
                        status->state = STATE_RESET;
 
                        NVIC_SystemReset();
 
                    } break;
 
                    case RESET_EXIT:
 
                    {
 
                        status->state = STATE_IDLE;
 
                    } break;
 
                }
 
            }
 
            else if(SW_DOWN_PRESSED && reset_mode < (RESET_SIZE-1)) {
 
                reset_mode++;
 
            }
 
            else if(SW_UP_PRESSED && reset_mode > 0) {
 
                reset_mode--;
 
            }
flash.c
Show inline comments
 
#include "stm32f0xx_hal.h"
 
#include "ssd1306.h"
 
#include "stm32f0xx_hal_flash.h"
 
#include "flash.h"
 

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

	
 
#define MAGIC_NUMBER 0x0BAE
 

	
 
static void __flash_write(therm_settings_t* tosave);
 

	
 

	
 
#define EEPROM_MAGIC_INDEX 0
 
#define EEPROM_MAGIC_VALUE 0xbeef
 

	
 

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

	
 

	
 
void flash_restore(therm_settings_t* torestore)
 
{
 

	
 
    if(eeprom[EEPROM_MAGIC_INDEX] == EEPROM_MAGIC_VALUE)
 
	//read flash and calculate checksum
 
	uint16_t checksum = MAGIC_NUMBER;
 
	uint16_t i;
 
    for(i = 0; i < (sizeof(therm_settings_t)/2); i++)
 
    {
 
        for(uint8_t i = 1; i <= 20; i++) {
 
            torestore->data[i] = *(eeprom+i);
 
		torestore->data[i] = eeprom[i];
 
		checksum ^= torestore->data[i];
 
        }
 
    }
 
    else {
 
        // load default settings
 

	
 
    //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();
 

	
 
    //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 = (uint32_t) eeprom;
 
    erase.NbPages = 1;
 
    uint32_t SectorError = 0;
 
    HAL_FLASHEx_Erase(&erase, &SectorError);
 

	
 
    CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
 

	
 
    for(uint8_t i = 1; i <= (sizeof(therm_settings_t)/2); i++)
 
    // 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]);
 
		HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i], tosave->data[i]);
 
    	checksum ^= tosave->data[i];
 
	}
 

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

	
 
    HAL_FLASH_Lock();
 
}
 

	
 

	
 

	
 
// vim:softtabstop=4 shiftwidth=4 expandtab 
flash.h
Show inline comments
 
#ifndef FLASH_H
 
#define FLASH_H
 

	
 
#include "states.h"
 
#include "stm32f0xx_hal_flash.h"
 

	
 
#define PAGE_SIZE ((uint16_t)0x400)
 
#define END_ADDR 0x08007FFF
 

	
 
void flash_save(therm_settings_t* tosave);
 
void flash_restore(therm_settings_t* tosave);
 
void flash_load_defaults(therm_settings_t* torestore);
 
void flash_erase(void);
 

	
 
#endif
 

	
ssd1306.c
Show inline comments
 
#include "stm32f0xx_hal_conf.h"
 
#include "ssd1306.h"
 
 
// Write command to OLED
 
static void WriteCommand(unsigned char command)
 
{
 
  SSD_CS_Low();
 
  SSD_A0_Low();
 
  SPI_SendByte(command);
 
  SSD_CS_High();
 
}
 
 
// Write data to OLED
ssd1306.h
Show inline comments
 
@@ -11,23 +11,25 @@
 
#define   SSD_A0_High()     HAL_GPIO_WritePin(SSD_A0, 1)
 
#define   SSD_CS_Low()      HAL_GPIO_WritePin(SSD_CS, 0)
 
#define   SSD_CS_High()     HAL_GPIO_WritePin(SSD_CS, 1)
 
 
// EMZ FIXME this won't really work
 
#define   SPI_SendByte(data)  HAL_SPI_Transmit(spi_get(), &data, 1, 100) 
 
//#define SPI_SendByte(data) 
 
#define SPI_Wait() 
 
 
//#define   SPI_SendByte(data)  SPI_I2S_SendData(SPI1,data) 
 
//#define   SPI_Wait()       while(!(SPI1->SR&SPI_FLAG_TXE));while(SPI1->SR&SPI_FLAG_BSY); 
 
 
#include "stm32f0xx_hal_conf.h"
 
 
void ssd1306_init(void);
 
void ssd1306_drawchar(char ascii, unsigned char row, unsigned char xPos);
 
void ssd1306_drawcharbig(char ascii, unsigned char row, unsigned char xPos);
 
void ssd1306_drawstring(const char *dataPtr, unsigned char row, unsigned char xPos);
 
void ssd1306_drawstringbig(const char *dataPtr, unsigned char row, unsigned char xPos);
 
void ssd1306_drawlogo();
 
void ssd1306_clearscreen();
 
 
#endif
 
 
// vim:softtabstop=4 shiftwidth=4 expandtab 
states.h
Show inline comments
 
#ifndef STATES_H
 
#define STATES_H
 

	
 
#include "stm32f0xx_hal.h"
 
#include "config.h"
 

	
 
typedef struct {
 
    int32_t temp;
 
    uint8_t temp_frac;
 
    uint8_t state_resume;
 
    uint8_t state;
 
    int32_t setpoint;
 
    uint8_t pid_enabled;
 
    uint8_t error_code;
 
} therm_status_t;
 

	
 
@@ -57,19 +58,20 @@ enum state {
 

	
 
enum GOTO_MODE {
 
	#ifdef BOOTLOADER_SHORTCUT
 
	MODE_BOOTLOADER,
 
	#endif
 
	MODE_HEAT,
 
	MODE_SETUP,
 
	MODE_RESET,
 
	MODE_SIZE,
 
};
 

	
 
enum RESET_MODE {
 
	RESET_RESET = 0,
 
	RESET_REBOOT = 0,
 
	RESET_DEFAULTS,
 
	RESET_BOOTLOADER,
 
	RESET_EXIT,
 
	RESET_SIZE,
 
};
 

	
 
#endif
0 comments (0 inline, 0 general)