Module: xenomai-3
Branch: next
Commit: df614aa783e03623da14a022cb7d43c08616eac4
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=df614aa783e03623da14a022cb7d43c08616eac4

Author: Jorge Ramirez-Ortiz <j...@xenomai.org>
Date:   Fri Sep 12 11:55:40 2014 -0400

utils/analogy: calibration - use iniparser

---

 utils/analogy/Makefile.am         |    4 ++-
 utils/analogy/analogy_calibrate.c |   57 ++++++++++++++++++++++++++++++++-----
 utils/analogy/analogy_calibrate.h |   11 ++++++-
 utils/analogy/calibration_ni_m.c  |   40 ++++++++++++++++++++++++++
 4 files changed, 103 insertions(+), 9 deletions(-)

diff --git a/utils/analogy/Makefile.am b/utils/analogy/Makefile.am
index fe2f317..40c09f3 100644
--- a/utils/analogy/Makefile.am
+++ b/utils/analogy/Makefile.am
@@ -12,7 +12,9 @@ bin_PROGRAMS = \
 CPPFLAGS =                                             \
        @XENO_USER_CFLAGS@                              \
        -ggdb                                           \
-       -I$(top_srcdir)/include
+       -I$(top_srcdir)/include                         \
+       -I$(top_srcdir)/lib/boilerplate 
+
 
 LDFLAGS =
 
diff --git a/utils/analogy/analogy_calibrate.c 
b/utils/analogy/analogy_calibrate.c
index 586a38a..b2ac286 100644
--- a/utils/analogy/analogy_calibrate.c
+++ b/utils/analogy/analogy_calibrate.c
@@ -31,7 +31,7 @@
 #include "analogy_calibrate.h"
 #include "calibration_ni_m.h"
 
-
+struct apply_calibration_params params = {.name = NULL,} ;
 struct timespec calibration_start_time;
 static const char *revision = "0.0.1";
 a4l_desc_t descriptor;
@@ -57,28 +57,65 @@ static const struct option options[] = {
                .flag = NULL,
        },
        {
+#define apply_opt      3
+               .name = "apply",
+               .has_arg = 1,
+               .flag = NULL,
+       },
+       {
                .name = NULL,
        }
 };
 
-static void print_usage(void)
+static void
+print_usage(void)
 {
        fprintf(stderr, "Usage: analogy_calibrate \n"
-              "  --help                        : this menu \n"
-              "  --device /dev/analogyX        : analogy device to calibrate 
\n"
-              "  --output filename             : calibration results \n"
+              "  --help                                        : this menu \n"
+              "  --device /dev/analogyX                        : analogy 
device to calibrate \n"
+              "  --output filename                             : calibration 
results \n"
+              "  --apply filename:subd,channel,range,aref      : apply the 
calibration file \n"
+              "          ex: /home/foo/calib.rc:0,1,255,255 - use 255 for dont 
care \n"
              );
 }
 
+static int
+apply_calibration_set_globals(char *info)
+{
+       char *p;
+
+       params.name = strtok(info, ":");
+       p = strtok(NULL, ",");
+       if (!p)
+               error(EXIT, 0, "missing --apply parameter \n");
+       params.subd = strtol(p, NULL, 0);
+
+       p = strtok(NULL, ",");
+       if (!p)
+               error(EXIT, 0, "missing --apply parameter \n");
+       params.channel = strtol(p, NULL, 0);
+
+       p = strtok(NULL, ",");
+       if (!p)
+               error(EXIT, 0, "missing --apply parameter \n");
+       params.range = strtol(p, NULL, 0);
+
+       p = strtok(NULL, "");
+       if (!p)
+               error(EXIT, 0, "missing --apply parameter \n");
+       params.aref = strtol(p, NULL, 0);
+
+       return 0;
+}
+
 static void __attribute__ ((constructor)) __analogy_calibrate_init(void)
 {
        clock_gettime(CLOCK_MONOTONIC, &calibration_start_time);
 }
