From b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8 Mon Sep 17 00:00:00 2001 From: px4dev Date: Sun, 19 Aug 2012 22:15:51 -0700 Subject: wrapper commands for saving and loading parameters --- apps/systemcmds/eeprom/Makefile | 2 +- apps/systemcmds/eeprom/eeprom.c | 84 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 4 deletions(-) (limited to 'apps/systemcmds') diff --git a/apps/systemcmds/eeprom/Makefile b/apps/systemcmds/eeprom/Makefile index 63f28c349..2f3db0fdc 100644 --- a/apps/systemcmds/eeprom/Makefile +++ b/apps/systemcmds/eeprom/Makefile @@ -37,6 +37,6 @@ APPNAME = eeprom PRIORITY = SCHED_PRIORITY_DEFAULT -STACKSIZE = 2048 +STACKSIZE = 4096 include $(APPDIR)/mk/app.mk diff --git a/apps/systemcmds/eeprom/eeprom.c b/apps/systemcmds/eeprom/eeprom.c index fd99cc9a3..c4b7e5870 100644 --- a/apps/systemcmds/eeprom/eeprom.c +++ b/apps/systemcmds/eeprom/eeprom.c @@ -41,18 +41,23 @@ #include #include +#include #include #include - +#include +#include #include +#include #include #include #include +#include #include #include "systemlib/systemlib.h" +#include "systemlib/param/param.h" #include "systemlib/err.h" #ifndef PX4_I2C_BUS_ONBOARD @@ -65,13 +70,30 @@ __EXPORT int eeprom_main(int argc, char *argv[]); static void eeprom_start(void); - +static void eeprom_ioctl(unsigned operation); +static void eeprom_save(const char *name); +static void eeprom_load(const char *name); int eeprom_main(int argc, char *argv[]) { if (argc >= 2) { if (!strcmp(argv[1], "start")) eeprom_start(); + + if (!strcmp(argv[1], "save_param")) + eeprom_save(argv[2]); + + if (!strcmp(argv[1], "load_param")) + eeprom_load(argv[2]); + + if (0) { /* these actually require a file on the filesystem... */ + + if (!strcmp(argv[1], "reformat")) + eeprom_ioctl(FIOC_REFORMAT); + + if (!strcmp(argv[1], "repack")) + eeprom_ioctl(FIOC_OPTIMIZE); + } } errx(1, "expected a command, try 'start'"); @@ -88,24 +110,80 @@ eeprom_start(void) errx(1, "EEPROM service already started"); /* find the right I2C */ - struct i2c_s *i2c = up_i2cinitialize(PX4_I2C_BUS_ONBOARD); + struct i2c_dev_s *i2c = up_i2cinitialize(PX4_I2C_BUS_ONBOARD); + if (i2c == NULL) errx(1, "failed to locate I2C bus"); /* start the MTD driver */ struct mtd_dev_s *mtd = at24c_initialize(i2c); + if (mtd == NULL) errx(1, "failed to initialize EEPROM driver"); /* start NXFFS */ ret = nxffs_initialize(mtd); + if (ret < 0) err(1, "failed to initialize NXFFS"); /* mount the EEPROM */ ret = mount(NULL, "/eeprom", "nxffs", 0, NULL); + if (ret < 0) err(1, "failed to mount EEPROM"); errx(0, "mounted EEPROM at /eeprom"); } + +static void +eeprom_ioctl(unsigned operation) +{ + int fd; + + fd = open("/eeprom/.", 0); + + if (fd < 0) + err(1, "open /eeprom"); + + if (ioctl(fd, operation, 0) < 0) + err(1, "ioctl"); + + exit(0); +} + +static void +eeprom_save(const char *name) +{ + int fd = open(name, O_WRONLY | O_CREAT | O_EXCL); + + if (fd < 0) + err(1, "create '%s'", name); + + int result = param_export(fd, false); + close(fd); + + if (result < 0) { + unlink(name); + errx(1, "error exporting to '%s'", name); + } + + exit(0); +} + +static void +eeprom_load(const char *name) +{ + int fd = open(name, O_RDONLY); + + if (fd < 0) + err(1, "open '%s'", name); + + int result = param_import(fd); + close(fd); + + if (result < 0) + unlink(name); + + exit(0); +} -- cgit v1.2.3