raspikeyer/src/settings.cpp
2024-02-16 20:56:03 +01:00

69 lines
1.7 KiB
C++

#include <cstring>
#include "pico/stdlib.h"
#include "settings.h"
namespace
{
constexpr const uint32_t FLASH_TARGET_OFFSET = PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE;
const uint8_t *flash_target_contents = (const uint8_t *)(XIP_BASE + FLASH_TARGET_OFFSET);
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
} // namespace
void flash_store_callback(void *settings)
{
// int writeSize = (sizeof(struct Settings) / FLASH_PAGE_SIZE) + 1;
flash_range_erase(FLASH_TARGET_OFFSET, FLASH_SECTOR_SIZE);
flash_range_program(FLASH_TARGET_OFFSET, (uint8_t *)settings, FLASH_PAGE_SIZE);
}
void store_settings(Settings &settings)
{
uint8_t *settingsAsBytes = (uint8_t *)&settings;
int result = flash_safe_execute(flash_store_callback, settingsAsBytes, 1000);
if (result == PICO_OK) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
}
Settings read_settings()
{
Settings settings;
memcpy(&settings, flash_target_contents, sizeof(struct Settings));
if (settings.magic_number != MAGIC_NUMBER) {
settings = Settings();
gpio_put(LED_PIN, 1);
sleep_ms(1000);
gpio_put(LED_PIN, 0);
sleep_ms(250);
gpio_put(LED_PIN, 1);
sleep_ms(1000);
gpio_put(LED_PIN, 0);
sleep_ms(250);
gpio_put(LED_PIN, 1);
sleep_ms(1000);
gpio_put(LED_PIN, 0);
sleep_ms(250);
store_settings(settings);
}
return settings;
}