Map Updates

Fix 3D map for Qt < 5.15.
Add 3D map label scale setting.
Add 3D map time to Web report.
Reduce height of display settings dialog to fit on smaller screens.
This commit is contained in:
Jon Beniston 2022-02-09 16:41:40 +00:00
parent 73848c94e4
commit 29b2941951
18 changed files with 646 additions and 437 deletions

View File

@ -443,7 +443,7 @@ QJsonObject CZML::update(MapItem *mapItem, bool isTarget, bool isSelected)
QJsonObject label {
{"text", mapItem->m_label},
{"show", m_settings->m_displayNames && mapItem->m_itemSettings->m_enabled && mapItem->m_itemSettings->m_display3DLabel},
{"scale", 0.5},
{"scale", mapItem->m_itemSettings->m_3DLabelScale},
{"pixelOffset", labelPixelOffset},
{"eyeOffset", labelEyeOffset},
{"verticalOrigin", "BASELINE"},

View File

@ -43,7 +43,9 @@ const char* const Map::m_featureIdURI = "sdrangel.feature.map";
const char* const Map::m_featureId = "Map";
Map::Map(WebAPIAdapterInterface *webAPIAdapterInterface) :
Feature(m_featureIdURI, webAPIAdapterInterface)
Feature(m_featureIdURI, webAPIAdapterInterface),
m_multiplier(0.0),
m_dateTimeMutex(QMutex::Recursive)
{
qDebug("Map::Map: webAPIAdapterInterface: %p", webAPIAdapterInterface);
setObjectName(m_featureId);
@ -206,6 +208,17 @@ int Map::webapiSettingsPutPatch(
return 200;
}
int Map::webapiReportGet(
SWGSDRangel::SWGFeatureReport& response,
QString& errorMessage)
{
(void) errorMessage;
response.setMapReport(new SWGSDRangel::SWGMapReport());
response.getMapReport()->init();
webapiFormatFeatureReport(response);
return 200;
}
int Map::webapiActionsPost(
const QStringList& featureActionsKeys,
SWGSDRangel::SWGFeatureActions& query,
@ -356,6 +369,16 @@ void Map::webapiReverseSendSettings(QList<QString>& featureSettingsKeys, const M
delete swgFeatureSettings;
}
void Map::webapiFormatFeatureReport(SWGSDRangel::SWGFeatureReport& response)
{
QString mapDateTime = getMapDateTime().toString(Qt::ISODateWithMs);
if (response.getMapReport()->getDateTime()) {
*response.getMapReport()->getDateTime() = mapDateTime;
} else {
response.getMapReport()->setDateTime(new QString(mapDateTime));
}
}
void Map::networkManagerFinished(QNetworkReply *reply)
{
QNetworkReply::NetworkError replyError = reply->error();
@ -376,3 +399,29 @@ void Map::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void Map::setMapDateTime(QDateTime mapDateTime, QDateTime systemDateTime, double multiplier)
{
QMutexLocker mutexLocker(&m_dateTimeMutex);
m_mapDateTime = mapDateTime;
m_systemDateTime = systemDateTime;
m_multiplier = multiplier;
}
QDateTime Map::getMapDateTime()
{
QMutexLocker mutexLocker(&m_dateTimeMutex);
if (m_multiplier == 0.0)
{
return m_mapDateTime;
}
else
{
// It's not possible to synchronously get the time from Cesium
// so we calculate it based on the system clock difference from
// when changes were made to the clock GUI elements
// Should be accurate enough for satellite tracker
qint64 diffMsecs = m_systemDateTime.msecsTo(QDateTime::currentDateTime());
return m_mapDateTime.addMSecs(diffMsecs * m_multiplier);
}
}

View File

@ -24,6 +24,7 @@
#include <QNetworkRequest>
#include <QTimer>
#include <QDateTime>
#include <QMutex>
#include "feature/feature.h"
#include "util/message.h"
@ -127,6 +128,10 @@ public:
SWGSDRangel::SWGFeatureSettings& response,
QString& errorMessage);
virtual int webapiReportGet(
SWGSDRangel::SWGFeatureReport& response,
QString& errorMessage);
virtual int webapiActionsPost(
const QStringList& featureActionsKeys,
SWGSDRangel::SWGFeatureActions& query,
@ -141,6 +146,9 @@ public:
const QStringList& featureSettingsKeys,
SWGSDRangel::SWGFeatureSettings& response);
void setMapDateTime(QDateTime mapDateTime, QDateTime systemDateTime, double multiplier);
QDateTime getMapDateTime();
static const char* const m_featureIdURI;
static const char* const m_featureId;
@ -154,8 +162,14 @@ private:
QNetworkRequest m_networkRequest;
void applySettings(const MapSettings& settings, bool force = false);
void webapiFormatFeatureReport(SWGSDRangel::SWGFeatureReport& response);
void webapiReverseSendSettings(QList<QString>& featureSettingsKeys, const MapSettings& settings, bool force);
QDateTime m_mapDateTime;
QDateTime m_systemDateTime;
double m_multiplier;
QMutex m_dateTimeMutex;
private slots:
void updatePipes();
void networkManagerFinished(QNetworkReply *reply);

View File

@ -216,10 +216,7 @@
viewer.clock.currentTime = dateTime;
} else if (command.command == "getDateTime") {
// Get current date and time of viewer
socket.send(JSON.stringify({
command: "getDateTime",
dateTime: Cesium.JulianDate.toIso8601(viewer.clock.currentTime)
}));
reportClock();
} else if (command.command == "setTerrain") {
// Support using Ellipsoid terrain for performance and also
// because paths can't be clammped to ground, so AIS paths
@ -397,6 +394,39 @@
}
});
// Report clock changes for use by other plugins
var systemTime = new Cesium.JulianDate();
function reportClock() {
if (socket.readyState === 1) {
Cesium.JulianDate.now(systemTime);
socket.send(JSON.stringify({
event: "clock",
canAnimate: viewer.clock.canAnimate,
shouldAnimate: viewer.clock.shouldAnimate,
currentTime: Cesium.JulianDate.toIso8601(viewer.clock.currentTime),
multiplier: viewer.clock.multiplier,
systemTime: Cesium.JulianDate.toIso8601(systemTime)
}));
}
};
Cesium.knockout.getObservable(viewer.clockViewModel, 'shouldAnimate').subscribe(function(isAnimating) {
reportClock();
});
Cesium.knockout.getObservable(viewer.clockViewModel, 'multiplier').subscribe(function(multiplier) {
reportClock();
});
// This is called every frame
//Cesium.knockout.getObservable(viewer.clockViewModel, 'currentTime').subscribe(function(currentTime) {
//reportClock();
//});
viewer.timeline.addEventListener('settime', reportClock, false);
socket.onopen = () => {
reportClock();
};
</script>
</div>
</body>

