mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-17 11:13:35 +08:00
Dataman: Store sizes of all containers and reset file if any of them changes.
This commit is contained in:
committed by
Lorenz Meier
parent
c340974991
commit
db774798fa
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user