From 21a5fd32442c4337c627a646fdb071111f8554f2 Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Wed, 25 Mar 2026 19:58:11 +0100 Subject: [PATCH] Added track store and updated copy to and from volatile to single template function --- src/custom_types.h | 35 ++++++++--------------------------- src/data/gps_store.cpp | 4 ++-- src/data/track_store.cpp | 27 +++++++++++++++++++++++++++ src/data/track_store.h | 13 +++++++++++++ 4 files changed, 50 insertions(+), 29 deletions(-) create mode 100644 src/data/track_store.cpp create mode 100644 src/data/track_store.h diff --git a/src/custom_types.h b/src/custom_types.h index e3c89f2..61c41c1 100644 --- a/src/custom_types.h +++ b/src/custom_types.h @@ -3,6 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include +#include #define CONFIG_MAGIC 0xBEEF struct vehicle_config{ @@ -20,7 +21,7 @@ struct lat_lng { struct track_data { uint16_t magic = CONFIG_MAGIC; int id; - char name[32]; + char name[20]; lat_lng pt_a; lat_lng pt_b; }; @@ -40,32 +41,12 @@ struct gps_data { uint32_t num_fix; }; -inline void gps_sub_copy_from_volatile(gps_sub_data& dst, const volatile gps_sub_data& src) { - dst.age = src.age; - dst.valid = src.valid; - dst.value = src.value; +template +inline void copy_from_volatile(T& dst, const volatile T& src) { + memcpy(&dst, (const void*)&src, sizeof(T)); } -inline void gps_sub_copy_to_volatile(volatile gps_sub_data& dst, const gps_sub_data& src) { - dst.age = src.age; - dst.valid = src.valid; - dst.value = src.value; -} - -inline void gps_copy_from_volatile(gps_data& dst, const volatile gps_data& src) { - gps_sub_copy_from_volatile(dst.altitude, src.altitude); - gps_sub_copy_from_volatile(dst.lat, src.lat); - gps_sub_copy_from_volatile(dst.lng, src.lng); - gps_sub_copy_from_volatile(dst.speed, src.speed); - gps_sub_copy_from_volatile(dst.course, src.course); - dst.num_fix = src.num_fix; -} - -inline void gps_copy_to_volatile(volatile gps_data& dst, const gps_data& src) { - gps_sub_copy_to_volatile(dst.altitude, src.altitude); - gps_sub_copy_to_volatile(dst.lat, src.lat); - gps_sub_copy_to_volatile(dst.lng, src.lng); - gps_sub_copy_to_volatile(dst.speed, src.speed); - gps_sub_copy_to_volatile(dst.course, src.course); - dst.num_fix = src.num_fix; +template +inline void copy_to_volatile(volatile T& dst, const T& src) { + memcpy((void*)&dst, &src, sizeof(T)); } \ No newline at end of file diff --git a/src/data/gps_store.cpp b/src/data/gps_store.cpp index 5b1d25b..0afdb02 100644 --- a/src/data/gps_store.cpp +++ b/src/data/gps_store.cpp @@ -6,9 +6,9 @@ volatile gps_data gps_data_global = {}; void gps_global_read(gps_data& out) { - gps_copy_from_volatile(out, gps_data_global); + copy_from_volatile(out, gps_data_global); } void gps_global_write(const gps_data& in) { - gps_copy_to_volatile(gps_data_global, in); + copy_to_volatile(gps_data_global, in); } \ No newline at end of file diff --git a/src/data/track_store.cpp b/src/data/track_store.cpp new file mode 100644 index 0000000..2683811 --- /dev/null +++ b/src/data/track_store.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2026 Hector van der Aa +// Copyright (C) 2026 Association Exergie +// SPDX-License-Identifier: GPL-3.0-or-later +#include "data/track_store.h" + + volatile track_data track_data_global = {}; + + void track_global_read(track_data& out) { + copy_from_volatile(out, track_data_global); + } + + int track_global_read(unsigned short idx, track_data& out) { + if (idx < 1 || idx > 8) { + return 1; + } + track_data temp; + EEPROM.get(idx, temp); + if (temp.magic != CONFIG_MAGIC) { + return 1; + } + out = temp; + return 0; + } + + void track_global_write(const track_data& in) { + copy_to_volatile(track_data_global, in); + } \ No newline at end of file diff --git a/src/data/track_store.h b/src/data/track_store.h new file mode 100644 index 0000000..51f7c99 --- /dev/null +++ b/src/data/track_store.h @@ -0,0 +1,13 @@ +// Copyright (C) 2026 Hector van der Aa +// Copyright (C) 2026 Association Exergie +// SPDX-License-Identifier: GPL-3.0-or-later +#pragma once + +#include "custom_types.h" +#include + +extern volatile track_data track_data_global; + +void track_global_read(track_data& out); +int track_global_read(unsigned short idx, track_data& out); +void track_global_write(const track_data& in); \ No newline at end of file