From 416e2c6078febe29ee79d9870de4ff221ecfe7e0 Mon Sep 17 00:00:00 2001 From: nzkarit Date: Sun, 18 Aug 2019 17:18:22 +1200 Subject: [PATCH] first part of integrating velocity from https://github.com/jaywilhelm/ADSB-Out_Python --- ADSB_Encoder.py | 18 +++++++++--- ModeS.py | 75 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/ADSB_Encoder.py b/ADSB_Encoder.py index ce7b053..da61008 100755 --- a/ADSB_Encoder.py +++ b/ADSB_Encoder.py @@ -72,13 +72,23 @@ def singlePlane(arguments): samples = bytearray() for i in range(0, arguments.repeats): modes = ModeS() - (df17_even, df17_odd) = modes.df17_pos_rep_encode(arguments.capability, arguments.icao, arguments.typecode, arguments.surveillancestatus, arguments.nicsupplementb, arguments.altitude, arguments.time, arguments.latitude, arguments.longitude, arguments.surface) - + (df17_pos_even, df17_pos_odd) = modes.df17_pos_rep_encode(arguments.capability, arguments.icao, arguments.typecode, arguments.surveillancestatus, arguments.nicsupplementb, arguments.altitude, arguments.time, arguments.latitude, arguments.longitude, arguments.surface) + + df17_velocity = modes.vel_heading_encode(arguments.capability, arguments.icao) + ppm = PPM() - df17_array = ppm.frame_1090es_ppm_modulate(df17_even, df17_odd) + df17_array_position = ppm.frame_1090es_ppm_modulate(df17_pos_even, df17_pos_odd) + df17_array_velocity = ppm.frame_1090es_ppm_modulate(df17_velocity, df17_velocity) hackrf = HackRF() - samples_array = hackrf.hackrf_raw_IQ_format(df17_array) + #Position + samples_array = hackrf.hackrf_raw_IQ_format(df17_array_position) + samples = samples+samples_array + gap_array = ppm.addGap(arguments.intermessagegap) + samples_array = hackrf.hackrf_raw_IQ_format(gap_array) + samples = samples+samples_array + #Velocity + samples_array = hackrf.hackrf_raw_IQ_format(df17_array_velocity) samples = samples+samples_array gap_array = ppm.addGap(arguments.intermessagegap) samples_array = hackrf.hackrf_raw_IQ_format(gap_array) diff --git a/ModeS.py b/ModeS.py index da5250d..b087896 100644 --- a/ModeS.py +++ b/ModeS.py @@ -35,9 +35,9 @@ class ModeS: df17_even_bytes.append((tc<<3) | (ss<<1) | nicsb) df17_even_bytes.append((enc_alt>>4) & 0xff) df17_even_bytes.append((enc_alt & 0xf) << 4 | (time<<3) | (ff<<2) | (evenenclat>>15)) - df17_even_bytes.append((evenenclat>>7) & 0xff) - df17_even_bytes.append(((evenenclat & 0x7f) << 1) | (evenenclon>>16)) - df17_even_bytes.append((evenenclon>>8) & 0xff) + df17_even_bytes.append((evenenclat>>7) & 0xff) + df17_even_bytes.append(((evenenclat & 0x7f) << 1) | (evenenclon>>16)) + df17_even_bytes.append((evenenclon>>8) & 0xff) df17_even_bytes.append((evenenclon ) & 0xff) df17_str = "{0:02x}{1:02x}{2:02x}{3:02x}{4:02x}{5:02x}{6:02x}{7:02x}{8:02x}{9:02x}{10:02x}".format(*df17_even_bytes[0:11]) @@ -58,9 +58,9 @@ class ModeS: df17_odd_bytes.append((tc<<3) | (ss<<1) | nicsb) df17_odd_bytes.append((enc_alt>>4) & 0xff) df17_odd_bytes.append((enc_alt & 0xf) << 4 | (time<<3) | (ff<<2) | (oddenclat>>15)) - df17_odd_bytes.append((oddenclat>>7) & 0xff) - df17_odd_bytes.append(((oddenclat & 0x7f) << 1) | (oddenclon>>16)) - df17_odd_bytes.append((oddenclon>>8) & 0xff) + df17_odd_bytes.append((oddenclat>>7) & 0xff) + df17_odd_bytes.append(((oddenclat & 0x7f) << 1) | (oddenclon>>16)) + df17_odd_bytes.append((oddenclon>>8) & 0xff) df17_odd_bytes.append((oddenclon ) & 0xff) df17_str = "{0:02x}{1:02x}{2:02x}{3:02x}{4:02x}{5:02x}{6:02x}{7:02x}{8:02x}{9:02x}{10:02x}".format(*df17_odd_bytes[0:11]) @@ -68,10 +68,71 @@ class ModeS: df17_odd_bytes.append((df17_crc>>16) & 0xff) df17_odd_bytes.append((df17_crc>> 8) & 0xff) - df17_odd_bytes.append((df17_crc ) & 0xff) + df17_odd_bytes.append((df17_crc ) & 0xff) return (df17_even_bytes, df17_odd_bytes) + #From https://github.com/jaywilhelm/ADSB-Out_Python on 2019-08-18 + def vel_heading_encode(self, ca, icao): + #(ca,icao,ew_dir,ew_vel,ns_dir,ns_vel) + df = 17 + #ca = 5 + + + #1-5 downlink format + #6-8 CA capability + #9-32 ICAO + #33-88 DATA -> 33-87 w/ 33-37 TC + #89-112 Parity + + tc = 19 #33-37 1-5 type code + st = 0x01 #38-40 6-8 subtype, 3 air, 1 ground speed + ic = 0 # #41 9 intent change flag + resv_a = 0#1 #42 10 + NAC = 2#0 #43-45 11-13 velocity uncertainty + S_EW = 1#1 #46 14 + V_EW = 97#9 #47-56 15-24 + S_NS = 0#1 #57 25 north-south sign + V_NS = 378#0xA0 #58-67 26-35 160 north-south vel + VrSrc = 1#0 #68 36 vertical rate source + S_Vr = 1#1 #69 37 vertical rate sign + Vr = 40#0x0E #70-78 38-46 14 vertical rate + RESV_B = 0 #79-80 47-48 + S_Dif = 0 #81 49 diff from baro alt, sign + Dif = 0x1c#0x17 #82-88 50-66 23 diff from baro alt + + #ca = 5 + #icao = 0xabcdef#0xa06703 #0x485020 # + + dfvel = [] + dfvel.append((df << 3) | ca) + dfvel.append((icao >> 16) & 0xff) + dfvel.append((icao >> 8) & 0xff) + dfvel.append((icao) & 0xff) + # data + dfvel.append((tc << 3) | st) + dfvel.append((ic << 7) | (resv_a << 6) | (NAC << 3) | (S_EW << 2) | ((V_EW >> 8) & 0x03)) + dfvel.append(0xFF & V_EW) + dfvel.append((S_NS << 7) | ((V_NS >> 3))) #& 0x7F)) + dfvel.append(((V_NS << 5) & 0xE0) | (VrSrc << 4) | (S_Vr << 3) | ((Vr >> 6) & 0x03)) + dfvel.append(((Vr << 2) & 0xFC) | (RESV_B)) + dfvel.append((S_Dif << 7) | (Dif)) + + dfvel_str = "{0:02x} {1:02x} {2:02x} {3:02x} {4:02x} {5:02x} {6:02x} {7:02x} {8:02x} {9:02x} {10:02x}".format( + *dfvel[0:11]) + #print(dfvel_str) + dfvel_str2 = "{0:02x}{1:02x}{2:02x}{3:02x}{4:02x}{5:02x}{6:02x}{7:02x}{8:02x}{9:02x}{10:02x}".format( + *dfvel[0:11]) + crc_str = "%X" % self.bin2int(self.modes_crc(dfvel_str2+"000000", encode=True)) + #print(crc_str) + #print(dfvel_str), " %X" % +"000000", encode=True)) + #, "%X" % get_parity(hex2bin(dfvel_str+"000000"), extended=True)) + dfvel_crc = self.bin2int(self.modes_crc(dfvel_str2 + "000000", encode=True)) + dfvel.append((dfvel_crc >> 16) & 0xff) + dfvel.append((dfvel_crc >> 8) & 0xff) + dfvel.append((dfvel_crc) & 0xff) + return dfvel + ############################################################### # Copyright (C) 2015 Junzi Sun (TU Delft)