103 lines
5.5 KiB
Python
103 lines
5.5 KiB
Python
from ..message_base import MessageBase
|
|
from ..constants import Subaddress, DLTargetType
|
|
from ..fields import BitField, EnumField, ScaledField, ASCIIField
|
|
|
|
class MsgA7(MessageBase):
|
|
"""
|
|
Message A7: Data Link Targets (Message #1)
|
|
|
|
ID: A7
|
|
Direction: BC -> RT (Receive)
|
|
Subaddress: 07
|
|
Rate: 6.25 Hz
|
|
Document Ref: 7.1.7
|
|
|
|
Contains:
|
|
- Validity flags for Targets 01-10
|
|
- Data for Targets 01-05
|
|
"""
|
|
SUBADDRESS = Subaddress.RX_DATALINK_1
|
|
IS_TRANSMIT = False
|
|
|
|
# --- Word 01: DL Targets Validity (Ref 7.1.7.1) ---
|
|
validity_tgt_01 = BitField(word_index=0, start_bit=0, width=1)
|
|
validity_tgt_02 = BitField(word_index=0, start_bit=1, width=1)
|
|
validity_tgt_03 = BitField(word_index=0, start_bit=2, width=1)
|
|
validity_tgt_04 = BitField(word_index=0, start_bit=3, width=1)
|
|
validity_tgt_05 = BitField(word_index=0, start_bit=4, width=1)
|
|
validity_tgt_06 = BitField(word_index=0, start_bit=5, width=1)
|
|
validity_tgt_07 = BitField(word_index=0, start_bit=6, width=1)
|
|
validity_tgt_08 = BitField(word_index=0, start_bit=7, width=1)
|
|
validity_tgt_09 = BitField(word_index=0, start_bit=8, width=1)
|
|
validity_tgt_10 = BitField(word_index=0, start_bit=9, width=1)
|
|
# Bits 10-15 Spare
|
|
|
|
# ========================== TARGET 01 ==========================
|
|
# Pos X: 16-bit, 2's comp, LSB=16 ft
|
|
tgt_01_pos_x = ScaledField(word_index=1, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
# Pos Y: 16-bit, 2's comp, LSB=16 ft
|
|
tgt_01_pos_y = ScaledField(word_index=2, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
# Track Angle: Semicircles, 2's comp
|
|
tgt_01_track_angle = ScaledField(word_index=3, start_bit=0, width=16, lsb_value=3.05176e-5, signed=True)
|
|
|
|
# Presentation Data
|
|
tgt_01_type = EnumField(word_index=4, start_bit=0, width=2, enum_cls=DLTargetType)
|
|
tgt_01_velocity = ScaledField(word_index=4, start_bit=2, width=3, lsb_value=143.0) # Knots
|
|
tgt_01_altitude = ScaledField(word_index=4, start_bit=5, width=7, lsb_value=1000.0) # Feet (LSB 1 kft)
|
|
tgt_01_intercept_zone = BitField(word_index=4, start_bit=12, width=1)
|
|
|
|
# Call Sign (4 Chars)
|
|
tgt_01_callsign_ab = ASCIIField(word_index=5)
|
|
tgt_01_callsign_cd = ASCIIField(word_index=6)
|
|
|
|
# ========================== TARGET 02 ==========================
|
|
tgt_02_pos_x = ScaledField(word_index=7, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_02_pos_y = ScaledField(word_index=8, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_02_track_angle = ScaledField(word_index=9, start_bit=0, width=16, lsb_value=3.05176e-5, signed=True)
|
|
|
|
tgt_02_type = EnumField(word_index=10, start_bit=0, width=2, enum_cls=DLTargetType)
|
|
tgt_02_velocity = ScaledField(word_index=10, start_bit=2, width=3, lsb_value=143.0)
|
|
tgt_02_altitude = ScaledField(word_index=10, start_bit=5, width=7, lsb_value=1000.0)
|
|
tgt_02_intercept_zone = BitField(word_index=10, start_bit=12, width=1)
|
|
|
|
tgt_02_callsign_ab = ASCIIField(word_index=11)
|
|
tgt_02_callsign_cd = ASCIIField(word_index=12)
|
|
|
|
# ========================== TARGET 03 ==========================
|
|
tgt_03_pos_x = ScaledField(word_index=13, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_03_pos_y = ScaledField(word_index=14, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_03_track_angle = ScaledField(word_index=15, start_bit=0, width=16, lsb_value=3.05176e-5, signed=True)
|
|
|
|
tgt_03_type = EnumField(word_index=16, start_bit=0, width=2, enum_cls=DLTargetType)
|
|
tgt_03_velocity = ScaledField(word_index=16, start_bit=2, width=3, lsb_value=143.0)
|
|
tgt_03_altitude = ScaledField(word_index=16, start_bit=5, width=7, lsb_value=1000.0)
|
|
tgt_03_intercept_zone = BitField(word_index=16, start_bit=12, width=1)
|
|
|
|
tgt_03_callsign_ab = ASCIIField(word_index=17)
|
|
tgt_03_callsign_cd = ASCIIField(word_index=18)
|
|
|
|
# ========================== TARGET 04 ==========================
|
|
tgt_04_pos_x = ScaledField(word_index=19, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_04_pos_y = ScaledField(word_index=20, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_04_track_angle = ScaledField(word_index=21, start_bit=0, width=16, lsb_value=3.05176e-5, signed=True)
|
|
|
|
tgt_04_type = EnumField(word_index=22, start_bit=0, width=2, enum_cls=DLTargetType)
|
|
tgt_04_velocity = ScaledField(word_index=22, start_bit=2, width=3, lsb_value=143.0)
|
|
tgt_04_altitude = ScaledField(word_index=22, start_bit=5, width=7, lsb_value=1000.0)
|
|
tgt_04_intercept_zone = BitField(word_index=22, start_bit=12, width=1)
|
|
|
|
tgt_04_callsign_ab = ASCIIField(word_index=23)
|
|
tgt_04_callsign_cd = ASCIIField(word_index=24)
|
|
|
|
# ========================== TARGET 05 ==========================
|
|
tgt_05_pos_x = ScaledField(word_index=25, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_05_pos_y = ScaledField(word_index=26, start_bit=0, width=16, lsb_value=16.0, signed=True)
|
|
tgt_05_track_angle = ScaledField(word_index=27, start_bit=0, width=16, lsb_value=3.05176e-5, signed=True)
|
|
|
|
tgt_05_type = EnumField(word_index=28, start_bit=0, width=2, enum_cls=DLTargetType)
|
|
tgt_05_velocity = ScaledField(word_index=28, start_bit=2, width=3, lsb_value=143.0)
|
|
tgt_05_altitude = ScaledField(word_index=28, start_bit=5, width=7, lsb_value=1000.0)
|
|
tgt_05_intercept_zone = BitField(word_index=28, start_bit=12, width=1)
|
|
|
|
tgt_05_callsign_ab = ASCIIField(word_index=29)
|
|
tgt_05_callsign_cd = ASCIIField(word_index=30) |