-
 int main(int argc, char *argv[])
 {
        struct sched_param param = {.sched_priority = 99};
-       char *device = NULL, *file = NULL;
+       char *device = NULL, *file = NULL, *apply_info = NULL;
        int v, i, fd, err = 0;
        struct rlimit rl;
 
@@ -103,12 +140,18 @@ int main(int argc, char *argv[])
                                error(EXIT, errno, "calibration file");
                        __debug("calibration output: %s \n", file);
                        break;
+               case apply_opt:
+                       apply_info = optarg;
+                       break;
                default:
                        print_usage();
                        exit(EXIT_FAILURE);
                }
        }
 
+       if (apply_info)
+               apply_calibration_set_globals(apply_info);
+
        err = getrlimit(RLIMIT_STACK, &rl);
        if (!err) {
                if (rl.rlim_cur < rl.rlim_max) {
diff --git a/utils/analogy/analogy_calibrate.h 
b/utils/analogy/analogy_calibrate.h
index 1fb548e..c2b539a 100644
--- a/utils/analogy/analogy_calibrate.h
+++ b/utils/analogy/analogy_calibrate.h
@@ -38,8 +38,17 @@ extern struct timespec calibration_start_time;
 extern a4l_desc_t descriptor;
 extern FILE *cal;
 
-#define ARRAY_LEN(a)  (sizeof(a) / sizeof((a)[0]))
+struct apply_calibration_params {
+       int channel;
+       char *name;
+       int range;
+       int subd;
+       int aref;
+};
 
+extern struct apply_calibration_params params;
+
+#define ARRAY_LEN(a)  (sizeof(a) / sizeof((a)[0]))
 
 #define RETURN  1
 #define CONT    0
diff --git a/utils/analogy/calibration_ni_m.c b/utils/analogy/calibration_ni_m.c
index 05e5f24..fa5b4e6 100644
--- a/utils/analogy/calibration_ni_m.c
+++ b/utils/analogy/calibration_ni_m.c
@@ -26,9 +26,13 @@
 #include <gsl/gsl_matrix.h>
 #include <gsl/gsl_vector.h>
 #include <rtdm/analogy.h>
+#include <wordexp.h>
 #include <math.h>
 
 #include "calibration_ni_m.h"
+#include "iniparser/iniparser.h"
+
+extern char *apply_name;
 
 struct list ai_calibration_list;
 struct list ao_calibration_list;
@@ -42,6 +46,40 @@ static struct subdev_ops ops;
 static struct eeprom eeprom;
 static struct gnumath math;
 
+
+static int
+apply_calibration(void)
+{
+       const char *filename;
+       dictionary *d;
+       wordexp_t exp;
+       int ret = 0;
+
+       if (params.name == NULL)
+               return 0;
+
+       ret = wordexp(params.name, &exp, WRDE_NOCMD|WRDE_UNDEF);
+       if (ret) {
+               ret = ret == WRDE_NOSPACE ? -ENOMEM : -EINVAL;
+               error(EXIT, 0, "cant apply calibration (%d) \n", ret);
+       }
+
+       if (exp.we_wordc != 1)
+               error(EXIT, 0, "weird expansion of %s as rc file \n", 
params.name);
+
+       filename = exp.we_wordv[0];
+       if (access(filename, R_OK))
+               error(EXIT, 0, "cant access %s for reading \n", params.name);
+
+       d = iniparser_load(filename);
+       wordfree(&exp);
+
+       if (d == NULL)
+               error(EXIT, 0, "iniparser loading error for %s \n", 
params.name);
+
+       return ret;
+}
+
 /*
  * generate the calibration file
  */
@@ -1389,6 +1427,8 @@ int ni_m_software_calibrate(void)
 
        write_calibration(&ao_calibration_list, &ao_subd);
 
+       apply_calibration();
+
        return 0;
 }
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to