1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-04-25 08:53:59 -04:00

SigMF file sink: REST API: Implementation

This commit is contained in:
f4exb 2020-07-17 12:16:23 +02:00
parent a63f36f860
commit 87bee18b9f
7 changed files with 193 additions and 35 deletions

View File

@ -24,6 +24,8 @@
#include <QBuffer>
#include "SWGChannelSettings.h"
#include "SWGChannelReport.h"
#include "SWGChannelActions.h"
#include "util/simpleserializer.h"
#include "dsp/dspcommands.h"
@ -34,6 +36,7 @@
#include "dsp/devicesamplemimo.h"
#include "device/deviceapi.h"
#include "sigmffilesinkmessages.h"
#include "sigmffilesinkbaseband.h"
#include "sigmffilesink.h"
@ -291,8 +294,8 @@ int SigMFFileSink::webapiSettingsGet(
QString& errorMessage)
{
(void) errorMessage;
response.setLocalSinkSettings(new SWGSDRangel::SWGLocalSinkSettings());
response.getLocalSinkSettings()->init();
response.setSigMfFileSinkSettings(new SWGSDRangel::SWGSigMFFileSinkSettings());
response.getSigMfFileSinkSettings()->init();
webapiFormatChannelSettings(response, m_settings);
return 200;
}
@ -322,59 +325,158 @@ int SigMFFileSink::webapiSettingsPutPatch(
return 200;
}
int SigMFFileSink::webapiReportGet(
SWGSDRangel::SWGChannelReport& response,
QString& errorMessage)
{
(void) errorMessage;
response.setSigMfFileSinkReport(new SWGSDRangel::SWGSigMFFileSinkReport());
response.getSigMfFileSinkReport()->init();
webapiFormatChannelReport(response);
return 200;
}
int SigMFFileSink::webapiActionsPost(
const QStringList& channelActionsKeys,
SWGSDRangel::SWGChannelActions& query,
QString& errorMessage)
{
SWGSDRangel::SWGSigMFFileSinkActions *swgSigMFFileSinkActions = query.getSigMfFileSinkActions();
if (swgSigMFFileSinkActions)
{
if (channelActionsKeys.contains("record"))
{
bool record = swgSigMFFileSinkActions->getRecord() != 0;
if (!m_settings.m_squelchRecordingEnable)
{
SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkWork *msg = SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkWork::create(record);
m_basebandSink->getInputMessageQueue()->push(msg);
if (getMessageQueueToGUI())
{
SigMFFileSinkMessages::MsgReportRecording *msgToGUI = SigMFFileSinkMessages::MsgReportRecording::create(record);
getMessageQueueToGUI()->push(msgToGUI);
}
}
}
return 202;
}
else
{
errorMessage = "Missing SigMFFileSinkActions in query";
return 400;
}
}
void SigMFFileSink::webapiUpdateChannelSettings(
SigMFFileSinkSettings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response)
{
if (channelSettingsKeys.contains("inputFrequencyOffset")) {
settings.m_inputFrequencyOffset = response.getSigMfFileSinkSettings()->getInputFrequencyOffset();
}
if (channelSettingsKeys.contains("fileRecordName")) {
settings.m_fileRecordName = *response.getSigMfFileSinkSettings()->getFileRecordName();
}
if (channelSettingsKeys.contains("rgbColor")) {
settings.m_rgbColor = response.getLocalSinkSettings()->getRgbColor();
settings.m_rgbColor = response.getSigMfFileSinkSettings()->getRgbColor();
}
if (channelSettingsKeys.contains("title")) {
settings.m_title = *response.getLocalSinkSettings()->getTitle();
settings.m_title = *response.getSigMfFileSinkSettings()->getTitle();
}
if (channelSettingsKeys.contains("log2Decim")) {
settings.m_log2Decim = response.getLocalSinkSettings()->getLog2Decim();
settings.m_log2Decim = response.getSigMfFileSinkSettings()->getLog2Decim();
}
if (channelSettingsKeys.contains("spectrumSquelchMode")) {
settings.m_spectrumSquelchMode = response.getSigMfFileSinkSettings()->getSpectrumSquelchMode() != 0;
}
if (channelSettingsKeys.contains("spectrumSquelch")) {
settings.m_spectrumSquelch = response.getSigMfFileSinkSettings()->getSpectrumSquelch();
}
if (channelSettingsKeys.contains("squelchPreRecordTime")) {
settings.m_squelchPreRecordTime = response.getSigMfFileSinkSettings()->getSquelchPreRecordTime();
}
if (channelSettingsKeys.contains("squelchPostRecordTime")) {
settings.m_squelchPostRecordTime = response.getSigMfFileSinkSettings()->getSquelchPostRecordTime();
}
if (channelSettingsKeys.contains("squelchRecordingEnable")) {
settings.m_squelchRecordingEnable = response.getSigMfFileSinkSettings()->getSquelchRecordingEnable() != 0;
}
if (channelSettingsKeys.contains("streamIndex")) {
settings.m_streamIndex = response.getSigMfFileSinkSettings()->getStreamIndex();
}
if (channelSettingsKeys.contains("useReverseAPI")) {
settings.m_useReverseAPI = response.getLocalSinkSettings()->getUseReverseApi() != 0;
settings.m_useReverseAPI = response.getSigMfFileSinkSettings()->getUseReverseApi() != 0;
}
if (channelSettingsKeys.contains("reverseAPIAddress")) {
settings.m_reverseAPIAddress = *response.getLocalSinkSettings()->getReverseApiAddress();
settings.m_reverseAPIAddress = *response.getSigMfFileSinkSettings()->getReverseApiAddress();
}
if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = response.getLocalSinkSettings()->getReverseApiPort();
settings.m_reverseAPIPort = response.getSigMfFileSinkSettings()->getReverseApiPort();
}
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = response.getLocalSinkSettings()->getReverseApiDeviceIndex();
settings.m_reverseAPIDeviceIndex = response.getSigMfFileSinkSettings()->getReverseApiDeviceIndex();
}
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = response.getLocalSinkSettings()->getReverseApiChannelIndex();
settings.m_reverseAPIChannelIndex = response.getSigMfFileSinkSettings()->getReverseApiChannelIndex();
}
if (channelSettingsKeys.contains("inputFrequencyOffset")) {
settings.m_reverseAPIChannelIndex = response.getSigMfFileSinkSettings()->getInputFrequencyOffset();
}
}
void SigMFFileSink::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const SigMFFileSinkSettings& settings)
{
response.getLocalSinkSettings()->setRgbColor(settings.m_rgbColor);
response.getSigMfFileSinkSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
if (response.getLocalSinkSettings()->getTitle()) {
*response.getLocalSinkSettings()->getTitle() = settings.m_title;
if (response.getSigMfFileSinkSettings()->getFileRecordName()) {
*response.getSigMfFileSinkSettings()->getFileRecordName() = settings.m_fileRecordName;
} else {
response.getLocalSinkSettings()->setTitle(new QString(settings.m_title));
response.getSigMfFileSinkSettings()->setFileRecordName(new QString(settings.m_fileRecordName));
}
response.getLocalSinkSettings()->setLog2Decim(settings.m_log2Decim);
response.getLocalSinkSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
response.getSigMfFileSinkSettings()->setRgbColor(settings.m_rgbColor);
if (response.getLocalSinkSettings()->getReverseApiAddress()) {
*response.getLocalSinkSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
if (response.getSigMfFileSinkSettings()->getTitle()) {
*response.getSigMfFileSinkSettings()->getTitle() = settings.m_title;
} else {
response.getLocalSinkSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
response.getSigMfFileSinkSettings()->setTitle(new QString(settings.m_title));
}
response.getLocalSinkSettings()->setReverseApiPort(settings.m_reverseAPIPort);
response.getLocalSinkSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
response.getLocalSinkSettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex);
response.getSigMfFileSinkSettings()->setLog2Decim(settings.m_log2Decim);
response.getSigMfFileSinkSettings()->setSpectrumSquelchMode(settings.m_spectrumSquelchMode ? 1 : 0);
response.getSigMfFileSinkSettings()->setSpectrumSquelch(settings.m_spectrumSquelch);
response.getSigMfFileSinkSettings()->setSquelchPreRecordTime(settings.m_squelchPreRecordTime);
response.getSigMfFileSinkSettings()->setSquelchPostRecordTime(settings.m_squelchPostRecordTime);
response.getSigMfFileSinkSettings()->setSquelchRecordingEnable(settings.m_squelchRecordingEnable ? 1 : 0);
response.getSigMfFileSinkSettings()->setStreamIndex(settings.m_streamIndex);
response.getSigMfFileSinkSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
if (response.getSigMfFileSinkSettings()->getReverseApiAddress()) {
*response.getSigMfFileSinkSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
} else {
response.getSigMfFileSinkSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
}
response.getSigMfFileSinkSettings()->setReverseApiPort(settings.m_reverseAPIPort);
response.getSigMfFileSinkSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
response.getSigMfFileSinkSettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex);
}
void SigMFFileSink::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
{
response.getSigMfFileSinkReport()->setSpectrumSquelch(m_basebandSink->isSquelchOpen() ? 1 : 0);
response.getSigMfFileSinkReport()->setSpectrumMax(m_basebandSink->getSpecMax());
response.getSigMfFileSinkReport()->setSinkSampleRate(m_basebandSink->getSinkSampleRate());
response.getSigMfFileSinkReport()->setRecordTimeMs(getMsCount());
response.getSigMfFileSinkReport()->setRecordSize(getByteCount());
response.getSigMfFileSinkReport()->setRecording(m_basebandSink->isRecording() ? 1 : 0);
response.getSigMfFileSinkReport()->setRecordCaptures(getNbTracks());
response.getSigMfFileSinkReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
}
void SigMFFileSink::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force)
@ -384,19 +486,43 @@ void SigMFFileSink::webapiReverseSendSettings(QList<QString>& channelSettingsKey
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
swgChannelSettings->setOriginatorDeviceSetIndex(getDeviceSetIndex());
swgChannelSettings->setChannelType(new QString("SigMFFileSink"));
swgChannelSettings->setLocalSinkSettings(new SWGSDRangel::SWGLocalSinkSettings());
SWGSDRangel::SWGLocalSinkSettings *swgLocalSinkSettings = swgChannelSettings->getLocalSinkSettings();
swgChannelSettings->setSigMfFileSinkSettings(new SWGSDRangel::SWGSigMFFileSinkSettings());
SWGSDRangel::SWGSigMFFileSinkSettings *swgSigMFFileSinkSettings = swgChannelSettings->getSigMfFileSinkSettings();
// transfer data that has been modified. When force is on transfer all data except reverse API data
if (channelSettingsKeys.contains("inputFrequencyOffset")) {
swgSigMFFileSinkSettings->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
}
if (channelSettingsKeys.contains("fileRecordName")) {
swgSigMFFileSinkSettings->setTitle(new QString(settings.m_fileRecordName));
}
if (channelSettingsKeys.contains("rgbColor") || force) {
swgLocalSinkSettings->setRgbColor(settings.m_rgbColor);
swgSigMFFileSinkSettings->setRgbColor(settings.m_rgbColor);
}
if (channelSettingsKeys.contains("title") || force) {
swgLocalSinkSettings->setTitle(new QString(settings.m_title));
swgSigMFFileSinkSettings->setTitle(new QString(settings.m_title));
}
if (channelSettingsKeys.contains("log2Decim") || force) {
swgLocalSinkSettings->setLog2Decim(settings.m_log2Decim);
swgSigMFFileSinkSettings->setLog2Decim(settings.m_log2Decim);
}
if (channelSettingsKeys.contains("spectrumSquelchMode")) {
swgSigMFFileSinkSettings->setSpectrumSquelchMode(settings.m_spectrumSquelchMode ? 1 : 0);
}
if (channelSettingsKeys.contains("spectrumSquelch")) {
swgSigMFFileSinkSettings->setSpectrumSquelch(settings.m_spectrumSquelch);
}
if (channelSettingsKeys.contains("squelchPreRecordTime")) {
swgSigMFFileSinkSettings->setSquelchPreRecordTime(settings.m_squelchPreRecordTime);
}
if (channelSettingsKeys.contains("squelchPostRecordTime")) {
swgSigMFFileSinkSettings->setSquelchPostRecordTime(settings.m_squelchPostRecordTime);
}
if (channelSettingsKeys.contains("squelchRecordingEnable")) {
swgSigMFFileSinkSettings->setSquelchRecordingEnable(settings.m_squelchRecordingEnable ? 1 : 0);
}
if (channelSettingsKeys.contains("streamIndex")) {
swgSigMFFileSinkSettings->setStreamIndex(settings.m_streamIndex);
}
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -425,7 +551,7 @@ void SigMFFileSink::networkManagerFinished(QNetworkReply *reply)
if (replyError)
{
qWarning() << "v::networkManagerFinished:"
qWarning() << "SigMFFileSink::networkManagerFinished:"
<< " error(" << (int) replyError
<< "): " << replyError
<< ": " << reply->errorString();

View File

@ -98,6 +98,15 @@ public:
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
virtual int webapiReportGet(
SWGSDRangel::SWGChannelReport& response,
QString& errorMessage);
virtual int webapiActionsPost(
const QStringList& channelActionsKeys,
SWGSDRangel::SWGChannelActions& query,
QString& errorMessage);
static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response,
const SigMFFileSinkSettings& settings);
@ -136,6 +145,7 @@ private:
void propagateSampleRateAndFrequency(uint32_t index, uint32_t log2Decim);
DeviceSampleSource *getLocalDevice(uint32_t index);
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force);
private slots:

