2020-10-27 12:22:10 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Copyright (C) 2020 Jon Beniston, M7RCE //
|
|
|
|
// Copyright (C) 2020 Edouard Griffiths, F4EXB //
|
|
|
|
// //
|
|
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
|
|
// it under the terms of the GNU General Public License as published by //
|
|
|
|
// the Free Software Foundation as version 3 of the License, or //
|
|
|
|
// (at your option) any later version. //
|
|
|
|
// //
|
|
|
|
// This program is distributed in the hope that it will be useful, //
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
|
|
// GNU General Public License V3 for more details. //
|
|
|
|
// //
|
|
|
|
// You should have received a copy of the GNU General Public License //
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2021-10-12 07:10:12 -04:00
|
|
|
#include <cmath>
|
|
|
|
|
2020-10-27 12:22:10 -04:00
|
|
|
#include <QDebug>
|
|
|
|
#include <QNetworkAccessManager>
|
|
|
|
#include <QNetworkReply>
|
|
|
|
#include <QBuffer>
|
2021-10-03 20:11:27 -04:00
|
|
|
#include <QSerialPortInfo>
|
2020-10-27 12:22:10 -04:00
|
|
|
|
|
|
|
#include "SWGFeatureSettings.h"
|
|
|
|
#include "SWGFeatureReport.h"
|
|
|
|
#include "SWGFeatureActions.h"
|
|
|
|
#include "SWGDeviceState.h"
|
2021-01-13 14:44:53 -05:00
|
|
|
#include "SWGTargetAzimuthElevation.h"
|
2020-10-27 12:22:10 -04:00
|
|
|
|
|
|
|
#include "dsp/dspengine.h"
|
2021-01-13 14:44:53 -05:00
|
|
|
#include "device/deviceset.h"
|
|
|
|
#include "feature/featureset.h"
|
|
|
|
#include "maincore.h"
|
2020-10-27 12:22:10 -04:00
|
|
|
|
|
|
|
#include "gs232controller.h"
|
2021-01-13 14:44:53 -05:00
|
|
|
#include "gs232controllerworker.h"
|
|
|
|
#include "gs232controllerreport.h"
|
2020-10-27 12:22:10 -04:00
|
|
|
|
|
|
|
MESSAGE_CLASS_DEFINITION(GS232Controller::MsgConfigureGS232Controller, Message)
|
|
|
|
MESSAGE_CLASS_DEFINITION(GS232Controller::MsgStartStop, Message)
|
2021-01-13 14:44:53 -05:00
|
|
|
MESSAGE_CLASS_DEFINITION(GS232Controller::MsgReportWorker, Message)
|
2020-10-27 12:22:10 -04:00
|
|
|
|
2020-11-21 14:24:18 -05:00
|
|
|
const char* const GS232Controller::m_featureIdURI = "sdrangel.feature.gs232controller";
|
|
|
|
const char* const GS232Controller::m_featureId = "GS232Controller";
|
2020-10-27 12:22:10 -04:00
|
|
|
|
|
|
|
GS232Controller::GS232Controller(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
2021-01-13 14:44:53 -05:00
|
|
|
Feature(m_featureIdURI, webAPIAdapterInterface)
|
2020-10-27 12:22:10 -04:00
|
|
|
{
|
|
|
|
qDebug("GS232Controller::GS232Controller: webAPIAdapterInterface: %p", webAPIAdapterInterface);
|
|
|
|
setObjectName(m_featureId);
|
2021-01-13 14:44:53 -05:00
|
|
|
m_worker = new GS232ControllerWorker();
|
2021-11-25 04:28:59 -05:00
|
|
|
m_worker->moveToThread(&m_thread);
|
2020-10-27 12:22:10 -04:00
|
|
|
m_state = StIdle;
|
|
|
|
m_errorMessage = "GS232Controller error";
|
2021-01-13 14:44:53 -05:00
|
|
|
m_selectedPipe = nullptr;
|
|
|
|
connect(&m_updatePipesTimer, SIGNAL(timeout()), this, SLOT(updatePipes()));
|
|
|
|
m_updatePipesTimer.start(1000);
|
2021-01-15 06:24:21 -05:00
|
|
|
m_networkManager = new QNetworkAccessManager();
|
|
|
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
GS232Controller::~GS232Controller()
|
|
|
|
{
|
2021-01-15 06:24:21 -05:00
|
|
|
disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
|
|
|
delete m_networkManager;
|
2020-10-27 12:22:10 -04:00
|
|
|
if (m_worker->isRunning()) {
|
|
|
|
stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
delete m_worker;
|
|
|
|
}
|
|
|
|
|
|
|
|
void GS232Controller::start()
|
|
|
|
{
|
|
|
|
qDebug("GS232Controller::start");
|
|
|
|
|
|
|
|
m_worker->reset();
|
|
|
|
m_worker->setMessageQueueToFeature(getInputMessageQueue());
|
|
|
|
bool ok = m_worker->startWork();
|
|
|
|
m_state = ok ? StRunning : StError;
|
|
|
|
m_thread.start();
|
|
|
|
|
|
|
|
GS232ControllerWorker::MsgConfigureGS232ControllerWorker *msg = GS232ControllerWorker::MsgConfigureGS232ControllerWorker::create(m_settings, true);
|
|
|
|
m_worker->getInputMessageQueue()->push(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
void GS232Controller::stop()
|
|
|
|
{
|
|
|
|
qDebug("GS232Controller::stop");
|
|
|
|
m_worker->stopWork();
|
|
|
|
m_state = StIdle;
|
|
|
|
m_thread.quit();
|
|
|
|
m_thread.wait();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool GS232Controller::handleMessage(const Message& cmd)
|
|
|
|
{
|
|
|
|
if (MsgConfigureGS232Controller::match(cmd))
|
|
|
|
{
|
|
|
|
MsgConfigureGS232Controller& cfg = (MsgConfigureGS232Controller&) cmd;
|
|
|
|
qDebug() << "GS232Controller::handleMessage: MsgConfigureGS232Controller";
|
|
|
|
applySettings(cfg.getSettings(), cfg.getForce());
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (MsgStartStop::match(cmd))
|
|
|
|
{
|
|
|
|
MsgStartStop& cfg = (MsgStartStop&) cmd;
|
|
|
|
qDebug() << "GS232Controller::handleMessage: MsgStartStop: start:" << cfg.getStartStop();
|
|
|
|
|
|
|
|
if (cfg.getStartStop()) {
|
|
|
|
start();
|
|
|
|
} else {
|
|
|
|
stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2021-01-13 14:44:53 -05:00
|
|
|
else if (MsgReportWorker::match(cmd))
|
2020-10-27 12:22:10 -04:00
|
|
|
{
|
2021-01-13 14:44:53 -05:00
|
|
|
MsgReportWorker& report = (MsgReportWorker&) cmd;
|
|
|
|
if (report.getMessage() == "Connected")
|
|
|
|
m_state = StRunning;
|
|
|
|
else if (report.getMessage() == "Disconnected")
|
|
|
|
m_state = StIdle;
|
|
|
|
else
|
2020-10-27 12:22:10 -04:00
|
|
|
{
|
2021-01-13 14:44:53 -05:00
|
|
|
m_state = StError;
|
|
|
|
m_errorMessage = report.getMessage();
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2021-10-05 09:03:31 -04:00
|
|
|
else if (GS232ControllerReport::MsgReportAzAl::match(cmd))
|
|
|
|
{
|
|
|
|
GS232ControllerReport::MsgReportAzAl& report = (GS232ControllerReport::MsgReportAzAl&) cmd;
|
|
|
|
// Save state for Web report/getOnTarget
|
|
|
|
m_currentAzimuth = report.getAzimuth();
|
|
|
|
m_currentElevation = report.getElevation();
|
|
|
|
// Forward to GUI
|
|
|
|
if (getMessageQueueToGUI()) {
|
|
|
|
getMessageQueueToGUI()->push(new GS232ControllerReport::MsgReportAzAl(report));
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2021-01-13 14:44:53 -05:00
|
|
|
else if (MainCore::MsgTargetAzimuthElevation::match(cmd))
|
|
|
|
{
|
2021-10-03 17:15:15 -04:00
|
|
|
// New source from another plugin
|
2021-01-13 14:44:53 -05:00
|
|
|
if ((m_state == StRunning) && m_settings.m_track)
|
|
|
|
{
|
|
|
|
MainCore::MsgTargetAzimuthElevation& msg = (MainCore::MsgTargetAzimuthElevation&) cmd;
|
|
|
|
// Is it from the selected pipe?
|
|
|
|
if (msg.getPipeSource() == m_selectedPipe)
|
|
|
|
{
|
|
|
|
if (getMessageQueueToGUI())
|
|
|
|
{
|
|
|
|
// Forward to GUI - which will then send us updated settings
|
|
|
|
getMessageQueueToGUI()->push(new MainCore::MsgTargetAzimuthElevation(msg));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-10-03 17:15:15 -04:00
|
|
|
// No GUI, so save source - applySettings will propagate to worker
|
2021-01-13 14:44:53 -05:00
|
|
|
SWGSDRangel::SWGTargetAzimuthElevation *swgTarget = msg.getSWGTargetAzimuthElevation();
|
|
|
|
m_settings.m_azimuth = swgTarget->getAzimuth();
|
|
|
|
m_settings.m_elevation = swgTarget->getElevation();
|
|
|
|
applySettings(m_settings);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
qDebug() << "GS232Controller::handleMessage: No match " << msg.getPipeSource() << " " << m_selectedPipe;
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-05 09:03:31 -04:00
|
|
|
// Calculate whether last received az/el was on target
|
|
|
|
bool GS232Controller::getOnTarget() const
|
|
|
|
{
|
|
|
|
float targetAziumth, targetElevation;
|
|
|
|
m_settings.calcTargetAzEl(targetAziumth, targetElevation);
|
2021-10-12 07:10:12 -04:00
|
|
|
float readTolerance = m_settings.m_tolerance + 0.0f;
|
|
|
|
bool onTarget = (std::fabs(m_currentAzimuth - targetAziumth) < readTolerance)
|
|
|
|
&& (std::fabs(m_currentElevation - targetElevation) < readTolerance);
|
2021-10-05 09:03:31 -04:00
|
|
|
return onTarget;
|
|
|
|
}
|
|
|
|
|
2021-01-13 14:44:53 -05:00
|
|
|
void GS232Controller::updatePipes()
|
|
|
|
{
|
2021-10-05 09:03:31 -04:00
|
|
|
QList<AvailablePipeSource> availablePipes = updateAvailablePipeSources("target", GS232ControllerSettings::m_pipeTypes, GS232ControllerSettings::m_pipeURIs, this);
|
2021-01-13 14:44:53 -05:00
|
|
|
|
|
|
|
if (availablePipes != m_availablePipes)
|
|
|
|
{
|
|
|
|
m_availablePipes = availablePipes;
|
2021-10-03 17:15:15 -04:00
|
|
|
|
2021-01-13 14:44:53 -05:00
|
|
|
if (getMessageQueueToGUI())
|
|
|
|
{
|
|
|
|
MsgReportPipes *msgToGUI = MsgReportPipes::create();
|
|
|
|
QList<AvailablePipeSource>& msgAvailablePipes = msgToGUI->getAvailablePipes();
|
|
|
|
msgAvailablePipes.append(availablePipes);
|
|
|
|
getMessageQueueToGUI()->push(msgToGUI);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-27 12:22:10 -04:00
|
|
|
QByteArray GS232Controller::serialize() const
|
|
|
|
{
|
|
|
|
return m_settings.serialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool GS232Controller::deserialize(const QByteArray& data)
|
|
|
|
{
|
|
|
|
if (m_settings.deserialize(data))
|
|
|
|
{
|
|
|
|
MsgConfigureGS232Controller *msg = MsgConfigureGS232Controller::create(m_settings, true);
|
|
|
|
m_inputMessageQueue.push(msg);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_settings.resetToDefaults();
|
|
|
|
MsgConfigureGS232Controller *msg = MsgConfigureGS232Controller::create(m_settings, true);
|
|
|
|
m_inputMessageQueue.push(msg);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void GS232Controller::applySettings(const GS232ControllerSettings& settings, bool force)
|
|
|
|
{
|
|
|
|
qDebug() << "GS232Controller::applySettings:"
|
|
|
|
<< " m_azimuth: " << settings.m_azimuth
|
|
|
|
<< " m_elevation: " << settings.m_elevation
|
2021-02-26 15:27:35 -05:00
|
|
|
<< " m_azimuthOffset: " << settings.m_azimuthOffset
|
|
|
|
<< " m_elevationOffset: " << settings.m_elevationOffset
|
|
|
|
<< " m_azimuthMin: " << settings.m_azimuthMin
|
|
|
|
<< " m_azimuthMax: " << settings.m_azimuthMax
|
|
|
|
<< " m_elevationMin: " << settings.m_elevationMin
|
|
|
|
<< " m_elevationMax: " << settings.m_elevationMax
|
2021-05-30 07:38:07 -04:00
|
|
|
<< " m_tolerance: " << settings.m_tolerance
|
|
|
|
<< " m_protocol: " << settings.m_protocol
|
2020-10-27 12:22:10 -04:00
|
|
|
<< " m_serialPort: " << settings.m_serialPort
|
|
|
|
<< " m_baudRate: " << settings.m_baudRate
|
2021-11-23 07:28:06 -05:00
|
|
|
<< " m_host: " << settings.m_host
|
|
|
|
<< " m_port: " << settings.m_port
|
2020-10-27 12:22:10 -04:00
|
|
|
<< " m_track: " << settings.m_track
|
2021-10-03 17:15:15 -04:00
|
|
|
<< " m_source: " << settings.m_source
|
2020-10-27 12:22:10 -04:00
|
|
|
<< " m_title: " << settings.m_title
|
|
|
|
<< " m_rgbColor: " << settings.m_rgbColor
|
|
|
|
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
|
|
|
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
|
|
|
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
|
|
|
|
<< " m_reverseAPIFeatureSetIndex: " << settings.m_reverseAPIFeatureSetIndex
|
|
|
|
<< " m_reverseAPIFeatureIndex: " << settings.m_reverseAPIFeatureIndex
|
|
|
|
<< " force: " << force;
|
|
|
|
|
|
|
|
QList<QString> reverseAPIKeys;
|
|
|
|
|
|
|
|
if ((m_settings.m_azimuth != settings.m_azimuth) || force) {
|
|
|
|
reverseAPIKeys.append("azimuth");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_elevation != settings.m_elevation) || force) {
|
|
|
|
reverseAPIKeys.append("elevation");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_serialPort != settings.m_serialPort) || force) {
|
|
|
|
reverseAPIKeys.append("serialPort");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_baudRate != settings.m_baudRate) || force) {
|
|
|
|
reverseAPIKeys.append("baudRate");
|
|
|
|
}
|
2021-11-23 07:28:06 -05:00
|
|
|
if ((m_settings.m_host != settings.m_host) || force) {
|
|
|
|
reverseAPIKeys.append("host");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_port != settings.m_port) || force) {
|
|
|
|
reverseAPIKeys.append("port");
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
if ((m_settings.m_track != settings.m_track) || force) {
|
|
|
|
reverseAPIKeys.append("track");
|
|
|
|
}
|
2021-10-03 17:15:15 -04:00
|
|
|
if ((m_settings.m_source != settings.m_source)
|
|
|
|
|| (!settings.m_source.isEmpty() && (m_selectedPipe == nullptr)) // Change in available pipes
|
2021-01-13 14:44:53 -05:00
|
|
|
|| force)
|
|
|
|
{
|
2021-10-03 17:15:15 -04:00
|
|
|
if (!settings.m_source.isEmpty())
|
2021-01-13 14:44:53 -05:00
|
|
|
{
|
2021-10-03 17:15:15 -04:00
|
|
|
m_selectedPipe = getPipeEndPoint(settings.m_source, m_availablePipes);
|
|
|
|
|
|
|
|
if (m_selectedPipe == nullptr) {
|
|
|
|
qDebug() << "GS232Controller::applySettings: No plugin corresponding to source " << settings.m_source;
|
|
|
|
}
|
2021-01-13 14:44:53 -05:00
|
|
|
}
|
|
|
|
|
2021-10-03 17:15:15 -04:00
|
|
|
reverseAPIKeys.append("source");
|
2021-01-13 14:44:53 -05:00
|
|
|
}
|
|
|
|
if ((m_settings.m_azimuthOffset != settings.m_azimuthOffset) || force) {
|
|
|
|
reverseAPIKeys.append("azimuthOffset");
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-01-13 14:44:53 -05:00
|
|
|
if ((m_settings.m_elevationOffset != settings.m_elevationOffset) || force) {
|
|
|
|
reverseAPIKeys.append("elevationOffset");
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-02-26 15:27:35 -05:00
|
|
|
if ((m_settings.m_azimuthMin != settings.m_azimuthMin) || force) {
|
|
|
|
reverseAPIKeys.append("azimuthMin");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_azimuthMax != settings.m_azimuthMax) || force) {
|
|
|
|
reverseAPIKeys.append("azimuthMax");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_elevationMin != settings.m_elevationMin) || force) {
|
|
|
|
reverseAPIKeys.append("elevationMin");
|
|
|
|
}
|
2021-05-30 07:38:07 -04:00
|
|
|
if ((m_settings.m_tolerance != settings.m_tolerance) || force) {
|
|
|
|
reverseAPIKeys.append("tolerance");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_protocol != settings.m_protocol) || force) {
|
|
|
|
reverseAPIKeys.append("m_protocol");
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
if ((m_settings.m_title != settings.m_title) || force) {
|
|
|
|
reverseAPIKeys.append("title");
|
|
|
|
}
|
|
|
|
if ((m_settings.m_rgbColor != settings.m_rgbColor) || force) {
|
|
|
|
reverseAPIKeys.append("rgbColor");
|
|
|
|
}
|
|
|
|
|
|
|
|
GS232ControllerWorker::MsgConfigureGS232ControllerWorker *msg = GS232ControllerWorker::MsgConfigureGS232ControllerWorker::create(
|
|
|
|
settings, force
|
|
|
|
);
|
|
|
|
m_worker->getInputMessageQueue()->push(msg);
|
|
|
|
|
|
|
|
if (settings.m_useReverseAPI)
|
|
|
|
{
|
|
|
|
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
|
|
|
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
|
|
|
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
|
|
|
(m_settings.m_reverseAPIFeatureSetIndex != settings.m_reverseAPIFeatureSetIndex) ||
|
|
|
|
(m_settings.m_reverseAPIFeatureIndex != settings.m_reverseAPIFeatureIndex);
|
|
|
|
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
|
|
|
}
|
|
|
|
|
|
|
|
m_settings = settings;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GS232Controller::webapiRun(bool run,
|
|
|
|
SWGSDRangel::SWGDeviceState& response,
|
|
|
|
QString& errorMessage)
|
|
|
|
{
|
2020-11-14 05:13:32 -05:00
|
|
|
(void) errorMessage;
|
2020-10-27 12:22:10 -04:00
|
|
|
getFeatureStateStr(*response.getState());
|
|
|
|
MsgStartStop *msg = MsgStartStop::create(run);
|
|
|
|
getInputMessageQueue()->push(msg);
|
|
|
|
return 202;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GS232Controller::webapiSettingsGet(
|
|
|
|
SWGSDRangel::SWGFeatureSettings& response,
|
|
|
|
QString& errorMessage)
|
|
|
|
{
|
|
|
|
(void) errorMessage;
|
|
|
|
response.setGs232ControllerSettings(new SWGSDRangel::SWGGS232ControllerSettings());
|
|
|
|
response.getGs232ControllerSettings()->init();
|
|
|
|
webapiFormatFeatureSettings(response, m_settings);
|
|
|
|
return 200;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GS232Controller::webapiSettingsPutPatch(
|
|
|
|
bool force,
|
|
|
|
const QStringList& featureSettingsKeys,
|
|
|
|
SWGSDRangel::SWGFeatureSettings& response,
|
|
|
|
QString& errorMessage)
|
|
|
|
{
|
|
|
|
(void) errorMessage;
|
|
|
|
GS232ControllerSettings settings = m_settings;
|
|
|
|
webapiUpdateFeatureSettings(settings, featureSettingsKeys, response);
|
|
|
|
|
|
|
|
MsgConfigureGS232Controller *msg = MsgConfigureGS232Controller::create(settings, force);
|
|
|
|
m_inputMessageQueue.push(msg);
|
|
|
|
|
|
|
|
if (m_guiMessageQueue) // forward to GUI if any
|
|
|
|
{
|
|
|
|
MsgConfigureGS232Controller *msgToGUI = MsgConfigureGS232Controller::create(settings, force);
|
|
|
|
m_guiMessageQueue->push(msgToGUI);
|
|
|
|
}
|
|
|
|
|
|
|
|
webapiFormatFeatureSettings(response, settings);
|
|
|
|
|
|
|
|
return 200;
|
|
|
|
}
|
|
|
|
|
2021-10-03 17:15:15 -04:00
|
|
|
int GS232Controller::webapiReportGet(
|
|
|
|
SWGSDRangel::SWGFeatureReport& response,
|
|
|
|
QString& errorMessage)
|
|
|
|
{
|
|
|
|
(void) errorMessage;
|
|
|
|
response.setGs232ControllerReport(new SWGSDRangel::SWGGS232ControllerReport());
|
|
|
|
response.getGs232ControllerReport()->init();
|
|
|
|
webapiFormatFeatureReport(response);
|
|
|
|
return 200;
|
|
|
|
}
|
|
|
|
|
2021-10-21 20:01:33 -04:00
|
|
|
int GS232Controller::webapiActionsPost(
|
|
|
|
const QStringList& featureActionsKeys,
|
|
|
|
SWGSDRangel::SWGFeatureActions& query,
|
|
|
|
QString& errorMessage)
|
|
|
|
{
|
|
|
|
SWGSDRangel::SWGGS232ControllerActions *swgGS232ControllerActions = query.getGs232ControllerActions();
|
|
|
|
|
|
|
|
if (swgGS232ControllerActions)
|
|
|
|
{
|
|
|
|
if (featureActionsKeys.contains("run"))
|
|
|
|
{
|
|
|
|
bool featureRun = swgGS232ControllerActions->getRun() != 0;
|
|
|
|
MsgStartStop *msg = MsgStartStop::create(featureRun);
|
|
|
|
getInputMessageQueue()->push(msg);
|
|
|
|
return 202;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
errorMessage = "Unknown action";
|
|
|
|
return 400;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
errorMessage = "Missing GS232ControllerActions in query";
|
|
|
|
return 400;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-27 12:22:10 -04:00
|
|
|
void GS232Controller::webapiFormatFeatureSettings(
|
|
|
|
SWGSDRangel::SWGFeatureSettings& response,
|
|
|
|
const GS232ControllerSettings& settings)
|
|
|
|
{
|
|
|
|
response.getGs232ControllerSettings()->setAzimuth(settings.m_azimuth);
|
|
|
|
response.getGs232ControllerSettings()->setElevation(settings.m_elevation);
|
|
|
|
response.getGs232ControllerSettings()->setSerialPort(new QString(settings.m_serialPort));
|
|
|
|
response.getGs232ControllerSettings()->setBaudRate(settings.m_baudRate);
|
2021-11-23 07:28:06 -05:00
|
|
|
response.getGs232ControllerSettings()->setHost(new QString(settings.m_host));
|
|
|
|
response.getGs232ControllerSettings()->setPort(settings.m_port);
|
2020-10-27 12:22:10 -04:00
|
|
|
response.getGs232ControllerSettings()->setTrack(settings.m_track);
|
2021-10-03 17:15:15 -04:00
|
|
|
response.getGs232ControllerSettings()->setSource(new QString(settings.m_source));
|
2021-01-13 14:44:53 -05:00
|
|
|
response.getGs232ControllerSettings()->setAzimuthOffset(settings.m_azimuthOffset);
|
|
|
|
response.getGs232ControllerSettings()->setElevationOffset(settings.m_elevationOffset);
|
2021-02-26 15:27:35 -05:00
|
|
|
response.getGs232ControllerSettings()->setAzimuthMin(settings.m_azimuthMin);
|
|
|
|
response.getGs232ControllerSettings()->setAzimuthMax(settings.m_azimuthMax);
|
|
|
|
response.getGs232ControllerSettings()->setElevationMin(settings.m_elevationMin);
|
|
|
|
response.getGs232ControllerSettings()->setElevationMax(settings.m_elevationMax);
|
2021-05-30 07:38:07 -04:00
|
|
|
response.getGs232ControllerSettings()->setTolerance(settings.m_tolerance);
|
|
|
|
response.getGs232ControllerSettings()->setProtocol(settings.m_protocol);
|
2020-10-27 12:22:10 -04:00
|
|
|
|
|
|
|
if (response.getGs232ControllerSettings()->getTitle()) {
|
|
|
|
*response.getGs232ControllerSettings()->getTitle() = settings.m_title;
|
|
|
|
} else {
|
|
|
|
response.getGs232ControllerSettings()->setTitle(new QString(settings.m_title));
|
|
|
|
}
|
|
|
|
|
|
|
|
response.getGs232ControllerSettings()->setRgbColor(settings.m_rgbColor);
|
|
|
|
response.getGs232ControllerSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
|
|
|
|
|
|
|
|
if (response.getGs232ControllerSettings()->getReverseApiAddress()) {
|
|
|
|
*response.getGs232ControllerSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
|
|
|
|
} else {
|
|
|
|
response.getGs232ControllerSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
|
|
|
|
}
|
|
|
|
|
|
|
|
response.getGs232ControllerSettings()->setReverseApiPort(settings.m_reverseAPIPort);
|
2021-10-03 20:11:27 -04:00
|
|
|
response.getGs232ControllerSettings()->setReverseApiFeatureSetIndex(settings.m_reverseAPIFeatureSetIndex);
|
|
|
|
response.getGs232ControllerSettings()->setReverseApiFeatureIndex(settings.m_reverseAPIFeatureIndex);
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void GS232Controller::webapiUpdateFeatureSettings(
|
|
|
|
GS232ControllerSettings& settings,
|
|
|
|
const QStringList& featureSettingsKeys,
|
|
|
|
SWGSDRangel::SWGFeatureSettings& response)
|
|
|
|
{
|
|
|
|
if (featureSettingsKeys.contains("azimuth")) {
|
|
|
|
settings.m_azimuth = response.getGs232ControllerSettings()->getAzimuth();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("elevation")) {
|
|
|
|
settings.m_elevation = response.getGs232ControllerSettings()->getElevation();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("serialPort")) {
|
|
|
|
settings.m_serialPort = *response.getGs232ControllerSettings()->getSerialPort();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("baudRate")) {
|
2021-10-03 20:11:27 -04:00
|
|
|
settings.m_baudRate = response.getGs232ControllerSettings()->getBaudRate();
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-11-23 07:28:06 -05:00
|
|
|
if (featureSettingsKeys.contains("host")) {
|
|
|
|
settings.m_host = *response.getGs232ControllerSettings()->getHost();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("port")) {
|
|
|
|
settings.m_port = response.getGs232ControllerSettings()->getPort();
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
if (featureSettingsKeys.contains("track")) {
|
|
|
|
settings.m_track = response.getGs232ControllerSettings()->getTrack() != 0;
|
|
|
|
}
|
2021-10-03 17:15:15 -04:00
|
|
|
if (featureSettingsKeys.contains("source")) {
|
|
|
|
settings.m_source = *response.getGs232ControllerSettings()->getSource();
|
2021-01-13 14:44:53 -05:00
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("azimuthOffset")) {
|
|
|
|
settings.m_azimuthOffset = response.getGs232ControllerSettings()->getAzimuthOffset();
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-01-13 14:44:53 -05:00
|
|
|
if (featureSettingsKeys.contains("elevationOffset")) {
|
|
|
|
settings.m_elevationOffset = response.getGs232ControllerSettings()->getElevationOffset();
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-02-26 15:27:35 -05:00
|
|
|
if (featureSettingsKeys.contains("azimuthMin")) {
|
|
|
|
settings.m_azimuthMin = response.getGs232ControllerSettings()->getAzimuthMin();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("azimuthMax")) {
|
|
|
|
settings.m_azimuthMax = response.getGs232ControllerSettings()->getAzimuthMax();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("elevationMin")) {
|
|
|
|
settings.m_elevationMin = response.getGs232ControllerSettings()->getElevationMin();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("elevationMax")) {
|
|
|
|
settings.m_elevationMax = response.getGs232ControllerSettings()->getElevationMax();
|
|
|
|
}
|
2021-05-30 07:38:07 -04:00
|
|
|
if (featureSettingsKeys.contains("tolerance")) {
|
|
|
|
settings.m_tolerance = response.getGs232ControllerSettings()->getTolerance();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("protocol")) {
|
|
|
|
settings.m_protocol = (GS232ControllerSettings::Protocol)response.getGs232ControllerSettings()->getProtocol();
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
if (featureSettingsKeys.contains("title")) {
|
|
|
|
settings.m_title = *response.getGs232ControllerSettings()->getTitle();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("rgbColor")) {
|
|
|
|
settings.m_rgbColor = response.getGs232ControllerSettings()->getRgbColor();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("useReverseAPI")) {
|
|
|
|
settings.m_useReverseAPI = response.getGs232ControllerSettings()->getUseReverseApi() != 0;
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("reverseAPIAddress")) {
|
|
|
|
settings.m_reverseAPIAddress = *response.getGs232ControllerSettings()->getReverseApiAddress();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("reverseAPIPort")) {
|
|
|
|
settings.m_reverseAPIPort = response.getGs232ControllerSettings()->getReverseApiPort();
|
|
|
|
}
|
2021-10-03 20:11:27 -04:00
|
|
|
if (featureSettingsKeys.contains("reverseAPIFeatureSetIndex")) {
|
|
|
|
settings.m_reverseAPIFeatureSetIndex = response.getGs232ControllerSettings()->getReverseApiFeatureSetIndex();
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("reverseAPIFeatureIndex")) {
|
|
|
|
settings.m_reverseAPIFeatureIndex = response.getGs232ControllerSettings()->getReverseApiFeatureIndex();
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void GS232Controller::webapiReverseSendSettings(QList<QString>& featureSettingsKeys, const GS232ControllerSettings& settings, bool force)
|
|
|
|
{
|
|
|
|
SWGSDRangel::SWGFeatureSettings *swgFeatureSettings = new SWGSDRangel::SWGFeatureSettings();
|
|
|
|
// swgFeatureSettings->setOriginatorFeatureIndex(getIndexInDeviceSet());
|
|
|
|
// swgFeatureSettings->setOriginatorFeatureSetIndex(getDeviceSetIndex());
|
|
|
|
swgFeatureSettings->setFeatureType(new QString("GS232Controller"));
|
|
|
|
swgFeatureSettings->setGs232ControllerSettings(new SWGSDRangel::SWGGS232ControllerSettings());
|
|
|
|
SWGSDRangel::SWGGS232ControllerSettings *swgGS232ControllerSettings = swgFeatureSettings->getGs232ControllerSettings();
|
|
|
|
|
|
|
|
// transfer data that has been modified. When force is on transfer all data except reverse API data
|
|
|
|
|
|
|
|
if (featureSettingsKeys.contains("azimuth") || force) {
|
|
|
|
swgGS232ControllerSettings->setAzimuth(settings.m_azimuth);
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("elevation") || force) {
|
|
|
|
swgGS232ControllerSettings->setElevation(settings.m_elevation);
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("serialPort") || force) {
|
|
|
|
swgGS232ControllerSettings->setSerialPort(new QString(settings.m_serialPort));
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("baudRate") || force) {
|
|
|
|
swgGS232ControllerSettings->setBaudRate(settings.m_baudRate);
|
|
|
|
}
|
2021-11-23 07:28:06 -05:00
|
|
|
if (featureSettingsKeys.contains("host") || force) {
|
|
|
|
swgGS232ControllerSettings->setHost(new QString(settings.m_host));
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("port") || force) {
|
|
|
|
swgGS232ControllerSettings->setPort(settings.m_port);
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
if (featureSettingsKeys.contains("track") || force) {
|
|
|
|
swgGS232ControllerSettings->setTrack(settings.m_track);
|
|
|
|
}
|
2021-10-03 17:15:15 -04:00
|
|
|
if (featureSettingsKeys.contains("source") || force) {
|
|
|
|
swgGS232ControllerSettings->setSource(new QString(settings.m_source));
|
2021-01-13 14:44:53 -05:00
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("azimuthOffset") || force) {
|
|
|
|
swgGS232ControllerSettings->setAzimuthOffset(settings.m_azimuthOffset);
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-01-13 14:44:53 -05:00
|
|
|
if (featureSettingsKeys.contains("elevationOffset") || force) {
|
|
|
|
swgGS232ControllerSettings->setElevationOffset(settings.m_elevationOffset);
|
2020-10-27 12:22:10 -04:00
|
|
|
}
|
2021-02-26 15:27:35 -05:00
|
|
|
if (featureSettingsKeys.contains("azimuthMin") || force) {
|
|
|
|
swgGS232ControllerSettings->setAzimuthMin(settings.m_azimuthMin);
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("azimuthMax") || force) {
|
|
|
|
swgGS232ControllerSettings->setAzimuthMax(settings.m_azimuthMax);
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("elevationMin") || force) {
|
|
|
|
swgGS232ControllerSettings->setElevationMin(settings.m_elevationMin);
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("elevationMax") || force) {
|
|
|
|
swgGS232ControllerSettings->setElevationMax(settings.m_elevationMax);
|
|
|
|
}
|
2021-05-30 07:38:07 -04:00
|
|
|
if (featureSettingsKeys.contains("tolerance") || force) {
|
|
|
|
swgGS232ControllerSettings->setTolerance(settings.m_tolerance);
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("protocol") || force) {
|
|
|
|
swgGS232ControllerSettings->setProtocol((int)settings.m_protocol);
|
|
|
|
}
|
2020-10-27 12:22:10 -04:00
|
|
|
if (featureSettingsKeys.contains("title") || force) {
|
|
|
|
swgGS232ControllerSettings->setTitle(new QString(settings.m_title));
|
|
|
|
}
|
|
|
|
if (featureSettingsKeys.contains("rgbColor") || force) {
|
|
|
|
swgGS232ControllerSettings->setRgbColor(settings.m_rgbColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString channelSettingsURL = QString("http://%1:%2/sdrangel/featureset/%3/feature/%4/settings")
|
|
|
|
.arg(settings.m_reverseAPIAddress)
|
|
|
|
.arg(settings.m_reverseAPIPort)
|
|
|
|
.arg(settings.m_reverseAPIFeatureSetIndex)
|
|
|
|
.arg(settings.m_reverseAPIFeatureIndex);
|
|
|
|
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
|
|
|
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
|
|
|
|
|
|
QBuffer *buffer = new QBuffer();
|
|
|
|
buffer->open((QBuffer::ReadWrite));
|
|
|
|
buffer->write(swgFeatureSettings->asJson().toUtf8());
|
|
|
|
buffer->seek(0);
|
|
|
|
|
|
|
|
// Always use PATCH to avoid passing reverse API settings
|
|
|
|
QNetworkReply *reply = m_networkManager->sendCustomRequest(m_networkRequest, "PATCH", buffer);
|
|
|
|
buffer->setParent(reply);
|
|
|
|
|
|
|
|
delete swgFeatureSettings;
|
|
|
|
}
|
|
|
|
|
2021-10-03 17:15:15 -04:00
|
|
|
void GS232Controller::webapiFormatFeatureReport(SWGSDRangel::SWGFeatureReport& response)
|
|
|
|
{
|
|
|
|
response.getGs232ControllerReport()->setSources(new QList<QString*>());
|
|
|
|
|
|
|
|
for (int i = 0; i < m_availablePipes.size(); i++) {
|
|
|
|
response.getGs232ControllerReport()->getSources()->append(new QString(m_availablePipes.at(i).getName()));
|
|
|
|
}
|
2021-10-03 20:11:27 -04:00
|
|
|
|
|
|
|
QList<QSerialPortInfo> serialPorts = QSerialPortInfo::availablePorts();
|
|
|
|
QListIterator<QSerialPortInfo> i(serialPorts);
|
|
|
|
response.getGs232ControllerReport()->setSerialPorts(new QList<QString*>());
|
|
|
|
|
|
|
|
while (i.hasNext())
|
|
|
|
{
|
|
|
|
QSerialPortInfo info = i.next();
|
|
|
|
response.getGs232ControllerReport()->getSerialPorts()->append(new QString(info.portName()));
|
|
|
|
}
|
2021-10-05 09:03:31 -04:00
|
|
|
|
|
|
|
float azimuth, elevation;
|
|
|
|
m_settings.calcTargetAzEl(azimuth, elevation);
|
|
|
|
response.getGs232ControllerReport()->setTargetAzimuth(azimuth);
|
|
|
|
response.getGs232ControllerReport()->setTargetElevation(elevation);
|
|
|
|
response.getGs232ControllerReport()->setCurrentAzimuth(m_currentAzimuth);
|
|
|
|
response.getGs232ControllerReport()->setCurrentElevation(m_currentElevation);
|
|
|
|
response.getGs232ControllerReport()->setOnTarget(getOnTarget());
|
2021-10-23 15:24:25 -04:00
|
|
|
response.getGs232ControllerReport()->setRunningState(getState());
|
2021-10-03 17:15:15 -04:00
|
|
|
}
|
|
|
|
|
2020-10-27 12:22:10 -04:00
|
|
|
void GS232Controller::networkManagerFinished(QNetworkReply *reply)
|
|
|
|
{
|
|
|
|
QNetworkReply::NetworkError replyError = reply->error();
|
|
|
|
|
|
|
|
if (replyError)
|
|
|
|
{
|
|
|
|
qWarning() << "GS232Controller::networkManagerFinished:"
|
|
|
|
<< " error(" << (int) replyError
|
|
|
|
<< "): " << replyError
|
|
|
|
<< ": " << reply->errorString();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
QString answer = reply->readAll();
|
|
|
|
answer.chop(1); // remove last \n
|
|
|
|
qDebug("GS232Controller::networkManagerFinished: reply:\n%s", answer.toStdString().c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
reply->deleteLater();
|
|
|
|
}
|