View File

@ -812,6 +812,7 @@ void MapGUI::applyMap3DSettings(bool reloadMap)
m_cesium->setSunLight(m_settings.m_sunLightEnabled);
m_cesium->setCameraReferenceFrame(m_settings.m_eciCamera);
m_cesium->setAntiAliasing(m_settings.m_antiAliasing);
m_cesium->getDateTime();
}
}
@ -826,14 +827,14 @@ void MapGUI::init3DMap()
m_cesium->setSunLight(m_settings.m_sunLightEnabled);
m_cesium->setCameraReferenceFrame(m_settings.m_eciCamera);
m_cesium->setAntiAliasing(m_settings.m_antiAliasing);
m_cesium->getDateTime();
m_mapModel.allUpdated();
float stationLatitude = MainCore::instance()->getSettings().getLatitude();
float stationLongitude = MainCore::instance()->getSettings().getLongitude();
// Set 3D view after loading initial objects
m_cesium->setHomeView(stationLatitude, stationLongitude);
m_mapModel.allUpdated();
}
void MapGUI::displaySettings()
@ -1144,6 +1145,18 @@ void MapGUI::receivedCesiumEvent(const QJsonObject &obj)
//m_mapModel.setTarget("");
}
}
else if (event == "clock")
{
if (m_map)
{
QDateTime mapDateTime = QDateTime::fromString(obj.value("currentTime").toString(), Qt::ISODateWithMs);
QDateTime systemDateTime = QDateTime::fromString(obj.value("systemTime").toString(), Qt::ISODateWithMs);
double multiplier = obj.value("multiplier").toDouble();
bool canAnimate = obj.value("canAnimate").toBool();
bool shouldAnimate = obj.value("shouldAnimate").toBool();
m_map->setMapDateTime(mapDateTime, systemDateTime, canAnimate && shouldAnimate ? multiplier : 0.0);
}
}
}
else
{

View File

@ -251,6 +251,7 @@ void MapSettings::MapItemSettings::resetToDefaults()
m_display3DTrack = true;
m_3DTrackColor = QColor(150, 0, 20).rgb();
m_3DModelMinPixelSize = 0;
m_3DLabelScale = 0.5f;
}
QByteArray MapSettings::MapItemSettings::serialize() const
@ -271,6 +272,7 @@ QByteArray MapSettings::MapItemSettings::serialize() const
s.writeBool(12, m_display3DTrack);
s.writeU32(13, m_3DTrackColor);
s.writeS32(14, m_3DModelMinPixelSize);
s.writeFloat(15, m_3DLabelScale);
return s.final();
}
@ -301,6 +303,7 @@ bool MapSettings::MapItemSettings::deserialize(const QByteArray& data)
d.readBool(12, &m_display3DTrack, true);
d.readU32(13, &m_3DTrackColor, QColor(150, 0, 20).rgb());
d.readS32(14, &m_3DModelMinPixelSize, 0);
d.readFloat(15, &m_3DLabelScale, 0.5f);
return true;
}
else

