Ref T731, simplified form of ATC station map

This commit is contained in:
Klaus Basan
2019-09-26 14:33:26 +02:00
committed by Mat Sutcliffe
parent b26cde4ed5
commit 840633749e
3 changed files with 47 additions and 317 deletions

View File

@@ -6,14 +6,15 @@
* 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/model/afvmapreader.h"
#include "afvmapdialog.h"
#include "ui_afvmapdialog.h"
#include <QQmlContext>
#include <QQmlEngine>
using namespace BlackCore::Afv::Model;
using namespace BlackCore::Afv::Clients;
@@ -26,14 +27,28 @@ namespace BlackGui
QDialog(parent),
ui(new Ui::CAfvMapDialog)
{
ui->setupUi(this);
m_afvMapReader = new CAfvMapReader(this);
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();
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() { }

View File

@@ -11,19 +11,14 @@
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
<string>AFV map</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="vl_AfvMap">
<item>
<widget class="QQuickWidget" name="qw_AfvMap">
<property name="resizeMode">
<enum>QQuickWidget::SizeRootObjectToView</enum>
</property>
<property name="source">
<url>
<string>qrc:/blackgui/qml/AFVMap.qml</string>
</url>
</property>
</widget>
</item>
<item>
@@ -32,7 +27,7 @@
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>

View File

@@ -16,305 +16,16 @@ Rectangle {
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 {
id: map
anchors.topMargin: 5
anchors.top: leftGrid.bottom
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.fill: parent
/**
anchors.topMargin: 5
anchors.top: leftGrid.bottom
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
**/
plugin: mapPlugin
center: QtPositioning.coordinate(48.50, 11.50) // Oslo
zoomLevel: 3
@@ -339,10 +50,9 @@ Rectangle {
onSelected: {
map.center = QtPositioning.coordinate(latitude, longitude)
transceiver1.frequency = frequency
voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value)
// voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
// voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value )
}
}
}
@@ -386,14 +96,24 @@ Rectangle {
anchors.bottomMargin: 20
onClicked: map.zoomLevel = map.zoomLevel - 1
}
SpinBox {
id: sbAltitude
width: 150
height: 40
stepSize: 500
to: 50000
from: 0
value: 1000
}
}
Timer {
interval: 5000; running: true; repeat: true
onTriggered: {
voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value)
// voiceClient.updateComFrequency(0, transceiver1.frequency * 1000)
// voiceClient.updateComFrequency(1, transceiver2.frequency * 1000)
voiceClient.updatePosition(map.center.latitude, map.center.longitude, sbAltitude.value )
}
}
}