mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-31 21:12:28 -04:00
Map: Fix Kiwi list. Add SDRangel wss support.
This commit is contained in:
parent
256b01dda4
commit
7ed73e6272
@ -40,6 +40,7 @@
|
|||||||
#include "gui/dialogpositioner.h"
|
#include "gui/dialogpositioner.h"
|
||||||
#include "device/deviceset.h"
|
#include "device/deviceset.h"
|
||||||
#include "device/deviceapi.h"
|
#include "device/deviceapi.h"
|
||||||
|
#include "channel/channelwebapiutils.h"
|
||||||
#include "dsp/devicesamplesource.h"
|
#include "dsp/devicesamplesource.h"
|
||||||
#include "device/deviceenumerator.h"
|
#include "device/deviceenumerator.h"
|
||||||
#include "util/units.h"
|
#include "util/units.h"
|
||||||
@ -55,8 +56,6 @@
|
|||||||
#include "ui_mapgui.h"
|
#include "ui_mapgui.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "mapgui.h"
|
#include "mapgui.h"
|
||||||
#include "SWGMapItem.h"
|
|
||||||
#include "SWGDeviceSettings.h"
|
|
||||||
#include "SWGKiwiSDRSettings.h"
|
#include "SWGKiwiSDRSettings.h"
|
||||||
#include "SWGRemoteTCPInputSettings.h"
|
#include "SWGRemoteTCPInputSettings.h"
|
||||||
|
|
||||||
@ -310,7 +309,6 @@ MapGUI::MapGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
|
|||||||
connect(profile, &QWebEngineProfile::downloadRequested, this, &MapGUI::downloadRequested);
|
connect(profile, &QWebEngineProfile::downloadRequested, this, &MapGUI::downloadRequested);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qDebug() << "Get station position";
|
|
||||||
// Get station position
|
// Get station position
|
||||||
float stationLatitude = MainCore::instance()->getSettings().getLatitude();
|
float stationLatitude = MainCore::instance()->getSettings().getLatitude();
|
||||||
float stationLongitude = MainCore::instance()->getSettings().getLongitude();
|
float stationLongitude = MainCore::instance()->getSettings().getLongitude();
|
||||||
@ -322,7 +320,6 @@ qDebug() << "Get station position";
|
|||||||
m_polygonMapFilter.setPosition(stationPosition);
|
m_polygonMapFilter.setPosition(stationPosition);
|
||||||
m_polylineMapFilter.setPosition(stationPosition);
|
m_polylineMapFilter.setPosition(stationPosition);
|
||||||
|
|
||||||
qDebug() << "Centre map";
|
|
||||||
// Centre map at My Position
|
// Centre map at My Position
|
||||||
QQuickItem *item = ui->map->rootObject();
|
QQuickItem *item = ui->map->rootObject();
|
||||||
QObject *object = item->findChild<QObject*>("map");
|
QObject *object = item->findChild<QObject*>("map");
|
||||||
@ -334,7 +331,6 @@ qDebug() << "Centre map";
|
|||||||
object->setProperty("center", QVariant::fromValue(coords));
|
object->setProperty("center", QVariant::fromValue(coords));
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "Creating antenna";
|
|
||||||
// Create antenna at My Position
|
// Create antenna at My Position
|
||||||
m_antennaMapItem.setName(new QString("Station"));
|
m_antennaMapItem.setName(new QString("Station"));
|
||||||
m_antennaMapItem.setLatitude(stationLatitude);
|
m_antennaMapItem.setLatitude(stationLatitude);
|
||||||
@ -770,7 +766,7 @@ void MapGUI::sdrangelServerUpdated(const QList<SDRangelServerList::SDRangelServe
|
|||||||
antenna.append(QString("Az: %1%3 El: %2%3").arg(sdr.m_azimuth).arg(sdr.m_elevation).arg(QChar(0x00b0)));
|
antenna.append(QString("Az: %1%3 El: %2%3").arg(sdr.m_azimuth).arg(sdr.m_elevation).arg(QChar(0x00b0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString text = QString("SDRangel\n\nStation: %1\nDevice: %2\nAntenna: %3\nFrequency: %4 - %5\nRemote control: %6\nUsers: %7/%8")
|
QString text = QString("%9\n\nStation: %1\nDevice: %2\nAntenna: %3\nFrequency: %4 - %5\nRemote control: %6\nUsers: %7/%8")
|
||||||
.arg(sdr.m_stationName)
|
.arg(sdr.m_stationName)
|
||||||
.arg(sdr.m_device)
|
.arg(sdr.m_device)
|
||||||
.arg(antenna.join(" - "))
|
.arg(antenna.join(" - "))
|
||||||
@ -779,11 +775,17 @@ void MapGUI::sdrangelServerUpdated(const QList<SDRangelServerList::SDRangelServe
|
|||||||
.arg(sdr.m_remoteControl ? "Yes" : "No")
|
.arg(sdr.m_remoteControl ? "Yes" : "No")
|
||||||
.arg(sdr.m_clients)
|
.arg(sdr.m_clients)
|
||||||
.arg(sdr.m_maxClients)
|
.arg(sdr.m_maxClients)
|
||||||
|
.arg(sdr.m_protocol)
|
||||||
;
|
;
|
||||||
if (sdr.m_timeLimit > 0) {
|
if (sdr.m_timeLimit > 0) {
|
||||||
text.append(QString("\nTime limit: %1 mins").arg(sdr.m_timeLimit));
|
text.append(QString("\nTime limit: %1 mins").arg(sdr.m_timeLimit));
|
||||||
}
|
}
|
||||||
QString url = QString("sdrangel-server://%1").arg(address);
|
QString url;
|
||||||
|
if (sdr.m_protocol == "SDRangel wss") {
|
||||||
|
url = QString("sdrangel-wss-server://%1").arg(address);
|
||||||
|
} else {
|
||||||
|
url = QString("sdrangel-server://%1").arg(address);
|
||||||
|
}
|
||||||
QString link = QString("<a href=%1 onclick=\"return parent.infoboxLink('%1')\">%2</a>").arg(url).arg(address);
|
QString link = QString("<a href=%1 onclick=\"return parent.infoboxLink('%1')\">%2</a>").arg(url).arg(address);
|
||||||
text.append(QString("\nURL: %1").arg(link));
|
text.append(QString("\nURL: %1").arg(link));
|
||||||
sdrangelServerMapItem.setText(new QString(text));
|
sdrangelServerMapItem.setText(new QString(text));
|
||||||
@ -803,7 +805,7 @@ void MapGUI::sdrangelServerUpdated(const QList<SDRangelServerList::SDRangelServe
|
|||||||
if (sdr.m_maxFrequency > 3000000000) {
|
if (sdr.m_maxFrequency > 3000000000) {
|
||||||
bands.append("SHF");
|
bands.append("SHF");
|
||||||
}
|
}
|
||||||
QString label = QString("SDRangel %1").arg(bands.join(" "));
|
QString label = QString("%1 %2").arg(sdr.m_protocol).arg(bands.join(" "));
|
||||||
sdrangelServerMapItem.setLabel(new QString(label));
|
sdrangelServerMapItem.setLabel(new QString(label));
|
||||||
sdrangelServerMapItem.setLabelAltitudeOffset(4.5);
|
sdrangelServerMapItem.setLabelAltitudeOffset(4.5);
|
||||||
sdrangelServerMapItem.setAltitudeReference(1);
|
sdrangelServerMapItem.setAltitudeReference(1);
|
||||||
@ -2720,120 +2722,29 @@ void MapGUI::linkClicked(const QString& url)
|
|||||||
QString spyServerURL = url.mid(21);
|
QString spyServerURL = url.mid(21);
|
||||||
openSpyServer(spyServerURL);
|
openSpyServer(spyServerURL);
|
||||||
}
|
}
|
||||||
|
else if (url.startsWith("sdrangel-wss-server://"))
|
||||||
|
{
|
||||||
|
QString sdrangelServerURL = url.mid(22);
|
||||||
|
openSDRangelServer(sdrangelServerURL, true);
|
||||||
|
}
|
||||||
else if (url.startsWith("sdrangel-server://"))
|
else if (url.startsWith("sdrangel-server://"))
|
||||||
{
|
{
|
||||||
QString sdrangelServerURL = url.mid(18);
|
QString sdrangelServerURL = url.mid(18);
|
||||||
openSDRangelServer(sdrangelServerURL);
|
openSDRangelServer(sdrangelServerURL, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapGUI::openKiwiSDRInput()
|
|
||||||
{
|
|
||||||
// Create DeviceSet
|
|
||||||
MainCore *mainCore = MainCore::instance();
|
|
||||||
unsigned int deviceSetIndex = mainCore->getDeviceSets().size();
|
|
||||||
MainCore::MsgAddDeviceSet *msg = MainCore::MsgAddDeviceSet::create(0);
|
|
||||||
mainCore->getMainMessageQueue()->push(msg);
|
|
||||||
|
|
||||||
// Switch to KiwiSDR
|
|
||||||
int nbSamplingDevices = DeviceEnumerator::instance()->getNbRxSamplingDevices();
|
|
||||||
bool found = false;
|
|
||||||
QString hwType = "KiwiSDR";
|
|
||||||
for (int i = 0; i < nbSamplingDevices; i++)
|
|
||||||
{
|
|
||||||
const PluginInterface::SamplingDevice *samplingDevice;
|
|
||||||
|
|
||||||
samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(i);
|
|
||||||
|
|
||||||
if (!hwType.isEmpty() && (hwType != samplingDevice->hardwareId)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int direction = 0;
|
|
||||||
MainCore::MsgSetDevice *msg = MainCore::MsgSetDevice::create(deviceSetIndex, i, direction);
|
|
||||||
mainCore->getMainMessageQueue()->push(msg);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
qCritical() << "MapGUI::openKiwiSDR: Failed to find KiwiSDR";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move to same workspace
|
|
||||||
//getWorkspaceIndex();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open a KiwiSDR RX device
|
// Open a KiwiSDR RX device
|
||||||
void MapGUI::openKiwiSDR(const QString& url)
|
void MapGUI::openKiwiSDR(const QString& url)
|
||||||
{
|
{
|
||||||
m_remoteDeviceAddress = url;
|
m_remoteDeviceAddress = url;
|
||||||
connect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::kiwiSDRDeviceSetAdded);
|
QStringList deviceSettingsKeys = {"serverAddress"};
|
||||||
if (!openKiwiSDRInput()) {
|
SWGSDRangel::SWGDeviceSettings *response = new SWGSDRangel::SWGDeviceSettings();
|
||||||
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::kiwiSDRDeviceSetAdded);
|
response->init();
|
||||||
}
|
SWGSDRangel::SWGKiwiSDRSettings *deviceSettings = response->getKiwiSdrSettings();
|
||||||
}
|
deviceSettings->setServerAddress(new QString(m_remoteDeviceAddress));
|
||||||
|
|
||||||
void MapGUI::kiwiSDRDeviceSetAdded(int index, DeviceAPI *device)
|
ChannelWebAPIUtils::addDevice("KiwiSDR", 0, deviceSettingsKeys, response);
|
||||||
{
|
|
||||||
(void) index;
|
|
||||||
|
|
||||||
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::kiwiSDRDeviceSetAdded);
|
|
||||||
|
|
||||||
// FIXME: Doesn't work if we do it immediately. Settings overwritten?
|
|
||||||
QTimer::singleShot(200, [=] {
|
|
||||||
// Set address setting
|
|
||||||
QStringList deviceSettingsKeys = {"serverAddress"};
|
|
||||||
SWGSDRangel::SWGDeviceSettings response;
|
|
||||||
response.init();
|
|
||||||
SWGSDRangel::SWGKiwiSDRSettings *deviceSettings = response.getKiwiSdrSettings();
|
|
||||||
deviceSettings->setServerAddress(new QString(m_remoteDeviceAddress));
|
|
||||||
QString errorMessage;
|
|
||||||
device->getSampleSource()->webapiSettingsPutPatch(false, deviceSettingsKeys, response, errorMessage);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MapGUI::openRemoteTCPInput()
|
|
||||||
{
|
|
||||||
// Create DeviceSet
|
|
||||||
MainCore *mainCore = MainCore::instance();
|
|
||||||
unsigned int deviceSetIndex = mainCore->getDeviceSets().size();
|
|
||||||
MainCore::MsgAddDeviceSet *msg = MainCore::MsgAddDeviceSet::create(0);
|
|
||||||
mainCore->getMainMessageQueue()->push(msg);
|
|
||||||
|
|
||||||
// Switch to RemoteTCPInput
|
|
||||||
int nbSamplingDevices = DeviceEnumerator::instance()->getNbRxSamplingDevices();
|
|
||||||
bool found = false;
|
|
||||||
QString hwType = "RemoteTCPInput";
|
|
||||||
for (int i = 0; i < nbSamplingDevices; i++)
|
|
||||||
{
|
|
||||||
const PluginInterface::SamplingDevice *samplingDevice;
|
|
||||||
|
|
||||||
samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(i);
|
|
||||||
|
|
||||||
if (!hwType.isEmpty() && (hwType != samplingDevice->hardwareId)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int direction = 0;
|
|
||||||
MainCore::MsgSetDevice *msg = MainCore::MsgSetDevice::create(deviceSetIndex, i, direction);
|
|
||||||
mainCore->getMainMessageQueue()->push(msg);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
qCritical() << "MapGUI::openRemoteTCPInput: Failed to find RemoteTCPInput";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move to same workspace
|
|
||||||
//getWorkspaceIndex();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open a RemoteTCPInput device to use for SpyServer
|
// Open a RemoteTCPInput device to use for SpyServer
|
||||||
@ -2842,66 +2753,36 @@ void MapGUI::openSpyServer(const QString& url)
|
|||||||
QStringList address = url.split(":");
|
QStringList address = url.split(":");
|
||||||
m_remoteDeviceAddress = address[0];
|
m_remoteDeviceAddress = address[0];
|
||||||
m_remoteDevicePort = address[1].toInt();
|
m_remoteDevicePort = address[1].toInt();
|
||||||
connect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::spyServerDeviceSetAdded);
|
|
||||||
if (!openRemoteTCPInput()) {
|
|
||||||
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::spyServerDeviceSetAdded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapGUI::spyServerDeviceSetAdded(int index, DeviceAPI *device)
|
QStringList deviceSettingsKeys = {"dataAddress", "dataPort", "protocol", "overrideRemoteSettings"};
|
||||||
{
|
SWGSDRangel::SWGDeviceSettings *response = new SWGSDRangel::SWGDeviceSettings();
|
||||||
(void) index;
|
response->init();
|
||||||
|
SWGSDRangel::SWGRemoteTCPInputSettings *deviceSettings = response->getRemoteTcpInputSettings();
|
||||||
|
deviceSettings->setDataAddress(new QString(m_remoteDeviceAddress));
|
||||||
|
deviceSettings->setDataPort(m_remoteDevicePort);
|
||||||
|
deviceSettings->setProtocol(new QString("Spy Server"));
|
||||||
|
deviceSettings->setOverrideRemoteSettings(false);
|
||||||
|
|
||||||
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::spyServerDeviceSetAdded);
|
ChannelWebAPIUtils::addDevice("RemoteTCPInput", 0, deviceSettingsKeys, response);
|
||||||
|
|
||||||
// FIXME: Doesn't work if we do it immediately. Settings overwritten?
|
|
||||||
QTimer::singleShot(200, [=] {
|
|
||||||
// Set address/port setting
|
|
||||||
QStringList deviceSettingsKeys = {"dataAddress", "dataPort", "protocol", "overrideRemoteSettings"};
|
|
||||||
SWGSDRangel::SWGDeviceSettings response;
|
|
||||||
response.init();
|
|
||||||
SWGSDRangel::SWGRemoteTCPInputSettings *deviceSettings = response.getRemoteTcpInputSettings();
|
|
||||||
deviceSettings->setDataAddress(new QString(m_remoteDeviceAddress));
|
|
||||||
deviceSettings->setDataPort(m_remoteDevicePort);
|
|
||||||
deviceSettings->setProtocol(new QString("Spy Server"));
|
|
||||||
deviceSettings->setOverrideRemoteSettings(false);
|
|
||||||
QString errorMessage;
|
|
||||||
device->getSampleSource()->webapiSettingsPutPatch(false, deviceSettingsKeys, response, errorMessage);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open a RemoteTCPInput device to use for SDRangel
|
// Open a RemoteTCPInput device to use for SDRangel
|
||||||
void MapGUI::openSDRangelServer(const QString& url)
|
void MapGUI::openSDRangelServer(const QString& url, bool wss)
|
||||||
{
|
{
|
||||||
QStringList address = url.split(":");
|
QStringList address = url.split(":");
|
||||||
m_remoteDeviceAddress = address[0];
|
m_remoteDeviceAddress = address[0];
|
||||||
m_remoteDevicePort = address[1].toInt();
|
m_remoteDevicePort = address[1].toInt();
|
||||||
connect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::sdrangelServerDeviceSetAdded);
|
|
||||||
if (!openRemoteTCPInput()) {
|
|
||||||
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::sdrangelServerDeviceSetAdded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapGUI::sdrangelServerDeviceSetAdded(int index, DeviceAPI *device)
|
QStringList deviceSettingsKeys = {"dataAddress", "dataPort", "protocol", "overrideRemoteSettings"};
|
||||||
{
|
SWGSDRangel::SWGDeviceSettings *response = new SWGSDRangel::SWGDeviceSettings();
|
||||||
(void) index;
|
response->init();
|
||||||
|
SWGSDRangel::SWGRemoteTCPInputSettings *deviceSettings = response->getRemoteTcpInputSettings();
|
||||||
|
deviceSettings->setDataAddress(new QString(m_remoteDeviceAddress));
|
||||||
|
deviceSettings->setDataPort(m_remoteDevicePort);
|
||||||
|
deviceSettings->setProtocol(new QString(wss ? "SDRangel wss" : "SDRangel"));
|
||||||
|
deviceSettings->setOverrideRemoteSettings(false);
|
||||||
|
|
||||||
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &MapGUI::sdrangelServerDeviceSetAdded);
|
ChannelWebAPIUtils::addDevice("RemoteTCPInput", 0, deviceSettingsKeys, response);
|
||||||
|
|
||||||
// FIXME: Doesn't work if we do it immediately. Settings overwritten?
|
|
||||||
QTimer::singleShot(200, [=] {
|
|
||||||
// Set address/port setting
|
|
||||||
QStringList deviceSettingsKeys = {"dataAddress", "dataPort", "protocol", "overrideRemoteSettings"};
|
|
||||||
SWGSDRangel::SWGDeviceSettings response;
|
|
||||||
response.init();
|
|
||||||
SWGSDRangel::SWGRemoteTCPInputSettings *deviceSettings = response.getRemoteTcpInputSettings();
|
|
||||||
deviceSettings->setDataAddress(new QString(m_remoteDeviceAddress));
|
|
||||||
deviceSettings->setDataPort(m_remoteDevicePort);
|
|
||||||
deviceSettings->setProtocol(new QString("SDRangel"));
|
|
||||||
deviceSettings->setOverrideRemoteSettings(false);
|
|
||||||
QString errorMessage;
|
|
||||||
device->getSampleSource()->webapiSettingsPutPatch(false, deviceSettingsKeys, response, errorMessage);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QT_WEBENGINE_FOUND
|
#ifdef QT_WEBENGINE_FOUND
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include "availablechannelorfeaturehandler.h"
|
#include "availablechannelorfeaturehandler.h"
|
||||||
|
|
||||||
#include "SWGMapItem.h"
|
#include "SWGMapItem.h"
|
||||||
|
#include "SWGDeviceSettings.h"
|
||||||
|
|
||||||
#include "mapsettings.h"
|
#include "mapsettings.h"
|
||||||
#include "mapbeacondialog.h"
|
#include "mapbeacondialog.h"
|
||||||
@ -290,11 +291,9 @@ private:
|
|||||||
void applyNASAGlobalImagerySettings();
|
void applyNASAGlobalImagerySettings();
|
||||||
void createNASAGlobalImageryView();
|
void createNASAGlobalImageryView();
|
||||||
void displayNASAMetaData();
|
void displayNASAMetaData();
|
||||||
bool openKiwiSDRInput();
|
|
||||||
bool openRemoteTCPInput();
|
|
||||||
void openKiwiSDR(const QString& url);
|
void openKiwiSDR(const QString& url);
|
||||||
void openSpyServer(const QString& url);
|
void openSpyServer(const QString& url);
|
||||||
void openSDRangelServer(const QString& url);
|
void openSDRangelServer(const QString& url, bool wss);
|
||||||
QString formatFrequency(qint64 frequency) const;
|
QString formatFrequency(qint64 frequency) const;
|
||||||
void updateGIRO(const QDateTime& mapDateTime);
|
void updateGIRO(const QDateTime& mapDateTime);
|
||||||
|
|
||||||
@ -371,11 +370,8 @@ private slots:
|
|||||||
void airportsUpdated();
|
void airportsUpdated();
|
||||||
void waypointsUpdated();
|
void waypointsUpdated();
|
||||||
void kiwiSDRUpdated(const QList<KiwiSDRList::KiwiSDR>& sdrs);
|
void kiwiSDRUpdated(const QList<KiwiSDRList::KiwiSDR>& sdrs);
|
||||||
void kiwiSDRDeviceSetAdded(int index, DeviceAPI *device);
|
|
||||||
void spyServerUpdated(const QList<SpyServerList::SpyServer>& sdrs);
|
void spyServerUpdated(const QList<SpyServerList::SpyServer>& sdrs);
|
||||||
void spyServerDeviceSetAdded(int index, DeviceAPI *device);
|
|
||||||
void sdrangelServerUpdated(const QList<SDRangelServerList::SDRangelServer>& sdrs);
|
void sdrangelServerUpdated(const QList<SDRangelServerList::SDRangelServer>& sdrs);
|
||||||
void sdrangelServerDeviceSetAdded(int index, DeviceAPI *device);
|
|
||||||
void linkClicked(const QString& url);
|
void linkClicked(const QString& url);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "maincore.h"
|
#include "maincore.h"
|
||||||
#include "device/deviceset.h"
|
#include "device/deviceset.h"
|
||||||
#include "device/deviceapi.h"
|
#include "device/deviceapi.h"
|
||||||
|
#include "device/deviceenumerator.h"
|
||||||
#include "channel/channelapi.h"
|
#include "channel/channelapi.h"
|
||||||
#include "channel/channelutils.h"
|
#include "channel/channelutils.h"
|
||||||
#include "dsp/devicesamplesource.h"
|
#include "dsp/devicesamplesource.h"
|
||||||
@ -1953,3 +1954,87 @@ bool ChannelWebAPIUtils::addChannel(unsigned int deviceSetIndex, const QString&
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// response will be deleted after device is opened.
|
||||||
|
bool ChannelWebAPIUtils::addDevice(const QString hwType, int direction, const QStringList& settingsKeys, SWGSDRangel::SWGDeviceSettings *response)
|
||||||
|
{
|
||||||
|
return DeviceOpener::open(hwType, direction, settingsKeys, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceOpener::DeviceOpener(int deviceIndex, int direction, const QStringList& settingsKeys, SWGSDRangel::SWGDeviceSettings *response) :
|
||||||
|
m_deviceIndex(deviceIndex),
|
||||||
|
m_direction(direction),
|
||||||
|
m_settingsKeys(settingsKeys),
|
||||||
|
m_response(response),
|
||||||
|
m_device(nullptr)
|
||||||
|
{
|
||||||
|
connect(MainCore::instance(), &MainCore::deviceSetAdded, this, &DeviceOpener::deviceSetAdded);
|
||||||
|
// Create DeviceSet
|
||||||
|
MainCore *mainCore = MainCore::instance();
|
||||||
|
m_deviceSetIndex = mainCore->getDeviceSets().size();
|
||||||
|
MainCore::MsgAddDeviceSet *msg = MainCore::MsgAddDeviceSet::create(m_direction);
|
||||||
|
mainCore->getMainMessageQueue()->push(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceOpener::deviceSetAdded(int index, DeviceAPI *device)
|
||||||
|
{
|
||||||
|
if (index == m_deviceSetIndex)
|
||||||
|
{
|
||||||
|
disconnect(MainCore::instance(), &MainCore::deviceSetAdded, this, &DeviceOpener::deviceSetAdded);
|
||||||
|
|
||||||
|
m_device = device;
|
||||||
|
// Set the correct device type
|
||||||
|
MainCore::MsgSetDevice *msg = MainCore::MsgSetDevice::create(m_deviceSetIndex, m_deviceIndex, m_direction);
|
||||||
|
MainCore::instance()->getMainMessageQueue()->push(msg);
|
||||||
|
// Wait until device has initialised - FIXME: Better way to do this other than polling?
|
||||||
|
m_timer.setInterval(250);
|
||||||
|
connect(&m_timer, &QTimer::timeout, this, &DeviceOpener::checkInitialised);
|
||||||
|
m_timer.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceOpener::checkInitialised()
|
||||||
|
{
|
||||||
|
if (m_device && m_device->getSampleSource() && (m_device->state() >= DeviceAPI::EngineState::StIdle))
|
||||||
|
{
|
||||||
|
m_timer.stop();
|
||||||
|
|
||||||
|
QString errorMessage;
|
||||||
|
if (200 != m_device->getSampleSource()->webapiSettingsPutPatch(false, m_settingsKeys, *m_response, errorMessage)) {
|
||||||
|
qDebug() << "DeviceOpener::checkInitialised: webapiSettingsPutPatch failed: " << errorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete m_response;
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceOpener::open(const QString hwType, int direction, const QStringList& settingsKeys, SWGSDRangel::SWGDeviceSettings *response)
|
||||||
|
{
|
||||||
|
if (direction) {
|
||||||
|
return false; // FIXME: Only RX support for now
|
||||||
|
}
|
||||||
|
|
||||||
|
int nbSamplingDevices = DeviceEnumerator::instance()->getNbRxSamplingDevices();
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < nbSamplingDevices; i++)
|
||||||
|
{
|
||||||
|
const PluginInterface::SamplingDevice *samplingDevice;
|
||||||
|
|
||||||
|
samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(i);
|
||||||
|
|
||||||
|
if (!hwType.isEmpty() && (hwType != samplingDevice->hardwareId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
new DeviceOpener(i, direction, settingsKeys, response);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
qCritical() << "DeviceOpener::open: Failed to find device with hwType " << hwType;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include "SWGDeviceSettings.h"
|
#include "SWGDeviceSettings.h"
|
||||||
#include "SWGDeviceReport.h"
|
#include "SWGDeviceReport.h"
|
||||||
@ -36,6 +37,28 @@
|
|||||||
class DeviceSet;
|
class DeviceSet;
|
||||||
class Feature;
|
class Feature;
|
||||||
class ChannelAPI;
|
class ChannelAPI;
|
||||||
|
class DeviceAPI;
|
||||||
|
|
||||||
|
// Use ChannelWebAPIUtils::addDevice rather than this directly
|
||||||
|
class DeviceOpener : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
protected:
|
||||||
|
DeviceOpener(int deviceIndex, int direction, const QStringList& settingsKeys, SWGSDRangel::SWGDeviceSettings *response);
|
||||||
|
private:
|
||||||
|
int m_deviceIndex;
|
||||||
|
int m_direction;
|
||||||
|
int m_deviceSetIndex;
|
||||||
|
QStringList m_settingsKeys;
|
||||||
|
SWGSDRangel::SWGDeviceSettings *m_response;
|
||||||
|
DeviceAPI *m_device;
|
||||||
|
QTimer m_timer;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void deviceSetAdded(int index, DeviceAPI *device);
|
||||||
|
void checkInitialised();
|
||||||
|
public:
|
||||||
|
static bool open(const QString hwType, int direction, const QStringList& settingsKeys, SWGSDRangel::SWGDeviceSettings *response);
|
||||||
|
};
|
||||||
|
|
||||||
class SDRBASE_API ChannelWebAPIUtils
|
class SDRBASE_API ChannelWebAPIUtils
|
||||||
{
|
{
|
||||||
@ -103,6 +126,7 @@ public:
|
|||||||
static bool getChannelSettings(ChannelAPI *channel, SWGSDRangel::SWGChannelSettings &channelSettingsResponse);
|
static bool getChannelSettings(ChannelAPI *channel, SWGSDRangel::SWGChannelSettings &channelSettingsResponse);
|
||||||
static bool getChannelReport(unsigned int deviceIndex, unsigned int channelIndex, SWGSDRangel::SWGChannelReport &channelReport);
|
static bool getChannelReport(unsigned int deviceIndex, unsigned int channelIndex, SWGSDRangel::SWGChannelReport &channelReport);
|
||||||
static bool addChannel(unsigned int deviceSetIndex, const QString& uri, int direction);
|
static bool addChannel(unsigned int deviceSetIndex, const QString& uri, int direction);
|
||||||
|
static bool addDevice(const QString hwType, int direction, const QStringList& settingsKeys, SWGSDRangel::SWGDeviceSettings *response);
|
||||||
protected:
|
protected:
|
||||||
static QString getDeviceHardwareId(unsigned int deviceIndex);
|
static QString getDeviceHardwareId(unsigned int deviceIndex);
|
||||||
};
|
};
|
||||||
|
@ -97,6 +97,11 @@ void KiwiSDRList::handleHTML(const QString& url, const QByteArray& bytes)
|
|||||||
|
|
||||||
QList<KiwiSDR> sdrs;
|
QList<KiwiSDR> sdrs;
|
||||||
QString html(bytes);
|
QString html(bytes);
|
||||||
|
|
||||||
|
// Strip nested divs, as the following div regexp can't handle them
|
||||||
|
QRegularExpression divName("<div class='cl-name'>(.*?)<\\/div>", QRegularExpression::DotMatchesEverythingOption);
|
||||||
|
html.replace(divName, "\\1");
|
||||||
|
|
||||||
QRegularExpression div("<div class='cl-info'>(.*?)<\\/div>", QRegularExpression::DotMatchesEverythingOption);
|
QRegularExpression div("<div class='cl-info'>(.*?)<\\/div>", QRegularExpression::DotMatchesEverythingOption);
|
||||||
QRegularExpressionMatchIterator divItr = div.globalMatch(html);
|
QRegularExpressionMatchIterator divItr = div.globalMatch(html);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user