diff options
Diffstat (limited to 'apps/systemcmds/mixer/mixer.c')
-rw-r--r-- | apps/systemcmds/mixer/mixer.c | 261 |
1 files changed, 6 insertions, 255 deletions
diff --git a/apps/systemcmds/mixer/mixer.c b/apps/systemcmds/mixer/mixer.c index bdf54bc20..9d52557e7 100644 --- a/apps/systemcmds/mixer/mixer.c +++ b/apps/systemcmds/mixer/mixer.c @@ -44,7 +44,6 @@ #include <fcntl.h> #include <errno.h> -#include <systemlib/mixer.h> #include <drivers/drv_mixer.h> #include <uORB/topics/actuator_controls.h> @@ -52,8 +51,6 @@ __EXPORT int mixer_main(int argc, char *argv[]); static void usage(const char *reason); static void load(const char *devname, const char *fname); -static void save(const char *devname, const char *fname); -static void show(const char *devname); int mixer_main(int argc, char *argv[]) @@ -67,18 +64,6 @@ mixer_main(int argc, char *argv[]) load(argv[2], argv[3]); - } else if (!strcmp(argv[1], "save")) { - if (argc < 4) - usage("missing device or filename"); - - save(argv[2], argv[3]); - - } else if (!strcmp(argv[1], "show")) { - if (argc < 3) - usage("missing device name"); - - show(argv[2]); - } else { usage("unrecognised command"); } @@ -93,146 +78,15 @@ usage(const char *reason) fprintf(stderr, "%s\n", reason); fprintf(stderr, "usage:\n"); - fprintf(stderr, " mixer show <device>\n"); - fprintf(stderr, " mixer {load|save} <device> [<filename>]\n"); + fprintf(stderr, " mixer load <device> <filename>\n"); + /* XXX automatic setups for quad, etc. */ exit(1); } static void load(const char *devname, const char *fname) { - int defs = -1; - int dev = -1; - unsigned num_mixers = 0; - int ret, result = 1; - struct mixer_s *mixer = NULL; - - /* open the device */ - if ((dev = open(devname, 0)) < 0) { - fprintf(stderr, "can't open %s\n", devname); - goto out; - } - - /* open the definition file */ - if ((defs = open(fname, O_RDONLY)) < 0) { - fprintf(stderr, "can't open %s\n", fname); - goto out; - } - - /* find out how many mixers the device supports */ - ioctl(dev, MIXERIOCGETMIXERCOUNT, (unsigned long)&num_mixers); - - if (num_mixers < 1) { - fprintf(stderr, "can't get mixer count from %s\n", devname); - goto out; - } - - /* send mixers to the device */ - for (unsigned i = 0; i < num_mixers; i++) { - ret = mixer_load(defs, &mixer); - - if (ret < 0) { - fprintf(stderr, "read for mixer %d failed\n", i); - goto out; - } - - /* end of file? */ - if (ret == 0) - break; - - if (mixer != NULL) { - /* sanity check the mixer */ - ret = mixer_check(mixer, NUM_ACTUATOR_CONTROL_GROUPS, NUM_ACTUATOR_CONTROLS); - - if (ret != 0) { - fprintf(stderr, "mixer %u fails sanity check %d\n", i, ret); - goto out; - } - - /* send the mixer to the device */ - ret = ioctl(dev, MIXERIOCSETMIXER(i), (unsigned long)mixer); - - if (ret < 0) { - fprintf(stderr, "mixer %d set failed\n", i); - goto out; - } - - free(mixer); - mixer = NULL; - - } else { - /* delete the mixer */ - ret = ioctl(dev, MIXERIOCSETMIXER(i), 0); - - if (ret < 0) { - fprintf(stderr, "mixer %d clear failed\n", i); - goto out; - } - } - } - - result = 0; - -out: - - /* free the mixers array */ - if (mixer != NULL) - free(mixer); - - if (defs != -1) - close(defs); - - if (dev != -1) - close(dev); - - exit(result); -} - -static int -getmixer(int dev, unsigned mixer_number, struct MixInfo **mip) -{ - struct MixInfo *mi = *mip; - int ret; - - /* first-round initialisation */ - if (mi == NULL) { - mi = (struct MixInfo *)malloc(MIXINFO_SIZE(0)); - mi->num_controls = 0; - } - - /* loop trying to get the next mixer until the buffer is big enough */ - do { - /* try to get the mixer into the buffer as it stands */ - ret = ioctl(dev, MIXERIOCGETMIXER(mixer_number), (unsigned long)mi); - - if (ret < 0) - return -1; - - /* did the mixer fit? */ - if (mi->mixer.control_count <= mi->num_controls) - break; - - /* re-allocate to suit */ - mi->num_controls = mi->mixer.control_count; - mi = (struct MixInfo *)realloc(mi, MIXINFO_SIZE(mi->num_controls)); - - /* oops, blew up the heap */ - if (mi == NULL) - return -1; - - } while (true); - - *mip = mi; - return 0; -} - -static void -save(const char *devname, const char *fname) -{ - struct MixInfo *mi = NULL; - int defs = -1; int dev = -1; - unsigned num_mixers = 0; int ret, result = 1; /* open the device */ @@ -241,120 +95,17 @@ save(const char *devname, const char *fname) goto out; } - /* find out how many mixers the device supports */ - ioctl(dev, MIXERIOCGETMIXERCOUNT, (unsigned long)&num_mixers); - - if (num_mixers < 1) { - fprintf(stderr, "can't get mixer count from %s\n", devname); - goto out; - } - - /* open the definition file */ - if ((defs = open(fname, O_WRONLY | O_CREAT)) < 0) { - fprintf(stderr, "can't open %s\n", fname); - goto out; - } - - /* get mixers from the device and save them */ - for (unsigned i = 0; i < num_mixers; i++) { - struct mixer_s *mm; - - ret = getmixer(dev, i, &mi); - mm = &mi->mixer; - - if (ret < 0) { - if (errno != ENOENT) - goto out; - - mm = NULL; - } - - ret = mixer_save(defs, mm); - - if (ret < 0) - goto out; + /* tell it to load the file */ + ret = ioctl(dev, MIXERIOCLOADFILE, (unsigned long)fname); + if (ret != 0) { + fprintf(stderr, "failed loading %s\n", fname); } result = 0; - out: - /* free the mixinfo */ - if (mi != NULL) - free(mi); - - if (defs != -1) - close(defs); - if (dev != -1) close(dev); exit(result); } - -static void -show(const char *devname) -{ - struct MixInfo *mi = NULL; - int dev = -1; - unsigned num_mixers = 0; - int ret; - - /* open the device */ - if ((dev = open(devname, 0)) < 0) { - fprintf(stderr, "can't open %s\n", devname); - goto out; - } - - /* find out how many mixers the device supports */ - ioctl(dev, MIXERIOCGETMIXERCOUNT, (unsigned long)&num_mixers); - - if (num_mixers < 1) { - fprintf(stderr, "can't get mixer count from %s\n", devname); - goto out; - } - - /* get mixers from the device and print them */ - for (unsigned i = 0; i < num_mixers; i++) { - - ret = getmixer(dev, i, &mi); - - if (ret < 0) { - if (errno != ENOENT) - goto out; - - continue; - } - - printf("mixer %d:\n", i); - printf(" -ve scale +ve scale offset low limit high limit\n"); - printf("output %8.4f %8.4f %8.4f %8.4f %8.4f\n", - mi->mixer.output_scaler.negative_scale, - mi->mixer.output_scaler.positive_scale, - mi->mixer.output_scaler.offset, - mi->mixer.output_scaler.lower_limit, - mi->mixer.output_scaler.upper_limit); - - for (unsigned j = 0; j < mi->mixer.control_count; j++) { - printf("(%u,%u) %8.4f %8.4f %8.4f %8.4f %8.4f\n", - mi->mixer.control_scaler[j].control_group, - mi->mixer.control_scaler[j].control_index, - mi->mixer.control_scaler[j].negative_scale, - mi->mixer.control_scaler[j].positive_scale, - mi->mixer.control_scaler[j].offset, - mi->mixer.control_scaler[j].lower_limit, - mi->mixer.control_scaler[j].upper_limit); - } - } - -out: - - /* free the mixinfo */ - if (mi != NULL) - free(mi); - - if (dev != -1) - close(dev); - - exit(0); -} |