mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-18 23:55:50 -05:00
PTT Feature: initial commit
This commit is contained in:
parent
e8f3745bf3
commit
e36ab79b7a
@ -40,5 +40,6 @@ endif()
|
||||
|
||||
add_subdirectory(channelrx)
|
||||
add_subdirectory(channeltx)
|
||||
add_subdirectory(feature)
|
||||
add_subdirectory(samplesource)
|
||||
add_subdirectory(samplesink)
|
||||
|
3
plugins/feature/CMakeLists.txt
Normal file
3
plugins/feature/CMakeLists.txt
Normal file
@ -0,0 +1,3 @@
|
||||
project(feature)
|
||||
|
||||
add_subdirectory(simpleptt)
|
56
plugins/feature/simpleptt/CMakeLists.txt
Normal file
56
plugins/feature/simpleptt/CMakeLists.txt
Normal file
@ -0,0 +1,56 @@
|
||||
project(simpleptt)
|
||||
|
||||
set(simpleptt_SOURCES
|
||||
simpleptt.cpp
|
||||
simplepttsettings.cpp
|
||||
simplepttplugin.cpp
|
||||
simplepttworker.cpp
|
||||
simplepttreport.cpp
|
||||
)
|
||||
|
||||
set(simpleptt_HEADERS
|
||||
simpleptt.h
|
||||
simplepttsettings.h
|
||||
simplepttplugin.h
|
||||
simplepttworker.h
|
||||
simplepttreport.h
|
||||
)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
|
||||
)
|
||||
|
||||
if(NOT SERVER_MODE)
|
||||
set(simpleptt_SOURCES
|
||||
${simpleptt_SOURCES}
|
||||
simplepttgui.cpp
|
||||
simplepttgui.ui
|
||||
)
|
||||
set(simpleptt_HEADERS
|
||||
${simpleptt_HEADERS}
|
||||
simplepttgui.h
|
||||
)
|
||||
|
||||
set(TARGET_NAME featuresimpleptt)
|
||||
set(TARGET_LIB "Qt5::Widgets")
|
||||
set(TARGET_LIB_GUI "sdrgui")
|
||||
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
|
||||
else()
|
||||
set(TARGET_NAME featuresimplepttsrv)
|
||||
set(TARGET_LIB "")
|
||||
set(TARGET_LIB_GUI "")
|
||||
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
|
||||
endif()
|
||||
|
||||
add_library(${TARGET_NAME} SHARED
|
||||
${simpleptt_SOURCES}
|
||||
)
|
||||
|
||||
target_link_libraries(${TARGET_NAME}
|
||||
Qt5::Core
|
||||
${TARGET_LIB}
|
||||
sdrbase
|
||||
${TARGET_LIB_GUI}
|
||||
)
|
||||
|
||||
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})
|
151
plugins/feature/simpleptt/simpleptt.cpp
Normal file
151
plugins/feature/simpleptt/simpleptt.cpp
Normal file
@ -0,0 +1,151 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include "dsp/dspengine.h"
|
||||
|
||||
#include "simplepttworker.h"
|
||||
#include "simpleptt.h"
|
||||
|
||||
MESSAGE_CLASS_DEFINITION(SimplePTT::MsgConfigureSimplePTT, Message)
|
||||
MESSAGE_CLASS_DEFINITION(SimplePTT::MsgPTT, Message)
|
||||
MESSAGE_CLASS_DEFINITION(SimplePTT::MsgStartStop, Message)
|
||||
|
||||
const QString SimplePTT::m_featureIdURI = "sdrangel.feature.simpleptt";
|
||||
const QString SimplePTT::m_featureId = "SimplePTT";
|
||||
|
||||
SimplePTT::SimplePTT(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
||||
Feature(m_featureIdURI, webAPIAdapterInterface)
|
||||
{
|
||||
setObjectName(m_featureId);
|
||||
m_worker = new SimplePTTWorker(webAPIAdapterInterface);
|
||||
m_state = StIdle;
|
||||
m_errorMessage = "SimplePTT error";
|
||||
}
|
||||
|
||||
SimplePTT::~SimplePTT()
|
||||
{
|
||||
if (m_worker->isRunning()) {
|
||||
stop();
|
||||
}
|
||||
|
||||
delete m_worker;
|
||||
}
|
||||
|
||||
void SimplePTT::start()
|
||||
{
|
||||
qDebug("SimplePTT::start");
|
||||
|
||||
m_worker->reset();
|
||||
m_worker->setMessageQueueToGUI(getMessageQueueToGUI());
|
||||
bool ok = m_worker->startWork();
|
||||
m_state = ok ? StRunning : StError;
|
||||
m_thread.start();
|
||||
|
||||
SimplePTTWorker::MsgConfigureSimplePTTWorker *msg = SimplePTTWorker::MsgConfigureSimplePTTWorker::create(m_settings, true);
|
||||
m_worker->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
void SimplePTT::stop()
|
||||
{
|
||||
qDebug("SimplePTT::stop");
|
||||
m_worker->stopWork();
|
||||
m_state = StIdle;
|
||||
m_thread.quit();
|
||||
m_thread.wait();
|
||||
}
|
||||
|
||||
bool SimplePTT::handleMessage(const Message& cmd)
|
||||
{
|
||||
if (MsgConfigureSimplePTT::match(cmd))
|
||||
{
|
||||
MsgConfigureSimplePTT& cfg = (MsgConfigureSimplePTT&) cmd;
|
||||
qDebug() << "SimplePTT::handleMessage: MsgConfigureSimplePTT";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MsgPTT::match(cmd))
|
||||
{
|
||||
MsgPTT& cfg = (MsgPTT&) cmd;
|
||||
qDebug() << "SimplePTT::handleMessage: MsgPTT: tx:" << cfg.getTx();
|
||||
|
||||
SimplePTTWorker::MsgPTT *msg = SimplePTTWorker::MsgPTT::create(cfg.getTx());
|
||||
m_worker->getInputMessageQueue()->push(msg);
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MsgStartStop::match(cmd))
|
||||
{
|
||||
MsgStartStop& cfg = (MsgStartStop&) cmd;
|
||||
qDebug() << "SimplePTT::handleMessage: MsgStartStop: start:" << cfg.getStartStop();
|
||||
|
||||
if (cfg.getStartStop()) {
|
||||
start();
|
||||
} else {
|
||||
stop();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray SimplePTT::serialize() const
|
||||
{
|
||||
return m_settings.serialize();
|
||||
}
|
||||
|
||||
bool SimplePTT::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureSimplePTT *msg = MsgConfigureSimplePTT::create(m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureSimplePTT *msg = MsgConfigureSimplePTT::create(m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTT::applySettings(const SimplePTTSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "SimplePTT::applySettings:"
|
||||
<< " m_title: " << settings.m_title
|
||||
<< " m_rgbColor: " << settings.m_rgbColor
|
||||
<< " m_rxDeviceSetIndex: " << settings.m_rxDeviceSetIndex
|
||||
<< " m_txDeviceSetIndex: " << settings.m_txDeviceSetIndex
|
||||
<< " m_rx2TxDelayMs: " << settings.m_rx2TxDelayMs
|
||||
<< " m_tx2RxDelayMs: " << settings.m_tx2RxDelayMs
|
||||
<< " force: " << force;
|
||||
|
||||
SimplePTTWorker::MsgConfigureSimplePTTWorker *msg = SimplePTTWorker::MsgConfigureSimplePTTWorker::create(
|
||||
settings, force
|
||||
);
|
||||
m_worker->getInputMessageQueue()->push(msg);
|
||||
|
||||
m_settings = settings;
|
||||
}
|
119
plugins/feature/simpleptt/simpleptt.h
Normal file
119
plugins/feature/simpleptt/simpleptt.h
Normal file
@ -0,0 +1,119 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_FEATURE_SIMPLEPTT_H_
|
||||
#define INCLUDE_FEATURE_SIMPLEPTT_H_
|
||||
|
||||
#include <QThread>
|
||||
|
||||
#include "feature/feature.h"
|
||||
#include "util/message.h"
|
||||
|
||||
#include "simplepttsettings.h"
|
||||
|
||||
class WebAPIAdapterInterface;
|
||||
class SimplePTTWorker;
|
||||
|
||||
class SimplePTT : public Feature
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
class MsgConfigureSimplePTT : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
const SimplePTTSettings& getSettings() const { return m_settings; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureSimplePTT* create(const SimplePTTSettings& settings, bool force) {
|
||||
return new MsgConfigureSimplePTT(settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
SimplePTTSettings m_settings;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureSimplePTT(const SimplePTTSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
|
||||
class MsgPTT : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
bool getTx() const { return m_tx; }
|
||||
|
||||
static MsgPTT* create(bool tx) {
|
||||
return new MsgPTT(tx);
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_tx;
|
||||
|
||||
MsgPTT(bool tx) :
|
||||
Message(),
|
||||
m_tx(tx)
|
||||
{ }
|
||||
};
|
||||
|
||||
class MsgStartStop : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
bool getStartStop() const { return m_startStop; }
|
||||
|
||||
static MsgStartStop* create(bool startStop) {
|
||||
return new MsgStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
bool m_startStop;
|
||||
|
||||
MsgStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
};
|
||||
|
||||
SimplePTT(WebAPIAdapterInterface *webAPIAdapterInterface);
|
||||
~SimplePTT();
|
||||
virtual void destroy() { delete this; }
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
|
||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
|
||||
static const QString m_featureIdURI;
|
||||
static const QString m_featureId;
|
||||
|
||||
private:
|
||||
QThread m_thread;
|
||||
SimplePTTWorker *m_worker;
|
||||
SimplePTTSettings m_settings;
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
void applySettings(const SimplePTTSettings& settings, bool force = false);
|
||||
};
|
||||
|
||||
#endif // INCLUDE_FEATURE_SIMPLEPTT_H_
|
372
plugins/feature/simpleptt/simplepttgui.cpp
Normal file
372
plugins/feature/simpleptt/simplepttgui.cpp
Normal file
@ -0,0 +1,372 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "feature/featureuiset.h"
|
||||
#include "gui/basicfeaturesettingsdialog.h"
|
||||
#include "mainwindow.h"
|
||||
#include "device/deviceuiset.h"
|
||||
|
||||
#include "ui_simplepttgui.h"
|
||||
#include "simplepttreport.h"
|
||||
#include "simpleptt.h"
|
||||
#include "simplepttgui.h"
|
||||
|
||||
SimplePTTGUI* SimplePTTGUI::create(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature)
|
||||
{
|
||||
SimplePTTGUI* gui = new SimplePTTGUI(pluginAPI, featureUISet, feature);
|
||||
return gui;
|
||||
}
|
||||
|
||||
void SimplePTTGUI::destroy()
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
void SimplePTTGUI::setName(const QString& name)
|
||||
{
|
||||
setObjectName(name);
|
||||
}
|
||||
|
||||
QString SimplePTTGUI::getName() const
|
||||
{
|
||||
return objectName();
|
||||
}
|
||||
|
||||
void SimplePTTGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
}
|
||||
|
||||
QByteArray SimplePTTGUI::serialize() const
|
||||
{
|
||||
return m_settings.serialize();
|
||||
}
|
||||
|
||||
bool SimplePTTGUI::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
resetToDefaults();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool SimplePTTGUI::handleMessage(const Message& message)
|
||||
{
|
||||
if (SimplePTT::MsgConfigureSimplePTT::match(message))
|
||||
{
|
||||
qDebug("SimplePTTGUI::handleMessage: SimplePTT::MsgConfigureSimplePTT");
|
||||
const SimplePTT::MsgConfigureSimplePTT& cfg = (SimplePTT::MsgConfigureSimplePTT&) message;
|
||||
m_settings = cfg.getSettings();
|
||||
blockApplySettings(true);
|
||||
displaySettings();
|
||||
blockApplySettings(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (SimplePTTReport::MsgRadioState::match(message))
|
||||
{
|
||||
qDebug("SimplePTTGUI::handleMessage: SimplePTTReport::MsgRadioState");
|
||||
const SimplePTTReport::MsgRadioState& cfg = (SimplePTTReport::MsgRadioState&) message;
|
||||
SimplePTTReport::RadioState state = cfg.getState();
|
||||
ui->statusIndicator->setStyleSheet("QLabel { background-color: " +
|
||||
m_statusColors[(int) state] + "; border-radius: 12px; }");
|
||||
ui->statusIndicator->setToolTip(m_statusTooltips[(int) state]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void SimplePTTGUI::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = getInputMessageQueue()->pop()))
|
||||
{
|
||||
if (handleMessage(*message)) {
|
||||
delete message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
{
|
||||
(void) widget;
|
||||
(void) rollDown;
|
||||
}
|
||||
|
||||
SimplePTTGUI::SimplePTTGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent) :
|
||||
RollupWidget(parent),
|
||||
ui(new Ui::SimplePTTGUI),
|
||||
m_pluginAPI(pluginAPI),
|
||||
m_featureUISet(featureUISet),
|
||||
m_doApplySettings(true),
|
||||
m_lastFeatureState(0)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||
setChannelWidget(false);
|
||||
connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
|
||||
m_simplePTT = reinterpret_cast<SimplePTT*>(feature);
|
||||
m_simplePTT->setMessageQueueToGUI(&m_inputMessageQueue);
|
||||
|
||||
m_featureUISet->registerFeatureInstance(SimplePTT::m_featureIdURI, this);
|
||||
m_featureUISet->addRollupWidget(this);
|
||||
|
||||
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
|
||||
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
|
||||
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
|
||||
m_statusTimer.start(1000);
|
||||
|
||||
m_statusTooltips.push_back("Idle"); // 0 - all off
|
||||
m_statusTooltips.push_back("Rx on"); // 1 - Rx on
|
||||
m_statusTooltips.push_back("Tx on"); // 2 - Tx on
|
||||
|
||||
m_statusColors.push_back("gray"); // All off
|
||||
m_statusColors.push_back("rgb(85, 232, 85)"); // Rx on (green)
|
||||
m_statusColors.push_back("rgb(232, 85, 85)"); // Tx on (red)
|
||||
|
||||
updateDeviceSetLists();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
}
|
||||
|
||||
SimplePTTGUI::~SimplePTTGUI()
|
||||
{
|
||||
m_featureUISet->removeFeatureInstance(this);
|
||||
delete m_simplePTT; // When the GUI closes it has to delete the demodulator because it can be done with (x)
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void SimplePTTGUI::blockApplySettings(bool block)
|
||||
{
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void SimplePTTGUI::displaySettings()
|
||||
{
|
||||
setTitleColor(m_settings.m_rgbColor);
|
||||
setWindowTitle(m_settings.m_title);
|
||||
}
|
||||
|
||||
void SimplePTTGUI::updateDeviceSetLists()
|
||||
{
|
||||
MainWindow *mainWindow = MainWindow::getInstance();
|
||||
std::vector<DeviceUISet*>& deviceUISets = mainWindow->getDeviceUISets();
|
||||
std::vector<DeviceUISet*>::const_iterator it = deviceUISets.begin();
|
||||
|
||||
ui->rxDevice->blockSignals(true);
|
||||
ui->txDevice->blockSignals(true);
|
||||
|
||||
ui->rxDevice->clear();
|
||||
ui->txDevice->clear();
|
||||
unsigned int deviceIndex = 0;
|
||||
unsigned int rxIndex = 0;
|
||||
unsigned int txIndex = 0;
|
||||
|
||||
for (; it != deviceUISets.end(); ++it, deviceIndex++)
|
||||
{
|
||||
DSPDeviceSourceEngine *deviceSourceEngine = (*it)->m_deviceSourceEngine;
|
||||
DSPDeviceSinkEngine *deviceSinkEngine = (*it)->m_deviceSinkEngine;
|
||||
|
||||
if (deviceSourceEngine)
|
||||
{
|
||||
ui->rxDevice->addItem(QString("R%1").arg(deviceIndex), deviceIndex);
|
||||
rxIndex++;
|
||||
}
|
||||
else if (deviceSinkEngine)
|
||||
{
|
||||
ui->txDevice->addItem(QString("T%1").arg(deviceIndex), deviceIndex);
|
||||
txIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
if (rxIndex > 0)
|
||||
{
|
||||
if (m_settings.m_rxDeviceSetIndex < 0) {
|
||||
ui->rxDevice->setCurrentIndex(0);
|
||||
} else {
|
||||
ui->rxDevice->setCurrentIndex(m_settings.m_rxDeviceSetIndex);
|
||||
}
|
||||
}
|
||||
|
||||
if (txIndex > 0)
|
||||
{
|
||||
if (m_settings.m_txDeviceSetIndex < 0) {
|
||||
ui->txDevice->setCurrentIndex(0);
|
||||
} else {
|
||||
ui->txDevice->setCurrentIndex(m_settings.m_txDeviceSetIndex);
|
||||
}
|
||||
}
|
||||
|
||||
int rxDeviceIndex = ui->rxDevice->currentData().toInt();
|
||||
int txDeviceIndex = ui->txDevice->currentData().toInt();
|
||||
|
||||
if ((rxDeviceIndex != m_settings.m_rxDeviceSetIndex) ||
|
||||
(txDeviceIndex != m_settings.m_txDeviceSetIndex))
|
||||
{
|
||||
qDebug("SimplePTTGUI::updateDeviceSetLists: device index changed: %d:%d", rxDeviceIndex, txDeviceIndex);
|
||||
m_settings.m_rxDeviceSetIndex = rxDeviceIndex;
|
||||
m_settings.m_txDeviceSetIndex = txDeviceIndex;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
ui->rxDevice->blockSignals(false);
|
||||
ui->txDevice->blockSignals(false);
|
||||
}
|
||||
|
||||
void SimplePTTGUI::leaveEvent(QEvent*)
|
||||
{
|
||||
}
|
||||
|
||||
void SimplePTTGUI::enterEvent(QEvent*)
|
||||
{
|
||||
}
|
||||
|
||||
void SimplePTTGUI::onMenuDialogCalled(const QPoint &p)
|
||||
{
|
||||
if (m_contextMenuType == ContextMenuChannelSettings)
|
||||
{
|
||||
BasicFeatureSettingsDialog dialog(this);
|
||||
dialog.setTitle(m_settings.m_title);
|
||||
dialog.setColor(m_settings.m_rgbColor);
|
||||
|
||||
dialog.move(p);
|
||||
dialog.exec();
|
||||
|
||||
m_settings.m_rgbColor = dialog.getColor().rgb();
|
||||
m_settings.m_title = dialog.getTitle();
|
||||
|
||||
setWindowTitle(m_settings.m_title);
|
||||
setTitleColor(m_settings.m_rgbColor);
|
||||
|
||||
applySettings();
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_startStop_toggled(bool checked)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
SimplePTT::MsgStartStop *message = SimplePTT::MsgStartStop::create(checked);
|
||||
m_simplePTT->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_devicesRefresh_clicked()
|
||||
{
|
||||
updateDeviceSetLists();
|
||||
displaySettings();
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_rxDevice_currentIndexChanged(int index)
|
||||
{
|
||||
if (index >= 0)
|
||||
{
|
||||
m_settings.m_rxDeviceSetIndex = index;
|
||||
applySettings();
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_txDevice_currentIndexChanged(int index)
|
||||
{
|
||||
if (index >= 0)
|
||||
{
|
||||
m_settings.m_txDeviceSetIndex = index;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_rxtxDelay_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_rx2TxDelayMs = value;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_txrxDelay_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_tx2RxDelayMs = value;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void SimplePTTGUI::on_ptt_toggled(bool checked)
|
||||
{
|
||||
applyPTT(checked);
|
||||
}
|
||||
|
||||
void SimplePTTGUI::updateStatus()
|
||||
{
|
||||
int state = m_simplePTT->getState();
|
||||
|
||||
if (m_lastFeatureState != state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case Feature::StNotStarted:
|
||||
ui->startStop->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
||||
break;
|
||||
case Feature::StIdle:
|
||||
ui->startStop->setStyleSheet("QToolButton { background-color : blue; }");
|
||||
break;
|
||||
case Feature::StRunning:
|
||||
ui->startStop->setStyleSheet("QToolButton { background-color : green; }");
|
||||
break;
|
||||
case Feature::StError:
|
||||
ui->startStop->setStyleSheet("QToolButton { background-color : red; }");
|
||||
QMessageBox::information(this, tr("Message"), m_simplePTT->getErrorMessage());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
m_lastFeatureState = state;
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTGUI::applySettings(bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
SimplePTT::MsgConfigureSimplePTT* message = SimplePTT::MsgConfigureSimplePTT::create( m_settings, force);
|
||||
m_simplePTT->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTGUI::applyPTT(bool tx)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
SimplePTT::MsgPTT* message = SimplePTT::MsgPTT::create(tx);
|
||||
m_simplePTT->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
93
plugins/feature/simpleptt/simplepttgui.h
Normal file
93
plugins/feature/simpleptt/simplepttgui.h
Normal file
@ -0,0 +1,93 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_FEATURE_SIMPLEPTTGUI_H_
|
||||
#define INCLUDE_FEATURE_SIMPLEPTTGUI_H_
|
||||
|
||||
#include <QTimer>
|
||||
|
||||
#include "plugin/plugininstancegui.h"
|
||||
#include "gui/rollupwidget.h"
|
||||
#include "util/messagequeue.h"
|
||||
#include "simplepttsettings.h"
|
||||
|
||||
class PluginAPI;
|
||||
class FeatureUISet;
|
||||
class SimplePTT;
|
||||
|
||||
namespace Ui {
|
||||
class SimplePTTGUI;
|
||||
}
|
||||
|
||||
class SimplePTTGUI : public RollupWidget, public PluginInstanceGUI {
|
||||
Q_OBJECT
|
||||
public:
|
||||
static SimplePTTGUI* create(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature);
|
||||
virtual void destroy();
|
||||
void setName(const QString& name);
|
||||
QString getName() const;
|
||||
virtual qint64 getCenterFrequency() const { return 0; }
|
||||
virtual void setCenterFrequency(qint64 centerFrequency) {}
|
||||
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
virtual bool handleMessage(const Message& message);
|
||||
|
||||
private:
|
||||
Ui::SimplePTTGUI* ui;
|
||||
PluginAPI* m_pluginAPI;
|
||||
FeatureUISet* m_featureUISet;
|
||||
SimplePTTSettings m_settings;
|
||||
bool m_doApplySettings;
|
||||
|
||||
SimplePTT* m_simplePTT;
|
||||
MessageQueue m_inputMessageQueue;
|
||||
QTimer m_statusTimer;
|
||||
int m_lastFeatureState;
|
||||
std::vector<QString> m_statusColors;
|
||||
std::vector<QString> m_statusTooltips;
|
||||
|
||||
explicit SimplePTTGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent = nullptr);
|
||||
virtual ~SimplePTTGUI();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applyPTT(bool tx);
|
||||
void displaySettings();
|
||||
void updateDeviceSetLists();
|
||||
|
||||
void leaveEvent(QEvent*);
|
||||
void enterEvent(QEvent*);
|
||||
|
||||
private slots:
|
||||
void onMenuDialogCalled(const QPoint &p);
|
||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||
void handleInputMessages();
|
||||
void on_startStop_toggled(bool checked);
|
||||
void on_devicesRefresh_clicked();
|
||||
void on_rxDevice_currentIndexChanged(int index);
|
||||
void on_txDevice_currentIndexChanged(int index);
|
||||
void on_rxtxDelay_valueChanged(int value);
|
||||
void on_txrxDelay_valueChanged(int value);
|
||||
void on_ptt_toggled(bool checked);
|
||||
void updateStatus();
|
||||
};
|
||||
|
||||
|
||||
#endif // INCLUDE_FEATURE_SIMPLEPTTGUI_H_
|
327
plugins/feature/simpleptt/simplepttgui.ui
Normal file
327
plugins/feature/simpleptt/simplepttgui.ui
Normal file
@ -0,0 +1,327 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SimplePTTGUI</class>
|
||||
<widget class="RollupWidget" name="SimplePTTGUI">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>320</width>
|
||||
<height>181</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>320</width>
|
||||
<height>100</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>320</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Liberation Sans</family>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Simple PTT</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Local Sink</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="settingsContainer" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>10</y>
|
||||
<width>301</width>
|
||||
<height>151</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Settings</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="pttLayout">
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="startStop">
|
||||
<property name="toolTip">
|
||||
<string>start/stop acquisition</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../sdrgui/resources/res.qrc">
|
||||
<normaloff>:/play.png</normaloff>
|
||||
<normalon>:/stop.png</normalon>:/play.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="ptt">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>200</width>
|
||||
<height>50</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>20</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Push To Talk</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>PTT</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="statusIndicator">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Idle</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel { background-color: gray; border-radius: 12px; }</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="localDeviceLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="devicesRefresh">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Refresh indexes of available local devices</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../sdrgui/resources/res.qrc">
|
||||
<normaloff>:/recycle.png</normaloff>:/recycle.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="rxDeviceLabel">
|
||||
<property name="text">
|
||||
<string>Rx dev</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="rxDevice">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>55</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Receiver deviceset index</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>
|
||||
<item>
|
||||
<widget class="QLabel" name="txDeviceLabel">
|
||||
<property name="text">
|
||||
<string>Tx dev</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="txDevice">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>55</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Transmitter deviceset index</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="DelaysLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="rxtxDelayLabel">
|
||||
<property name="text">
|
||||
<string>Rx-Tx </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="rxtxDelay">
|
||||
<property name="toolTip">
|
||||
<string>Rx to Tx transition delay (ms)</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>100</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="rxtxDelayUnits">
|
||||
<property name="text">
|
||||
<string>ms</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="txrxDelayLabel">
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Tx-Rx</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="txrxDelay">
|
||||
<property name="toolTip">
|
||||
<string>Tx to Rx transition delay (ms)</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>100</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="txrxDelayUnits">
|
||||
<property name="text">
|
||||
<string>ms</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>RollupWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>gui/rollupwidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>ButtonSwitch</class>
|
||||
<extends>QToolButton</extends>
|
||||
<header>gui/buttonswitch.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
74
plugins/feature/simpleptt/simplepttplugin.cpp
Normal file
74
plugins/feature/simpleptt/simplepttplugin.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include <QtPlugin>
|
||||
#include "plugin/pluginapi.h"
|
||||
|
||||
#ifndef SERVER_MODE
|
||||
#include "simplepttgui.h"
|
||||
#endif
|
||||
#include "simpleptt.h"
|
||||
#include "simplepttplugin.h"
|
||||
|
||||
const PluginDescriptor SimplePTTPlugin::m_pluginDescriptor = {
|
||||
SimplePTT::m_featureId,
|
||||
QString("Simple PTT"),
|
||||
QString("5.12.0"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
QString("https://github.com/f4exb/sdrangel")
|
||||
};
|
||||
|
||||
SimplePTTPlugin::SimplePTTPlugin(QObject* parent) :
|
||||
QObject(parent),
|
||||
m_pluginAPI(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
const PluginDescriptor& SimplePTTPlugin::getPluginDescriptor() const
|
||||
{
|
||||
return m_pluginDescriptor;
|
||||
}
|
||||
|
||||
void SimplePTTPlugin::initPlugin(PluginAPI* pluginAPI)
|
||||
{
|
||||
m_pluginAPI = pluginAPI;
|
||||
|
||||
// register Simple PTT feature
|
||||
m_pluginAPI->registerFeature(SimplePTT::m_featureIdURI, SimplePTT::m_featureId, this);
|
||||
}
|
||||
|
||||
#ifdef SERVER_MODE
|
||||
PluginInstanceGUI* SimplePTTPlugin::createFeatureGUI(FeatureUISet *featureUISet, Feature *feature) const
|
||||
{
|
||||
(void) featureUISet;
|
||||
(void) feature;
|
||||
return nullptr;
|
||||
}
|
||||
#else
|
||||
PluginInstanceGUI* SimplePTTPlugin::createFeatureGUI(FeatureUISet *featureUISet, Feature *feature) const
|
||||
{
|
||||
return SimplePTTGUI::create(m_pluginAPI, featureUISet, feature);
|
||||
}
|
||||
#endif
|
||||
|
||||
Feature* SimplePTTPlugin::createFeature(WebAPIAdapterInterface* webAPIAdapterInterface) const
|
||||
{
|
||||
return new SimplePTT(webAPIAdapterInterface);
|
||||
}
|
46
plugins/feature/simpleptt/simplepttplugin.h
Normal file
46
plugins/feature/simpleptt/simplepttplugin.h
Normal file
@ -0,0 +1,46 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_FEATURE_SIMPLEPTTPLUGIN_H
|
||||
#define INCLUDE_FEATURE_SIMPLEPTTPLUGIN_H
|
||||
|
||||
#include <QObject>
|
||||
#include "plugin/plugininterface.h"
|
||||
|
||||
class WebAPIAdapterInterface;
|
||||
|
||||
class SimplePTTPlugin : public QObject, PluginInterface {
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(PluginInterface)
|
||||
Q_PLUGIN_METADATA(IID "sdrangel.feature.simpleptt")
|
||||
|
||||
public:
|
||||
explicit SimplePTTPlugin(QObject* parent = nullptr);
|
||||
|
||||
const PluginDescriptor& getPluginDescriptor() const;
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
virtual PluginInstanceGUI* createFeatureGUI(FeatureUISet *featureUISet, Feature *feature) const;
|
||||
virtual Feature* createFeature(WebAPIAdapterInterface *webAPIAdapterInterface) const;
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
||||
PluginAPI* m_pluginAPI;
|
||||
};
|
||||
|
||||
#endif // INCLUDE_FEATURE_SIMPLEPTTPLUGIN_H
|
26
plugins/feature/simpleptt/simplepttreport.cpp
Normal file
26
plugins/feature/simpleptt/simplepttreport.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "simplepttreport.h"
|
||||
|
||||
MESSAGE_CLASS_DEFINITION(SimplePTTReport::MsgRadioState, Message)
|
||||
|
||||
SimplePTTReport::SimplePTTReport()
|
||||
{}
|
||||
|
||||
SimplePTTReport::~SimplePTTReport()
|
||||
{}
|
55
plugins/feature/simpleptt/simplepttreport.h
Normal file
55
plugins/feature/simpleptt/simplepttreport.h
Normal file
@ -0,0 +1,55 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_FEATURE_SIMPLEPTTREPORT_H_
|
||||
#define INCLUDE_FEATURE_SIMPLEPTTREPORT_H_
|
||||
|
||||
#include "util/message.h"
|
||||
|
||||
class SimplePTTReport
|
||||
{
|
||||
public:
|
||||
enum RadioState {
|
||||
RadioIdle,
|
||||
RadioRx,
|
||||
RadioTx
|
||||
};
|
||||
class MsgRadioState : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
RadioState getState() const { return m_state; }
|
||||
|
||||
static MsgRadioState* create(RadioState state)
|
||||
{
|
||||
return new MsgRadioState(state);
|
||||
}
|
||||
|
||||
private:
|
||||
RadioState m_state;
|
||||
|
||||
MsgRadioState(RadioState state) :
|
||||
Message(),
|
||||
m_state(state)
|
||||
{ }
|
||||
};
|
||||
|
||||
SimplePTTReport();
|
||||
~SimplePTTReport();
|
||||
};
|
||||
|
||||
#endif // INCLUDE_FEATURE_SIMPLEPTTREPORT_H_
|
85
plugins/feature/simpleptt/simplepttsettings.cpp
Normal file
85
plugins/feature/simpleptt/simplepttsettings.cpp
Normal file
@ -0,0 +1,85 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QColor>
|
||||
|
||||
#include "util/simpleserializer.h"
|
||||
#include "settings/serializable.h"
|
||||
|
||||
#include "simplepttsettings.h"
|
||||
|
||||
SimplePTTSettings::SimplePTTSettings()
|
||||
{
|
||||
resetToDefaults();
|
||||
}
|
||||
|
||||
void SimplePTTSettings::resetToDefaults()
|
||||
{
|
||||
m_title = "Simple PTT";
|
||||
m_rgbColor = QColor(255, 0, 0).rgb();
|
||||
m_rxDeviceSetIndex = -1;
|
||||
m_txDeviceSetIndex = -1;
|
||||
m_rx2TxDelayMs = 0;
|
||||
m_tx2RxDelayMs = 0;
|
||||
}
|
||||
|
||||
QByteArray SimplePTTSettings::serialize() const
|
||||
{
|
||||
SimpleSerializer s(1);
|
||||
|
||||
s.writeString(1, m_title);
|
||||
s.writeU32(2, m_rgbColor);
|
||||
s.writeS32(3, m_rxDeviceSetIndex);
|
||||
s.writeS32(4, m_txDeviceSetIndex);
|
||||
s.writeU32(5, m_rx2TxDelayMs);
|
||||
s.writeU32(6, m_tx2RxDelayMs);
|
||||
|
||||
return s.final();
|
||||
}
|
||||
|
||||
bool SimplePTTSettings::deserialize(const QByteArray& data)
|
||||
{
|
||||
SimpleDeserializer d(data);
|
||||
|
||||
if(!d.isValid())
|
||||
{
|
||||
resetToDefaults();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(d.getVersion() == 1)
|
||||
{
|
||||
QByteArray bytetmp;
|
||||
qint32 tmp;
|
||||
uint32_t utmp;
|
||||
QString strtmp;
|
||||
|
||||
d.readString(1, &m_title, "Simple PTT");
|
||||
d.readU32(2, &m_rgbColor, QColor(255, 0, 0).rgb());
|
||||
d.readS32(3, &m_rxDeviceSetIndex, -1);
|
||||
d.readS32(4, &m_txDeviceSetIndex, -1);
|
||||
d.readU32(5, &m_rx2TxDelayMs, 0);
|
||||
d.readU32(6, &m_tx2RxDelayMs, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
resetToDefaults();
|
||||
return false;
|
||||
}
|
||||
}
|
41
plugins/feature/simpleptt/simplepttsettings.h
Normal file
41
plugins/feature/simpleptt/simplepttsettings.h
Normal file
@ -0,0 +1,41 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_FEATURE_SIMPLEPTTSETTINGS_H_
|
||||
#define INCLUDE_FEATURE_SIMPLEPTTSETTINGS_H_
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QString>
|
||||
|
||||
class Serializable;
|
||||
|
||||
struct SimplePTTSettings
|
||||
{
|
||||
QString m_title;
|
||||
quint32 m_rgbColor;
|
||||
int m_rxDeviceSetIndex;
|
||||
int m_txDeviceSetIndex;
|
||||
unsigned int m_rx2TxDelayMs;
|
||||
unsigned int m_tx2RxDelayMs;
|
||||
|
||||
SimplePTTSettings();
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
};
|
||||
|
||||
#endif // INCLUDE_FEATURE_SIMPLEPTTSETTINGS_H_
|
209
plugins/feature/simpleptt/simplepttworker.cpp
Normal file
209
plugins/feature/simpleptt/simplepttworker.cpp
Normal file
@ -0,0 +1,209 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include "SWGDeviceState.h"
|
||||
#include "SWGSuccessResponse.h"
|
||||
#include "SWGErrorResponse.h"
|
||||
|
||||
#include "webapi/webapiadapterinterface.h"
|
||||
|
||||
#include "simplepttreport.h"
|
||||
#include "simplepttworker.h"
|
||||
|
||||
MESSAGE_CLASS_DEFINITION(SimplePTTWorker::MsgConfigureSimplePTTWorker, Message)
|
||||
MESSAGE_CLASS_DEFINITION(SimplePTTWorker::MsgPTT, Message)
|
||||
|
||||
SimplePTTWorker::SimplePTTWorker(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
||||
m_webAPIAdapterInterface(webAPIAdapterInterface),
|
||||
m_msgQueueToGUI(nullptr),
|
||||
m_running(false),
|
||||
m_mutex(QMutex::Recursive)
|
||||
{
|
||||
qDebug("SimplePTTWorker::SimplePTTWorker");
|
||||
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
|
||||
}
|
||||
|
||||
SimplePTTWorker::~SimplePTTWorker()
|
||||
{
|
||||
m_inputMessageQueue.clear();
|
||||
}
|
||||
|
||||
void SimplePTTWorker::reset()
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
m_inputMessageQueue.clear();
|
||||
}
|
||||
|
||||
bool SimplePTTWorker::startWork()
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
m_running = true;
|
||||
return m_running;
|
||||
}
|
||||
|
||||
void SimplePTTWorker::stopWork()
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
m_running = false;
|
||||
}
|
||||
|
||||
void SimplePTTWorker::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != nullptr)
|
||||
{
|
||||
if (handleMessage(*message)) {
|
||||
delete message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SimplePTTWorker::handleMessage(const Message& cmd)
|
||||
{
|
||||
if (MsgConfigureSimplePTTWorker::match(cmd))
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
MsgConfigureSimplePTTWorker& cfg = (MsgConfigureSimplePTTWorker&) cmd;
|
||||
qDebug() << "SimplePTTWorker::handleMessage: MsgConfigureSimplePTTWorker";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MsgPTT::match(cmd))
|
||||
{
|
||||
MsgPTT& cfg = (MsgPTT&) cmd;
|
||||
qDebug() << "SimplePTTWorker::handleMessage: MsgPTT";
|
||||
|
||||
sendPTT(cfg.getTx());
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTWorker::applySettings(const SimplePTTSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "SimplePTTWorker::applySettings:"
|
||||
<< " m_title: " << settings.m_title
|
||||
<< " m_rgbColor: " << settings.m_rgbColor
|
||||
<< " m_rxDeviceSetIndex: " << settings.m_rxDeviceSetIndex
|
||||
<< " m_txDeviceSetIndex: " << settings.m_txDeviceSetIndex
|
||||
<< " m_rx2TxDelayMs: " << settings.m_rx2TxDelayMs
|
||||
<< " m_tx2RxDelayMs: " << settings.m_tx2RxDelayMs
|
||||
<< " force: " << force;
|
||||
m_settings = settings;
|
||||
}
|
||||
|
||||
void SimplePTTWorker::sendPTT(bool tx)
|
||||
{
|
||||
if (!m_updateTimer.isActive())
|
||||
{
|
||||
bool switchedOff = false;
|
||||
m_mutex.lock();
|
||||
|
||||
if (tx)
|
||||
{
|
||||
if (m_settings.m_rxDeviceSetIndex >= 0)
|
||||
{
|
||||
m_tx = false;
|
||||
switchedOff = turnDevice(false);
|
||||
}
|
||||
|
||||
if (m_settings.m_txDeviceSetIndex >= 0)
|
||||
{
|
||||
m_tx = true;
|
||||
m_updateTimer.start(m_settings.m_rx2TxDelayMs);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_txDeviceSetIndex >= 0)
|
||||
{
|
||||
m_tx = true;
|
||||
switchedOff = turnDevice(false);
|
||||
}
|
||||
|
||||
if (m_settings.m_rxDeviceSetIndex >= 0)
|
||||
{
|
||||
m_tx = false;
|
||||
m_updateTimer.start(m_settings.m_tx2RxDelayMs);
|
||||
}
|
||||
}
|
||||
|
||||
if (switchedOff && (m_msgQueueToGUI))
|
||||
{
|
||||
SimplePTTReport::MsgRadioState *msg = SimplePTTReport::MsgRadioState::create(SimplePTTReport::RadioIdle);
|
||||
m_msgQueueToGUI->push(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SimplePTTWorker::updateHardware()
|
||||
{
|
||||
SWGSDRangel::SWGSuccessResponse response;
|
||||
SWGSDRangel::SWGErrorResponse error;
|
||||
m_updateTimer.stop();
|
||||
m_mutex.unlock();
|
||||
|
||||
if (turnDevice(true))
|
||||
{
|
||||
m_webAPIAdapterInterface->devicesetFocusPatch(
|
||||
m_tx ? m_settings.m_txDeviceSetIndex : m_settings.m_rxDeviceSetIndex, response, error);
|
||||
|
||||
if (m_msgQueueToGUI)
|
||||
{
|
||||
SimplePTTReport::MsgRadioState *msg = SimplePTTReport::MsgRadioState::create(
|
||||
m_tx ? SimplePTTReport::RadioTx : SimplePTTReport::RadioRx
|
||||
);
|
||||
m_msgQueueToGUI->push(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SimplePTTWorker::turnDevice(bool on)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceState response;
|
||||
SWGSDRangel::SWGErrorResponse error;
|
||||
int httpCode;
|
||||
|
||||
if (on) {
|
||||
httpCode = m_webAPIAdapterInterface->devicesetDeviceRunPost(
|
||||
m_tx ? m_settings.m_txDeviceSetIndex : m_settings.m_rxDeviceSetIndex, response, error);
|
||||
} else {
|
||||
httpCode = m_webAPIAdapterInterface->devicesetDeviceRunDelete(
|
||||
m_tx ? m_settings.m_txDeviceSetIndex : m_settings.m_rxDeviceSetIndex, response, error);
|
||||
}
|
||||
|
||||
if (httpCode/100 == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
qWarning("SimplePTTWorker::turnDevice: error: %s", qPrintable(*error.getMessage()));
|
||||
return false;
|
||||
}
|
||||
}
|
106
plugins/feature/simpleptt/simplepttworker.h
Normal file
106
plugins/feature/simpleptt/simplepttworker.h
Normal file
@ -0,0 +1,106 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// 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/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_FEATURE_SIMPLEPTTWORKER_H_
|
||||
#define INCLUDE_FEATURE_SIMPLEPTTWORKER_H_
|
||||
|
||||
#include <QObject>
|
||||
#include <QTimer>
|
||||
|
||||
#include "util/message.h"
|
||||
#include "util/messagequeue.h"
|
||||
|
||||
#include "simplepttsettings.h"
|
||||
|
||||
class WebAPIAdapterInterface;
|
||||
|
||||
class SimplePTTWorker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
class MsgConfigureSimplePTTWorker : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
const SimplePTTSettings& getSettings() const { return m_settings; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureSimplePTTWorker* create(const SimplePTTSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureSimplePTTWorker(settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
SimplePTTSettings m_settings;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureSimplePTTWorker(const SimplePTTSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
|
||||
class MsgPTT : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
bool getTx() const { return m_tx; }
|
||||
|
||||
static MsgPTT* create(bool tx) {
|
||||
return new MsgPTT(tx);
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_tx;
|
||||
|
||||
MsgPTT(bool tx) :
|
||||
Message(),
|
||||
m_tx(tx)
|
||||
{ }
|
||||
};
|
||||
|
||||
SimplePTTWorker(WebAPIAdapterInterface *webAPIAdapterInterface);
|
||||
~SimplePTTWorker();
|
||||
void reset();
|
||||
bool startWork();
|
||||
void stopWork();
|
||||
bool isRunning() const { return m_running; }
|
||||
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
void setMessageQueueToGUI(MessageQueue *messageQueue) { m_msgQueueToGUI = messageQueue; }
|
||||
|
||||
private:
|
||||
WebAPIAdapterInterface *m_webAPIAdapterInterface;
|
||||
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
|
||||
MessageQueue *m_msgQueueToGUI; //!< Queue to report state to GUI
|
||||
SimplePTTSettings m_settings;
|
||||
bool m_running;
|
||||
bool m_tx;
|
||||
QTimer m_updateTimer;
|
||||
QMutex m_mutex;
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const SimplePTTSettings& settings, bool force = false);
|
||||
void sendPTT(bool tx);
|
||||
bool turnDevice(bool on);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
void updateHardware();
|
||||
};
|
||||
|
||||
#endif // INCLUDE_FEATURE_SIMPLEPTTWORKER_H_
|
Loading…
Reference in New Issue
Block a user