66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
import math
|
|
from target_simulator.core.command_builder import build_tgtinit
|
|
from target_simulator.core.models import Waypoint, Target, NM_TO_FT
|
|
|
|
METERS_PER_NM = 1852.0
|
|
|
|
|
|
def test_build_tgtinit_contains_parameters():
|
|
wp = Waypoint(
|
|
maneuver_type=Waypoint.maneuver_type, # placeholder, not used by builder
|
|
target_range_nm=30.0,
|
|
target_azimuth_deg=10.0,
|
|
target_altitude_ft=10000.0,
|
|
target_velocity_fps=506.34,
|
|
target_heading_deg=25.0,
|
|
)
|
|
t = Target(target_id=0, trajectory=[wp])
|
|
# Make sure flags are set as expected
|
|
t.active = True
|
|
t.traceable = True
|
|
t.restart = True
|
|
# Set current kinematics to match waypoint (build_tgtinit reads current_* fields)
|
|
t.current_range_nm = 30.0
|
|
t.current_azimuth_deg = 10.0
|
|
t.current_heading_deg = 25.0
|
|
t.current_altitude_ft = 10000.0
|
|
t.current_velocity_fps = 506.34
|
|
|
|
cmd = build_tgtinit(t)
|
|
# command should start with tgtinit and contain the numeric fields in order
|
|
parts = cmd.split()
|
|
assert parts[0] == "tgtinit"
|
|
assert parts[1] == "0"
|
|
assert parts[2] == "30.00"
|
|
assert parts[3] == "10.00"
|
|
# velocity is formatted as fps
|
|
assert parts[4] == "506.34"
|
|
assert parts[5] == "25.00"
|
|
assert parts[6] == "10000.00"
|
|
# qualifiers should contain /s /t /r (order may vary for /r appended)
|
|
qualifiers = parts[7:]
|
|
assert "/s" in qualifiers
|
|
assert "/t" in qualifiers
|
|
assert "/r" in qualifiers
|
|
|
|
|
|
def test_command_to_ris_coordinate_roundtrip():
|
|
"""Simula il percorso: command params -> RIS coords (meters) -> GUI azimuth -> reconstruct coords.
|
|
Verifica che la ricostruzione torni alle stesse coordinate (round-trip) entro tolleranza."""
|
|
range_nm = 40.0
|
|
az_deg = 20.0
|
|
alt_ft = 10000.0
|
|
|
|
# Simulate server: produce RIS X,Y in meters using conventional conversion
|
|
rad = math.radians(az_deg)
|
|
x_m = range_nm * METERS_PER_NM * math.sin(rad)
|
|
y_m = range_nm * METERS_PER_NM * math.cos(rad)
|
|
|
|
# GUI receives x_m,y_m and computes az_gui = degrees(atan2(y,x)).
|
|
# Given server uses x = R*sin(az) and y = R*cos(az),
|
|
# az_gui should equal (90° - az) modulo 360.
|
|
az_gui = math.degrees(math.atan2(y_m, x_m)) % 360
|
|
expected = (90.0 - az_deg) % 360
|
|
assert math.isclose(az_gui, expected, rel_tol=1e-9, abs_tol=1e-6)
|
|
|