Module: xenomai-forge Branch: next Commit: d1bc4b1194d64e5c0b5eadfef46034e8444b55f7 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d1bc4b1194d64e5c0b5eadfef46034e8444b55f7
Author: Jorge Ramirez-Ortiz <j...@xenomai.org> Date: Sat Jun 14 15:51:03 2014 -0400 utils/analogy: cmd_write optimizations --- utils/analogy/cmd_write.c | 56 ++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/utils/analogy/cmd_write.c b/utils/analogy/cmd_write.c index bedd6aa..bec397a 100644 --- a/utils/analogy/cmd_write.c +++ b/utils/analogy/cmd_write.c @@ -202,6 +202,8 @@ error: cfg->chans = NULL; + fprintf(stderr, "cmd_write: leaving %s in error\n", __FUNCTION__); + return err; } @@ -267,14 +269,20 @@ static void print_config(struct config *cfg) static void cleanup_config(struct config *cfg) { - if (cfg->buffer) + if (cfg->buffer) { free(cfg->buffer); + cfg->buffer = NULL; + } - if (cfg->dsc.sbdata) + if (cfg->dsc.sbdata) { free(cfg->dsc.sbdata); + cfg->dsc.sbdata = NULL; + } - if (cfg->dsc.fd != -1) + if (cfg->dsc.fd != -1) { a4l_close(&cfg->dsc); + cfg->dsc.fd = -1; + } } static int init_config(struct config *cfg, int argc, char *argv[]) @@ -375,7 +383,7 @@ out: /* --- Input management part --- */ -static int process_input(struct config *cfg) +static int process_input(struct config *cfg, int *elements) { int err = 0, filled = 0; @@ -389,8 +397,7 @@ static int process_input(struct config *cfg) double value; char tmp[128]; - /* Data from stdin are supposed to be double values - coming from wf_generate... */ + /* stdin data are supposed to be double values from wf_generate */ err = fread(&value, sizeof(double), 1, cfg->input); if (err != 1 && !feof(cfg->input)) { err = -errno; @@ -401,7 +408,7 @@ static int process_input(struct config *cfg) else if (err == 0 && feof(cfg->input)) goto out; - /* ...and these data are just for one channel... */ + /* the data is just for one channel */ err = a4l_dtoraw(cfg->cinfo, cfg->rinfo, tmp, &value, 1); if (err < 0) { fprintf(stderr, @@ -410,7 +417,7 @@ static int process_input(struct config *cfg) goto out; } - /* ...so we have to duplicate the conversion if many + /* so we have to duplicate the conversion if many channels are selected for the acquisition */ for (i = 0; i < cfg->chans_count; i++) memcpy(cfg->buffer + filled * scan_size + i * chan_size, @@ -420,30 +427,41 @@ static int process_input(struct config *cfg) } out: + if (err < 0) + return err; + + *elements = filled; - return err < 0 ? err : filled; + return 0; } /* --- Acquisition related stuff --- */ - static int run_acquisition(struct config *cfg) { - int err = 0; + int err = 0, elements = 0; /* The return value of a4l_sizeof_chan() was already controlled in init_config so no need to do it twice */ int chan_size = a4l_sizeof_chan(cfg->cinfo); int scan_size = cfg->chans_count * chan_size; - err = cfg->input ? process_input(cfg) : BUFFER_DEPTH; - if (err > 0) - err = a4l_async_write(&cfg->dsc, - cfg->buffer, - err * scan_size, A4L_INFINITE); - else if (err == 0) - err = -ENOENT; + if (cfg->input) { + err = process_input(cfg, &elements); + if (err < 0) + return err; + } + else + elements = BUFFER_DEPTH; + + if (elements == 0) + return -ENOENT; - return err < 0 ? err : 0; + err = a4l_async_write(&cfg->dsc, cfg->buffer, elements * scan_size, + A4L_INFINITE); + if (err < 0) + return err; + + return 0; } static int init_acquisition(struct config *cfg) _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git