Use ATC radio info from pydcs.

This commit is contained in:
Dan Albert
2022-09-08 20:03:43 -07:00
committed by Raffson
parent 9e4516eba1
commit b01895e2dd
165 changed files with 20 additions and 837 deletions

View File

@@ -9,7 +9,7 @@ import logging
from collections.abc import Iterator
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, ClassVar, Dict, Optional, TYPE_CHECKING, Tuple
from typing import ClassVar, Dict, Optional, TYPE_CHECKING, Tuple
import yaml
from dcs.task import Modulation
@@ -30,15 +30,14 @@ class AtcData:
uhf: RadioFrequency
@classmethod
def from_yaml(cls, data: dict[str, Any]) -> Optional[AtcData]:
atc_data = data.get("atc")
if atc_data is None:
def from_pydcs(cls, airport: Airport) -> Optional[AtcData]:
if airport.atc_radio is None:
return None
return AtcData(
RadioFrequency.parse(atc_data["hf"], Modulation.FM),
RadioFrequency.parse(atc_data["vhf_low"], Modulation.FM),
RadioFrequency.parse(atc_data["vhf_high"], Modulation.AM),
RadioFrequency.parse(atc_data["uhf"], Modulation.AM),
RadioFrequency(airport.atc_radio.hf_hz, Modulation.FM),
RadioFrequency(airport.atc_radio.vhf_low_hz, Modulation.FM),
RadioFrequency(airport.atc_radio.vhf_high_hz, Modulation.AM),
RadioFrequency(airport.atc_radio.uhf_hz, Modulation.AM),
)
@@ -73,10 +72,6 @@ class AirfieldData:
#: RSBN channel as a tuple of (callsign, channel).
rsbn: Optional[Tuple[str, int]] = None
#: Radio channels used by the airfield's ATC. Note that not all airfields
#: have ATCs.
atc: Optional[AtcData] = None
#: Dict of runway heading -> ILS tuple of (callsign, frequency).
ils: Dict[str, Tuple[str, RadioFrequency]] = field(default_factory=dict)
@@ -155,7 +150,6 @@ class AirfieldData:
tacan_callsign,
vor,
rsbn,
AtcData.from_yaml(data),
ils,
prmg,
outer_ndb,

View File

@@ -10,7 +10,7 @@ from dcs import Mission, Point
from dcs.coalition import Coalition
from dcs.countries import country_dict
from game.airfields import AirfieldData
from game.airfields import AtcData
from game.dcs.helpers import unit_type_from_name
from game.missiongenerator.aircraft.aircraftgenerator import (
AircraftGenerator,
@@ -21,8 +21,6 @@ from game.radio.tacan import TacanRegistry
from game.theater import Airfield, FrontLine
from game.theater.bullseye import Bullseye
from game.unitmap import UnitMap
from .aircraft.flightdata import FlightData
from .missiondata import MissionData
from .airsupportgenerator import AirSupportGenerator
from .beacons import load_beacons_for_terrain
from .briefinggenerator import BriefingGenerator, MissionInfoGenerator
@@ -36,6 +34,7 @@ from .frontlineconflictdescription import FrontLineConflictDescription
from .kneeboard import KneeboardGenerator
from .lasercoderegistry import LaserCodeRegistry
from .luagenerator import LuaGenerator
from .missiondata import MissionData
from .tgogenerator import TgoGenerator
from .triggergenerator import TriggerGenerator
from .visualsgenerator import VisualsGenerator
@@ -181,12 +180,12 @@ class MissionGenerator:
def initialize_radio_registry(
self, unique_map_frequencies: set[RadioFrequency]
) -> None:
for data in AirfieldData.for_theater(self.game.theater):
if data.atc is not None:
unique_map_frequencies.add(data.atc.hf)
unique_map_frequencies.add(data.atc.vhf_fm)
unique_map_frequencies.add(data.atc.vhf_am)
unique_map_frequencies.add(data.atc.uhf)
for airport in self.game.theater.terrain.airport_list():
if (atc := AtcData.from_pydcs(airport)) is not None:
unique_map_frequencies.add(atc.hf)
unique_map_frequencies.add(atc.vhf_fm)
unique_map_frequencies.add(atc.vhf_am)
unique_map_frequencies.add(atc.uhf)
# No need to reserve ILS or TACAN because those are in the
# beacon list.

View File

@@ -7,7 +7,7 @@ from typing import Iterator, Optional, TYPE_CHECKING
from dcs.terrain.terrain import Airport
from game.airfields import AirfieldData
from game.airfields import AirfieldData, AtcData
from game.radio.radios import RadioFrequency
from game.radio.tacan import TacanChannel
from game.utils import Heading
@@ -48,12 +48,12 @@ class RunwayData:
tacan: Optional[TacanChannel] = None
tacan_callsign: Optional[str] = None
ils: Optional[RadioFrequency] = None
atc_radio = AtcData.from_pydcs(airport)
if atc_radio is not None:
atc = atc_radio.uhf
try:
airfield = AirfieldData.for_airport(theater, airport)
if airfield.atc is not None:
atc = airfield.atc.uhf
else:
atc = None
tacan = airfield.tacan
tacan_callsign = airfield.tacan_callsign
ils = airfield.ils_freq(runway_name)