View File

@ -31,6 +31,7 @@ MESSAGE_CLASS_DEFINITION(SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkWork, M
SigMFFileSinkBaseband::SigMFFileSinkBaseband() :
m_running(false),
m_specMax(0),
m_squelchLevel(0),
m_squelchOpen(false),
m_mutex(QMutex::Recursive)
@ -226,7 +227,8 @@ void SigMFFileSinkBaseband::tick()
{
if (m_spectrumSink && m_settings.m_spectrumSquelchMode)
{
bool squelchOpen = m_spectrumSink->getSpecMax() > m_squelchLevel;
m_specMax = m_spectrumSink->getSpecMax();
bool squelchOpen = m_specMax > m_squelchLevel;
if (squelchOpen != m_squelchOpen)
{

View File

@ -97,6 +97,10 @@ public:
void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; m_sink.setMessageQueueToGUI(messageQueue); }
void setDeviceHwId(const QString& hwId) { m_sink.setDeviceHwId(hwId); }
void setDeviceUId(int uid) { m_sink.setDeviceUId(uid); }
bool isSquelchOpen() const { return m_squelchOpen; }
bool isRecording() const { return m_sink.isRecording(); }
float getSpecMax() const { return m_specMax; }
int getSinkSampleRate() const { return m_sink.getSampleRate(); }
private:
SampleSinkFifo m_sampleFifo;
@ -106,6 +110,7 @@ private:
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
MessageQueue *m_messageQueueToGUI;
SigMFFileSinkSettings m_settings;
float m_specMax; //!< Last max used for comparison
float m_squelchLevel;
bool m_squelchOpen;
int64_t m_centerFrequency;

View File

@ -54,6 +54,8 @@ public:
unsigned int getNbTracks() const { return m_fileSink.getNbCaptures(); }
void setMessageQueueToGUI(MessageQueue *messageQueue) { m_msgQueueToGUI = messageQueue; }
void squelchRecording(bool squelchOpen);
int getSampleRate() const { return m_sinkSampleRate; }
bool isRecording() const { return m_record; }
private:
int m_channelSampleRate;

View File

@ -31,9 +31,9 @@ int SigMFFileSinkWebAPIAdapter::webapiSettingsGet(
{
(void) errorMessage;
(void) response;
// response.setLocalSinkSettings(new SWGSDRangel::SWGLocalSinkSettings());
// response.getLocalSinkSettings()->init();
// LocalSink::webapiFormatChannelSettings(response, m_settings);
response.setSigMfFileSinkSettings(new SWGSDRangel::SWGSigMFFileSinkSettings());
response.getSigMfFileSinkSettings()->init();
SigMFFileSink::webapiFormatChannelSettings(response, m_settings);
return 200;
}

View File

@ -91,7 +91,8 @@ const QMap<QString, QString> WebAPIRequestMapper::m_channelURIToSettingsKey = {
{"de.maintech.sdrangelove.channel.wfm", "WFMDemodSettings"}, // remap
{"sdrangel.channeltx.modwfm", "WFMModSettings"},
{"sdrangel.channel.beamsteeringcwmod", "BeamSteeringCWModSettings"},
{"sdrangel.channelmimo.interferometer", "InterferometerSettings"}
{"sdrangel.channelmimo.interferometer", "InterferometerSettings"},
{"sdrangel.channel.sigmffilesink", "SigMFFileSinkSettings"}
};
const QMap<QString, QString> WebAPIRequestMapper::m_deviceIdToSettingsKey = {
@ -164,11 +165,13 @@ const QMap<QString, QString> WebAPIRequestMapper::m_channelTypeToSettingsKey = {
{"WFMDemod", "WFMDemodSettings"},
{"WFMMod", "WFMModSettings"},
{"BeamSteeringCWMod", "BeamSteeringCWModSettings"},
{"Interferometer", "InterferometerSettings"}
{"Interferometer", "InterferometerSettings"},
{"SigMFFileSink", "SigMFFileSinkSettings"}
};
const QMap<QString, QString> WebAPIRequestMapper::m_channelTypeToActionsKey = {
{"FileSource", "FileSourceActions"}
{"FileSource", "FileSourceActions"},
{"SigMFFileSink", "SigMFFileSinkActions"}
};
const QMap<QString, QString> WebAPIRequestMapper::m_sourceDeviceHwIdToSettingsKey = {
@ -3484,6 +3487,11 @@ bool WebAPIRequestMapper::getChannelSettings(
channelSettings->setRemoteSourceSettings(new SWGSDRangel::SWGRemoteSourceSettings());
channelSettings->getRemoteSourceSettings()->fromJsonObject(settingsJsonObject);
}
else if (channelSettingsKey == "SigMFFileSinkSettings")
{
channelSettings->setSigMfFileSinkSettings(new SWGSDRangel::SWGSigMFFileSinkSettings());
channelSettings->getSigMfFileSinkSettings()->fromJsonObject(settingsJsonObject);
}
else if (channelSettingsKey == "SSBDemodSettings")
{
channelSettings->setSsbDemodSettings(new SWGSDRangel::SWGSSBDemodSettings());
@ -3556,6 +3564,11 @@ bool WebAPIRequestMapper::getChannelActions(
channelActions->setFileSourceActions(new SWGSDRangel::SWGFileSourceActions());
channelActions->getFileSourceActions()->fromJsonObject(actionsJsonObject);
}
else if (channelActionsKey == "SigMFFileSinkActions")
{
channelActions->setSigMfFileSinkActions(new SWGSDRangel::SWGSigMFFileSinkActions());
channelActions->getSigMfFileSinkActions()->fromJsonObject(actionsJsonObject);
}
else
{
return false;