From 9e22d912b204c5bf5ab760d7d907076a562f8ed4 Mon Sep 17 00:00:00 2001 From: Timo Kokkonen Date: Sun, 6 Oct 2013 16:46:58 +0300 Subject: [PATCH] Add command line parsing Add generic commnd line parsing code for adjusting the run time configurable parameters. Signed-off-by: Timo Kokkonen --- Makefile | 2 +- main.c | 19 +++++++++---------- options.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ options.h | 12 ++++++++++++ 4 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 options.c create mode 100644 options.h diff --git a/Makefile b/Makefile index bcea3eb..e02d333 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CC=gcc LD=ld CFLAGS=-Wall -O2 -g -fPIC -LOG-PLOTTER_OBJS = baud.o main.o +LOG-PLOTTER_OBJS = baud.o main.o options.o ALL_OBJS = $(LOG-PLOTTER_OBJS) ALL_DEBS = $(patsubst %.o,.%.o.d,$(ALL_OBJS)) diff --git a/main.c b/main.c index dd6c7c0..d81f733 100644 --- a/main.c +++ b/main.c @@ -2,30 +2,29 @@ #include #include +#include "options.h" #include "baud.h" int main(int argc, char *argv[]) { struct epoll_event ev; + struct plotter_options options; int fd, baud, ret; int epoll_fd; - char *device; char buf[256]; - if (argc < 2) { - printf("Usage: %s SERIAL_DEVICE\n", argv[0]); - return 1; - } - baud = 128000; - device = argv[1]; + if (read_args(argc, argv, &options)) + return 1; - fd = open_at_baud(device, &baud); + baud = options.baud_rate; + fd = open_at_baud(options.device_path, &baud); if (fd < 0) return 1; - if (baud != 128000) { - printf("Failed to set baudrate to 128000, only got %d\n", baud); + if (baud != options.baud_rate) { + printf("Failed to set baudrate to %d, only got %d\n", + options.baud_rate, baud); close(fd); return 1; } diff --git a/options.c b/options.c new file mode 100644 index 0000000..38b29a3 --- /dev/null +++ b/options.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +#include "options.h" + +static void set_default_options(struct plotter_options *opts) +{ + bzero(opts, sizeof(*opts)); + + opts->baud_rate = 128000; + opts->device_path = "/dev/ttyUSB0"; +} + +int read_args(int argc, char *argv[], struct plotter_options *opts) +{ + int option_index = 0, c; + static struct option long_options[] = { + { .val = 'd', .name = "device", .has_arg = 1, }, + { .val = 'o', .name = "output", .has_arg = 1 }, + { .val = 'o', .name = "baud", .has_arg = 1 }, + }; + char short_options[] = "d:o:b:"; + + set_default_options(opts); + + while (1) { + c = getopt_long(argc, argv, short_options, long_options, + &option_index); + + if (c == -1) + break; + + switch (c) { + case 'd': + opts->device_path = optarg; + break; + case 'o': + opts->output_path = optarg; + break; + case 'b': + opts->baud_rate = atoi(optarg); + break; + case '?': + return -1; + } + } + + while (optind < argc) { + /* The rest of the options, ignored */ + optind++; + } + + return 0; +} diff --git a/options.h b/options.h new file mode 100644 index 0000000..5312e42 --- /dev/null +++ b/options.h @@ -0,0 +1,12 @@ +#ifndef _OPTIONS_H +#define _OPTIONS_H + +struct plotter_options { + char *device_path; + char *output_path; + int baud_rate; +}; + +int read_args(int argc, char *argv[], struct plotter_options *opts); + +#endif -- 2.44.0