Treat zero-or-missing signal levels as "no information" and don't include them in RSSI.
This commit is contained in:
parent
f7c9aed8b0
commit
214bc0e587
18
net_io.c
18
net_io.c
|
@ -373,6 +373,7 @@ static void modesSendBeastOutput(struct modesMessage *mm) {
|
||||||
char *p = prepareWrite(&Modes.beast_out, 2 + 2 * (7 + msgLen));
|
char *p = prepareWrite(&Modes.beast_out, 2 + 2 * (7 + msgLen));
|
||||||
char ch;
|
char ch;
|
||||||
int j;
|
int j;
|
||||||
|
int sig;
|
||||||
unsigned char *msg = (Modes.net_verbatim ? mm->verbatim : mm->msg);
|
unsigned char *msg = (Modes.net_verbatim ? mm->verbatim : mm->msg);
|
||||||
|
|
||||||
if (!p)
|
if (!p)
|
||||||
|
@ -402,7 +403,12 @@ static void modesSendBeastOutput(struct modesMessage *mm) {
|
||||||
*p++ = (ch = (mm->timestampMsg));
|
*p++ = (ch = (mm->timestampMsg));
|
||||||
if (0x1A == ch) {*p++ = ch; }
|
if (0x1A == ch) {*p++ = ch; }
|
||||||
|
|
||||||
*p++ = ch = (char) round(sqrt(mm->signalLevel) * 255);
|
sig = round(sqrt(mm->signalLevel) * 255);
|
||||||
|
if (mm->signalLevel > 0 && sig < 1)
|
||||||
|
sig = 1;
|
||||||
|
if (sig > 255)
|
||||||
|
sig = 255;
|
||||||
|
*p++ = ch = (char)sig;
|
||||||
if (0x1A == ch) {*p++ = ch; }
|
if (0x1A == ch) {*p++ = ch; }
|
||||||
|
|
||||||
for (j = 0; j < msgLen; j++) {
|
for (j = 0; j < msgLen; j++) {
|
||||||
|
@ -729,8 +735,8 @@ static int decodeBinMessage(struct client *c, char *p) {
|
||||||
clock_gettime(CLOCK_REALTIME, &mm.sysTimestampMsg);
|
clock_gettime(CLOCK_REALTIME, &mm.sysTimestampMsg);
|
||||||
|
|
||||||
ch = *p++; // Grab the signal level
|
ch = *p++; // Grab the signal level
|
||||||
mm.signalLevel = ((unsigned char)ch / 256.0);
|
mm.signalLevel = ((unsigned char)ch / 255.0);
|
||||||
mm.signalLevel = mm.signalLevel * mm.signalLevel + 1e-5;
|
mm.signalLevel = mm.signalLevel * mm.signalLevel;
|
||||||
if (0x1A == ch) {p++;}
|
if (0x1A == ch) {p++;}
|
||||||
|
|
||||||
for (j = 0; j < msgLen; j++) { // and the data
|
for (j = 0; j < msgLen; j++) { // and the data
|
||||||
|
@ -797,7 +803,7 @@ static int decodeHexMessage(struct client *c, char *hex) {
|
||||||
// Mark messages received over the internet as remote so that we don't try to
|
// Mark messages received over the internet as remote so that we don't try to
|
||||||
// pass them off as being received by this instance when forwarding them
|
// pass them off as being received by this instance when forwarding them
|
||||||
mm.remote = 1;
|
mm.remote = 1;
|
||||||
mm.signalLevel = 1e-5;
|
mm.signalLevel = 0;
|
||||||
|
|
||||||
// Remove spaces on the left and on the right
|
// Remove spaces on the left and on the right
|
||||||
while(l && isspace(hex[l-1])) {
|
while(l && isspace(hex[l-1])) {
|
||||||
|
@ -814,8 +820,8 @@ static int decodeHexMessage(struct client *c, char *hex) {
|
||||||
|
|
||||||
switch(hex[0]) {
|
switch(hex[0]) {
|
||||||
case '<': {
|
case '<': {
|
||||||
mm.signalLevel = ((hexDigitVal(hex[13])<<4) | hexDigitVal(hex[14])) / 256.0;
|
mm.signalLevel = ((hexDigitVal(hex[13])<<4) | hexDigitVal(hex[14])) / 255.0;
|
||||||
mm.signalLevel = mm.signalLevel * mm.signalLevel + 1e-5;
|
mm.signalLevel = mm.signalLevel * mm.signalLevel;
|
||||||
hex += 15; l -= 16; // Skip <, timestamp and siglevel, and ;
|
hex += 15; l -= 16; // Skip <, timestamp and siglevel, and ;
|
||||||
break;}
|
break;}
|
||||||
|
|
||||||
|
|
9
track.c
9
track.c
|
@ -66,8 +66,8 @@ struct aircraft *trackCreateAircraft(struct modesMessage *mm) {
|
||||||
// Now initialise things that should not be 0/NULL to their defaults
|
// Now initialise things that should not be 0/NULL to their defaults
|
||||||
a->addr = mm->addr;
|
a->addr = mm->addr;
|
||||||
for (i = 0; i < 8; ++i)
|
for (i = 0; i < 8; ++i)
|
||||||
a->signalLevel[i] = mm->signalLevel; // First time, initialise everything
|
a->signalLevel[i] = 1e-5;
|
||||||
// to the first signal strength
|
a->signalNext = 0;
|
||||||
|
|
||||||
// mm->msgtype 32 is used to represent Mode A/C. These values can never change, so
|
// mm->msgtype 32 is used to represent Mode A/C. These values can never change, so
|
||||||
// set them once here during initialisation, and don't bother to set them every
|
// set them once here during initialisation, and don't bother to set them every
|
||||||
|
@ -478,7 +478,10 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
||||||
Modes.aircrafts = a;
|
Modes.aircrafts = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
a->signalLevel[a->messages & 7] = mm->signalLevel;// replace the 8th oldest signal strength
|
if (mm->signalLevel > 0) {
|
||||||
|
a->signalLevel[a->signalNext] = mm->signalLevel;
|
||||||
|
a->signalNext = (a->signalNext + 1) & 7;
|
||||||
|
}
|
||||||
a->seen = now;
|
a->seen = now;
|
||||||
a->messages++;
|
a->messages++;
|
||||||
|
|
||||||
|
|
1
track.h
1
track.h
|
@ -64,6 +64,7 @@ struct aircraft {
|
||||||
uint32_t addr; // ICAO address
|
uint32_t addr; // ICAO address
|
||||||
char flight[16]; // Flight number
|
char flight[16]; // Flight number
|
||||||
double signalLevel[8]; // Last 8 Signal Amplitudes
|
double signalLevel[8]; // Last 8 Signal Amplitudes
|
||||||
|
int signalNext; // next index of signalLevel to use
|
||||||
int altitude; // Altitude (Baro)
|
int altitude; // Altitude (Baro)
|
||||||
int altitude_hae; // Altitude (HAE)
|
int altitude_hae; // Altitude (HAE)
|
||||||
int hae_delta; // Difference between HAE and Baro altitudes
|
int hae_delta; // Difference between HAE and Baro altitudes
|
||||||
|
|
Loading…
Reference in a new issue