Dataman: Store sizes of all containers and reset file if any of them changes.

This commit is contained in:
Lorenz Meier
2016-10-23 16:26:03 +02:00
committed by Lorenz Meier
parent c340974991
commit db774798fa
2 changed files with 40 additions and 3 deletions
+28
View File
@@ -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);
}
+12 -3
View File
@@ -39,6 +39,7 @@
#ifndef _DATAMANAGER_H
#define _DATAMANAGER_H
#include <string.h>
#include <navigator/navigation.h>
#include <uORB/topics/mission.h>
#include <uORB/topics/fence.h>
@@ -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;