altos: Remove unused ao_adc_get from ao_adc_stm.c
[fw/altos] / ao-tools / ao-send-telem / ao-send-telem.c
index c6cc51a160227f7e3c9d7620f432fb388043a6db..4b8f3c4f2639c182a70d1a2f0b2b266cfe0c1e6b 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,12 +30,14 @@ static const struct option options[] = {
        { .name = "device", .has_arg = 1, .val = 'D' },
        { .name = "frequency", .has_arg = 1, .val = 'F' },
        { .name = "realtime", .has_arg = 0, .val = 'R' },
+       { .name = "verbose", .has_arg = 0, .val = 'v' },
+       { .name = "fake", .has_arg = 0, .val = 'f' },
        { 0, 0, 0, 0},
 };
 
 static void usage(char *program)
 {
-       fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] [--frequency <kHz>] [--realtime] file.telem ...\n", program);
+       fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] [--frequency <kHz>] [--realtime] [--verbose] [--fake] file.telem ...\n", program);
        exit(1);
 }
 
@@ -85,6 +88,12 @@ packet_state(union ao_telemetry_all *telem)
        case AO_TELEMETRY_MEGA_DATA:
                cur_state = telem->mega_data.state;
                break;
+       case AO_TELEMETRY_METRUM_SENSOR:
+               cur_state = telem->metrum_sensor.state;
+               break;
+       case AO_TELEMETRY_MINI:
+               cur_state = telem->mini.state;
+               break;
        }
        return cur_state;
 }
@@ -105,7 +114,6 @@ static const char *state_names[] = {
 static void
 send_telem(struct cc_usb *cc, union ao_telemetry_all *telem)
 {
-       int     rssi = (int8_t) telem->generic.rssi / 2 - 74;
        int     i;
        uint8_t *b;
 
@@ -120,7 +128,7 @@ send_telem(struct cc_usb *cc, union ao_telemetry_all *telem)
        for (i = 0; i < 0x20; i++)
                cc_usb_printf(cc, "%02x", b[i]);
        cc_usb_sync(cc);
-}      
+}
 
 static void
 do_delay(uint16_t now, uint16_t then)
@@ -161,15 +169,15 @@ main (int argc, char **argv)
        char            line[80];
        int             c, i, ret = 0;
        int             freq = 434550;
-       char            *s;
        FILE            *file;
-       int             serial;
        uint16_t        last_tick;
        int             started;
        int             realtime = 0;
-      
+       int             verbose = 0;
+       int             fake = 0;
+       int             rate = 0;
 
-       while ((c = getopt_long(argc, argv, "RT:D:F:", options, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "vRfT:D:F:r:", options, NULL)) != -1) {
                switch (c) {
                case 'T':
                        tty = optarg;
@@ -183,6 +191,30 @@ main (int argc, char **argv)
                case 'R':
                        realtime = 1;
                        break;
+               case 'v':
+                       verbose++;
+                       break;
+               case 'f':
+                       fake++;
+                       break;
+               case 'r':
+                       rate = atoi(optarg);
+                       switch (rate) {
+                       case 38400:
+                               rate = 0;
+                               break;
+                       case 9600:
+                               rate = 1;
+                               break;
+                       case 2400:
+                               rate = 2;
+                               break;
+                       default:
+                               fprintf(stderr, "Rate %d isn't 38400, 9600 or 2400\n", rate);
+                               usage(argv[0]);
+                               break;
+                       }
+                       break;
                default:
                        usage(argv[0]);
                        break;
@@ -199,41 +231,65 @@ main (int argc, char **argv)
                exit (1);
 
        cc_usb_printf(cc, "m 0\n");
-       cc_usb_printf(cc, "F %d\n", freq);
-       for (i = optind; i < argc; i++) {
-               file = fopen(argv[i], "r");
-               if (!file) {
-                       perror(argv[i]);
-                       ret++;
-                       continue;
+       cc_usb_printf(cc, "c F %d\n", freq);
+       cc_usb_printf(cc, "c T %d\n", rate);
+
+       if (fake) {
+               union ao_telemetry_all  telem;
+               int                     i;
+
+               memset(&telem, '\0', sizeof (telem));
+               telem.generic.serial = 1;
+               telem.generic.type = 0;
+               for (i = 0; i < sizeof (telem.generic.payload); i++)
+                       telem.generic.payload[i] = i & 7;
+               for (;;) {
+                       telem.generic.tick += 50;
+                       send_telem(cc, &telem);
+                       do_delay(50, 0);
                }
-               started = 0;
-               last_tick = 0;
-               while (fgets(line, sizeof (line), file)) {
-                       union ao_telemetry_all telem;
-
-                       if (cc_telemetry_parse(line, &telem)) {
-                               /*
-                                * Skip packets with CRC errors.
-                                */
-                               if ((telem.generic.status & (1 << 7)) == 0)
-                                       continue;
-
-                               if (started) {
-                                       do_delay(telem.generic.tick, last_tick);
-                                       last_tick = telem.generic.tick;
-                                       send_telem(cc, &telem);
-                               } else {
-                                       add_telem(&telem);
-                                       if (packet_state(&telem) > ao_flight_pad) {
-                                               started = 1;
-                                               last_tick = send_queued(cc, realtime);
+       } else {
+               for (i = optind; i < argc; i++) {
+                       file = fopen(argv[i], "r");
+                       if (!file) {
+                               perror(argv[i]);
+                               ret++;
+                               continue;
+                       }
+                       started = 0;
+                       last_tick = 0;
+                       while (fgets(line, sizeof (line), file)) {
+                               union ao_telemetry_all telem;
+
+                               if (cc_telemetry_parse(line, &telem)) {
+                                       /*
+                                        * Skip packets with CRC errors.
+                                        */
+                                       if ((telem.generic.status & (1 << 7)) == 0)
+                                               continue;
+
+                                       if (verbose)
+                                               printf ("type %4d\n", telem.generic.type);
+
+                                       if (started || realtime) {
+                                               do_delay(telem.generic.tick, last_tick);
+                                               last_tick = telem.generic.tick;
+                                               send_telem(cc, &telem);
+                                       } else {
+                                               enum ao_flight_state state = packet_state(&telem);
+                                               printf ("\tstate %4d\n", state);
+                                               add_telem(&telem);
+                                               if (ao_flight_pad < state && state < ao_flight_landed) {
+                                                       printf ("started\n");
+                                                       started = 1;
+                                                       last_tick = send_queued(cc, realtime);
+                                               }
                                        }
                                }
                        }
-               }
-               fclose (file);
+                       fclose (file);
 
+               }
        }
        return ret;
 }