View File

@ -42,6 +42,7 @@ struct MapSettings
bool m_display3DTrack; // Display a ground track for this item on the 3D map
quint32 m_3DTrackColor;
int m_3DModelMinPixelSize;
float m_3DLabelScale;
MapItemSettings(const QString& group, const QColor color, bool display3DPoint=true, int minZoom=11, int modelMinPixelSize=0);
MapItemSettings(const QByteArray& data);

View File

@ -96,8 +96,13 @@ MapItemSettingsGUI::MapItemSettingsGUI(QTableWidget *table, int row, MapSettings
m_minPixels = new QSpinBox(table);
m_minPixels->setRange(0, 200);
m_minPixels->setValue(settings->m_3DModelMinPixelSize);
m_labelScale = new QDoubleSpinBox(table);
m_labelScale->setDecimals(2);
m_labelScale->setRange(0.01, 10.0);
m_labelScale->setValue(settings->m_3DLabelScale);
table->setCellWidget(row, MapSettingsDialog::COL_2D_MIN_ZOOM, m_minZoom);
table->setCellWidget(row, MapSettingsDialog::COL_3D_MIN_PIXELS, m_minPixels);
table->setCellWidget(row, MapSettingsDialog::COL_3D_LABEL_SCALE, m_labelScale);
}
MapSettingsDialog::MapSettingsDialog(MapSettings *settings, QWidget* parent) :
@ -241,6 +246,7 @@ void MapSettingsDialog::accept()
itemSettings->m_display3DTrack = !gui->m_track3D.m_noColor;
itemSettings->m_3DTrackColor = gui->m_track3D.m_color;
itemSettings->m_3DModelMinPixelSize = gui->m_minPixels->value();
itemSettings->m_3DLabelScale = gui->m_labelScale->value();
}
QDialog::accept();
@ -276,6 +282,7 @@ void MapSettingsDialog::on_map3DEnabled_clicked(bool checked)
ui->mapItemSettings->showColumn(COL_3D_LABEL);
ui->mapItemSettings->showColumn(COL_3D_POINT);
ui->mapItemSettings->showColumn(COL_3D_TRACK);
ui->mapItemSettings->showColumn(COL_3D_LABEL_SCALE);
}
else
{
@ -284,6 +291,7 @@ void MapSettingsDialog::on_map3DEnabled_clicked(bool checked)
ui->mapItemSettings->hideColumn(COL_3D_LABEL);
ui->mapItemSettings->hideColumn(COL_3D_POINT);
ui->mapItemSettings->hideColumn(COL_3D_TRACK);
ui->mapItemSettings->hideColumn(COL_3D_LABEL_SCALE);
}
ui->terrain->setEnabled(checked);
ui->buildings->setEnabled(checked);

