Add simple post-flight analysis tool (ao-postflight)
[fw/altos] / ao-tools / ao-dumplog / ao-dumplog.c
1 /*
2  * Copyright © 2009 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <unistd.h>
22 #include <getopt.h>
23 #include "cc-usb.h"
24 #include "cc.h"
25
26 #define NUM_BLOCK       512
27
28 static const struct option options[] = {
29         { .name = "tty", .has_arg = 1, .val = 'T' },
30         { .name = "device", .has_arg = 1, .val = 'D' },
31         { 0, 0, 0, 0},
32 };
33
34 static void usage(char *program)
35 {
36         fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>\n", program);
37         exit(1);
38 }
39
40 int
41 main (int argc, char **argv)
42 {
43         struct cc_usb   *cc;
44         char            *tty = NULL;
45         char            *device = NULL;
46         int             c;
47         char            line[8192];
48         FILE            *out;
49         char            *filename;
50         int             serial_number;
51         char            cmd;
52         int             tick, a, b;
53
54         while ((c = getopt_long(argc, argv, "T:D:", options, NULL)) != -1) {
55                 switch (c) {
56                 case 'T':
57                         tty = optarg;
58                         break;
59                 case 'D':
60                         device = optarg;
61                         break;
62                 default:
63                         usage(argv[0]);
64                         break;
65                 }
66         }
67         if (!tty)
68                 tty = cc_usbdevs_find_by_arg(device, "TeleMetrum");
69         if (!tty)
70                 tty = getenv("ALTOS_TTY");
71         if (!tty)
72                 tty="/dev/ttyACM0";
73         cc = cc_usb_open(tty);
74         if (!cc)
75                 exit(1);
76         /* send a 'version' command followed by a 'log' command */
77         cc_usb_printf(cc, "v\nl\n");
78         out = NULL;
79         for (;;) {
80                 cc_usb_getline(cc, line, sizeof (line));
81                 if (!strcmp (line, "end"))
82                         break;
83                 if (sscanf(line, "serial-number %u", &serial_number) == 1) {
84                         filename = cc_make_filename(serial_number, "eeprom");
85                         out = fopen (filename, "w");
86                         if (!out) {
87                                 perror(filename);
88                         }
89                         fprintf (out, "%s\n", line);
90                 } else if (sscanf(line, "%c %x %x %x", &cmd, &tick, &a, &b) == 4) {
91                         if (out) {
92                                 fprintf(out, "%s\n", line);
93                                 if (cmd == 'S' && a == 8) {
94                                         fclose(out);
95                                         out = NULL;
96                                 }
97                         }
98                 }
99         }
100         if (out)
101                 fclose (out);
102         cc_usb_close(cc);
103         exit (0);
104 }