From db774798fad6bda2c85d9b5251c42944c378878d Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Fri, 21 Oct 2016 13:54:44 +0200 Subject: [PATCH] Dataman: Store sizes of all containers and reset file if any of them changes. --- src/modules/dataman/dataman.c | 28 ++++++++++++++++++++++++++++ src/modules/dataman/dataman.h | 15 ++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/modules/dataman/dataman.c b/src/modules/dataman/dataman.c index 6af444d880..cba88d478f 100644 --- a/src/modules/dataman/dataman.c +++ b/src/modules/dataman/dataman.c @@ -956,7 +956,26 @@ task_main(int argc, char *argv[]) } #else + // Read the mission state and check the hash + struct dataman_compat_s compat_state; + int ret = dm_read(DM_KEY_COMPAT, 0, &compat_state, sizeof(compat_state)); + + bool incompat = true; + + if (ret == sizeof(compat_state)) { + + if (compat_state.key == DM_COMPAT_KEY) { + incompat = false; + } + + } + close(g_task_fd); + + if (incompat) { + unlink(k_data_manager_device_path); + } + #endif } @@ -977,6 +996,15 @@ task_main(int argc, char *argv[]) return -1; } + /* Write current compat info */ + struct dataman_compat_s compat_state; + compat_state.key = DM_COMPAT_KEY; + int ret = dm_write(DM_KEY_COMPAT, 0, DM_PERSIST_POWER_ON_RESET, &compat_state, sizeof(compat_state)); + + if (ret != sizeof(compat_state)) { + PX4_ERR("Failed writing compat."); + } + fsync(g_task_fd); } diff --git a/src/modules/dataman/dataman.h b/src/modules/dataman/dataman.h index 337cdddef1..d5f9e90543 100644 --- a/src/modules/dataman/dataman.h +++ b/src/modules/dataman/dataman.h @@ -39,6 +39,7 @@ #ifndef _DATAMANAGER_H #define _DATAMANAGER_H +#include #include #include #include @@ -56,6 +57,7 @@ typedef enum { DM_KEY_WAYPOINTS_OFFBOARD_1, /* (alernate between 0 and 1) */ DM_KEY_WAYPOINTS_ONBOARD, /* Mission way point coordinates generated onboard */ DM_KEY_MISSION_STATE, /* Persistent mission state */ + DM_KEY_COMPAT, DM_KEY_NUM_KEYS /* Total number of item types defined */ } dm_item_t; @@ -103,14 +105,21 @@ typedef enum { DM_INIT_REASON_VOLATILE /* Data does not survive reset */ } dm_reset_reason; +struct dataman_compat_s { + uint32_t key; +}; + +#define DM_COMPAT_KEY ((sizeof(struct mission_item_s) << 24) + (sizeof(struct mission_s) << 16) + (sizeof(struct fence_vertex_s) << 8) + sizeof(struct dataman_compat_s)) + /** Maximum size in bytes of a single item instance is * defined by adding the structure type to the union below */ typedef union dataman_max_size_t { - struct mission_item_s mission_item; - struct mission_s mission; - struct fence_vertex_s vertex; + struct mission_item_s mission_item; + struct mission_s mission; + struct fence_vertex_s vertex; + struct dataman_compat_s compat; } dataman_max_size_t;