From c64cd25464b24480b41738d4d9a0e98782ae6418 Mon Sep 17 00:00:00 2001 From: Steve Sloan Date: Tue, 20 Mar 2012 09:58:32 -0700 Subject: [PATCH] Added -format option (defaults to "clean"), added "raw" and "CSV" formats. --- contour-protocol.c | 4 ++-- contour-protocol.h | 2 +- main.c | 48 +++++++++++++++++++++++++++++++++++++++++----- options.c | 18 ++++++++++++++++- options.h | 7 ++++++- 5 files changed, 69 insertions(+), 10 deletions(-) diff --git a/contour-protocol.c b/contour-protocol.c index 141c5e2..6e02fac 100644 --- a/contour-protocol.c +++ b/contour-protocol.c @@ -83,6 +83,7 @@ static int read_and_verify(struct msg *msg, int fd) } memcpy(msg->data, buf, sizeof(buf)); + memset(&msg->data[sizeof(buf)], 0, sizeof(msg->data)-sizeof(buf)); trace(2, "Got data %d: ", datalen(buf)); if (trace_level >= 3) print_hex(buf, datalen(buf)); @@ -297,10 +298,9 @@ int contour_read_entry(int fd, int uc, struct msg *in) msg.direction = OUT; SET_FIRST_BYTE(0x01); SET_BYTE(1, 0x06); - send_msg(&msg, fd, uc); - read_and_verify(in, fd); + read_and_verify(in, fd); return datalen(in->data); } diff --git a/contour-protocol.h b/contour-protocol.h index 42c52ff..3bb2edb 100644 --- a/contour-protocol.h +++ b/contour-protocol.h @@ -25,7 +25,7 @@ struct msg { int direction; - unsigned char data[64]; + unsigned char data[64+1]; }; enum direction { diff --git a/main.c b/main.c index fed79a9..0f2b641 100644 --- a/main.c +++ b/main.c @@ -32,10 +32,12 @@ #include "options.h" #include "contour-protocol.h" +char *token(char **str, char sep); + int main(int argc, char *argv[]) { FILE *outf; - struct user_options opts; + struct user_options opts = { .output_format = CLEAN }; struct msg msg; int fd, usage_code, ret, error; int entries = 0; @@ -63,19 +65,45 @@ int main(int argc, char *argv[]) fd = hiddev_open(opts.usbdev, &usage_code); if (fd < 0) return 1; - trace(0, "Initializing\n"); contour_initialize(fd, usage_code); trace(0, "Done! Reading data\n"); + if ( opts.output_format == CSV ) + fprintf(outf, "#,Time,Type,Value,Unit,Before meal,After meal,Stress,Sick,Dont feel right,Activity,Control test\n"); + while (1) { ret = contour_read_entry(fd, usage_code, &msg); - sanitize_ascii(msg.data, ret); - if (ret < 45) break; - fprintf(outf, "%s\n", msg.data); + if ( opts.output_format == CSV ) { + char *tok = (char *) &msg.data; + token(&tok, '|'); // unknown + char *seq = token(&tok, '|'); + char *type = token(&tok, '|'); + char *val = token(&tok, '|'); + char *unit = token(&tok, '|'); + token(&tok, '|'); // unknown + char *notes = token(&tok, '|'); + token(&tok, '|'); // unknown + char *time = token(&tok, '\r'); + unit[strlen(unit)-2] = 0; + fprintf(outf, "%s,%.4s-%.2s-%.2s %.2s:%.2s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n", + seq, &time[0], &time[4], &time[6], &time[8], &time[10], &type[3], val, unit, + strchr(notes, 'B') ? "X" : "", strchr(notes, 'A') ? "X" : "", + strchr(notes, 'S') ? "X" : "", strchr(notes, 'I') ? "X" : "", + strchr(notes, 'D') ? "X" : "", strchr(notes, 'X') ? "X" : "", + strchr(notes, 'C') ? "X" : "" + ); + } else + if ( opts.output_format == CLEAN ) { + sanitize_ascii(msg.data, ret); + fprintf(outf, "%s\n", msg.data); + } else + if ( opts.output_format == RAW ) { + fprintf(outf, "%s", msg.data); + } entries++; if (outf != stdout) { @@ -87,3 +115,13 @@ int main(int argc, char *argv[]) return 0; } + +char *token(char **str, char sep) +{ + char *start = *str; + char *cur; + for ( cur = start; *cur && (*cur != sep); ++cur ) ; + *cur = 0; + *str = cur+1; + return start; +} diff --git a/options.c b/options.c index 9d4ff03..7bd5b9b 100644 --- a/options.c +++ b/options.c @@ -22,6 +22,7 @@ #include #include "options.h" +#include "utils.h" int read_args(int argc, char *argv[], struct user_options *opts) { @@ -30,8 +31,9 @@ int read_args(int argc, char *argv[], struct user_options *opts) { .val = 'd', .name = "device", .has_arg = 1, }, { .val = 'v', .name = "verbose", .has_arg = 2 }, { .val = 'o', .name = "output", .has_arg = 1 }, + { .val = 'f', .name = "format", .has_arg = 1, }, }; - char short_options[] = "d:v:o:"; + char short_options[] = "d:v:o:f:"; memset(opts, 0, sizeof(*opts)); @@ -54,6 +56,20 @@ int read_args(int argc, char *argv[], struct user_options *opts) case 'o': opts->output_path = optarg; break; + case 'f': + if ( strcmp(optarg, "raw") == 0 ) { + opts->output_format = RAW; + } else + if ( strcmp(optarg, "clean") == 0 ) { + opts->output_format = CLEAN; + } else + if ( strcmp(optarg, "csv") == 0 ) { + opts->output_format = CSV; + } else { + trace(0, "Unknown format type \"%s\", must be one of \"raw\", \"clean\", or \"csv\"\n", optarg ); + return -1; + } + break; case '?': return -1; } diff --git a/options.h b/options.h index deb46cd..83fefb6 100644 --- a/options.h +++ b/options.h @@ -18,11 +18,16 @@ */ #ifndef _OPTIONS_H_ -#define _OPTINOS_H_ +#define _OPTIONS_H_ struct user_options { char *usbdev; char *output_path; + enum { + RAW = 0, + CLEAN = 1, + CSV = 2, + } output_format; int trace_level; }; -- 2.44.0