mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-05 22:24:47 +08:00
New param interface for microSD and EEPROM
This commit is contained in:
@@ -268,33 +268,6 @@ void tune_confirm() {
|
|||||||
ioctl(buzzer, TONE_SET_ALARM, 3);
|
ioctl(buzzer, TONE_SET_ALARM, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *parameter_file = "/eeprom/parameters";
|
|
||||||
|
|
||||||
static int pm_save_eeprom(bool only_unsaved)
|
|
||||||
{
|
|
||||||
/* delete the file in case it exists */
|
|
||||||
unlink(parameter_file);
|
|
||||||
|
|
||||||
/* create the file */
|
|
||||||
int fd = open(parameter_file, O_WRONLY | O_CREAT | O_EXCL);
|
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
warn("opening '%s' for writing failed", parameter_file);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int result = param_export(fd, only_unsaved);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (result != 0) {
|
|
||||||
unlink(parameter_file);
|
|
||||||
warn("error exporting parameters to '%s'", parameter_file);
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_mag_calibration(int status_pub, struct vehicle_status_s *status)
|
void do_mag_calibration(int status_pub, struct vehicle_status_s *status)
|
||||||
{
|
{
|
||||||
/* set to mag calibration mode */
|
/* set to mag calibration mode */
|
||||||
@@ -496,9 +469,9 @@ void do_mag_calibration(int status_pub, struct vehicle_status_s *status)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* auto-save to EEPROM */
|
/* auto-save to EEPROM */
|
||||||
int save_ret = pm_save_eeprom(false);
|
int save_ret = param_save_default();
|
||||||
if(save_ret != 0) {
|
if(save_ret != 0) {
|
||||||
warn("WARNING: auto-save of params to EEPROM failed");
|
warn("WARNING: auto-save of params to storage failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("[mag cal]\tscale: %.6f %.6f %.6f\n \toffset: %.6f %.6f %.6f\nradius: %.6f GA\n",
|
printf("[mag cal]\tscale: %.6f %.6f %.6f\n \toffset: %.6f %.6f %.6f\nradius: %.6f GA\n",
|
||||||
@@ -616,9 +589,9 @@ void do_gyro_calibration(int status_pub, struct vehicle_status_s *status)
|
|||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
/* auto-save to EEPROM */
|
/* auto-save to EEPROM */
|
||||||
int save_ret = pm_save_eeprom(false);
|
int save_ret = param_save_default();
|
||||||
if(save_ret != 0) {
|
if(save_ret != 0) {
|
||||||
warn("WARNING: auto-save of params to EEPROM failed");
|
warn("WARNING: auto-save of params to storage failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
// char buf[50];
|
// char buf[50];
|
||||||
@@ -736,9 +709,9 @@ void do_accel_calibration(int status_pub, struct vehicle_status_s *status)
|
|||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
/* auto-save to EEPROM */
|
/* auto-save to EEPROM */
|
||||||
int save_ret = pm_save_eeprom(false);
|
int save_ret = param_save_default();
|
||||||
if(save_ret != 0) {
|
if(save_ret != 0) {
|
||||||
warn("WARNING: auto-save of params to EEPROM failed");
|
warn("WARNING: auto-save of params to storage failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
//char buf[50];
|
//char buf[50];
|
||||||
|
|||||||
@@ -172,64 +172,6 @@ int mavlink_pm_send_param(param_t param)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *mavlink_parameter_file = "/eeprom/parameters";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return 0 on success, -1 if device open failed, -2 if writing parameters failed
|
|
||||||
*/
|
|
||||||
static int mavlink_pm_save_eeprom()
|
|
||||||
{
|
|
||||||
/* delete the file in case it exists */
|
|
||||||
unlink(mavlink_parameter_file);
|
|
||||||
|
|
||||||
/* create the file */
|
|
||||||
int fd = open(mavlink_parameter_file, O_WRONLY | O_CREAT | O_EXCL);
|
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
warn("opening '%s' for writing failed", mavlink_parameter_file);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int result = param_export(fd, false);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (result != 0) {
|
|
||||||
unlink(mavlink_parameter_file);
|
|
||||||
warn("error exporting parameters to '%s'", mavlink_parameter_file);
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return 0 on success, 1 if all params have not yet been stored, -1 if device open failed, -2 if writing parameters failed
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
mavlink_pm_load_eeprom()
|
|
||||||
{
|
|
||||||
int fd = open(mavlink_parameter_file, O_RDONLY);
|
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
/* no parameter file is OK, otherwise this is an error */
|
|
||||||
if (errno != ENOENT) {
|
|
||||||
warn("open '%s' for reading failed", mavlink_parameter_file);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int result = param_load(fd);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (result != 0) {
|
|
||||||
warn("error reading parameters from '%s'", mavlink_parameter_file);
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mavlink_pm_message_handler(const mavlink_channel_t chan, const mavlink_message_t *msg)
|
void mavlink_pm_message_handler(const mavlink_channel_t chan, const mavlink_message_t *msg)
|
||||||
{
|
{
|
||||||
switch (msg->msgid) {
|
switch (msg->msgid) {
|
||||||
@@ -307,7 +249,7 @@ void mavlink_pm_message_handler(const mavlink_channel_t chan, const mavlink_mess
|
|||||||
if (((int)(cmd_mavlink.param1)) == 0) {
|
if (((int)(cmd_mavlink.param1)) == 0) {
|
||||||
|
|
||||||
/* read all parameters from EEPROM to RAM */
|
/* read all parameters from EEPROM to RAM */
|
||||||
int read_ret = mavlink_pm_load_eeprom();
|
int read_ret = param_load_default();
|
||||||
if (read_ret == OK) {
|
if (read_ret == OK) {
|
||||||
//printf("[mavlink pm] Loaded EEPROM params in RAM\n");
|
//printf("[mavlink pm] Loaded EEPROM params in RAM\n");
|
||||||
mavlink_missionlib_send_gcs_string("[mavlink pm] OK loaded EEPROM params");
|
mavlink_missionlib_send_gcs_string("[mavlink pm] OK loaded EEPROM params");
|
||||||
@@ -327,7 +269,7 @@ void mavlink_pm_message_handler(const mavlink_channel_t chan, const mavlink_mess
|
|||||||
} else if (((int)(cmd_mavlink.param1)) == 1) {
|
} else if (((int)(cmd_mavlink.param1)) == 1) {
|
||||||
|
|
||||||
/* write all parameters from RAM to EEPROM */
|
/* write all parameters from RAM to EEPROM */
|
||||||
int write_ret = mavlink_pm_save_eeprom();
|
int write_ret = param_save_default();
|
||||||
if (write_ret == OK) {
|
if (write_ret == OK) {
|
||||||
mavlink_missionlib_send_gcs_string("[mavlink pm] OK params written to EEPROM");
|
mavlink_missionlib_send_gcs_string("[mavlink pm] OK params written to EEPROM");
|
||||||
result = MAV_RESULT_ACCEPTED;
|
result = MAV_RESULT_ACCEPTED;
|
||||||
|
|||||||
@@ -56,36 +56,53 @@
|
|||||||
|
|
||||||
__EXPORT int param_main(int argc, char *argv[]);
|
__EXPORT int param_main(int argc, char *argv[]);
|
||||||
|
|
||||||
static void do_save(void);
|
static void do_save(const char* param_file_name);
|
||||||
static void do_load(void);
|
static void do_load(const char* param_file_name);
|
||||||
static void do_import(void);
|
static void do_import(const char* param_file_name);
|
||||||
static void do_show(void);
|
static void do_show(void);
|
||||||
static void do_show_print(void *arg, param_t param);
|
static void do_show_print(void *arg, param_t param);
|
||||||
|
|
||||||
static const char *param_file_name = "/eeprom/parameters";
|
static const char *param_file_name_default = "/fs/microsd/parameters";
|
||||||
|
|
||||||
int
|
int
|
||||||
param_main(int argc, char *argv[])
|
param_main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if (argc >= 2) {
|
if (argc >= 2) {
|
||||||
if (!strcmp(argv[1], "save"))
|
if (!strcmp(argv[1], "save")) {
|
||||||
do_save();
|
if (argc >= 3) {
|
||||||
|
do_save(argv[2]);
|
||||||
|
} else {
|
||||||
|
do_save(param_file_name_default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(argv[1], "load"))
|
if (!strcmp(argv[1], "load")) {
|
||||||
do_load();
|
if (argc >= 3) {
|
||||||
|
do_load(argv[2]);
|
||||||
|
} else {
|
||||||
|
do_load(param_file_name_default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(argv[1], "import"))
|
if (!strcmp(argv[1], "import")) {
|
||||||
do_import();
|
if (argc >= 3) {
|
||||||
|
do_import(argv[2]);
|
||||||
|
} else {
|
||||||
|
do_import(param_file_name_default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(argv[1], "show"))
|
if (!strcmp(argv[1], "show")) {
|
||||||
do_show();
|
do_show();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errx(1, "expected a command, try 'load', 'import', 'show' or 'save'\n");
|
errx(1, "expected a command, try 'load', 'import', 'show' or 'save'\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_save(void)
|
do_save(const char* param_file_name)
|
||||||
{
|
{
|
||||||
/* delete the parameter file in case it exists */
|
/* delete the parameter file in case it exists */
|
||||||
unlink(param_file_name);
|
unlink(param_file_name);
|
||||||
@@ -108,7 +125,7 @@ do_save(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_load(void)
|
do_load(const char* param_file_name)
|
||||||
{
|
{
|
||||||
int fd = open(param_file_name, O_RDONLY);
|
int fd = open(param_file_name, O_RDONLY);
|
||||||
|
|
||||||
@@ -118,14 +135,18 @@ do_load(void)
|
|||||||
int result = param_load(fd);
|
int result = param_load(fd);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
if (result < 0)
|
if (result < 0) {
|
||||||
errx(1, "error importing from '%s'", param_file_name);
|
errx(1, "error importing from '%s'", param_file_name);
|
||||||
|
} else {
|
||||||
|
/* set default file name for next storage operation */
|
||||||
|
param_set_default_file(param_file_name);
|
||||||
|
}
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_import(void)
|
do_import(const char* param_file_name)
|
||||||
{
|
{
|
||||||
int fd = open(param_file_name, O_RDONLY);
|
int fd = open(param_file_name, O_RDONLY);
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
@@ -480,6 +481,83 @@ param_reset_all(void)
|
|||||||
param_notify_changes();
|
param_notify_changes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char param_default_file_name[50] = "/eeprom/parameters";
|
||||||
|
|
||||||
|
int
|
||||||
|
param_set_default_file(const char* filename)
|
||||||
|
{
|
||||||
|
if (filename) {
|
||||||
|
if (strlen(filename) < sizeof(param_default_file_name))
|
||||||
|
{
|
||||||
|
strcpy(param_default_file_name, filename);
|
||||||
|
} else {
|
||||||
|
warnx("param file name too long");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
warnx("no valid param file name");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
param_save_default(void)
|
||||||
|
{
|
||||||
|
/* delete the file in case it exists */
|
||||||
|
unlink(param_default_file_name);
|
||||||
|
|
||||||
|
/* create the file */
|
||||||
|
int fd = open(param_default_file_name, O_WRONLY | O_CREAT | O_EXCL);
|
||||||
|
|
||||||
|
if (fd < 0) {
|
||||||
|
warn("opening '%s' for writing failed", param_default_file_name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result = param_export(fd, false);
|
||||||
|
/* should not be necessary, over-careful here */
|
||||||
|
fsync(fd);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
if (result != 0) {
|
||||||
|
unlink(param_default_file_name);
|
||||||
|
warn("error exporting parameters to '%s'", param_default_file_name);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 0 on success, 1 if all params have not yet been stored, -1 if device open failed, -2 if writing parameters failed
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
param_load_default(void)
|
||||||
|
{
|
||||||
|
int fd = open(param_default_file_name, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd < 0) {
|
||||||
|
/* no parameter file is OK, otherwise this is an error */
|
||||||
|
if (errno != ENOENT) {
|
||||||
|
warn("open '%s' for reading failed", param_default_file_name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result = param_load(fd);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
if (result != 0) {
|
||||||
|
warn("error reading parameters from '%s'", param_default_file_name);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
param_export(int fd, bool only_unsaved)
|
param_export(int fd, bool only_unsaved)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -234,6 +234,25 @@ __EXPORT int param_load(int fd);
|
|||||||
*/
|
*/
|
||||||
__EXPORT void param_foreach(void (*func)(void *arg, param_t param), void *arg, bool only_changed);
|
__EXPORT void param_foreach(void (*func)(void *arg, param_t param), void *arg, bool only_changed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export parameters to the default file name.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
*/
|
||||||
|
__EXPORT int param_save_default(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the default parameter file name.
|
||||||
|
*/
|
||||||
|
__EXPORT int param_set_default_file(const char* filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import parameters from the default file name.
|
||||||
|
*/
|
||||||
|
__EXPORT int param_load_default(void);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Macros creating static parameter definitions.
|
* Macros creating static parameter definitions.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user