Calculate DF and size in decodeModeMessage
Allow the decodeModeMessage function to re-calculate msgtype and msgbits. This makes the code a bit more portable by not requiring the calling function to fill in these fields before the call.
This commit is contained in:
parent
c81498a0d0
commit
2e21367f85
27
dump1090.c
27
dump1090.c
|
@ -1394,12 +1394,9 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
|
||||||
memcpy(mm->msg, msg, MODES_LONG_MSG_BYTES);
|
memcpy(mm->msg, msg, MODES_LONG_MSG_BYTES);
|
||||||
msg = mm->msg;
|
msg = mm->msg;
|
||||||
|
|
||||||
// If we havn't already got it, get the message type ASAP as other operations depend on this
|
// Get the message type ASAP as other operations depend on this
|
||||||
if (mm->msgbits == 0) {
|
mm->msgtype = msg[0] >> 3; // Downlink Format
|
||||||
mm->msgtype = msg[0] >> 3; // Downlink Format
|
mm->msgbits = modesMessageLenByType(mm->msgtype);
|
||||||
mm->msgbits = modesMessageLenByType(mm->msgtype);
|
|
||||||
}
|
|
||||||
|
|
||||||
mm->errorbit = -1; // No errors fixed
|
mm->errorbit = -1; // No errors fixed
|
||||||
mm->phase_corrected = 0;
|
mm->phase_corrected = 0;
|
||||||
mm->crc = modesChecksum(msg, mm->msgbits);
|
mm->crc = modesChecksum(msg, mm->msgbits);
|
||||||
|
@ -2008,19 +2005,20 @@ void detectModeS(uint16_t *m, uint32_t mlen) {
|
||||||
// for the preamble samples, so round up and divide by 60.
|
// for the preamble samples, so round up and divide by 60.
|
||||||
sigStrength = (sigStrength + 29) / 60;
|
sigStrength = (sigStrength + 29) / 60;
|
||||||
|
|
||||||
/* If we reached this point, and error is zero, we are very likely
|
// When we reach this point, if error is small, and the signal strength is large enough
|
||||||
* with a Mode S message in our hands, but it may still be broken
|
// we may have a Mode S message on our hands. It may still be broken and the CRC may not
|
||||||
* and CRC may not be correct. This is handled by the next layer. */
|
// be correct, but this can be handled by the next layer.
|
||||||
if ((msglen) && (sigStrength > MODES_MSG_SQUELCH_LEVEL) && (errors <= MODES_MSG_ENCODER_ERRS) )
|
if ( (msglen)
|
||||||
{
|
&& (sigStrength > MODES_MSG_SQUELCH_LEVEL)
|
||||||
|
&& (errors <= MODES_MSG_ENCODER_ERRS) ) {
|
||||||
struct modesMessage mm;
|
struct modesMessage mm;
|
||||||
|
|
||||||
/* Decode the received message and update statistics */
|
// Set initial mm structure details
|
||||||
mm.timestampMsg = Modes.timestampBlk + (j*6);
|
mm.timestampMsg = Modes.timestampBlk + (j*6);
|
||||||
sigStrength = (sigStrength + 0x7F) >> 8;
|
sigStrength = (sigStrength + 0x7F) >> 8;
|
||||||
mm.signalLevel = ((sigStrength < 255) ? sigStrength : 255);
|
mm.signalLevel = ((sigStrength < 255) ? sigStrength : 255);
|
||||||
mm.msgbits = msglen;
|
|
||||||
mm.msgtype = msg[0] >> 3;
|
// Decode the received message
|
||||||
decodeModesMessage(&mm, msg);
|
decodeModesMessage(&mm, msg);
|
||||||
|
|
||||||
/* Update statistics. */
|
/* Update statistics. */
|
||||||
|
@ -3009,7 +3007,6 @@ int decodeHexMessage(struct client *c) {
|
||||||
// Non timemarked internet data has indeterminate delay
|
// Non timemarked internet data has indeterminate delay
|
||||||
mm.timestampMsg = -1;
|
mm.timestampMsg = -1;
|
||||||
mm.signalLevel = -1;
|
mm.signalLevel = -1;
|
||||||
mm.msgbits = 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])) {
|
||||||
|
|
Loading…
Reference in a new issue