SXXXXXXX_PyBusMonitor1553/pybusmonitor1553/lib1553/messages/msg_a7.py

104 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
RATE_HZ = 6.25
# --- 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)