[hamradio-commits] [dump1090] 41/389: Squawk extraction fixed.

Matthew Ernisse mernisse-guest at moszumanska.debian.org
Wed Nov 5 00:19:38 UTC 2014


This is an automated email from the git hooks/post-receive script.

mernisse-guest pushed a commit to branch master
in repository dump1090.

commit c9bb48675ccad7adb123e0f3ffc318431fb7b425
Author: antirez <antirez at gmail.com>
Date:   Sat Jan 19 16:10:30 2013 +0100

    Squawk extraction fixed.
---
 dump1090.c | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/dump1090.c b/dump1090.c
index 3c4ec96..91bd902 100644
--- a/dump1090.c
+++ b/dump1090.c
@@ -705,7 +705,7 @@ int ICAOAddressWasRecentlySeen(uint32_t addr) {
  * If the function successfully recovers a message with a correct checksum
  * it returns 1. Otherwise 0 is returned. */
 int bruteForceAP(unsigned char *msg, int msgbits) {
-    unsigned char aux[MODES_LONG_MSG_BITS/8];
+    unsigned char aux[MODES_LONG_MSG_BYTES];
     int msgtype = msg[0]>>3;
 
     if (msgtype == 0 ||         /* Short air surveillance */
@@ -907,7 +907,37 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
     mm->dr = msg[1] >> 3 & 31;  /* Request extraction of downlink request. */
     mm->um = ((msg[1] & 7)<<3)| /* Request extraction of downlink request. */
               msg[2]>>5;
-    mm->identity = (msg[2]&31 << 8) | msg[3]; /* 13 bits identity. */
+
+    /* In the squawk (identity) field bits are interleaved like that
+     * (message bit 20 to bit 32):
+     *
+     * C1-A1-C2-A2-C4-A4-ZERO-B1-D1-B2-D2-B4-D4
+     *
+     * So every group of three bits A, B, C, D represent an integer
+     * from 0 to 7.
+     *
+     * The actual meaning is just 4 octal numbers, but we convert it
+     * into a base ten number tha happens to represent the four
+     * octal numbers.
+     *
+     * For more info: http://en.wikipedia.org/wiki/Gillham_code */
+    {
+        int a,b,c,d;
+
+        a = ((msg[3] & 0x80) >> 5) |
+            ((msg[2] & 0x02) >> 0) |
+            ((msg[2] & 0x08) >> 3);
+        b = ((msg[3] & 0x02) << 1) |
+            ((msg[3] & 0x08) >> 2) |
+            ((msg[3] & 0x20) >> 5);
+        c = ((msg[2] & 0x01) << 2) |
+            ((msg[2] & 0x04) >> 1) |
+            ((msg[2] & 0x10) >> 4);
+        d = ((msg[3] & 0x01) << 2) |
+            ((msg[3] & 0x04) >> 1) |
+            ((msg[3] & 0x10) >> 4);
+        mm->identity = a*1000 + b*100 + c*10 + d;
+    }
 
     /* Check if we can check the checksum for the Downlink Formats where
      * the checksum is xored with the aircraft ICAO address. We try to
@@ -926,6 +956,7 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
             mm->crcok = 0;
         }
     }
+
     /* If this is DF 11 or DF 17 and the checksum was ok,
      * we can add this address to the list of recently seen
      * addresses. */
@@ -1056,7 +1087,7 @@ void displayModesMessage(struct modesMessage *mm) {
         printf("  Flight Status  : %s\n", fs_str[mm->fs]);
         printf("  DR             : %d\n", mm->dr);
         printf("  UM             : %d\n", mm->um);
-        printf("  Squawk         : %o (octal)\n", mm->identity);
+        printf("  Squawk         : %d\n", mm->identity);
         printf("  ICAO Address   : %02x%02x%02x\n", mm->aa1, mm->aa2, mm->aa3);
 
         if (mm->msgtype == 21) {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/dump1090.git



More information about the pkg-hamradio-commits mailing list