X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao-tools%2Fao-send-telem%2Fao-send-telem.c;h=4b8f3c4f2639c182a70d1a2f0b2b266cfe0c1e6b;hp=c6cc51a160227f7e3c9d7620f432fb388043a6db;hb=63a44b9c169d042fb1a3997620477e7f00bb0918;hpb=00abbbb79de67dc95176fe48b23ce3e8614e8d3a diff --git a/ao-tools/ao-send-telem/ao-send-telem.c b/ao-tools/ao-send-telem/ao-send-telem.c index c6cc51a1..4b8f3c4f 100644 --- a/ao-tools/ao-send-telem/ao-send-telem.c +++ b/ao-tools/ao-send-telem/ao-send-telem.c @@ -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 ] [--device ] [--frequency ] [--realtime] file.telem ...\n", program); + fprintf(stderr, "usage: %s [--tty ] [--device ] [--frequency ] [--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; }