mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-18 03:15:34 +08:00
refs #250, own cockpit component
This commit is contained in:
@@ -18,11 +18,10 @@ using namespace BlackMisc::Settings;
|
|||||||
using namespace BlackMisc::Math;
|
using namespace BlackMisc::Math;
|
||||||
using namespace BlackMisc::Audio;
|
using namespace BlackMisc::Audio;
|
||||||
|
|
||||||
|
|
||||||
namespace BlackGui
|
namespace BlackGui
|
||||||
{
|
{
|
||||||
CCockpitV1Component::CCockpitV1Component(QWidget *parent) :
|
CCockpitV1Component::CCockpitV1Component(QWidget *parent) :
|
||||||
QWidget(parent), CRuntimeBasedComponent(nullptr, false), ui(new Ui::CCockpitV1Component), pb_ExternalCockpitIdent(nullptr), pb_ExternalCockpitSelected(nullptr)
|
QWidget(parent), CRuntimeBasedComponent(nullptr, false), ui(new Ui::CCockpitV1Component), m_externalCockpitIdentButton(nullptr), m_voiceRoomMembersTimer(nullptr)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
@@ -36,26 +35,43 @@ namespace BlackGui
|
|||||||
this->ui->cb_CockpitSelcal1->addItems(BlackMisc::Aviation::CSelcal::codePairs());
|
this->ui->cb_CockpitSelcal1->addItems(BlackMisc::Aviation::CSelcal::codePairs());
|
||||||
this->ui->cb_CockpitSelcal2->addItems(BlackMisc::Aviation::CSelcal::codePairs());
|
this->ui->cb_CockpitSelcal2->addItems(BlackMisc::Aviation::CSelcal::codePairs());
|
||||||
|
|
||||||
|
// cockpit GUI events
|
||||||
// cockpit
|
|
||||||
bool connected = this->connect(this->ui->cbp_CockpitTransponderMode, SIGNAL(currentIndexChanged(QString)), this, SLOT(cockpitValuesChanged()));
|
|
||||||
Q_ASSERT(connected);
|
|
||||||
this->connect(this->ui->ds_CockpitCom1Active, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->ds_CockpitCom1Active, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
this->connect(this->ui->ds_CockpitCom2Active, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->ds_CockpitCom2Active, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
this->connect(this->ui->ds_CockpitCom1Standby, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->ds_CockpitCom1Standby, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
this->connect(this->ui->ds_CockpitCom2Standby, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->ds_CockpitCom2Standby, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
this->connect(this->ui->ds_CockpitTransponder, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->ds_CockpitTransponder, &QDoubleSpinBox::editingFinished, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
|
|
||||||
this->connect(this->ui->cb_CockpitVoiceRoom1Override, &QCheckBox::clicked, this, &CCockpitV1Component::setAudioVoiceRooms);
|
this->connect(this->ui->cb_CockpitVoiceRoom1Override, &QCheckBox::clicked, this, &CCockpitV1Component::setAudioVoiceRoomUrls);
|
||||||
this->connect(this->ui->cb_CockpitVoiceRoom2Override, &QCheckBox::clicked, this, &CCockpitV1Component::setAudioVoiceRooms);
|
this->connect(this->ui->cb_CockpitVoiceRoom2Override, &QCheckBox::clicked, this, &CCockpitV1Component::setAudioVoiceRoomUrls);
|
||||||
this->connect(this->ui->le_CockpitVoiceRoomCom1, &QLineEdit::returnPressed, this, &CCockpitV1Component::setAudioVoiceRooms);
|
this->connect(this->ui->le_CockpitVoiceRoomCom1, &QLineEdit::returnPressed, this, &CCockpitV1Component::setAudioVoiceRoomUrls);
|
||||||
this->connect(this->ui->le_CockpitVoiceRoomCom2, &QLineEdit::returnPressed, this, &CCockpitV1Component::setAudioVoiceRooms);
|
this->connect(this->ui->le_CockpitVoiceRoomCom2, &QLineEdit::returnPressed, this, &CCockpitV1Component::setAudioVoiceRoomUrls);
|
||||||
this->connect(this->ui->pb_CockpitToggleCom1, &QPushButton::clicked, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->pb_CockpitToggleCom1, &QPushButton::clicked, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
this->connect(this->ui->pb_CockpitToggleCom2, &QPushButton::clicked, this, &CCockpitV1Component::cockpitValuesChanged);
|
this->connect(this->ui->pb_CockpitToggleCom2, &QPushButton::clicked, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
this->connect(this->ui->pb_CockpitSelcalTest, &QPushButton::clicked, this, &CCockpitV1Component::testSelcal);
|
this->connect(this->ui->pb_CockpitSelcalTest, &QPushButton::clicked, this, &CCockpitV1Component::testSelcal);
|
||||||
this->connect(this->ui->cbp_CockpitTransponderMode, &CTransponderModeSelector::identEnded, this, &CCockpitV1Component::resetTransponderMode);
|
|
||||||
|
|
||||||
Q_UNUSED(connected);
|
this->connect(this->ui->cbp_CockpitTransponderMode, &CTransponderModeSelector::valueChanged, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
|
|
||||||
|
this->connect(this->ui->di_CockpitCom1Volume, &QDial::valueChanged, this, &CCockpitV1Component::setCom1Volume);
|
||||||
|
this->connect(this->ui->di_CockpitCom2Volume, &QDial::valueChanged, this, &CCockpitV1Component::setCom2Volume);
|
||||||
|
|
||||||
|
// timer
|
||||||
|
this->m_voiceRoomMembersTimer = new QTimer(this);
|
||||||
|
this->connect(this->m_voiceRoomMembersTimer, &QTimer::timeout, this, &CCockpitV1Component::updateVoiceRoomMembers);
|
||||||
|
this->m_voiceRoomMembersTimer->start(10 * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCockpitV1Component::runtimeHasBeenSet()
|
||||||
|
{
|
||||||
|
// hook up with changes from own aircraft context
|
||||||
|
Q_ASSERT(this->getIContextOwnAircraft());
|
||||||
|
this->connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftCockpit, this, &CCockpitV1Component::updateCockpitFromContext);
|
||||||
|
|
||||||
|
// Audio is optional
|
||||||
|
if (this->getIContextAudio())
|
||||||
|
{
|
||||||
|
this->connect(this->getIContextAudio(), &IContextAudio::changedVoiceRooms, this, &CCockpitV1Component::updateAudioVoiceRoomsFromObject);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CCockpitV1Component::~CCockpitV1Component()
|
CCockpitV1Component::~CCockpitV1Component()
|
||||||
@@ -63,15 +79,53 @@ namespace BlackGui
|
|||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCockpitV1Component::setExternalButtons(QPushButton *cockpitIdent, QPushButton *cockpitSelected)
|
void CCockpitV1Component::setExternalIdentButton(QPushButton *cockpitIdent)
|
||||||
{
|
{
|
||||||
if (this->pb_ExternalCockpitIdent) disconnect(this->pb_ExternalCockpitIdent);
|
if (this->m_externalCockpitIdentButton) disconnect(this->m_externalCockpitIdentButton);
|
||||||
|
this->m_externalCockpitIdentButton = cockpitIdent;
|
||||||
|
if (this->m_externalCockpitIdentButton) this->connect(this->m_externalCockpitIdentButton, &QPushButton::clicked, this, &CCockpitV1Component::cockpitValuesChanged);
|
||||||
|
}
|
||||||
|
|
||||||
this->pb_ExternalCockpitIdent = cockpitIdent;
|
void CCockpitV1Component::setCom1Volume(int volume)
|
||||||
this->pb_ExternalCockpitSelected = cockpitSelected;
|
{
|
||||||
|
if (volume > 100) volume = 100;
|
||||||
|
if (volume < 0) volume = 0;
|
||||||
|
if (QObject::sender() != ui->di_CockpitCom1Volume)
|
||||||
|
this->ui->di_CockpitCom1Volume->setValue(volume);
|
||||||
|
this->getIContextOwnAircraft()->setAudioOutputVolumes(volume, this->ui->di_CockpitCom2Volume->value());
|
||||||
|
emit this->audioVolumeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
if (this->pb_ExternalCockpitIdent)
|
void CCockpitV1Component::setCom2Volume(int volume)
|
||||||
this->connect(this->pb_ExternalCockpitIdent, &QPushButton::clicked, this, &CCockpitV1Component::cockpitValuesChanged);
|
{
|
||||||
|
if (volume > 100) volume = 100;
|
||||||
|
if (volume < 0) volume = 0;
|
||||||
|
if (QObject::sender() != ui->di_CockpitCom2Volume)
|
||||||
|
this->ui->di_CockpitCom2Volume->setValue(volume);
|
||||||
|
this->getIContextOwnAircraft()->setAudioOutputVolumes(this->ui->di_CockpitCom1Volume->value(), volume);
|
||||||
|
emit this->audioVolumeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
int CCockpitV1Component::getCom1Volume() const
|
||||||
|
{
|
||||||
|
return this->ui->di_CockpitCom1Volume->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
int CCockpitV1Component::getCom2Volume() const
|
||||||
|
{
|
||||||
|
return this->ui->di_CockpitCom2Volume->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCockpitV1Component::setCockpitVoiceStatusPixmap(const QPixmap &pixmap)
|
||||||
|
{
|
||||||
|
this->ui->lbl_CockpitVoiceStatus->setPixmap(pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCockpitV1Component::isCockpitVolumeWidget(const QObject *sender) const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
sender == this->ui->di_CockpitCom1Volume ||
|
||||||
|
sender == this->ui->di_CockpitCom2Volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString &CCockpitV1Component::cockpitOriginator()
|
const QString &CCockpitV1Component::cockpitOriginator()
|
||||||
@@ -88,15 +142,11 @@ namespace BlackGui
|
|||||||
|
|
||||||
// non local
|
// non local
|
||||||
if (this->canPingApplicationContext()) return this->getIContextOwnAircraft()->getOwnAircraft();
|
if (this->canPingApplicationContext()) return this->getIContextOwnAircraft()->getOwnAircraft();
|
||||||
return this->m_ownAircraft;
|
return CAircraft(); // anything better here, or status?
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Cockpit values
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::cockpitValuesChanged()
|
void CCockpitV1Component::cockpitValuesChanged()
|
||||||
{
|
{
|
||||||
// frequency switch?
|
|
||||||
QObject *sender = QObject::sender();
|
QObject *sender = QObject::sender();
|
||||||
if (sender == this->ui->pb_CockpitToggleCom1)
|
if (sender == this->ui->pb_CockpitToggleCom1)
|
||||||
{
|
{
|
||||||
@@ -112,30 +162,114 @@ namespace BlackGui
|
|||||||
this->ui->ds_CockpitCom2Active->setValue(this->ui->ds_CockpitCom2Standby->value());
|
this->ui->ds_CockpitCom2Active->setValue(this->ui->ds_CockpitCom2Standby->value());
|
||||||
this->ui->ds_CockpitCom2Standby->setValue(f);
|
this->ui->ds_CockpitCom2Standby->setValue(f);
|
||||||
}
|
}
|
||||||
else if (this->pb_ExternalCockpitIdent && sender == this->pb_ExternalCockpitSelected)
|
else if (sender == this->ui->cbp_CockpitTransponderMode)
|
||||||
{
|
{
|
||||||
// trigger the real button
|
// toggle the external button
|
||||||
|
if (this->ui->cbp_CockpitTransponderMode->isIdentSelected())
|
||||||
|
{
|
||||||
|
if (this->m_externalCockpitIdentButton) this->m_externalCockpitIdentButton->setStyleSheet("background: red");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (this->m_externalCockpitIdentButton) this->m_externalCockpitIdentButton->setStyleSheet("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (sender == this->m_externalCockpitIdentButton)
|
||||||
|
{
|
||||||
|
// toggle the combo box
|
||||||
if (this->ui->cbp_CockpitTransponderMode->isIdentSelected())
|
if (this->ui->cbp_CockpitTransponderMode->isIdentSelected())
|
||||||
{
|
{
|
||||||
this->pb_ExternalCockpitIdent->setStyleSheet("");
|
|
||||||
this->ui->cbp_CockpitTransponderMode->resetTransponderMode();
|
this->ui->cbp_CockpitTransponderMode->resetTransponderMode();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->pb_ExternalCockpitIdent->setStyleSheet("background: red");
|
|
||||||
this->ui->cbp_CockpitTransponderMode->setSelectedTransponderModeStateIdent(); // trigger real button and whole process
|
this->ui->cbp_CockpitTransponderMode->setSelectedTransponderModeStateIdent(); // trigger real button and whole process
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAircraft ownAircraft = this->cockpitValuesToObject();
|
||||||
|
this->sendCockpitUpdates(ownAircraft);
|
||||||
|
}
|
||||||
|
|
||||||
|
CAircraft CCockpitV1Component::cockpitValuesToObject()
|
||||||
|
{
|
||||||
|
|
||||||
|
CAircraft ownAircraft = this->getOwnAircraft();
|
||||||
|
CTransponder transponder = ownAircraft.getTransponder();
|
||||||
|
CComSystem com1 = ownAircraft.getCom1System();
|
||||||
|
CComSystem com2 = ownAircraft.getCom2System();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Transponder
|
||||||
|
//
|
||||||
|
QString transponderCode = QString::number(qRound(this->ui->ds_CockpitTransponder->value()));
|
||||||
|
if (CTransponder::isValidTransponderCode(transponderCode))
|
||||||
|
{
|
||||||
|
transponder.setTransponderCode(transponderCode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->sendStatusMessage(CStatusMessage::getValidationError("Wrong transponder code, reset"));
|
||||||
|
this->ui->ds_CockpitTransponder->setValue(transponder.getTransponderCode());
|
||||||
|
}
|
||||||
|
transponder.setTransponderMode(this->ui->cbp_CockpitTransponderMode->getSelectedTransponderMode());
|
||||||
|
|
||||||
|
//
|
||||||
|
// COM units
|
||||||
|
//
|
||||||
|
com1.setFrequencyActiveMHz(this->ui->ds_CockpitCom1Active->value());
|
||||||
|
com1.setFrequencyStandbyMHz(this->ui->ds_CockpitCom1Standby->value());
|
||||||
|
com2.setFrequencyActiveMHz(this->ui->ds_CockpitCom2Active->value());
|
||||||
|
com2.setFrequencyStandbyMHz(this->ui->ds_CockpitCom2Standby->value());
|
||||||
|
this->updateComFrequencyDisplaysFromObjects(com1, com2); // back annotation after rounding
|
||||||
|
|
||||||
|
ownAircraft.setCom1System(com1);
|
||||||
|
ownAircraft.setCom2System(com2);
|
||||||
|
ownAircraft.setTransponder(transponder);
|
||||||
|
return ownAircraft;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCockpitV1Component::updateComFrequencyDisplaysFromObjects(const CComSystem &com1, const CComSystem &com2)
|
||||||
|
{
|
||||||
|
double freq = com1.getFrequencyActive().valueRounded(3);
|
||||||
|
if (freq != this->ui->ds_CockpitCom1Active->value())
|
||||||
|
this->ui->ds_CockpitCom1Active->setValue(freq);
|
||||||
|
|
||||||
|
freq = com2.getFrequencyActive().valueRounded(3);
|
||||||
|
if (freq != this->ui->ds_CockpitCom2Active->value())
|
||||||
|
this->ui->ds_CockpitCom2Active->setValue(freq);
|
||||||
|
|
||||||
|
freq = com1.getFrequencyStandby().valueRounded(3);
|
||||||
|
if (freq != this->ui->ds_CockpitCom1Standby->value())
|
||||||
|
this->ui->ds_CockpitCom1Standby->setValue(freq);
|
||||||
|
|
||||||
|
freq = com2.getFrequencyStandby().valueRounded(3);
|
||||||
|
if (freq != this->ui->ds_CockpitCom2Standby->value())
|
||||||
|
this->ui->ds_CockpitCom2Standby->setValue(freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCockpitV1Component::updateCockpitFromObject(const CAircraft &ownAircraft)
|
||||||
|
{
|
||||||
|
// update GUI elements
|
||||||
|
// avoid unnecessary change events as far as possible
|
||||||
|
const CComSystem com1 = ownAircraft.getCom1System(); // aircraft just updated or set from context
|
||||||
|
const CComSystem com2 = ownAircraft.getCom2System();
|
||||||
|
const CTransponder transponder = ownAircraft.getTransponder();
|
||||||
|
|
||||||
|
// update the frequencies
|
||||||
|
this->updateComFrequencyDisplaysFromObjects(com1, com2);
|
||||||
|
|
||||||
|
// update transponder
|
||||||
|
qint32 tc = transponder.getTransponderCode();
|
||||||
|
if (tc != static_cast<qint32>(this->ui->ds_CockpitTransponder->value()))
|
||||||
|
this->ui->ds_CockpitTransponder->setValue(tc);
|
||||||
|
|
||||||
|
this->ui->cbp_CockpitTransponderMode->setSelectedTransponderMode(transponder.getTransponderMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Own cockpit
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::updateCockpitFromContext(const CAircraft &ownAircraft, const QString &originator)
|
void CCockpitV1Component::updateCockpitFromContext(const CAircraft &ownAircraft, const QString &originator)
|
||||||
{
|
{
|
||||||
Q_UNUSED(originator);
|
if (originator == CCockpitV1Component::cockpitOriginator()) return; // comes from myself
|
||||||
|
|
||||||
// update GUI elements
|
// update GUI elements
|
||||||
// avoid unnecessary change events as far as possible
|
// avoid unnecessary change events as far as possible
|
||||||
@@ -144,9 +278,9 @@ namespace BlackGui
|
|||||||
const CTransponder transponder = ownAircraft.getTransponder();
|
const CTransponder transponder = ownAircraft.getTransponder();
|
||||||
|
|
||||||
// update the frequencies
|
// update the frequencies
|
||||||
this->updateComFrequencyDisplays(com1, com2);
|
this->updateComFrequencyDisplaysFromObjects(com1, com2);
|
||||||
|
|
||||||
// update transponder if this is not input focused
|
// update transponder
|
||||||
qint32 tc = transponder.getTransponderCode();
|
qint32 tc = transponder.getTransponderCode();
|
||||||
if (tc != static_cast<qint32>(this->ui->ds_CockpitTransponder->value()))
|
if (tc != static_cast<qint32>(this->ui->ds_CockpitTransponder->value()))
|
||||||
this->ui->ds_CockpitTransponder->setValue(tc);
|
this->ui->ds_CockpitTransponder->setValue(tc);
|
||||||
@@ -167,185 +301,84 @@ namespace BlackGui
|
|||||||
else
|
else
|
||||||
this->ui->lbl_CockpitCom2->setToolTip(com2Station.getCallsign().getStringAsSet());
|
this->ui->lbl_CockpitCom2->setToolTip(com2Station.getCallsign().getStringAsSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Voice room override
|
|
||||||
//
|
|
||||||
if (this->getIContextAudio())
|
|
||||||
{
|
|
||||||
// get all rooms, it is important to get the rooms from voice context here
|
|
||||||
// these are the ones featuring the real audio status
|
|
||||||
CVoiceRoomList rooms = this->getIContextAudio()->getComVoiceRoomsWithAudioStatus();
|
|
||||||
Q_ASSERT(rooms.size() == 2);
|
|
||||||
|
|
||||||
CVoiceRoom room1 = rooms[0];
|
|
||||||
CVoiceRoom room2 = rooms[1];
|
|
||||||
bool com1Connected = room1.isConnected();
|
|
||||||
bool com2Connected = room2.isConnected();
|
|
||||||
|
|
||||||
// update views
|
|
||||||
this->ui->tvp_CockpitVoiceRoom1->update(this->getIContextAudio()->getCom1RoomUsers());
|
|
||||||
this->ui->tvp_CockpitVoiceRoom1->update(this->getIContextAudio()->getCom1RoomUsers());
|
|
||||||
|
|
||||||
// highlite voice room according to status
|
|
||||||
QString vrStyle1;
|
|
||||||
QString vrStyle2;
|
|
||||||
if (!room1.getVoiceRoomUrl(true).isEmpty()) vrStyle1 = com1Connected ? "background: green" : "background: red";
|
|
||||||
if (!room2.getVoiceRoomUrl(true).isEmpty()) vrStyle2 = com2Connected ? "background: green" : "background: red";
|
|
||||||
this->ui->le_CockpitVoiceRoomCom1->setStyleSheet(vrStyle1);
|
|
||||||
this->ui->le_CockpitVoiceRoomCom2->setStyleSheet(vrStyle2);
|
|
||||||
|
|
||||||
// display URL if not override mode
|
|
||||||
if (!this->ui->cb_CockpitVoiceRoom1Override->isChecked())
|
|
||||||
{
|
|
||||||
// no override
|
|
||||||
QString s = room1.getVoiceRoomUrl();
|
|
||||||
this->ui->le_CockpitVoiceRoomCom1->setText(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// display URL if not override mode
|
bool CCockpitV1Component::sendCockpitUpdates(const CAircraft &ownAircraft)
|
||||||
if (!this->ui->cb_CockpitVoiceRoom2Override->isChecked())
|
|
||||||
{
|
{
|
||||||
// no overrride
|
|
||||||
QString s = room2.getVoiceRoomUrl();
|
|
||||||
this->ui->le_CockpitVoiceRoomCom2->setText(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Round the com frequency displays
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::updateComFrequencyDisplays(const CComSystem &com1, const CComSystem &com2)
|
|
||||||
{
|
|
||||||
// do not just set! Leads to unwanted signals fired
|
|
||||||
// only update if not focused
|
|
||||||
|
|
||||||
double freq = com1.getFrequencyActive().valueRounded(3);
|
|
||||||
if (freq != this->ui->ds_CockpitCom1Active->value())
|
|
||||||
this->ui->ds_CockpitCom1Active->setValue(freq);
|
|
||||||
|
|
||||||
freq = com2.getFrequencyActive().valueRounded(3);
|
|
||||||
if (freq != this->ui->ds_CockpitCom2Active->value())
|
|
||||||
this->ui->ds_CockpitCom2Active->setValue(freq);
|
|
||||||
|
|
||||||
freq = com1.getFrequencyStandby().valueRounded(3);
|
|
||||||
if (freq != this->ui->ds_CockpitCom1Standby->value())
|
|
||||||
this->ui->ds_CockpitCom1Standby->setValue(freq);
|
|
||||||
|
|
||||||
freq = com2.getFrequencyStandby().valueRounded(3);
|
|
||||||
if (freq != this->ui->ds_CockpitCom2Standby->value())
|
|
||||||
this->ui->ds_CockpitCom2Standby->setValue(freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reset transponder mode to Standby / Charly
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::resetTransponderMode()
|
|
||||||
{
|
|
||||||
if (!this->pb_ExternalCockpitIdent) return;
|
|
||||||
this->pb_ExternalCockpitIdent->setStyleSheet("");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send cockpit updates
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::sendCockpitUpdates()
|
|
||||||
{
|
|
||||||
CTransponder transponder = this->m_ownAircraft.getTransponder();
|
|
||||||
CComSystem com1 = this->m_ownAircraft.getCom1System();
|
|
||||||
CComSystem com2 = this->m_ownAircraft.getCom2System();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Transponder
|
|
||||||
//
|
|
||||||
QString transponderCode = QString::number(qRound(this->ui->ds_CockpitTransponder->value()));
|
|
||||||
if (CTransponder::isValidTransponderCode(transponderCode))
|
|
||||||
{
|
|
||||||
transponder.setTransponderCode(transponderCode);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->sendStatusMessage(CStatusMessage::getValidationError("Wrong transponder code, reset"));
|
|
||||||
this->ui->ds_CockpitTransponder->setValue(transponder.getTransponderCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
transponder.setTransponderMode(this->ui->cbp_CockpitTransponderMode->getSelectedTransponderMode());
|
|
||||||
if (this->pb_ExternalCockpitIdent && this->ui->cbp_CockpitTransponderMode->isIdentSelected())
|
|
||||||
{
|
|
||||||
// ident shall be sent for some time, then reset
|
|
||||||
this->pb_ExternalCockpitIdent->setStyleSheet("background: red");
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// COM units
|
|
||||||
//
|
|
||||||
com1.setFrequencyActiveMHz(this->ui->ds_CockpitCom1Active->value());
|
|
||||||
com1.setFrequencyStandbyMHz(this->ui->ds_CockpitCom1Standby->value());
|
|
||||||
com2.setFrequencyActiveMHz(this->ui->ds_CockpitCom2Active->value());
|
|
||||||
com2.setFrequencyStandbyMHz(this->ui->ds_CockpitCom2Standby->value());
|
|
||||||
this->updateComFrequencyDisplays(com1, com2);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Send to context
|
// Send to context
|
||||||
//
|
//
|
||||||
bool changedCockpit = false;
|
bool changedCockpit = false;
|
||||||
if (this->getIContextOwnAircraft())
|
if (this->getIContextOwnAircraft())
|
||||||
{
|
{
|
||||||
CAircraft ownAircraft = this->getOwnAircraft();
|
changedCockpit = this->getIContextOwnAircraft()->updateOwnCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), ownAircraft.getTransponder(), CCockpitV1Component::cockpitOriginator());
|
||||||
if (!ownAircraft.hasSameComData(com1, com2, transponder))
|
|
||||||
{
|
|
||||||
this->getIContextOwnAircraft()->updateOwnCockpit(com1, com2, transponder, CCockpitV1Component::cockpitOriginator());
|
|
||||||
changedCockpit = true;
|
|
||||||
}
|
}
|
||||||
|
return changedCockpit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
void CCockpitV1Component::setAudioVoiceRoomUrls()
|
||||||
// Now with the new voice room data, really set the
|
|
||||||
// voice rooms in the context
|
|
||||||
//
|
|
||||||
if (changedCockpit) this->setAudioVoiceRooms();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Voice room override
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::setAudioVoiceRooms()
|
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(this->getIContextOwnAircraft());
|
||||||
|
|
||||||
// make fields readonly if not overriding
|
// make fields readonly if not overriding
|
||||||
this->ui->le_CockpitVoiceRoomCom1->setReadOnly(!this->ui->cb_CockpitVoiceRoom1Override->isChecked());
|
this->ui->le_CockpitVoiceRoomCom1->setReadOnly(!this->ui->cb_CockpitVoiceRoom1Override->isChecked());
|
||||||
this->ui->le_CockpitVoiceRoomCom2->setReadOnly(!this->ui->cb_CockpitVoiceRoom2Override->isChecked());
|
this->ui->le_CockpitVoiceRoomCom2->setReadOnly(!this->ui->cb_CockpitVoiceRoom2Override->isChecked());
|
||||||
|
|
||||||
CVoiceRoom room1;
|
QString room1;
|
||||||
CVoiceRoom room2;
|
QString room2;
|
||||||
CVoiceRoomList selectedVoiceRooms = this->getIContextNetwork()->getSelectedVoiceRooms();
|
if (this->ui->cb_CockpitVoiceRoom1Override->isChecked()) room1 = ui->le_CockpitVoiceRoomCom1->text();
|
||||||
|
if (this->ui->cb_CockpitVoiceRoom2Override->isChecked()) room2 = ui->le_CockpitVoiceRoomCom2->text();
|
||||||
|
this->getIContextOwnAircraft()->setAudioVoiceRoomOverrideUrls(room1, room2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCockpitV1Component::updateAudioVoiceRoomsFromObject(const CVoiceRoomList &selectedVoiceRooms)
|
||||||
|
{
|
||||||
Q_ASSERT(selectedVoiceRooms.size() == 2);
|
Q_ASSERT(selectedVoiceRooms.size() == 2);
|
||||||
|
CVoiceRoom room1 = selectedVoiceRooms[0];
|
||||||
|
CVoiceRoom room2 = selectedVoiceRooms[1];
|
||||||
|
|
||||||
|
// remark
|
||||||
|
// isAudioPlaying() is not set, as this is only a temporary value when really "something is playing"
|
||||||
|
|
||||||
if (this->ui->cb_CockpitVoiceRoom1Override->isChecked())
|
|
||||||
room1 = CVoiceRoom(this->ui->le_CockpitVoiceRoomCom1->text().trimmed());
|
|
||||||
else
|
|
||||||
{
|
|
||||||
room1 = selectedVoiceRooms[0];
|
|
||||||
room1.setAudioPlaying(true);
|
|
||||||
this->ui->le_CockpitVoiceRoomCom1->setText(room1.getVoiceRoomUrl());
|
this->ui->le_CockpitVoiceRoomCom1->setText(room1.getVoiceRoomUrl());
|
||||||
|
if (room1.isConnected())
|
||||||
|
{
|
||||||
|
this->ui->le_CockpitVoiceRoomCom1->setStyleSheet("background: green");
|
||||||
|
if (this->getIContextAudio()) this->ui->tvp_CockpitVoiceRoom1->update(this->getIContextAudio()->getCom1RoomUsers());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->ui->cb_CockpitVoiceRoom2Override->isChecked())
|
|
||||||
room2 = CVoiceRoom(this->ui->le_CockpitVoiceRoomCom1->text().trimmed());
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
room2 = selectedVoiceRooms[1];
|
this->ui->le_CockpitVoiceRoomCom1->setStyleSheet("");
|
||||||
room2.setAudioPlaying(true);
|
this->ui->tvp_CockpitVoiceRoom1->clear();
|
||||||
|
}
|
||||||
|
|
||||||
this->ui->le_CockpitVoiceRoomCom2->setText(room2.getVoiceRoomUrl());
|
this->ui->le_CockpitVoiceRoomCom2->setText(room2.getVoiceRoomUrl());
|
||||||
|
if (room2.isConnected())
|
||||||
|
{
|
||||||
|
this->ui->le_CockpitVoiceRoomCom2->setStyleSheet("background: green");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ui->le_CockpitVoiceRoomCom2->setStyleSheet("");
|
||||||
|
this->ui->tvp_CockpitVoiceRoom2->clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the real voice rooms for audio output
|
void CCockpitV1Component::updateVoiceRoomMembers()
|
||||||
this->getIContextAudio()->setComVoiceRooms(room1, room2);
|
{
|
||||||
|
if (!this->getIContextAudio()) return;
|
||||||
|
if (!this->ui->le_CockpitVoiceRoomCom1->text().trimmed().isEmpty())
|
||||||
|
this->ui->tvp_CockpitVoiceRoom1->update(this->getIContextAudio()->getCom1RoomUsers());
|
||||||
|
else
|
||||||
|
this->ui->tvp_CockpitVoiceRoom1->clear();
|
||||||
|
|
||||||
|
if (!this->ui->le_CockpitVoiceRoomCom2->text().trimmed().isEmpty())
|
||||||
|
this->ui->tvp_CockpitVoiceRoom2->update(this->getIContextAudio()->getCom2RoomUsers());
|
||||||
|
else
|
||||||
|
this->ui->tvp_CockpitVoiceRoom2->clear();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Test SELCAL code
|
|
||||||
*/
|
|
||||||
void CCockpitV1Component::testSelcal()
|
void CCockpitV1Component::testSelcal()
|
||||||
{
|
{
|
||||||
QString selcalCode = this->getSelcalCode();
|
QString selcalCode = this->getSelcalCode();
|
||||||
@@ -364,9 +397,6 @@ namespace BlackGui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* SELCAL value selected
|
|
||||||
*/
|
|
||||||
QString CCockpitV1Component::getSelcalCode() const
|
QString CCockpitV1Component::getSelcalCode() const
|
||||||
{
|
{
|
||||||
QString selcal = this->ui->cb_CockpitSelcal1->currentText().append(this->ui->cb_CockpitSelcal2->currentText());
|
QString selcal = this->ui->cb_CockpitSelcal1->currentText().append(this->ui->cb_CockpitSelcal2->currentText());
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ namespace Ui { class CCockpitV1Component; }
|
|||||||
namespace BlackGui
|
namespace BlackGui
|
||||||
{
|
{
|
||||||
|
|
||||||
//! User componenet (users, clients)
|
/*!
|
||||||
|
* User componenet (users, clients)
|
||||||
|
*/
|
||||||
class CCockpitV1Component : public QWidget, public CRuntimeBasedComponent
|
class CCockpitV1Component : public QWidget, public CRuntimeBasedComponent
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -24,7 +26,19 @@ namespace BlackGui
|
|||||||
~CCockpitV1Component();
|
~CCockpitV1Component();
|
||||||
|
|
||||||
//! Set external push buttons
|
//! Set external push buttons
|
||||||
void setExternalButtons(QPushButton *cockpitIdent, QPushButton *cockpitSelected);
|
void setExternalIdentButton(QPushButton *cockpitIdent);
|
||||||
|
|
||||||
|
//! Volume 0..100 for COM1
|
||||||
|
int getCom1Volume() const;
|
||||||
|
|
||||||
|
//! Volume 0..100 for COM1
|
||||||
|
int getCom2Volume() const;
|
||||||
|
|
||||||
|
//! Pixmap for voice status
|
||||||
|
void setCockpitVoiceStatusPixmap(const QPixmap &pixmap);
|
||||||
|
|
||||||
|
//! Object one of the volume widgets?
|
||||||
|
bool isCockpitVolumeWidget(const QObject *sender) const;
|
||||||
|
|
||||||
//! Originator for signals
|
//! Originator for signals
|
||||||
static const QString &cockpitOriginator();
|
static const QString &cockpitOriginator();
|
||||||
@@ -36,34 +50,55 @@ namespace BlackGui
|
|||||||
//! set SELCAL code
|
//! set SELCAL code
|
||||||
QString getSelcalCode() const;
|
QString getSelcalCode() const;
|
||||||
|
|
||||||
|
//! Volume 0..100 for COM1
|
||||||
|
void setCom1Volume(int volume);
|
||||||
|
|
||||||
|
//! Volume 0..100 for COM2
|
||||||
|
void setCom2Volume(int volume);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
//! Audio volume changed
|
||||||
|
void audioVolumeChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! \copydoc CRuntimeBasedComponent::runtimeHasBeenSet
|
||||||
|
virtual void runtimeHasBeenSet() override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
//! Test SELCAL
|
//! Test SELCAL
|
||||||
void testSelcal();
|
void testSelcal();
|
||||||
|
|
||||||
//! Code values changed
|
//! Cockpit values changed from GUI
|
||||||
void cockpitValuesChanged();
|
void cockpitValuesChanged();
|
||||||
|
|
||||||
//! Cockpit updates
|
//! Update voice rooms from list
|
||||||
void sendCockpitUpdates();
|
void updateAudioVoiceRoomsFromObject(const BlackMisc::Audio::CVoiceRoomList &selectedVoiceRooms);
|
||||||
|
|
||||||
|
//! Update the voice room members
|
||||||
|
void updateVoiceRoomMembers();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::CCockpitV1Component *ui;
|
Ui::CCockpitV1Component *ui;
|
||||||
QPushButton *pb_ExternalCockpitIdent;
|
QPushButton *m_externalCockpitIdentButton; //!< External ident button
|
||||||
QPushButton *pb_ExternalCockpitSelected;
|
QTimer *m_voiceRoomMembersTimer;
|
||||||
|
|
||||||
BlackMisc::Aviation::CAircraft m_ownAircraft; //!< DBus fail safe copy of last state, not used as long as DBus is working / not used with local context as well
|
//! Own aircraft object
|
||||||
|
|
||||||
//! Own aircraft object, normally via context (in case of failure, backup object)
|
|
||||||
BlackMisc::Aviation::CAircraft getOwnAircraft() const;
|
BlackMisc::Aviation::CAircraft getOwnAircraft() const;
|
||||||
|
|
||||||
//! COM frequencies displays
|
//! Cockpit from aircraft object
|
||||||
void updateComFrequencyDisplays(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2);
|
void updateCockpitFromObject(const BlackMisc::Aviation::CAircraft &ownAircraft);
|
||||||
|
|
||||||
//! Reset transponder
|
//! COM frequencies displays
|
||||||
void resetTransponderMode();
|
void updateComFrequencyDisplaysFromObjects(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2);
|
||||||
|
|
||||||
|
//! Cockpit updates
|
||||||
|
bool sendCockpitUpdates(const BlackMisc::Aviation::CAircraft &ownAircraft);
|
||||||
|
|
||||||
//! Set audio voice rooms
|
//! Set audio voice rooms
|
||||||
void setAudioVoiceRooms();
|
void setAudioVoiceRoomUrls();
|
||||||
|
|
||||||
|
//! cockpit values to object, including back annotation
|
||||||
|
BlackMisc::Aviation::CAircraft cockpitValuesToObject();
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,22 @@
|
|||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="vl_CockpitComponent">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gl_CockpitCom">
|
<layout class="QGridLayout" name="gl_CockpitCom">
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
|
|||||||
Reference in New Issue
Block a user