diff --git a/dump1090.c b/dump1090.c index 3db8ee5..0d47fae 100644 --- a/dump1090.c +++ b/dump1090.c @@ -442,6 +442,7 @@ void showHelp(void) { "--debug Debug mode (verbose), see README for details\n" "--quiet Disable output to stdout. Use for daemon applications\n" "--ppm Set receiver error in parts per million (default 0)\n" +"--no-decode Don't decode the message contents beyond the minimum necessary\n" "--help Show this help\n" "\n" "Debug mode flags: d = Log frames decoded with errors\n" @@ -689,6 +690,8 @@ int main(int argc, char **argv) { } else if (!strcmp(argv[j],"--interactive-rtl1090")) { Modes.interactive = 1; Modes.interactive_rtl1090 = 1; + } else if (!strcmp(argv[j],"--no-decode")) { + Modes.no_decode = 1; } else { fprintf(stderr, "Unknown or not enough arguments for option '%s'.\n\n", @@ -698,6 +701,29 @@ int main(int argc, char **argv) { } } + // Handle --no-decode, which turns off various parts of decoding + // that are not useful for an "edge" dump1090 that purely forwards + // raw data to a central hub elsewhere. + if (Modes.no_decode) { + if (Modes.interactive) { + fprintf(stderr, "--no-decode and --interactive cannot be specified together.\n"); + exit(1); + } + + if (Modes.net_output_sbs_port != MODES_NET_OUTPUT_SBS_PORT) { + fprintf(stderr, "--no-decode and --net-sbs-port cannot be specified together.\n"); + exit(1); + } + + if (Modes.net_http_port != MODES_NET_HTTP_PORT) { + fprintf(stderr, "--no-decode and --net-http-port cannot be specified together.\n"); + exit(1); + } + + Modes.net_output_sbs_port = 0; + Modes.net_http_port = 0; + } + #ifdef _WIN32 // Try to comply with the Copyright license conditions for binary distribution if (!Modes.quiet) {showCopyright();} diff --git a/dump1090.h b/dump1090.h index bcb3e80..dbc3383 100644 --- a/dump1090.h +++ b/dump1090.h @@ -318,6 +318,7 @@ struct { // Internal state int metric; // Use metric units int mlat; // Use Beast ascii format for raw data output, i.e. @...; iso *...; int interactive_rtl1090; // flight table in interactive mode is formatted like RTL1090 + int no_decode; // Disable decoding and aircraft tracking // User details double fUserLat; // Users receiver/antenna lat/lon needed for initial surface location diff --git a/mode_s.c b/mode_s.c index da09f52..51a4dc3 100644 --- a/mode_s.c +++ b/mode_s.c @@ -911,6 +911,9 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) { // of the data contents, so save time and give up now. if ((Modes.check_crc) && (!mm->crcok) && (!mm->correctedbits)) { return;} + // If decoding is disabled, this is as far as we go. + if (Modes.no_decode) return; + // Fields for DF0, DF16 if (mm->msgtype == 0 || mm->msgtype == 16) { if (msg[0] & 0x04) { // VS Bit @@ -1178,6 +1181,12 @@ void displayModesMessage(struct modesMessage *mm) { printf("SNR: %d.%d dB\n", mm->signalLevel/5, 2*(mm->signalLevel%5)); + if (Modes.no_decode) { + // Show DF type and address only; the rest is not decoded. + printf("DF %d; address: %06x\n", mm->msgtype, mm->addr); + return; + } + if (mm->msgtype == 0) { // DF 0 printf("DF 0: Short Air-Air Surveillance.\n"); printf(" VS : %s\n", (mm->msg[0] & 0x04) ? "Ground" : "Airborne"); @@ -1937,8 +1946,10 @@ void detectModeS(uint16_t *m, uint32_t mlen) { void useModesMessage(struct modesMessage *mm) { if ((Modes.check_crc == 0) || (mm->crcok) || (mm->correctedbits)) { // not checking, ok or fixed - // Always track aircraft - interactiveReceiveData(mm); + // If we are decoding, track aircraft + if (!Modes.no_decode) { + interactiveReceiveData(mm); + } // In non-interactive non-quiet mode, display messages on standard output if (!Modes.interactive && !Modes.quiet) {