mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-05-06 02:16:04 +08:00
Ref T731, simplified form of ATC station map
This commit is contained in:
committed by
Mat Sutcliffe
parent
b26cde4ed5
commit
840633749e
@@ -6,14 +6,15 @@
|
|||||||
* or distributed except according to the terms contained in the LICENSE file.
|
* or distributed except according to the terms contained in the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//! \file
|
#include "blackgui/guiapplication.h"
|
||||||
|
#include "blackcore/context/contextaudioimpl.h"
|
||||||
#include "blackcore/afv/clients/afvclient.h"
|
#include "blackcore/afv/clients/afvclient.h"
|
||||||
#include "blackcore/afv/model/afvmapreader.h"
|
#include "blackcore/afv/model/afvmapreader.h"
|
||||||
|
|
||||||
#include "afvmapdialog.h"
|
#include "afvmapdialog.h"
|
||||||
#include "ui_afvmapdialog.h"
|
#include "ui_afvmapdialog.h"
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
using namespace BlackCore::Afv::Model;
|
using namespace BlackCore::Afv::Model;
|
||||||
using namespace BlackCore::Afv::Clients;
|
using namespace BlackCore::Afv::Clients;
|
||||||
@@ -26,14 +27,28 @@ namespace BlackGui
|
|||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
ui(new Ui::CAfvMapDialog)
|
ui(new Ui::CAfvMapDialog)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
|
||||||
m_afvMapReader = new CAfvMapReader(this);
|
m_afvMapReader = new CAfvMapReader(this);
|
||||||
m_afvMapReader->updateFromMap();
|
m_afvMapReader->updateFromMap();
|
||||||
m_afvClient = new CAfvClient("https://voice1.vatsim.uk");
|
|
||||||
|
|
||||||
|
if (sGui && !sGui->isShuttingDown() && sGui->getIContextAudio())
|
||||||
|
{
|
||||||
|
if (sGui->getIContextAudio()->isUsingImplementingObject())
|
||||||
|
{
|
||||||
|
m_afvClient = &sGui->getCoreFacade()->getCContextAudio()->voiceClient();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->setupUi(this);
|
||||||
QQmlContext *ctxt = ui->qw_AfvMap->rootContext();
|
QQmlContext *ctxt = ui->qw_AfvMap->rootContext();
|
||||||
ctxt->setContextProperty("afvMapReader", m_afvMapReader);
|
ctxt->setContextProperty("afvMapReader", m_afvMapReader);
|
||||||
ctxt->setContextProperty("voiceClient", m_afvClient);
|
|
||||||
|
if (m_afvClient)
|
||||||
|
{
|
||||||
|
ctxt->setContextProperty("voiceClient", m_afvClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ui->qw_AfvMap->engine()->setBaseUrl(":/blackgui/qml");
|
||||||
|
ui->qw_AfvMap->setSource(QUrl("qrc:/blackgui/qml/AFVMap.qml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
CAfvMapDialog::~CAfvMapDialog() { }
|
CAfvMapDialog::~CAfvMapDialog() { }
|
||||||
|
|||||||
@@ -11,19 +11,14 @@
|
|||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Dialog</string>
|
<string>AFV map</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="vl_AfvMap">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QQuickWidget" name="qw_AfvMap">
|
<widget class="QQuickWidget" name="qw_AfvMap">
|
||||||
<property name="resizeMode">
|
<property name="resizeMode">
|
||||||
<enum>QQuickWidget::SizeRootObjectToView</enum>
|
<enum>QQuickWidget::SizeRootObjectToView</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="source">
|
|
||||||
<url>
|
|
||||||
<string>qrc:/blackgui/qml/AFVMap.qml</string>
|
|
||||||
</url>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -32,7 +27,7 @@
|
|||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="standardButtons">
|
<property name="standardButtons">
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
<set>QDialogButtonBox::Close</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -16,305 +16,16 @@ Rectangle {
|
|||||||
name: "osm"
|
name: "osm"
|
||||||
}
|
}
|
||||||
|
|
||||||
Grid {
|
|
||||||
id: leftGrid
|
|
||||||
columns: 2
|
|
||||||
rows: 6
|
|
||||||
spacing: 10
|
|
||||||
padding: 10
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: 5
|
|
||||||
anchors.leftMargin: 10
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblUsername
|
|
||||||
width: 100
|
|
||||||
text: qsTr("Username")
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
Layout.fillHeight: true
|
|
||||||
Layout.fillWidth: false
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField {
|
|
||||||
id: tfUsername
|
|
||||||
width: 350
|
|
||||||
height: 25
|
|
||||||
text: qsTr("1234567")
|
|
||||||
selectByMouse: true
|
|
||||||
enabled: voiceClient.connectionStatus == 0 // Disconnected
|
|
||||||
horizontalAlignment: Text.AlignLeft
|
|
||||||
renderType: Text.NativeRendering
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblPassword
|
|
||||||
width: 100
|
|
||||||
text: qsTr("Password")
|
|
||||||
Layout.fillWidth: false
|
|
||||||
Layout.fillHeight: false
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField {
|
|
||||||
id: tfPassword
|
|
||||||
width: 350
|
|
||||||
height: 25
|
|
||||||
text: qsTr("123456")
|
|
||||||
selectByMouse: true
|
|
||||||
enabled: voiceClient.connectionStatus == 0 // Disconnected
|
|
||||||
echoMode: TextInput.PasswordEchoOnEdit
|
|
||||||
horizontalAlignment: Text.AlignLeft
|
|
||||||
renderType: Text.NativeRendering
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblCallsign
|
|
||||||
width: 100
|
|
||||||
text: qsTr("Callsign")
|
|
||||||
Layout.fillWidth: false
|
|
||||||
Layout.fillHeight: false
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField {
|
|
||||||
id: tfCallsign
|
|
||||||
width: 350
|
|
||||||
height: 25
|
|
||||||
text: qsTr("DECHK")
|
|
||||||
selectByMouse: true
|
|
||||||
enabled: voiceClient.connectionStatus == 0 // Disconnected
|
|
||||||
horizontalAlignment: Text.AlignLeft
|
|
||||||
renderType: Text.NativeRendering
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblInputDevice
|
|
||||||
width: 100
|
|
||||||
text: qsTr("Input Device")
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
Layout.fillHeight: false
|
|
||||||
Layout.fillWidth: false
|
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox {
|
|
||||||
id: cbInputDevices
|
|
||||||
width: 350
|
|
||||||
height: 25
|
|
||||||
model: voiceClient.availableInputDevices()
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblOutputDevice
|
|
||||||
width: 100
|
|
||||||
text: qsTr("Output Device")
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
Layout.fillHeight: false
|
|
||||||
Layout.fillWidth: false
|
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox {
|
|
||||||
id: cbOutputDevices
|
|
||||||
width: 350
|
|
||||||
height: 25
|
|
||||||
model: voiceClient.availableOutputDevices()
|
|
||||||
}
|
|
||||||
|
|
||||||
Frame {
|
|
||||||
background: Rectangle {
|
|
||||||
color: "transparent"
|
|
||||||
border.color: "transparent"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: 10
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btConnect
|
|
||||||
width: 170
|
|
||||||
height: 25
|
|
||||||
text: voiceClient.connectionStatus == 0 ? "Connect" : "Disconnect"
|
|
||||||
onClicked: {
|
|
||||||
if (voiceClient.connectionStatus == 0) {
|
|
||||||
voiceClient.connectTo(tfUsername.text, tfPassword.text, tfCallsign.text)
|
|
||||||
afvMapReader.setOwnCallsign(tfCallsign.text)
|
|
||||||
} else if (voiceClient.connectionStatus == 1) {
|
|
||||||
voiceClient.disconnectFrom()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btStartAudio
|
|
||||||
|
|
||||||
property bool started: false
|
|
||||||
width: 170
|
|
||||||
height: 25
|
|
||||||
text: qsTr("Start Audio")
|
|
||||||
onClicked: {
|
|
||||||
btStartAudio.enabled = false
|
|
||||||
cbInputDevices.enabled = false
|
|
||||||
cbOutputDevices.enabled = false
|
|
||||||
voiceClient.start(cbInputDevices.currentText, cbOutputDevices.currentText)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Grid {
|
|
||||||
id: rightGrid
|
|
||||||
padding: 10
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: leftGrid.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
spacing: 10
|
|
||||||
rows: 3
|
|
||||||
columns: 3
|
|
||||||
|
|
||||||
Transceiver {
|
|
||||||
id: transceiver1
|
|
||||||
transceiverId: 0
|
|
||||||
onRxOnChanged: {
|
|
||||||
voiceClient.enableTransceiver(transceiverId, rxOn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SpinBox {
|
|
||||||
id: sbAltitude
|
|
||||||
width: 150
|
|
||||||
height: 40
|
|
||||||
stepSize: 500
|
|
||||||
to: 50000
|
|
||||||
from: 0
|
|
||||||
value: 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblReceivingCom1
|
|
||||||
height: 40
|
|
||||||
text: qsTr("Receiving: ") + voiceClient.receivingCallsignsCom1
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
Transceiver {
|
|
||||||
id: transceiver2
|
|
||||||
transceiverId: 1
|
|
||||||
txOn: false
|
|
||||||
onRxOnChanged: {
|
|
||||||
voiceClient.enableTransceiver(transceiverId, rxOn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btUpdateStack
|
|
||||||
width: 150
|
|
||||||
height: 40
|
|
||||||
text: qsTr("Update Stack")
|
|
||||||
onClicked: {
|
|
||||||
voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
|
|
||||||
voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
|
|
||||||
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: lblReceivingCom2
|
|
||||||
height: 40
|
|
||||||
text: qsTr("Receiving: ") + voiceClient.receivingCallsignsCom2
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
// anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: column
|
|
||||||
spacing: 10
|
|
||||||
anchors.top: rightGrid.bottom
|
|
||||||
anchors.left: leftGrid.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
|
|
||||||
ProgressBar {
|
|
||||||
id: pbAudioInput
|
|
||||||
width: 500
|
|
||||||
height: 25
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 10
|
|
||||||
value: voiceClient.inputVolumePeakVU
|
|
||||||
}
|
|
||||||
|
|
||||||
ProgressBar {
|
|
||||||
id: pbAudioOutput
|
|
||||||
width: 500
|
|
||||||
height: 25
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 10
|
|
||||||
value: voiceClient.outputVolumePeakVU
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
padding: 0
|
|
||||||
spacing: 10
|
|
||||||
anchors.top: column.bottom
|
|
||||||
anchors.left: leftGrid.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
|
|
||||||
CheckBox {
|
|
||||||
id: cbVhfEffects
|
|
||||||
text: qsTr("VHF Effects")
|
|
||||||
checked: true
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
onClicked: voiceClient.setBypassEffects(!checked)
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckBox {
|
|
||||||
id: cbLoopback
|
|
||||||
text: qsTr("Loopback")
|
|
||||||
checked: false
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
onClicked: voiceClient.setLoopBack(checked)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btPtt
|
|
||||||
width: 150
|
|
||||||
height: 40
|
|
||||||
text: qsTr("PTT")
|
|
||||||
onPressed: voiceClient.setPtt(true)
|
|
||||||
onReleased: voiceClient.setPtt(false)
|
|
||||||
background: Rectangle {
|
|
||||||
implicitWidth: btPtt.width
|
|
||||||
implicitHeight: btPtt.height
|
|
||||||
color: btPtt.down ? "lightgreen" : "lightgrey"
|
|
||||||
border.width: 1
|
|
||||||
radius: 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
function translateStatus(status) {
|
|
||||||
switch(status) {
|
|
||||||
case 0: return "Disconnected"
|
|
||||||
case 1: return "Connected"
|
|
||||||
default: return "Unknown"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
id: lblStatus
|
|
||||||
text: "Status: " + translateStatus(voiceClient.connectionStatus)
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Map {
|
Map {
|
||||||
id: map
|
id: map
|
||||||
anchors.topMargin: 5
|
anchors.fill: parent
|
||||||
anchors.top: leftGrid.bottom
|
/**
|
||||||
anchors.bottom: parent.bottom
|
anchors.topMargin: 5
|
||||||
anchors.left: parent.left
|
anchors.top: leftGrid.bottom
|
||||||
anchors.right: parent.right
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
**/
|
||||||
plugin: mapPlugin
|
plugin: mapPlugin
|
||||||
center: QtPositioning.coordinate(48.50, 11.50) // Oslo
|
center: QtPositioning.coordinate(48.50, 11.50) // Oslo
|
||||||
zoomLevel: 3
|
zoomLevel: 3
|
||||||
@@ -339,10 +50,9 @@ Rectangle {
|
|||||||
onSelected: {
|
onSelected: {
|
||||||
map.center = QtPositioning.coordinate(latitude, longitude)
|
map.center = QtPositioning.coordinate(latitude, longitude)
|
||||||
transceiver1.frequency = frequency
|
transceiver1.frequency = frequency
|
||||||
voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
|
// voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
|
||||||
voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
|
// voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
|
||||||
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value)
|
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value )
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -386,14 +96,24 @@ Rectangle {
|
|||||||
anchors.bottomMargin: 20
|
anchors.bottomMargin: 20
|
||||||
onClicked: map.zoomLevel = map.zoomLevel - 1
|
onClicked: map.zoomLevel = map.zoomLevel - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SpinBox {
|
||||||
|
id: sbAltitude
|
||||||
|
width: 150
|
||||||
|
height: 40
|
||||||
|
stepSize: 500
|
||||||
|
to: 50000
|
||||||
|
from: 0
|
||||||
|
value: 1000
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer {
|
Timer {
|
||||||
interval: 5000; running: true; repeat: true
|
interval: 5000; running: true; repeat: true
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
|
// voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
|
||||||
voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
|
// voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
|
||||||
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value)
|
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user