From dff686f467f5eb963f1157021e9cbe3d01dcabfc Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 18 Apr 2015 11:14:50 +0100 Subject: [PATCH 1/4] Fix endian issues in timestamp input/output. This affected Beast input/output, and AVR output in --mlat mode. (cherry picked from commit e9378fb1c51d9db5d153c8723e2895bbbea260ee) --- net_io.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/net_io.c b/net_io.c index a979883f5..bbe5f4c0f 100644 --- a/net_io.c +++ b/net_io.c @@ -29,6 +29,10 @@ // #include "dump1090.h" + +/* for PRIx64 */ +#include + // // ============================= Networking ============================= // @@ -220,7 +224,6 @@ void modesSendAllClients(int service, void *msg, int len) { void modesSendBeastOutput(struct modesMessage *mm) { char *p = &Modes.beastOut[Modes.beastOutUsed]; int msgLen = mm->msgbits / 8; - char * pTimeStamp; char ch; int j; int iOutLen = msgLen + 9; // Escape, msgtype, timestamp, sigLevel, msg @@ -235,11 +238,19 @@ void modesSendBeastOutput(struct modesMessage *mm) { else {return;} - pTimeStamp = (char *) &mm->timestampMsg; - for (j = 5; j >= 0; j--) { - *p++ = (ch = pTimeStamp[j]); - if (0x1A == ch) {*p++ = ch; iOutLen++;} - } + /* timestamp, big-endian */ + *p++ = (ch = (mm->timestampMsg >> 40)); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + *p++ = (ch = (mm->timestampMsg >> 32)); + if (0x1A == ch) {*p++ = ch; iOutLen++; } + *p++ = (ch = (mm->timestampMsg >> 24)); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + *p++ = (ch = (mm->timestampMsg >> 16)); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + *p++ = (ch = (mm->timestampMsg >> 8)); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + *p++ = (ch = (mm->timestampMsg)); + if (0x1A == ch) {*p++ = ch; iOutLen++;} *p++ = (ch = mm->signalLevel); if (0x1A == ch) {*p++ = ch; iOutLen++;} @@ -266,15 +277,11 @@ void modesSendRawOutput(struct modesMessage *mm) { char *p = &Modes.rawOut[Modes.rawOutUsed]; int msgLen = mm->msgbits / 8; int j; - unsigned char * pTimeStamp; if (Modes.mlat && mm->timestampMsg) { - *p++ = '@'; - pTimeStamp = (unsigned char *) &mm->timestampMsg; - for (j = 5; j >= 0; j--) { - sprintf(p, "%02X", pTimeStamp[j]); - p += 2; - } + /* timestamp, big-endian */ + sprintf(p, "@%012" PRIx64, + mm->timestampMsg); Modes.rawOutUsed += 12; // additional 12 characters for timestamp } else *p++ = '*'; @@ -486,7 +493,6 @@ int decodeBinMessage(struct client *c, char *p) { int msgLen = 0; int j; char ch; - char * ptr; unsigned char msg[MODES_LONG_MSG_BYTES]; struct modesMessage mm; MODES_NOTUSED(c); @@ -508,9 +514,11 @@ int decodeBinMessage(struct client *c, char *p) { // pass them off as being received by this instance when forwarding them mm.remote = 1; - ptr = (char*) &mm.timestampMsg; - for (j = 0; j < 6; j++) { // Grab the timestamp (big endian format) - ptr[5-j] = ch = *p++; + // Grab the timestamp (big endian format) + mm.timestampMsg = 0; + for (j = 0; j < 6; j++) { + ch = *p++; + mm.timestampMsg = mm.timestampMsg << 8 | (ch & 255); if (0x1A == ch) {p++;} } From 55ff8c429bd162b0003925176fdf860513a01b6d Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 18 Apr 2015 11:18:03 +0100 Subject: [PATCH 2/4] Fix up a bug in AVR mlat output introduced in the previous commit. --- net_io.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net_io.c b/net_io.c index bbe5f4c0f..04c0249eb 100644 --- a/net_io.c +++ b/net_io.c @@ -282,6 +282,7 @@ void modesSendRawOutput(struct modesMessage *mm) { /* timestamp, big-endian */ sprintf(p, "@%012" PRIx64, mm->timestampMsg); + p += 13; Modes.rawOutUsed += 12; // additional 12 characters for timestamp } else *p++ = '*'; From 6d3722dd628c0c03a3ea3b831e49abb44c7c942a Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 18 Apr 2015 11:20:16 +0100 Subject: [PATCH 3/4] Emit capitalized hex in avrmlat output. --- net_io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net_io.c b/net_io.c index 04c0249eb..6cc48a6a3 100644 --- a/net_io.c +++ b/net_io.c @@ -30,7 +30,7 @@ #include "dump1090.h" -/* for PRIx64 */ +/* for PRIX64 */ #include // @@ -280,7 +280,7 @@ void modesSendRawOutput(struct modesMessage *mm) { if (Modes.mlat && mm->timestampMsg) { /* timestamp, big-endian */ - sprintf(p, "@%012" PRIx64, + sprintf(p, "@%012" PRIX64, mm->timestampMsg); p += 13; Modes.rawOutUsed += 12; // additional 12 characters for timestamp From b0b5e9cd5e1906f5249ab7c1b0cbdca8841b80b7 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 19 Apr 2015 00:57:24 +0100 Subject: [PATCH 4/4] Fix --mlat --raw stdout formatting on big-endian systems. (cherry picked from commit 0bd897cad1b5242b93bae414a163890ec91ec53a) --- mode_s.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/mode_s.c b/mode_s.c index cd129a02b..433c14209 100644 --- a/mode_s.c +++ b/mode_s.c @@ -29,6 +29,10 @@ // #include "dump1090.h" + +/* for PRIX64 */ +#include + // // ===================== Mode S detection and decoding =================== // @@ -1144,7 +1148,6 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) { // void displayModesMessage(struct modesMessage *mm) { int j; - unsigned char * pTimeStamp; // Handle only addresses mode first. if (Modes.onlyaddr) { @@ -1154,11 +1157,7 @@ void displayModesMessage(struct modesMessage *mm) { // Show the raw message. if (Modes.mlat && mm->timestampMsg) { - printf("@"); - pTimeStamp = (unsigned char *) &mm->timestampMsg; - for (j=5; j>=0;j--) { - printf("%02X",pTimeStamp[j]); - } + printf("@%012" PRIX64, mm->timestampMsg); } else printf("*");