[hamradio-commits] [dump1090] 115/389: Implement 100 ft Altitudes
Matthew Ernisse
mernisse-guest at moszumanska.debian.org
Wed Nov 5 00:19:46 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 8ed0574ac85b611e07d5e0a5d822268e7884adac
Author: Malcolm Robb <Support at ATTAvionics.com>
Date: Sun Apr 28 02:17:57 2013 +0100
Implement 100 ft Altitudes
The DF's for altitude include a Q bit to distinguish either 100ft or
25ft altitude encoding. This version implements the 100ft increments
used by older aircraft. These codes are basically ModeC altitudes
transmitted over ModeS.
---
dump1090.c | 94 ++++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 64 insertions(+), 30 deletions(-)
diff --git a/dump1090.c b/dump1090.c
index 2c6f512..05df24b 100644
--- a/dump1090.c
+++ b/dump1090.c
@@ -56,7 +56,7 @@
// MinorVer changes when additional features are added, but not for bug fixes (range 00-99)
// DayDate & Year changes for all changes, including for bug fixes. It represent the release date of the update
//
-#define MODES_DUMP1090_VERSION "1.03.2604.13"
+#define MODES_DUMP1090_VERSION "1.04.2704.13"
#define MODES_DEFAULT_RATE 2000000
#define MODES_DEFAULT_FREQ 1090000000
@@ -1314,51 +1314,85 @@ int bruteForceAP(unsigned char *msg, struct modesMessage *mm) {
}
return (0);
}
-
-/* Decode the 13 bit AC altitude field (in DF 20 and others).
- * Returns the altitude, and set 'unit' to either MODES_UNIT_METERS
- * or MDOES_UNIT_FEETS. */
+//
+// Decode the 13 bit AC altitude field (in DF 20 and others).
+// Returns the altitude, and set 'unit' to either MODES_UNIT_METERS or MDOES_UNIT_FEETS.
+//
int decodeAC13Field(unsigned char *msg, int *unit) {
- int m_bit = msg[3] & (1<<6);
- int q_bit = msg[3] & (1<<4);
+ int msg2 = msg[2];
+ int msg3 = msg[3];
+ int m_bit = msg3 & 0x40; // set = meters, clear = feet
+ int q_bit = msg3 & 0x10; // set = 25 ft encoding, clear = Gillham Mode C encoding
if (!m_bit) {
*unit = MODES_UNIT_FEET;
if (q_bit) {
- /* N is the 11 bit integer resulting from the removal of bit
- * Q and M */
- int n = ((msg[2]&31)<<6) |
- ((msg[3]&0x80)>>2) |
- ((msg[3]&0x20)>>1) |
- (msg[3]&15);
- /* The final altitude is due to the resulting number multiplied
- * by 25, minus 1000. */
- return n*25-1000;
+ // N is the 11 bit integer resulting from the removal of bit Q and M
+ int n = ((msg2 & 0x1F) << 6) |
+ ((msg3 & 0x80) >> 2) |
+ ((msg3 & 0x20) >> 1) |
+ (msg3 & 0x0F);
+ // The final altitude is resulting number multiplied by 25, minus 1000.
+ return ((n * 25) - 1000);
} else {
- /* TODO: Implement altitude where Q=0 and M=0 */
+ // N is an 11 bit Gillham coded altitude
+ int n = 0;
+ if (msg2 & 0x10) {n |= 0x0010;} // Bit 20 = C1;
+ if (msg2 & 0x08) {n |= 0x1000;} // Bit 21 = A1;
+ if (msg2 & 0x04) {n |= 0x0020;} // Bit 22 = C2;
+ if (msg2 & 0x02) {n |= 0x2000;} // Bit 23 = A2;
+ if (msg2 & 0x01) {n |= 0x0040;} // Bit 24 = C4;
+ if (msg3 & 0x80) {n |= 0x4000;} // Bit 25 = A4;
+ if (msg3 & 0x20) {n |= 0x0100;} // Bit 27 = B1;
+ if (msg3 & 0x08) {n |= 0x0200;} // Bit 29 = B2;
+ if (msg3 & 0x04) {n |= 0x0002;} // Bit 30 = D2;
+ if (msg3 & 0x02) {n |= 0x0400;} // Bit 31 = B4;
+ if (msg3 & 0x01) {n |= 0x0004;} // Bit 32 = D4;
+
+ n = ModeAToModeC(n);
+ if (n < -12) {n = 0;}
+
+ return (100 * n);
}
} else {
*unit = MODES_UNIT_METERS;
- /* TODO: Implement altitude when meter unit is selected. */
+ // TODO: Implement altitude when meter unit is selected
}
return 0;
}
-
-/* Decode the 12 bit AC altitude field (in DF 17 and others).
- * Returns the altitude or 0 if it can't be decoded. */
+//
+// Decode the 12 bit AC altitude field (in DF 17 and others).
+//
int decodeAC12Field(unsigned char *msg, int *unit) {
- int q_bit = msg[5] & 1;
+ int msg5 = msg[5];
+ int msg6 = msg[6];
+ int q_bit = msg5 & 1; // Bit 48 = Q
+ *unit = MODES_UNIT_FEET;
if (q_bit) {
- /* N is the 11 bit integer resulting from the removal of bit
- * Q */
- int n = ((msg[5]>>1)<<4) | ((msg[6]&0xF0) >> 4);
- *unit = MODES_UNIT_FEET;
- /* The final altitude is due to the resulting number multiplied
- * by 25, minus 1000. */
- return n*25-1000;
+ /// N is the 11 bit integer resulting from the removal of bit Q
+ int n = ((msg5 & 0xFE) << 3) | ((msg6 & 0xF0) >> 4);
+ // The final altitude is the resulting number multiplied by 25, minus 1000.
+ return ((n * 25) - 1000);
} else {
- return 0;
+ // N is an 11 bit Gillham coded altitude
+ int n = 0;
+ if (msg5 & 0x80) {n |= 0x0010;} // Bit 41 = C1;
+ if (msg5 & 0x40) {n |= 0x1000;} // Bit 42 = A1;
+ if (msg5 & 0x20) {n |= 0x0020;} // Bit 43 = C2;
+ if (msg5 & 0x10) {n |= 0x2000;} // Bit 44 = A2;
+ if (msg5 & 0x08) {n |= 0x0040;} // Bit 45 = C4;
+ if (msg5 & 0x04) {n |= 0x4000;} // Bit 46 = A4;
+ if (msg5 & 0x02) {n |= 0x0100;} // Bit 47 = B1;
+ if (msg6 & 0x80) {n |= 0x0200;} // Bit 49 = B2;
+ if (msg6 & 0x40) {n |= 0x0002;} // Bit 50 = D2;
+ if (msg6 & 0x20) {n |= 0x0400;} // Bit 51 = B4;
+ if (msg6 & 0x10) {n |= 0x0004;} // Bit 52 = D4;
+
+ n = ModeAToModeC(n);
+ if (n < -12) {n = 0;}
+
+ return (100 * n);
}
}
--
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