kopia lustrzana https://github.com/f4exb/sdrangel
SDRdaemon: add initial source or sink device
rodzic
e3a094c9a1
commit
9eb05a5c14
|
@ -26,6 +26,10 @@
|
||||||
|
|
||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
#include "dsp/dspdevicesourceengine.h"
|
#include "dsp/dspdevicesourceengine.h"
|
||||||
|
#include "dsp/dspdevicesinkengine.h"
|
||||||
|
#include "device/devicesourceapi.h"
|
||||||
|
#include "device/devicesinkapi.h"
|
||||||
|
#include "device/deviceenumerator.h"
|
||||||
#include "plugin/pluginmanager.h"
|
#include "plugin/pluginmanager.h"
|
||||||
#include "util/message.h"
|
#include "util/message.h"
|
||||||
#include "loggerwithfile.h"
|
#include "loggerwithfile.h"
|
||||||
|
@ -73,11 +77,66 @@ SDRDaemonMain::SDRDaemonMain(qtwebapp::LoggerWithFile *logger, const SDRDaemonPa
|
||||||
m_apiServer = new SDRDaemon::WebAPIServer(parser.getServerAddress(), parser.getServerPort(), m_requestMapper);
|
m_apiServer = new SDRDaemon::WebAPIServer(parser.getServerAddress(), parser.getServerPort(), m_requestMapper);
|
||||||
m_apiServer->start();
|
m_apiServer->start();
|
||||||
|
|
||||||
|
m_tx = parser.getTx();
|
||||||
|
m_deviceType = parser.getDeviceType();
|
||||||
|
m_deviceSerial = parser.hasSerial() ? parser.getSerial() : "";
|
||||||
|
m_deviceSequence = parser.hasSequence() ? parser.getSequence() : -1;
|
||||||
|
m_deviceSourceEngine = 0;
|
||||||
|
m_deviceSinkEngine = 0;
|
||||||
|
m_deviceSourceAPI = 0;
|
||||||
|
m_deviceSinkAPI = 0;
|
||||||
|
|
||||||
|
if (m_tx)
|
||||||
|
{
|
||||||
|
if (addSinkDevice())
|
||||||
|
{
|
||||||
|
QString msg(tr("SDRDaemonMain::SDRDaemonMain: set sink %1").arg(m_deviceType));
|
||||||
|
if (m_deviceSerial.length() > 0) {
|
||||||
|
msg += tr(" ser: %1").arg(m_deviceSerial);
|
||||||
|
} else if (m_deviceSequence >= 0) {
|
||||||
|
msg += tr(" seq: %1").arg(m_deviceSequence);
|
||||||
|
} else {
|
||||||
|
msg += " first device";
|
||||||
|
}
|
||||||
|
QDebug info = qInfo();
|
||||||
|
info.noquote();
|
||||||
|
info << msg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCritical("SDRDaemonMain::SDRDaemonMain: sink device not found aborting");
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (addSourceDevice())
|
||||||
|
{
|
||||||
|
QString msg(tr("SDRDaemonMain::SDRDaemonMain: set source %1").arg(m_deviceType));
|
||||||
|
if (m_deviceSerial.length() > 0) {
|
||||||
|
msg += tr(" ser: %1").arg(m_deviceSerial);
|
||||||
|
} else if (m_deviceSequence >= 0) {
|
||||||
|
msg += tr(" seq: %1").arg(m_deviceSequence);
|
||||||
|
} else {
|
||||||
|
msg += " first device";
|
||||||
|
}
|
||||||
|
QDebug info = qInfo();
|
||||||
|
info.noquote();
|
||||||
|
info << msg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCritical("SDRDaemonMain::SDRDaemonMain: source device not found aborting");
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
qDebug() << "SDRDaemonMain::SDRDaemonMain: end";
|
qDebug() << "SDRDaemonMain::SDRDaemonMain: end";
|
||||||
}
|
}
|
||||||
|
|
||||||
SDRDaemonMain::~SDRDaemonMain()
|
SDRDaemonMain::~SDRDaemonMain()
|
||||||
{
|
{
|
||||||
|
removeDevice();
|
||||||
m_apiServer->stop();
|
m_apiServer->stop();
|
||||||
m_settings.save();
|
m_settings.save();
|
||||||
delete m_apiServer;
|
delete m_apiServer;
|
||||||
|
@ -86,7 +145,7 @@ SDRDaemonMain::~SDRDaemonMain()
|
||||||
|
|
||||||
delete m_pluginManager;
|
delete m_pluginManager;
|
||||||
|
|
||||||
qDebug() << "SDRDaemonMain::~SDRdaemon: end";
|
qDebug() << "SDRDaemonMain::~SDRDaemonMain: end";
|
||||||
delete m_logger;
|
delete m_logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,6 +206,146 @@ void SDRDaemonMain::setLoggingOptions()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SDRDaemonMain::addSinkDevice()
|
||||||
|
{
|
||||||
|
DSPDeviceSinkEngine *dspDeviceSinkEngine = m_dspEngine->addDeviceSinkEngine();
|
||||||
|
dspDeviceSinkEngine->start();
|
||||||
|
|
||||||
|
uint dspDeviceSinkEngineUID = dspDeviceSinkEngine->getUID();
|
||||||
|
char uidCStr[16];
|
||||||
|
sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID);
|
||||||
|
|
||||||
|
m_deviceSourceEngine = 0;
|
||||||
|
m_deviceSinkEngine = dspDeviceSinkEngine;
|
||||||
|
|
||||||
|
m_deviceSinkAPI = new DeviceSinkAPI(0, dspDeviceSinkEngine);
|
||||||
|
int deviceIndex = getDeviceIndex();
|
||||||
|
|
||||||
|
if (deviceIndex >= 0)
|
||||||
|
{
|
||||||
|
PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(deviceIndex);
|
||||||
|
m_deviceSinkAPI->setSampleSinkSequence(samplingDevice.sequence);
|
||||||
|
m_deviceSinkAPI->setNbItems(samplingDevice.deviceNbItems);
|
||||||
|
m_deviceSinkAPI->setItemIndex(samplingDevice.deviceItemIndex);
|
||||||
|
m_deviceSinkAPI->setHardwareId(samplingDevice.hardwareId);
|
||||||
|
m_deviceSinkAPI->setSampleSinkId(samplingDevice.id);
|
||||||
|
m_deviceSinkAPI->setSampleSinkSerial(samplingDevice.serial);
|
||||||
|
m_deviceSinkAPI->setSampleSinkDisplayName(samplingDevice.displayedName);
|
||||||
|
m_deviceSinkAPI->setSampleSinkPluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(deviceIndex));
|
||||||
|
|
||||||
|
DeviceSampleSink *sink = m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceOutput(
|
||||||
|
m_deviceSinkAPI->getSampleSinkId(), m_deviceSinkAPI);
|
||||||
|
m_deviceSinkAPI->setSampleSink(sink);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SDRDaemonMain::addSourceDevice()
|
||||||
|
{
|
||||||
|
DSPDeviceSourceEngine *dspDeviceSourceEngine = m_dspEngine->addDeviceSourceEngine();
|
||||||
|
dspDeviceSourceEngine->start();
|
||||||
|
|
||||||
|
uint dspDeviceSourceEngineUID = dspDeviceSourceEngine->getUID();
|
||||||
|
char uidCStr[16];
|
||||||
|
sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID);
|
||||||
|
|
||||||
|
m_deviceSourceAPI = new DeviceSourceAPI(0, dspDeviceSourceEngine);
|
||||||
|
int deviceIndex = getDeviceIndex();
|
||||||
|
|
||||||
|
if (deviceIndex >= 0)
|
||||||
|
{
|
||||||
|
PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(deviceIndex);
|
||||||
|
m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence);
|
||||||
|
m_deviceSourceAPI->setNbItems(samplingDevice.deviceNbItems);
|
||||||
|
m_deviceSourceAPI->setItemIndex(samplingDevice.deviceItemIndex);
|
||||||
|
m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId);
|
||||||
|
m_deviceSourceAPI->setSampleSourceId(samplingDevice.id);
|
||||||
|
m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial);
|
||||||
|
m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName);
|
||||||
|
m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(deviceIndex));
|
||||||
|
|
||||||
|
DeviceSampleSource *source = m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput(
|
||||||
|
m_deviceSourceAPI->getSampleSourceId(), m_deviceSourceAPI);
|
||||||
|
m_deviceSourceAPI->setSampleSource(source);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDRDaemonMain::removeDevice()
|
||||||
|
{
|
||||||
|
if (m_deviceSourceEngine) // source set
|
||||||
|
{
|
||||||
|
m_deviceSourceEngine->stopAcquistion();
|
||||||
|
|
||||||
|
// deletes old UI and input object
|
||||||
|
m_deviceSourceAPI->resetSampleSourceId();
|
||||||
|
m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput(
|
||||||
|
m_deviceSourceAPI->getSampleSource());
|
||||||
|
m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists
|
||||||
|
|
||||||
|
m_deviceSourceEngine->stop();
|
||||||
|
m_dspEngine->removeLastDeviceSourceEngine();
|
||||||
|
|
||||||
|
delete m_deviceSourceAPI;
|
||||||
|
m_deviceSourceAPI = 0;
|
||||||
|
}
|
||||||
|
else if (m_deviceSinkEngine) // sink set
|
||||||
|
{
|
||||||
|
m_deviceSinkEngine->stopGeneration();
|
||||||
|
|
||||||
|
// deletes old UI and output object
|
||||||
|
m_deviceSinkAPI->resetSampleSinkId();
|
||||||
|
m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput(
|
||||||
|
m_deviceSinkAPI->getSampleSink());
|
||||||
|
m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists
|
||||||
|
|
||||||
|
m_deviceSinkEngine->stop();
|
||||||
|
m_dspEngine->removeLastDeviceSinkEngine();
|
||||||
|
|
||||||
|
delete m_deviceSinkAPI;
|
||||||
|
m_deviceSinkAPI = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int SDRDaemonMain::getDeviceIndex()
|
||||||
|
{
|
||||||
|
int nbSamplingDevices = m_tx ? DeviceEnumerator::instance()->getNbTxSamplingDevices() : DeviceEnumerator::instance()->getNbRxSamplingDevices();
|
||||||
|
|
||||||
|
for (int i = 0; i < nbSamplingDevices; i++)
|
||||||
|
{
|
||||||
|
PluginInterface::SamplingDevice samplingDevice = m_tx ? DeviceEnumerator::instance()->getTxSamplingDevice(i) : DeviceEnumerator::instance()->getRxSamplingDevice(i);
|
||||||
|
if (samplingDevice.hardwareId == m_deviceType)
|
||||||
|
{
|
||||||
|
if (m_deviceSerial.length() > 0)
|
||||||
|
{
|
||||||
|
if (samplingDevice.serial == m_deviceSerial) {
|
||||||
|
return i;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_deviceSequence >= 0)
|
||||||
|
{
|
||||||
|
if (samplingDevice.sequence == m_deviceSequence) {
|
||||||
|
return i;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1; // not found
|
||||||
|
}
|
||||||
|
|
||||||
bool SDRDaemonMain::handleMessage(const Message& cmd __attribute__((unused)))
|
bool SDRDaemonMain::handleMessage(const Message& cmd __attribute__((unused)))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -43,6 +43,10 @@ class DSPEngine;
|
||||||
class PluginManager;
|
class PluginManager;
|
||||||
class Message;
|
class Message;
|
||||||
class WebAPIAdapterDaemon;
|
class WebAPIAdapterDaemon;
|
||||||
|
class DSPDeviceSourceEngine;
|
||||||
|
class DeviceSourceAPI;
|
||||||
|
class DSPDeviceSinkEngine;
|
||||||
|
class DeviceSinkAPI;
|
||||||
|
|
||||||
class SDRDaemonMain : public QObject {
|
class SDRDaemonMain : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -51,6 +55,15 @@ public:
|
||||||
~SDRDaemonMain();
|
~SDRDaemonMain();
|
||||||
static SDRDaemonMain *getInstance() { return m_instance; } // Main Core is de facto a singleton so this just returns its reference
|
static SDRDaemonMain *getInstance() { return m_instance; } // Main Core is de facto a singleton so this just returns its reference
|
||||||
|
|
||||||
|
MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||||
|
|
||||||
|
const QTimer& getMasterTimer() const { return m_masterTimer; }
|
||||||
|
const SDRDaemonSettings& getSettings() const { return m_settings; }
|
||||||
|
|
||||||
|
bool addSourceDevice();
|
||||||
|
bool addSinkDevice();
|
||||||
|
void removeDevice();
|
||||||
|
|
||||||
friend class WebAPIAdapterDaemon;
|
friend class WebAPIAdapterDaemon;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
@ -70,8 +83,19 @@ private:
|
||||||
SDRDaemon::WebAPIServer *m_apiServer;
|
SDRDaemon::WebAPIServer *m_apiServer;
|
||||||
WebAPIAdapterDaemon *m_apiAdapter;
|
WebAPIAdapterDaemon *m_apiAdapter;
|
||||||
|
|
||||||
|
bool m_tx;
|
||||||
|
QString m_deviceType;
|
||||||
|
QString m_deviceSerial;
|
||||||
|
int m_deviceSequence;
|
||||||
|
|
||||||
|
DSPDeviceSourceEngine *m_deviceSourceEngine;
|
||||||
|
DeviceSourceAPI *m_deviceSourceAPI;
|
||||||
|
DSPDeviceSinkEngine *m_deviceSinkEngine;
|
||||||
|
DeviceSinkAPI *m_deviceSinkAPI;
|
||||||
|
|
||||||
void loadSettings();
|
void loadSettings();
|
||||||
void setLoggingOptions();
|
void setLoggingOptions();
|
||||||
|
int getDeviceIndex();
|
||||||
bool handleMessage(const Message& cmd);
|
bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
|
@ -52,8 +52,8 @@ SDRDaemonParser::SDRDaemonParser() :
|
||||||
m_serialOption(QStringList() << "s" << "serial",
|
m_serialOption(QStringList() << "s" << "serial",
|
||||||
"Device serial number.",
|
"Device serial number.",
|
||||||
"serial"),
|
"serial"),
|
||||||
m_sequenceOption(QStringList() << "n" << "sequence",
|
m_sequenceOption(QStringList() << "i" << "sequence",
|
||||||
"Device sequence number in enumeration for the same device type.",
|
"Device sequence index in enumeration for the same device type.",
|
||||||
"sequence")
|
"sequence")
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -140,27 +140,31 @@ void SDRDaemonParser::parse(const QCoreApplication& app)
|
||||||
qWarning() << "SDRDaemonParser::parse: data port invalid. Defaulting to " << m_dataPort;
|
qWarning() << "SDRDaemonParser::parse: data port invalid. Defaulting to " << m_dataPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
// hardware Id
|
// device type
|
||||||
|
|
||||||
QString deviceType = m_parser.value(m_deviceTypeOption);
|
QString deviceType = m_parser.value(m_deviceTypeOption);
|
||||||
|
|
||||||
QRegExp deviceTypeRegex("^[A-Z][a-z][A-Za-z0-9]+$");
|
QRegExp deviceTypeRegex("^[A-Z][A-Za-z0-9]+$");
|
||||||
QRegExpValidator deviceTypeValidator(deviceTypeRegex);
|
QRegExpValidator deviceTypeValidator(deviceTypeRegex);
|
||||||
|
|
||||||
if (deviceTypeValidator.validate(deviceType, pos) == QValidator::Acceptable) {
|
if (deviceTypeValidator.validate(deviceType, pos) == QValidator::Acceptable) {
|
||||||
m_deviceType = deviceType;
|
m_deviceType = deviceType;
|
||||||
|
qDebug() << "SDRDaemonParser::parse: device type: " << m_deviceType;
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "SDRDaemonParser::parse: device type invalid. Defaulting to " << deviceType;
|
qWarning() << "SDRDaemonParser::parse: device type invalid. Defaulting to " << m_deviceType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// tx
|
// tx
|
||||||
m_tx = m_parser.isSet(m_txOption);
|
m_tx = m_parser.isSet(m_txOption);
|
||||||
|
qDebug() << "SDRDaemonParser::parse: tx: " << m_tx;
|
||||||
|
|
||||||
// serial
|
// serial
|
||||||
m_hasSerial = m_parser.isSet(m_serialOption);
|
m_hasSerial = m_parser.isSet(m_serialOption);
|
||||||
|
|
||||||
if (m_hasSerial) {
|
if (m_hasSerial)
|
||||||
|
{
|
||||||
m_serial = m_parser.value(m_serialOption);
|
m_serial = m_parser.value(m_serialOption);
|
||||||
|
qDebug() << "SDRDaemonParser::parse: serial: " << m_serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
// sequence
|
// sequence
|
||||||
|
@ -173,6 +177,7 @@ void SDRDaemonParser::parse(const QCoreApplication& app)
|
||||||
|
|
||||||
if (ok && (sequence >= 0) && (sequence < 65536)) {
|
if (ok && (sequence >= 0) && (sequence < 65536)) {
|
||||||
m_sequence = sequence;
|
m_sequence = sequence;
|
||||||
|
qDebug() << "SDRDaemonParser::parse: sequence: " << m_sequence;
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "SDRDaemonParser::parse: sequence invalid. Defaulting to " << m_sequence;
|
qWarning() << "SDRDaemonParser::parse: sequence invalid. Defaulting to " << m_sequence;
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue