From ed59135498662e5cd6e8e1e9fe73c0b1a4668440 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Wed, 7 Feb 2024 09:32:11 +0100 Subject: [PATCH] read/write first attempt --- CMakeLists.txt | 6 +++++- pico_keyer.cpp | 14 +++++++++++++- settings.cpp | 23 +++++++++++++++++------ settings.h | 4 ++-- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9afff99..46d701b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,10 @@ pico_sdk_init() # Add executable. Default name is the project name, version 0.1 -add_executable(pico_keyer pico_keyer.cpp ) +add_executable(pico_keyer + pico_keyer.cpp + settings.cpp +) pico_set_program_name(pico_keyer "pico_keyer") pico_set_program_version(pico_keyer "0.1") @@ -48,6 +51,7 @@ target_link_libraries(pico_keyer hardware_flash hardware_exception pico_flash + pico_mem_ops ) pico_add_extra_outputs(pico_keyer) diff --git a/pico_keyer.cpp b/pico_keyer.cpp index ae63bde..be3ada2 100644 --- a/pico_keyer.cpp +++ b/pico_keyer.cpp @@ -1,5 +1,5 @@ #include -#include "pico/stdlib.h" +#include #include "settings.h" @@ -16,5 +16,17 @@ int main() puts("Hello, world!"); + Settings settings; + settings.mode = Mode::IAMBIC_A; + store_settings(settings); + printf("Iambic mode (stored): %d", static_cast(settings.mode)); + sleep_ms(1000); + Settings newSettings = read_settings(); + printf("Iambic mode (loaded): %d", static_cast(newSettings.mode)); + + while(true) { + sleep_ms(1000); + } + return 0; } diff --git a/settings.cpp b/settings.cpp index ee492c8..11926e3 100644 --- a/settings.cpp +++ b/settings.cpp @@ -1,19 +1,30 @@ +#include + #include "settings.h" namespace { - const size_t PAGE_SIZE{256}; - const size_t NVS_SIZE{4096}; - const uint32_t FLASH_WRITE_START = PICO_FLASH_SIZE_BYTES - NVS_SIZE; + 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); } void flash_store_callback(void *settings) { - flash_range_erase(FLASH_WRITE_START, NVS_SIZE); - flash_range_program(FLASH_WRITE_START, (const uint8_t *)settings, PAGE_SIZE); + int writeSize = (sizeof(struct Settings) / FLASH_PAGE_SIZE) + 1; + + flash_range_erase(FLASH_TARGET_OFFSET, FLASH_SECTOR_SIZE); + flash_range_program(FLASH_TARGET_OFFSET, reinterpret_cast(settings), FLASH_PAGE_SIZE * writeSize); } void store_settings(Settings &settings) { - flash_safe_execute(flash_store_callback, (void *)&settings, 1000); + uint8_t *settingsAsBytes = reinterpret_cast(&settings); + + flash_safe_execute(flash_store_callback, settingsAsBytes, 1000); +} + +Settings read_settings() { + Settings settings; + memcpy(&settings, flash_target_contents, sizeof(struct Settings)); + return settings; } \ No newline at end of file diff --git a/settings.h b/settings.h index e52417a..654b70a 100644 --- a/settings.h +++ b/settings.h @@ -1,7 +1,7 @@ #ifndef SETTINGS_H #define SETTINGS_H -#include "pico/flash.h" +#include enum class Mode { @@ -16,7 +16,7 @@ struct Settings }; void store_settings(Settings &settings); - +Settings read_settings(); #endif \ No newline at end of file