View File

@ -19,6 +19,7 @@
#define INCLUDE_FEATURE_MAPSETTINGSDIALOG_H
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QMessageBox>
#include "gui/httpdownloadmanagergui.h"
@ -56,6 +57,7 @@ public:
MapColorGUI m_track3D;
QSpinBox *m_minZoom;
QSpinBox *m_minPixels;
QDoubleSpinBox *m_labelScale;
};
class MapSettingsDialog : public QDialog {
@ -75,7 +77,8 @@ public:
COL_3D_MIN_PIXELS,
COL_3D_LABEL,
COL_3D_POINT,
COL_3D_TRACK
COL_3D_TRACK,
COL_3D_LABEL_SCALE
};
public:

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>800</height>
<width>1016</width>
<height>720</height>
</rect>
</property>
<property name="font">
@ -26,434 +26,453 @@
<number>0</number>
</property>
<item>
<widget class="QLabel" name="locationsLabel">
<property name="text">
<string>Select how to display items on the maps:</string>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="mapsTab">
<attribute name="title">
<string>Maps</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTableWidget" name="mapItemSettings">
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<column>
<property name="text">
<string>Enabled</string>
</property>
</column>
<column>
<property name="text">
<string>2D Icon</string>
</property>
</column>
<column>
<property name="text">
<string>2D Label</string>
</property>
</column>
<column>
<property name="text">
<string>2D Min Zoom</string>
</property>
</column>
<column>
<property name="text">
<string>2D Track</string>
</property>
</column>
<column>
<property name="text">
<string>3D Model</string>
</property>
</column>
<column>
<property name="text">
<string>3D Min Pixels</string>
</property>
</column>
<column>
<property name="text">
<string>3D Label</string>
</property>
</column>
<column>
<property name="text">
<string>3D Point</string>
</property>
</column>
<column>
<property name="text">
<string>3D Track</string>
</property>
</column>
<column>
<property name="text">
<string>3D Label Scale</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QGroupBox" name="map2DSettings">
<property name="title">
<string>2D Map Settings</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="map2DEnabledLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Enabled</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="map2DEnabled">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mapProviderLabel">
<property name="text">
<string>Map provider</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mapProvider">
<property name="toolTip">
<string>Select map provider</string>
</property>
<item>
<property name="text">
<string>OpenStreetMap</string>
</property>
</item>
<item>
<property name="text">
<string>ESRI</string>
</property>
</item>
<item>
<property name="text">
<string>Mapbox</string>
</property>
</item>
<item>
<property name="text">
<string>MapboxGL</string>
</property>
</item>
<item>
<property name="text">
<string>MapLibre</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="osmURLLabel">
<property name="text">
<string>OSM Custom URL</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="osmURL">
<property name="toolTip">
<string>URL of custom map for use with OpenStreetMap provider</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mapBoxStylesLabel">
<property name="text">
<string>MapboxGL Styles</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="mapBoxStyles">
<property name="toolTip">
<string>Comma separated list of MapBox styles</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="map3DSettings">
<property name="title">
<string>3D Map Settings</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="map3DEnabledLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Enabled</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="map3DEnabled">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="terrainLabel">
<property name="text">
<string>Terrain</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="terrain">
<item>
<property name="text">
<string>Cesium World Terrain</string>
</property>
</item>
<item>
<property name="text">
<string>Ellipsoid</string>
</property>
</item>
<item>
<property name="text">
<string>Maptiler</string>
</property>
</item>
<item>
<property name="text">
<string>ArcGIS</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="buildingsLabel">
<property name="text">
<string>Buildings</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="buildings">
<item>
<property name="text">
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>Cesium OSM Buildings</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="sunLightEnabledLabel">
<property name="text">
<string>Lighting</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="sunLightEnabled">
<property name="toolTip">
<string>Whether lighting is from the Sun or Camera</string>
</property>
<item>
<property name="text">
<string>Camera</string>
</property>
</item>
<item>
<property name="text">
<string>Sun</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="eciCameraLabel">
<property name="text">
<string>Camera reference frame</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="eciCamera">
<property name="toolTip">
<string>Selects camera reference frame. For ECEF the camera rotates with the Earth. For ECI, the camera position is fixed relative to the stars and the Earth's rotation will be visible.</string>
</property>
<item>
<property name="text">
<string>ECEF</string>
</property>
</item>
<item>
<property name="text">
<string>ECI</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="antiAliasingLabel">
<property name="text">
<string>Anti-aliasing</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="antiAliasing">
<property name="toolTip">
<string>Set anti-aliasing to use. This can remove jagged pixels on the edge of 3D models.</string>
</property>
<item>
<property name="text">
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>FXAA</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="downloadModels">
<property name="toolTip">
<string>Download 3D models. It is recommended to restart SDRangel after download.</string>
</property>
<property name="text">
<string>Download 3D Models (1.6GB)</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="apiKeysTab">
<attribute name="title">
<string>API Keys</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QGroupBox" name="apiKeys">
<property name="title">
<string>API Keys</string>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="thunderforestAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Thunderforest API Key</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="thunderforestAPIKey">
<property name="toolTip">
<string>Enter a Thunderforest API key in order to use non-watermarked Thunderforest maps: https://www.thunderforest.com/</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="maptilerAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Maptiler API Key</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="maptilerAPIKey">
<property name="toolTip">
<string>Enter a Maptiler API key in order to use Maptiler maps: https://www.maptiler.com/</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="mapBoxAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Mapbox API Key</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="mapBoxAPIKey">
<property name="toolTip">
<string>Enter a Mapbox API key in order to use Mapbox maps: https://www.mapbox.com/</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="cesiumIonAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Cesium Ion API Key</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="cesiumIonAPIKey">
<property name="toolTip">
<string>Enter a Cesium Ion Access Token</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QTableWidget" name="mapItemSettings">
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<column>
<property name="text">
<string>Enabled</string>
</property>
</column>
<column>
<property name="text">
<string>2D Icon</string>
</property>
</column>
<column>
<property name="text">
<string>2D Label</string>
</property>
</column>
<column>
<property name="text">
<string>2D Min Zoom</string>
</property>
</column>
<column>
<property name="text">
<string>2D Track</string>
</property>
</column>
<column>
<property name="text">
<string>3D Model</string>
</property>
</column>
<column>
<property name="text">
<string>3D Min Pixels</string>
</property>
</column>
<column>
<property name="text">
<string>3D Label</string>
</property>
</column>
<column>
<property name="text">
<string>3D Point</string>
</property>
</column>
<column>
<property name="text">
<string>3D Track</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QGroupBox" name="map2DSettings">
<property name="title">
<string>2D Map Settings</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="map2DEnabledLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Enabled</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="map2DEnabled">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mapProviderLabel">
<property name="text">
<string>Map provider</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mapProvider">
<property name="toolTip">
<string>Select map provider</string>
</property>
<item>
<property name="text">
<string>OpenStreetMap</string>
</property>
</item>
<item>
<property name="text">
<string>ESRI</string>
</property>
</item>
<item>
<property name="text">
<string>Mapbox</string>
</property>
</item>
<item>
<property name="text">
<string>MapboxGL</string>
</property>
</item>
<item>
<property name="text">
<string>MapLibre</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="osmURLLabel">
<property name="text">
<string>OSM Custom URL</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="osmURL">
<property name="toolTip">
<string>URL of custom map for use with OpenStreetMap provider</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mapBoxStylesLabel">
<property name="text">
<string>MapboxGL Styles</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="mapBoxStyles">
<property name="toolTip">
<string>Comma separated list of MapBox styles</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="map3DSettings">
<property name="title">
<string>3D Map Settings</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="map3DEnabledLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Enabled</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="map3DEnabled">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="terrainLabel">
<property name="text">
<string>Terrain</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="terrain">
<item>
<property name="text">
<string>Cesium World Terrain</string>
</property>
</item>
<item>
<property name="text">
<string>Ellipsoid</string>
</property>
</item>
<item>
<property name="text">
<string>Maptiler</string>
</property>
</item>
<item>
<property name="text">
<string>ArcGIS</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="buildingsLabel">
<property name="text">
<string>Buildings</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="buildings">
<item>
<property name="text">
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>Cesium OSM Buildings</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="sunLightEnabledLabel">
<property name="text">
<string>Lighting</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="sunLightEnabled">
<property name="toolTip">
<string>Whether lighting is from the Sun or Camera</string>
</property>
<item>
<property name="text">
<string>Camera</string>
</property>
</item>
<item>
<property name="text">
<string>Sun</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="eciCameraLabel">
<property name="text">
<string>Camera reference frame</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="eciCamera">
<property name="toolTip">
<string>Selects camera reference frame. For ECEF the camera rotates with the Earth. For ECI, the camera position is fixed relative to the stars and the Earth's rotation will be visible.</string>
</property>
<item>
<property name="text">
<string>ECEF</string>
</property>
</item>
<item>
<property name="text">
<string>ECI</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="antiAliasingLabel">
<property name="text">
<string>Anti-aliasing</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="antiAliasing">
<property name="toolTip">
<string>Set anti-aliasing to use. This can remove jagged pixels on the edge of 3D models.</string>
</property>
<item>
<property name="text">
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>FXAA</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="apiKeys">
<property name="title">
<string>API Keys</string>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="thunderforestAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Thunderforest API Key</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="thunderforestAPIKey">
<property name="toolTip">
<string>Enter a Thunderforest API key in order to use non-watermarked Thunderforest maps: https://www.thunderforest.com/</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="maptilerAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Maptiler API Key</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="maptilerAPIKey">
<property name="toolTip">
<string>Enter a Maptiler API key in order to use Maptiler maps: https://www.maptiler.com/</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="mapBoxAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Mapbox API Key</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="mapBoxAPIKey">
<property name="toolTip">
<string>Enter a Mapbox API key in order to use Mapbox maps: https://www.mapbox.com/</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="cesiumIonAPIKeyLabel">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Cesium Ion API Key</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="cesiumIonAPIKey">
<property name="toolTip">
<string>Enter a Cesium Ion Access Token</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="downloadModels">
<property name="toolTip">
<string>Download 3D models. It is recommended to restart SDRangel after download.</string>
</property>
<property name="text">
<string>Download 3D Models (1.6GB)</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
@ -470,6 +489,7 @@
</layout>
</widget>
<tabstops>
<tabstop>tabWidget</tabstop>
<tabstop>mapItemSettings</tabstop>
<tabstop>map2DEnabled</tabstop>
<tabstop>mapProvider</tabstop>
@ -481,11 +501,11 @@
<tabstop>sunLightEnabled</tabstop>
<tabstop>eciCamera</tabstop>
<tabstop>antiAliasing</tabstop>
<tabstop>downloadModels</tabstop>
<tabstop>thunderforestAPIKey</tabstop>
<tabstop>maptilerAPIKey</tabstop>
<tabstop>mapBoxAPIKey</tabstop>
<tabstop>cesiumIonAPIKey</tabstop>
<tabstop>downloadModels</tabstop>
</tabstops>
<resources/>
<connections>

