Add package frequency

Part of #70
This commit is contained in:
Raffson 2023-01-13 20:27:13 +01:00
parent e8151678dd
commit 7bae6cd562
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
5 changed files with 111 additions and 21 deletions

View File

@ -104,6 +104,12 @@ class AircraftGenerator:
ato: The ATO to spawn aircraft for. ato: The ATO to spawn aircraft for.
dynamic_runways: Runway data for carriers and FARPs. dynamic_runways: Runway data for carriers and FARPs.
""" """
for package in reversed(sorted(ato.packages, key=lambda x: x.time_over_target)):
if package.frequency is None:
continue
if package.frequency not in self.radio_registry.allocated_channels:
self.radio_registry.reserve(package.frequency)
for package in reversed(sorted(ato.packages, key=lambda x: x.time_over_target)): for package in reversed(sorted(ato.packages, key=lambda x: x.time_over_target)):
if not package.flights: if not package.flights:
continue continue

View File

@ -133,18 +133,19 @@ class FlightGroupConfigurator:
laser_codes.append(None) laser_codes.append(None)
def setup_radios(self) -> RadioFrequency: def setup_radios(self) -> RadioFrequency:
if self.flight.flight_type in {FlightType.AEWC, FlightType.REFUELING}: if (freq := self.flight.package.frequency) is None:
channel = self.radio_registry.alloc_uhf() freq = self.radio_registry.alloc_uhf()
self.register_air_support(channel) self.flight.package.frequency = freq
else: elif freq not in self.radio_registry.allocated_channels:
if (channel := self.flight.package.frequency) is None: self.radio_registry.reserve(freq)
channel = self.radio_registry.alloc_uhf()
self.flight.package.frequency = channel
if self.flight.client_count:
channel = self.flight.unit_type.alloc_flight_radio(self.radio_registry)
self.group.set_frequency(channel.mhz) if self.flight.flight_type in {FlightType.AEWC, FlightType.REFUELING}:
return channel self.register_air_support(freq)
elif self.flight.client_count:
freq = self.flight.unit_type.alloc_flight_radio(self.radio_registry)
self.group.set_frequency(freq.mhz)
return freq
def register_air_support(self, channel: RadioFrequency) -> None: def register_air_support(self, channel: RadioFrequency) -> None:
callsign = callsign_for_support_unit(self.group) callsign = callsign_for_support_unit(self.group)

View File

@ -20,6 +20,7 @@ from game.ato.flight import Flight
from game.ato.flightplans.planningerror import PlanningError from game.ato.flightplans.planningerror import PlanningError
from game.ato.package import Package from game.ato.package import Package
from game.game import Game from game.game import Game
from game.radio.radios import RadioFrequency
from game.server import EventStream from game.server import EventStream
from game.sim import GameUpdateEvents from game.sim import GameUpdateEvents
from game.theater.missiontarget import MissionTarget from game.theater.missiontarget import MissionTarget
@ -27,6 +28,7 @@ from qt_ui.models import AtoModel, GameModel, PackageModel
from qt_ui.uiconstants import EVENT_ICONS from qt_ui.uiconstants import EVENT_ICONS
from qt_ui.widgets.ato import QFlightList from qt_ui.widgets.ato import QFlightList
from qt_ui.windows.mission.flight.QFlightCreator import QFlightCreator from qt_ui.windows.mission.flight.QFlightCreator import QFlightCreator
from qt_ui.windows.mission.package.QPackageFrequency import QPackageFrequency
class QPackageDialog(QDialog): class QPackageDialog(QDialog):
@ -56,17 +58,30 @@ class QPackageDialog(QDialog):
self.summary_row = QHBoxLayout() self.summary_row = QHBoxLayout()
self.layout.addLayout(self.summary_row) self.layout.addLayout(self.summary_row)
self.package_type_column = QHBoxLayout() self.package_type_column = QVBoxLayout()
self.summary_row.addLayout(self.package_type_column) self.summary_row.addLayout(self.package_type_column)
package_type_row = QHBoxLayout()
self.package_type_label = QLabel("Package Type:") self.package_type_label = QLabel("Package Type:")
self.package_type_text = QLabel(self.package_model.description) self.package_type_text = QLabel(self.package_model.description)
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
self.package_changed.connect( self.package_changed.connect(self.on_package_changed)
lambda: self.package_type_text.setText(self.package_model.description) package_type_row.addWidget(self.package_type_label)
package_type_row.addWidget(self.package_type_text)
self.package_type_column.addLayout(package_type_row)
# TODO: make freq red if used by another package
package_freq_row = QHBoxLayout()
self.package_freq_label = QLabel("Package FREQ:")
freq = (
self.package_model.package.frequency.mhz
if self.package_model.package.frequency is not None
else ""
) )
self.package_type_column.addWidget(self.package_type_label) self.package_freq_text = QLabel(f"{freq}")
self.package_type_column.addWidget(self.package_type_text) package_freq_row.addWidget(self.package_freq_label)
package_freq_row.addWidget(self.package_freq_text)
self.package_type_column.addLayout(package_freq_row)
self.summary_row.addStretch(1) self.summary_row.addStretch(1)
@ -130,6 +145,10 @@ class QPackageDialog(QDialog):
self.delete_flight_button.setEnabled(model.rowCount() > 0) self.delete_flight_button.setEnabled(model.rowCount() > 0)
self.button_layout.addWidget(self.delete_flight_button) self.button_layout.addWidget(self.delete_flight_button)
self.open_radio_button = QPushButton("Set Package FREQ")
self.open_radio_button.clicked.connect(self.on_open_radio)
self.button_layout.addWidget(self.open_radio_button)
self.package_model.tot_changed.connect(self.update_tot) self.package_model.tot_changed.connect(self.update_tot)
self.button_layout.addStretch() self.button_layout.addStretch()
@ -218,6 +237,23 @@ class QPackageDialog(QDialog):
def on_change_name(self) -> None: def on_change_name(self) -> None:
self.package_model.package.custom_name = self.package_name_text.text() self.package_model.package.custom_name = self.package_name_text.text()
def on_open_radio(self) -> None:
self.package_frequency_dialog = QPackageFrequency(
self.game, self.package_model.package, parent=self.window()
)
self.package_frequency_dialog.accepted.connect(self.assign_frequency)
self.package_frequency_dialog.show()
def assign_frequency(self):
hz = round(self.package_frequency_dialog.frequency_input.value() * 10**6)
self.package_model.package.frequency = RadioFrequency(hertz=hz)
self.package_changed.emit()
def on_package_changed(self):
self.package_type_text.setText(self.package_model.description)
if (freq := self.package_model.package.frequency) is not None:
self.package_freq_text.setText(f"{freq.mhz} MHz")
class QNewPackageDialog(QPackageDialog): class QNewPackageDialog(QPackageDialog):
"""Dialog window for creating a new package. """Dialog window for creating a new package.

