ao-dumplog: Fix --remote and --channel options to actually work
[fw/altos] / ao-tools / ao-dumplog / ao-dumplog.c
index 4bfb7e51857fb1d5355678af4593c4dc35da55c2..6d4fa5bfb0cd56a13b02f48265adcd7801288602 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <getopt.h>
+#include <string.h>
 #include "cc-usb.h"
 #include "cc.h"
 
 static const struct option options[] = {
        { .name = "tty", .has_arg = 1, .val = 'T' },
        { .name = "device", .has_arg = 1, .val = 'D' },
-       { .name = "remote", .has_arg = 1, .val = 'R' },
+       { .name = "remote", .has_arg = 0, .val = 'R' },
+       { .name = "channel", .has_arg = 1, .val = 'C' },
        { 0, 0, 0, 0},
 };
 
 static void usage(char *program)
 {
-       fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] [-R]\n", program);
+       fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] [--remote] [--channel <radio-channel>]\n", program);
        exit(1);
 }
 
@@ -62,6 +64,7 @@ static const char *state_names[] = {
        "invalid"
 };
 
+
 int
 main (int argc, char **argv)
 {
@@ -72,7 +75,9 @@ main (int argc, char **argv)
        char            line[8192];
        FILE            *out;
        char            *filename;
-       int             serial_number;
+       int             serial_number = 0;
+       int             channel = 0;
+       int             flight = 0;
        char            cmd;
        int             tick, a, b;
        int             block;
@@ -82,8 +87,11 @@ main (int argc, char **argv)
        int             done;
        int             column;
        int             remote = 0;
+       int             any_valid;
+       int             invalid;
+       char            serial_line[8192];
 
-       while ((c = getopt_long(argc, argv, "T:D:R", options, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "T:D:C:R", options, NULL)) != -1) {
                switch (c) {
                case 'T':
                        tty = optarg;
@@ -94,6 +102,9 @@ main (int argc, char **argv)
                case 'R':
                        remote = 1;
                        break;
+               case 'C':
+                       channel = atoi(optarg);
+                       break;
                default:
                        usage(argv[0]);
                        break;
@@ -113,30 +124,23 @@ main (int argc, char **argv)
        if (!cc)
                exit(1);
        if (remote)
-               cc_usb_open_remote(cc);
+               cc_usb_open_remote(cc, channel);
        /* send a 'version' command followed by a 'log' command */
        cc_usb_printf(cc, "v\n");
        out = NULL;
        for (;;) {
                cc_usb_getline(cc, line, sizeof (line));
-               if (sscanf(line, "serial-number %u", &serial_number) == 1) {
-                       filename = cc_make_filename(serial_number, "eeprom");
-                       out = fopen (filename, "w");
-                       if (!out) {
-                               perror(filename);
-                       }
-                       fprintf (out, "%s\n", line);
-               }
+               if (sscanf(line, "serial-number %u", &serial_number) == 1)
+                       strcpy(serial_line, line);
                if (!strncmp(line, "software-version", 16))
                        break;
        }
-       if (!out) {
+       if (!serial_number) {
                fprintf(stderr, "no serial number found\n");
                cc_usb_close(cc);
                exit(1);
        }
        printf ("Serial number: %d\n", serial_number);
-       printf ("File name:     %s\n", filename);
        done = 0;
        column = 0;
        for (block = 0; !done && block < 511; block++) {
@@ -146,6 +150,7 @@ main (int argc, char **argv)
                        column = 0;
                }
                putchar('.'); fflush(stdout); column++;
+               any_valid = 0;
                for (addr = 0; addr < 0x100;) {
                        cc_usb_getline(cc, line, sizeof (line));
                        if (sscanf(line, "00%x %x %x %x %x %x %x %x %x",
@@ -160,11 +165,26 @@ main (int argc, char **argv)
                                if (log_checksum(data) != 0)
                                        fprintf (stderr, "invalid checksum at 0x%x\n",
                                                 block * 256 + received_addr);
+                               else
+                                       any_valid = 1;
 
                                cmd = data[0];
                                tick = data[2] + (data[3] << 8);
                                a = data[4] + (data[5] << 8);
                                b = data[6] + (data[7] << 8);
+                               if (cmd == 'F') {
+                                       flight = b;
+                                       filename = cc_make_filename(serial_number, flight, "eeprom");
+                                       printf ("Flight:       %d\n", flight);
+                                       printf ("File name:     %s\n", filename);
+                                       out = fopen (filename, "w");
+                                       if (!out) {
+                                               perror(filename);
+                                               exit(1);
+                                       }
+                                       fprintf(out, "%s\n", serial_line);
+                               }
+
                                if (cmd == 'S' && a <= 8) {
                                        if (column) putchar('\n');
                                        printf("%s\n", state_names[a]);
@@ -182,6 +202,11 @@ main (int argc, char **argv)
                                addr += 8;
                        }
                }
+               if (!any_valid) {
+                       fclose(out);
+                       out = NULL;
+                       done = 1;
+               }
        }
        if (column)
                putchar('\n');