View File

@ -157,6 +157,9 @@ void WebServer::readClient()
if (res.isValid() && (res.size() > 0))
{
QByteArray data = QByteArray::fromRawData((const char *)res.data(), res.size());
if (res.isCompressed()) {
data = qUncompress(data);
}
sendFile(socket, data, mimeType, path);
}
#endif

View File

@ -40,6 +40,9 @@ FITS::FITS(QString resourceName) :
m_fileSize = m_res.uncompressedSize();
#else
m_data = QByteArray::fromRawData((const char *)m_res.data(), m_res.size());
if (res.isCompressed()) {
m_data = qUncompress(m_data);
}
m_fileSize = m_res.size();
#endif
int hLen = std::min((qint64)m_headerSize * 3, m_fileSize); // Could possibly be bigger

View File

@ -5145,14 +5145,29 @@ void WebAPIRequestMapper::resetFeatureReport(SWGSDRangel::SWGFeatureReport& feat
{
featureReport.cleanup();
featureReport.setFeatureType(nullptr);
featureReport.setAfcReport(nullptr);
featureReport.setGs232ControllerReport(nullptr);
featureReport.setPerTesterReport(nullptr);
featureReport.setRigCtlServerReport(nullptr);
featureReport.setMapReport(nullptr);
featureReport.setSatelliteTrackerReport(nullptr);
featureReport.setSimplePttReport(nullptr);
featureReport.setStarTrackerReport(nullptr);
featureReport.setVorLocalizerReport(nullptr);
}
void WebAPIRequestMapper::resetFeatureActions(SWGSDRangel::SWGFeatureActions& featureActions)
{
featureActions.cleanup();
featureActions.setFeatureType(nullptr);
featureActions.setAfcActions(nullptr);
featureActions.setGs232ControllerActions(nullptr);
featureActions.setMapActions(nullptr);
featureActions.setPerTesterActions(nullptr);
featureActions.setRigCtlServerActions(nullptr);
featureActions.setSatelliteTrackerActions(nullptr);
featureActions.setSimplePttActions(nullptr);
featureActions.setStarTrackerActions(nullptr);
featureActions.setVorLocalizerActions(nullptr);
}

View File

@ -11,6 +11,8 @@ FeatureReport:
$ref: "http://swgserver:8081/api/swagger/include/AFC.yaml#/AFCReport"
GS232ControllerReport:
$ref: "http://swgserver:8081/api/swagger/include/GS232Controller.yaml#/GS232ControllerReport"
MapReport:
$ref: "http://swgserver:8081/api/swagger/include/Map.yaml#/MapReport"
PERTesterReport:
$ref: "http://swgserver:8081/api/swagger/include/PERTester.yaml#/PERTesterReport"
RigCtlServerReport:

View File

@ -22,6 +22,13 @@ MapSettings:
rollupState:
$ref: "http://swgserver:8081/api/swagger/include/RollupState.yaml#/RollupState"
MapReport:
description: Map
properties:
dateTime:
description: "Current date and time being displayed by 3D map"
type: string
MapActions:
description: Map
properties:

View File

@ -34,6 +34,8 @@ SWGFeatureReport::SWGFeatureReport() {
m_afc_report_isSet = false;
gs232_controller_report = nullptr;
m_gs232_controller_report_isSet = false;
map_report = nullptr;
m_map_report_isSet = false;
per_tester_report = nullptr;
m_per_tester_report_isSet = false;
rig_ctl_server_report = nullptr;
@ -60,6 +62,8 @@ SWGFeatureReport::init() {
m_afc_report_isSet = false;
gs232_controller_report = new SWGGS232ControllerReport();
m_gs232_controller_report_isSet = false;
map_report = new SWGMapReport();
m_map_report_isSet = false;
per_tester_report = new SWGPERTesterReport();
m_per_tester_report_isSet = false;
rig_ctl_server_report = new SWGRigCtlServerReport();
@ -85,6 +89,9 @@ SWGFeatureReport::cleanup() {
if(gs232_controller_report != nullptr) {
delete gs232_controller_report;
}
if(map_report != nullptr) {
delete map_report;
}
if(per_tester_report != nullptr) {
delete per_tester_report;
}
@ -122,6 +129,8 @@ SWGFeatureReport::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&gs232_controller_report, pJson["GS232ControllerReport"], "SWGGS232ControllerReport", "SWGGS232ControllerReport");
::SWGSDRangel::setValue(&map_report, pJson["MapReport"], "SWGMapReport", "SWGMapReport");
::SWGSDRangel::setValue(&per_tester_report, pJson["PERTesterReport"], "SWGPERTesterReport", "SWGPERTesterReport");
::SWGSDRangel::setValue(&rig_ctl_server_report, pJson["RigCtlServerReport"], "SWGRigCtlServerReport", "SWGRigCtlServerReport");
@ -159,6 +168,9 @@ SWGFeatureReport::asJsonObject() {
if((gs232_controller_report != nullptr) && (gs232_controller_report->isSet())){
toJsonValue(QString("GS232ControllerReport"), gs232_controller_report, obj, QString("SWGGS232ControllerReport"));
}
if((map_report != nullptr) && (map_report->isSet())){
toJsonValue(QString("MapReport"), map_report, obj, QString("SWGMapReport"));
}
if((per_tester_report != nullptr) && (per_tester_report->isSet())){
toJsonValue(QString("PERTesterReport"), per_tester_report, obj, QString("SWGPERTesterReport"));
}
@ -211,6 +223,16 @@ SWGFeatureReport::setGs232ControllerReport(SWGGS232ControllerReport* gs232_contr
this->m_gs232_controller_report_isSet = true;
}
SWGMapReport*
SWGFeatureReport::getMapReport() {
return map_report;
}
void
SWGFeatureReport::setMapReport(SWGMapReport* map_report) {
this->map_report = map_report;
this->m_map_report_isSet = true;
}
SWGPERTesterReport*
SWGFeatureReport::getPerTesterReport() {
return per_tester_report;
@ -285,6 +307,9 @@ SWGFeatureReport::isSet(){
if(gs232_controller_report && gs232_controller_report->isSet()){
isObjectUpdated = true; break;
}
if(map_report && map_report->isSet()){
isObjectUpdated = true; break;
}
if(per_tester_report && per_tester_report->isSet()){
isObjectUpdated = true; break;
}

View File

@ -24,6 +24,7 @@
#include "SWGAFCReport.h"
#include "SWGGS232ControllerReport.h"
#include "SWGMapReport.h"
#include "SWGPERTesterReport.h"
#include "SWGRigCtlServerReport.h"
#include "SWGSatelliteTrackerReport.h"
@ -59,6 +60,9 @@ public:
SWGGS232ControllerReport* getGs232ControllerReport();
void setGs232ControllerReport(SWGGS232ControllerReport* gs232_controller_report);
SWGMapReport* getMapReport();
void setMapReport(SWGMapReport* map_report);
SWGPERTesterReport* getPerTesterReport();
void setPerTesterReport(SWGPERTesterReport* per_tester_report);
@ -90,6 +94,9 @@ private:
SWGGS232ControllerReport* gs232_controller_report;
bool m_gs232_controller_report_isSet;
SWGMapReport* map_report;
bool m_map_report_isSet;
SWGPERTesterReport* per_tester_report;
bool m_per_tester_report_isSet;

View File

@ -175,6 +175,7 @@
#include "SWGMapCoordinate.h"
#include "SWGMapItem.h"
#include "SWGMapItem_2.h"
#include "SWGMapReport.h"
#include "SWGMapSettings.h"
#include "SWGMetisMISOSettings.h"
#include "SWGNFMDemodReport.h"
@ -1124,6 +1125,11 @@ namespace SWGSDRangel {
obj->init();
return obj;
}
if(QString("SWGMapReport").compare(type) == 0) {
SWGMapReport *obj = new SWGMapReport();
obj->init();
return obj;
}
if(QString("SWGMapSettings").compare(type) == 0) {
SWGMapSettings *obj = new SWGMapSettings();
obj->init();