View File

@ -0,0 +1,47 @@
from typing import Optional, Type
from PySide2.QtCore import Qt
from PySide2.QtWidgets import (
QDialog,
QPushButton,
QVBoxLayout,
QLabel,
QHBoxLayout,
QDoubleSpinBox,
)
from game import Game
from game.ato.package import Package
from game.radio.radios import RadioRegistry
from qt_ui.uiconstants import EVENT_ICONS
class QPackageFrequency(QDialog):
def __init__(self, game: Game, package: Package, parent=None) -> None:
super().__init__(parent=parent)
self.setMinimumWidth(400)
self.game = game
self.package = package
# Make dialog modal to prevent background windows to close unexpectedly.
self.setModal(True)
self.setWindowTitle("Assign frequency")
self.setWindowIcon(EVENT_ICONS["strike"])
layout = QHBoxLayout()
self.frequency_label = QLabel("FREQ (Mhz):")
self.frequency_input = QDoubleSpinBox()
self.frequency_input.setRange(225, 399.975)
self.frequency_input.setSingleStep(0.025)
self.frequency_input.setDecimals(3)
layout.addWidget(self.frequency_label)
layout.addWidget(self.frequency_input)
self.create_button = QPushButton("Save")
self.create_button.clicked.connect(self.accept)
layout.addWidget(self.create_button, alignment=Qt.AlignRight)
self.setLayout(layout)

View File

@ -479,7 +479,7 @@ QComboBox QAbstractItemView {
/*QSpinBox number input with up down arrows*/ /*QSpinBox number input with up down arrows*/
QSpinBox{ QSpinBox, QDoubleSpinBox{
border:1px solid #3B4656; border:1px solid #3B4656;
color: #fff; color: #fff;
padding: 4px 10px; padding: 4px 10px;
@ -487,19 +487,19 @@ QSpinBox{
min-width:40px; min-width:40px;
} }
QSpinBox:hover{ QSpinBox:hover, QDoubleSpinBox:hover{
border-color: #3592C4; border-color: #3592C4;
} }
QSpinBox::up-button , QSpinBox::down-button{ QSpinBox::up-button , QSpinBox::down-button, QDoubleSpinBox::up-button, QDoubleSpinBox::down-button{
border:none; border:none;
} }
QSpinBox::up-button{ QSpinBox::up-button, QDoubleSpinBox::up-button{
image: url(resources/stylesheets/chevron-up.png); image: url(resources/stylesheets/chevron-up.png);
} }
QSpinBox::down-button{ QSpinBox::down-button, QDoubleSpinBox::down-button{
image: url(resources/stylesheets/chevron-down.png); image: url(resources/stylesheets/chevron-down.png);
} }