mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-02-12 20:53:42 -05:00
Merge pull request #2632 from f4exb/feature-1329
Complete "atomic settings" for channel plugins
This commit is contained in:
commit
0698aaa5e1
@ -118,7 +118,7 @@ void BeamSteeringCWMod::startSources()
|
||||
m_basebandSource->getInputMessageQueue()->push(sig);
|
||||
|
||||
BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(
|
||||
m_settings, true);
|
||||
QStringList(), m_settings, true);
|
||||
m_basebandSource->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -152,42 +152,13 @@ void BeamSteeringCWMod::feed(const SampleVector::const_iterator& begin, const Sa
|
||||
(void) sinkIndex;
|
||||
}
|
||||
|
||||
void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings, bool force)
|
||||
void BeamSteeringCWMod::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "BeamSteeringCWMod::applySettings: "
|
||||
<< "m_steerDegrees: " << settings.m_steerDegrees
|
||||
<< "m_channelOutput: " << settings.m_channelOutput
|
||||
<< "m_filterChainHash: " << settings.m_filterChainHash
|
||||
<< "m_log2Interp: " << settings.m_log2Interp
|
||||
<< "m_filterChainHash: " << settings.m_filterChainHash
|
||||
<< "m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< "m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< "m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< "m_title: " << settings.m_title;
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((m_settings.m_steerDegrees != settings.m_steerDegrees) || force) {
|
||||
reverseAPIKeys.append("steerDegrees");
|
||||
}
|
||||
if ((m_settings.m_channelOutput != settings.m_channelOutput) || force) {
|
||||
reverseAPIKeys.append("channelOutput");
|
||||
}
|
||||
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
|
||||
reverseAPIKeys.append("filterChainHash");
|
||||
}
|
||||
if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) {
|
||||
reverseAPIKeys.append("log2Interp");
|
||||
}
|
||||
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
|
||||
reverseAPIKeys.append("filterChainHash");
|
||||
}
|
||||
qDebug() << "BeamSteeringCWMod::applySettings: " << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if (m_running)
|
||||
{
|
||||
BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(settings, force);
|
||||
BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSource->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -195,10 +166,14 @@ void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings,
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (!pipes.empty()) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void BeamSteeringCWMod::handleInputMessages()
|
||||
@ -220,7 +195,7 @@ bool BeamSteeringCWMod::handleMessage(const Message& cmd)
|
||||
{
|
||||
auto& cfg = (const MsgConfigureBeamSteeringCWMod&) cmd;
|
||||
qDebug() << "BeamSteeringCWMod::handleMessage: MsgConfigureBeamSteeringCWMod";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
return true;
|
||||
}
|
||||
else if (DSPMIMOSignalNotification::match(cmd))
|
||||
@ -274,14 +249,14 @@ bool BeamSteeringCWMod::deserialize(const QByteArray& data)
|
||||
(void) data;
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(m_settings, true);
|
||||
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(m_settings, true);
|
||||
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -334,12 +309,12 @@ int BeamSteeringCWMod::webapiSettingsPutPatch(
|
||||
BeamSteeringCWModSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(settings, force);
|
||||
MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
if (getMessageQueueToGUI()) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureBeamSteeringCWMod *msgToGUI = MsgConfigureBeamSteeringCWMod::create(settings, force);
|
||||
MsgConfigureBeamSteeringCWMod *msgToGUI = MsgConfigureBeamSteeringCWMod::create(channelSettingsKeys, settings, force);
|
||||
getMessageQueueToGUI()->push(msgToGUI);
|
||||
}
|
||||
|
||||
|
||||
@ -45,20 +45,23 @@ public:
|
||||
|
||||
public:
|
||||
const BeamSteeringCWModSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureBeamSteeringCWMod* create(const BeamSteeringCWModSettings& settings, bool force)
|
||||
static MsgConfigureBeamSteeringCWMod* create(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureBeamSteeringCWMod(settings, force);
|
||||
return new MsgConfigureBeamSteeringCWMod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
BeamSteeringCWModSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureBeamSteeringCWMod(const BeamSteeringCWModSettings& settings, bool force) :
|
||||
MsgConfigureBeamSteeringCWMod(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -164,7 +167,7 @@ private:
|
||||
uint32_t m_basebandSampleRate;
|
||||
|
||||
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
|
||||
void applySettings(const BeamSteeringCWModSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force = false);
|
||||
static void validateFilterChainHash(BeamSteeringCWModSettings& settings);
|
||||
void calculateFrequencyOffset();
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force);
|
||||
|
||||
@ -170,7 +170,7 @@ bool BeamSteeringCWModBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureBeamSteeringCWModBaseband& cfg = (MsgConfigureBeamSteeringCWModBaseband&) cmd;
|
||||
qDebug() << "BeamSteeringCWModBaseband::handleMessage: MsgConfigureBeamSteeringCWModBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -200,9 +200,9 @@ bool BeamSteeringCWModBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& settings, bool force)
|
||||
void BeamSteeringCWModBaseband::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
|
||||
{
|
||||
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || (m_settings.m_log2Interp != settings.m_log2Interp) || force)
|
||||
if ((settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) || (settingsKeys.contains("log2Interp") && (m_settings.m_log2Interp != settings.m_log2Interp)) || force)
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
@ -211,14 +211,14 @@ void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& s
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_settings.m_steerDegrees != settings.m_steerDegrees) || force)
|
||||
if ((settingsKeys.contains("steerDegrees") && (m_settings.m_steerDegrees != settings.m_steerDegrees)) || force)
|
||||
{
|
||||
float steeringAngle = settings.m_steerDegrees / 180.0f;
|
||||
steeringAngle = steeringAngle < -M_PI ? -M_PI : steeringAngle > M_PI ? M_PI : steeringAngle;
|
||||
m_streamSources[1].setPhase(M_PI*cos(steeringAngle));
|
||||
}
|
||||
|
||||
if ((m_settings.m_channelOutput != settings.m_channelOutput) || force)
|
||||
if ((settingsKeys.contains("channelOutput") && (m_settings.m_channelOutput != settings.m_channelOutput)) || force)
|
||||
{
|
||||
if (settings.m_channelOutput == 0)
|
||||
{
|
||||
@ -242,5 +242,9 @@ void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& s
|
||||
}
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,20 +39,23 @@ public:
|
||||
|
||||
public:
|
||||
const BeamSteeringCWModSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureBeamSteeringCWModBaseband* create(const BeamSteeringCWModSettings& settings, bool force)
|
||||
static MsgConfigureBeamSteeringCWModBaseband* create(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureBeamSteeringCWModBaseband(settings, force);
|
||||
return new MsgConfigureBeamSteeringCWModBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
BeamSteeringCWModSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureBeamSteeringCWModBaseband(const BeamSteeringCWModSettings& settings, bool force) :
|
||||
MsgConfigureBeamSteeringCWModBaseband(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -85,7 +88,7 @@ public:
|
||||
private:
|
||||
void processFifo(std::vector<SampleVector>& data, unsigned int ibegin, unsigned int iend);
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const BeamSteeringCWModSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force = false);
|
||||
|
||||
BeamSteeringCWModSettings m_settings;
|
||||
SampleMOFifo m_sampleMOFifo;
|
||||
|
||||
@ -38,7 +38,7 @@ void BeamSteeringCWModGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray BeamSteeringCWModGUI::serialize() const
|
||||
@ -50,7 +50,7 @@ bool BeamSteeringCWModGUI::deserialize(const QByteArray& data)
|
||||
{
|
||||
if(m_settings.deserialize(data)) {
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
} else {
|
||||
resetToDefaults();
|
||||
@ -128,7 +128,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
displayRateAndShift();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
|
||||
@ -142,13 +142,13 @@ void BeamSteeringCWModGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void BeamSteeringCWModGUI::applySettings(bool force)
|
||||
void BeamSteeringCWModGUI::applySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
setTitleColor(m_channelMarker.getColor());
|
||||
|
||||
BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod* message = BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::create(m_settings, force);
|
||||
BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod* message = BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::create(settingsKeys, m_settings, force);
|
||||
m_bsCWSource->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
@ -216,7 +216,7 @@ void BeamSteeringCWModGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -247,7 +247,15 @@ void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
|
||||
setTitle(m_channelMarker.getTitle());
|
||||
setTitleColor(m_settings.m_rgbColor);
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({
|
||||
"rgbColor",
|
||||
"title",
|
||||
"useReverseAPI",
|
||||
"reverseAPIAddress",
|
||||
"reverseAPIPort",
|
||||
"reverseAPIDeviceIndex",
|
||||
"reverseAPIChannelIndex"
|
||||
}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -256,7 +264,7 @@ void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
|
||||
void BeamSteeringCWModGUI::on_channelOutput_currentIndexChanged(int index)
|
||||
{
|
||||
m_settings.m_channelOutput = index;
|
||||
applySettings();
|
||||
applySettings(QStringList("channelOutput"));
|
||||
}
|
||||
|
||||
void BeamSteeringCWModGUI::on_interpolationFactor_currentIndexChanged(int index)
|
||||
@ -275,7 +283,7 @@ void BeamSteeringCWModGUI::on_steeringDegrees_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_steerDegrees = value;
|
||||
ui->steeringDegreesText->setText(tr("%1").arg(m_settings.m_steerDegrees));
|
||||
applySettings();
|
||||
applySettings(QStringList("steerDegrees"));
|
||||
}
|
||||
|
||||
void BeamSteeringCWModGUI::applyInterpolation()
|
||||
@ -301,7 +309,7 @@ void BeamSteeringCWModGUI::applyPosition()
|
||||
|
||||
displayRateAndShift();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"filterChainHash", "log2Interp"}));
|
||||
}
|
||||
|
||||
void BeamSteeringCWModGUI::tick()
|
||||
|
||||
@ -84,7 +84,7 @@ private:
|
||||
~BeamSteeringCWModGUI() final;
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void displayRateAndShift();
|
||||
bool handleMessage(const Message& message);
|
||||
|
||||
@ -134,7 +134,95 @@ bool BeamSteeringCWModSettings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void BeamSteeringCWModSettings::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("steerDegrees")) {
|
||||
m_steerDegrees = settings.m_steerDegrees;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("log2Interp")) {
|
||||
m_log2Interp = settings.m_log2Interp;
|
||||
}
|
||||
if (settingsKeys.contains("filterChainHash")) {
|
||||
m_filterChainHash = settings.m_filterChainHash;
|
||||
}
|
||||
if (settingsKeys.contains("channelOutput")) {
|
||||
m_channelOutput = settings.m_channelOutput;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("geometryBytes")) {
|
||||
m_geometryBytes = settings.m_geometryBytes;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString BeamSteeringCWModSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("steerDegrees") || force) {
|
||||
ostr << " m_steerDegrees: " << m_steerDegrees;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("log2Interp") || force) {
|
||||
ostr << " m_log2Interp: " << m_log2Interp;
|
||||
}
|
||||
if (settingsKeys.contains("filterChainHash") || force) {
|
||||
ostr << " m_filterChainHash: " << m_filterChainHash;
|
||||
}
|
||||
if (settingsKeys.contains("channelOutput") || force) {
|
||||
ostr << " m_channelOutput: " << m_channelOutput;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
@ -52,6 +52,8 @@ struct BeamSteeringCWModSettings
|
||||
void setRollupState(Serializable *RollupState) { m_rollupState = RollupState; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
};
|
||||
|
||||
#endif /* INCLUDE_BEAMSTEERINGCWMODSETTINGS_H_ */
|
||||
|
||||
@ -156,82 +156,41 @@ void DOA2::pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned
|
||||
(void) sourceIndex;
|
||||
}
|
||||
|
||||
void DOA2::applySettings(const DOA2Settings& settings, bool force)
|
||||
void DOA2::applySettings(const QStringList& settingsKeys, const DOA2Settings& settings, bool force)
|
||||
{
|
||||
qDebug() << "DOA2::applySettings: "
|
||||
<< "m_correlationType: " << settings.m_correlationType
|
||||
<< "m_filterChainHash: " << settings.m_filterChainHash
|
||||
<< "m_log2Decim: " << settings.m_log2Decim
|
||||
<< "m_phase: " << settings.m_phase
|
||||
<< "m_antennaAz:" << settings.m_antennaAz
|
||||
<< "m_basebandDistance: " << settings.m_basebandDistance
|
||||
<< "m_squelchdB: " << settings.m_squelchdB
|
||||
<< "m_fftAveragingIndex: "<< settings.m_fftAveragingIndex
|
||||
<< "m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< "m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< "m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< "m_title: " << settings.m_title;
|
||||
qDebug() << "DOA2::applySettings: " << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((m_settings.m_correlationType != settings.m_correlationType) || force) {
|
||||
reverseAPIKeys.append("correlationType");
|
||||
}
|
||||
if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) {
|
||||
reverseAPIKeys.append("filterChainHash");
|
||||
}
|
||||
if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) {
|
||||
reverseAPIKeys.append("log2Decim");
|
||||
}
|
||||
if ((m_settings.m_phase != settings.m_phase) || force) {
|
||||
reverseAPIKeys.append("phase");
|
||||
}
|
||||
if ((m_settings.m_title != settings.m_title) || force) {
|
||||
reverseAPIKeys.append("title");
|
||||
}
|
||||
if ((m_settings.m_antennaAz != settings.m_antennaAz) || force) {
|
||||
reverseAPIKeys.append("antennaAz");
|
||||
}
|
||||
if ((m_settings.m_basebandDistance != settings.m_basebandDistance) || force) {
|
||||
reverseAPIKeys.append("basebandDistance");
|
||||
}
|
||||
|
||||
if ((m_settings.m_squelchdB != settings.m_squelchdB) || force)
|
||||
if ((settingsKeys.contains("squelchdB") && m_settings.m_squelchdB != settings.m_squelchdB) || force)
|
||||
{
|
||||
reverseAPIKeys.append("squelchdB");
|
||||
|
||||
if (m_running) {
|
||||
m_basebandSink->setMagThreshold((float) CalcDb::powerFromdB(settings.m_squelchdB));
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_settings.m_fftAveragingIndex != settings.m_fftAveragingIndex) || force)
|
||||
if ((settingsKeys.contains("fftAveragingIndex") && m_settings.m_fftAveragingIndex != settings.m_fftAveragingIndex) || force)
|
||||
{
|
||||
reverseAPIKeys.append("m_fftAveragingIndex");
|
||||
|
||||
if (m_running) {
|
||||
m_basebandSink->setFFTAveraging(DOA2Settings::getAveragingValue(settings.m_fftAveragingIndex));
|
||||
}
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim)
|
||||
|| (m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
|
||||
if (m_running && ((settingsKeys.contains("log2Decim") && m_settings.m_log2Decim != settings.m_log2Decim)
|
||||
|| (settingsKeys.contains("filterChainHash") && m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
|
||||
{
|
||||
DOA2Baseband::MsgConfigureChannelizer *msg = DOA2Baseband::MsgConfigureChannelizer::create(
|
||||
settings.m_log2Decim, settings.m_filterChainHash);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_correlationType != settings.m_correlationType) || force))
|
||||
if (m_running && ((settingsKeys.contains("correlationType") && m_settings.m_correlationType != settings.m_correlationType) || force))
|
||||
{
|
||||
DOA2Baseband::MsgConfigureCorrelation *msg = DOA2Baseband::MsgConfigureCorrelation::create(
|
||||
settings.m_correlationType);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
if (m_running && ((m_settings.m_phase != settings.m_phase) || force)) {
|
||||
if (m_running && ((settingsKeys.contains("phase") && m_settings.m_phase != settings.m_phase) || force)) {
|
||||
m_basebandSink->setPhase(settings.m_phase);
|
||||
}
|
||||
|
||||
@ -239,7 +198,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (!pipes.empty()) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
@ -264,7 +223,7 @@ bool DOA2::handleMessage(const Message& cmd)
|
||||
{
|
||||
auto& cfg = (const MsgConfigureDOA2&) cmd;
|
||||
qDebug() << "DOA2::handleMessage: MsgConfigureDOA2";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
return true;
|
||||
}
|
||||
else if (DSPMIMOSignalNotification::match(cmd))
|
||||
@ -320,14 +279,14 @@ bool DOA2::deserialize(const QByteArray& data)
|
||||
(void) data;
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(m_settings, true);
|
||||
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(m_settings, true);
|
||||
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -400,12 +359,12 @@ int DOA2::webapiSettingsPutPatch(
|
||||
DOA2Settings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(settings, force);
|
||||
MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
if (getMessageQueueToGUI()) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDOA2 *msgToGUI = MsgConfigureDOA2::create(settings, force);
|
||||
MsgConfigureDOA2 *msgToGUI = MsgConfigureDOA2::create(channelSettingsKeys, settings, force);
|
||||
getMessageQueueToGUI()->push(msgToGUI);
|
||||
}
|
||||
|
||||
|
||||
@ -45,20 +45,23 @@ public:
|
||||
|
||||
public:
|
||||
const DOA2Settings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureDOA2* create(const DOA2Settings& settings, bool force)
|
||||
static MsgConfigureDOA2* create(const QStringList& settingsKeys, const DOA2Settings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDOA2(settings, force);
|
||||
return new MsgConfigureDOA2(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DOA2Settings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDOA2(const DOA2Settings& settings, bool force) :
|
||||
MsgConfigureDOA2(const QStringList& settingsKeys, const DOA2Settings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -175,7 +178,7 @@ private:
|
||||
qint64 m_deviceCenterFrequency;
|
||||
|
||||
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
|
||||
void applySettings(const DOA2Settings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DOA2Settings& settings, bool force = false);
|
||||
static void validateFilterChainHash(DOA2Settings& settings);
|
||||
void calculateFrequencyOffset();
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const;
|
||||
|
||||
@ -41,7 +41,7 @@ void DOA2GUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray DOA2GUI::serialize() const
|
||||
@ -54,7 +54,7 @@ bool DOA2GUI::deserialize(const QByteArray& data)
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@ -150,7 +150,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
displayRateAndShift();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
|
||||
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
|
||||
|
||||
@ -170,13 +170,13 @@ void DOA2GUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void DOA2GUI::applySettings(bool force)
|
||||
void DOA2GUI::applySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
setTitleColor(m_channelMarker.getColor());
|
||||
|
||||
DOA2::MsgConfigureDOA2* message = DOA2::MsgConfigureDOA2::create(m_settings, force);
|
||||
DOA2::MsgConfigureDOA2* message = DOA2::MsgConfigureDOA2::create(settingsKeys, m_settings, force);
|
||||
m_doa2->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
@ -284,7 +284,7 @@ void DOA2GUI::onWidgetRolled(const QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void DOA2GUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -315,7 +315,8 @@ void DOA2GUI::onMenuDialogCalled(const QPoint &p)
|
||||
setTitle(m_channelMarker.getTitle());
|
||||
setTitleColor(m_settings.m_rgbColor);
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress",
|
||||
"reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex"}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -338,14 +339,14 @@ void DOA2GUI::on_phaseCorrection_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_phase = value;
|
||||
ui->phaseCorrectionText->setText(tr("%1").arg(value));
|
||||
applySettings();
|
||||
applySettings(QStringList({"phase"}));
|
||||
}
|
||||
|
||||
void DOA2GUI::on_correlationType_currentIndexChanged(int index)
|
||||
{
|
||||
m_settings.m_correlationType = (DOA2Settings::CorrelationType) index;
|
||||
updateScopeFScale();
|
||||
applySettings();
|
||||
applySettings(QStringList({"correlationType"}));
|
||||
}
|
||||
|
||||
void DOA2GUI::on_antAz_valueChanged(int value)
|
||||
@ -353,28 +354,28 @@ void DOA2GUI::on_antAz_valueChanged(int value)
|
||||
m_settings.m_antennaAz = value;
|
||||
ui->compass->setAzAnt(value);
|
||||
updateDOA();
|
||||
applySettings();
|
||||
applySettings(QStringList({"antennaAz"}));
|
||||
}
|
||||
|
||||
void DOA2GUI::on_baselineDistance_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_basebandDistance = value < 1 ? 1 : value;
|
||||
updateDOA();
|
||||
applySettings();
|
||||
applySettings(QStringList({"basebandDistance"}));
|
||||
}
|
||||
|
||||
void DOA2GUI::on_squelch_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_squelchdB = value;
|
||||
ui->squelchText->setText(tr("%1").arg(m_settings.m_squelchdB, 3));
|
||||
applySettings();
|
||||
applySettings(QStringList({"squelchdB"}));
|
||||
}
|
||||
|
||||
void DOA2GUI::on_fftAveraging_currentIndexChanged(int index)
|
||||
{
|
||||
qDebug("DOA2GUI::on_averaging_currentIndexChanged: %d", index);
|
||||
m_settings.m_fftAveragingIndex = index;
|
||||
applySettings();
|
||||
applySettings(QStringList({"fftAveragingIndex"}));
|
||||
setFFTAveragingTooltip();
|
||||
}
|
||||
|
||||
@ -417,7 +418,7 @@ void DOA2GUI::applyPosition()
|
||||
|
||||
displayRateAndShift();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"filterChainHash", "log2Decim"}));
|
||||
}
|
||||
|
||||
void DOA2GUI::tick()
|
||||
|
||||
@ -84,7 +84,7 @@ private:
|
||||
~DOA2GUI() final;
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void applyDecimation();
|
||||
void applyPosition();
|
||||
void displaySettings();
|
||||
|
||||
@ -168,6 +168,123 @@ bool DOA2Settings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void DOA2Settings::applySettings(const QStringList& settingsKeys, const DOA2Settings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("correlationType")) {
|
||||
m_correlationType = settings.m_correlationType;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("log2Decim")) {
|
||||
m_log2Decim = settings.m_log2Decim;
|
||||
}
|
||||
if (settingsKeys.contains("filterChainHash")) {
|
||||
m_filterChainHash = settings.m_filterChainHash;
|
||||
}
|
||||
if (settingsKeys.contains("phase")) {
|
||||
m_phase = settings.m_phase;
|
||||
}
|
||||
if (settingsKeys.contains("antennaAz")) {
|
||||
m_antennaAz = settings.m_antennaAz;
|
||||
}
|
||||
if (settingsKeys.contains("basebandDistance")) {
|
||||
m_basebandDistance = settings.m_basebandDistance;
|
||||
}
|
||||
if (settingsKeys.contains("squelchdB")) {
|
||||
m_squelchdB = settings.m_squelchdB;
|
||||
}
|
||||
if (settingsKeys.contains("fftAveragingIndex")) {
|
||||
m_fftAveragingIndex = settings.m_fftAveragingIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("geometryBytes")) {
|
||||
m_geometryBytes = settings.m_geometryBytes;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString DOA2Settings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("correlationType") || force) {
|
||||
ostr << " m_correlationType: " << (int)m_correlationType;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("log2Decim") || force) {
|
||||
ostr << " m_log2Decim: " << m_log2Decim;
|
||||
}
|
||||
if (settingsKeys.contains("filterChainHash") || force) {
|
||||
ostr << " m_filterChainHash: " << m_filterChainHash;
|
||||
}
|
||||
if (settingsKeys.contains("phase") || force) {
|
||||
ostr << " m_phase: " << m_phase;
|
||||
}
|
||||
if (settingsKeys.contains("antennaAz") || force) {
|
||||
ostr << " m_antennaAz: " << m_antennaAz;
|
||||
}
|
||||
if (settingsKeys.contains("basebandDistance") || force) {
|
||||
ostr << " m_basebandDistance: " << m_basebandDistance;
|
||||
}
|
||||
if (settingsKeys.contains("squelchdB") || force) {
|
||||
ostr << " m_squelchdB: " << m_squelchdB;
|
||||
}
|
||||
if (settingsKeys.contains("fftAveragingIndex") || force) {
|
||||
ostr << " m_fftAveragingIndex: " << m_fftAveragingIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
int DOA2Settings::getAveragingValue(int averagingIndex)
|
||||
{
|
||||
if (averagingIndex <= 0) {
|
||||
|
||||
@ -65,6 +65,8 @@ struct DOA2Settings
|
||||
void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const DOA2Settings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
static int getAveragingValue(int averagingIndex);
|
||||
static int getAveragingIndex(int averagingValue);
|
||||
static const int m_averagingMaxExponent = 5; //!< Max 1M (10 * 10^5)
|
||||
|
||||
@ -183,7 +183,7 @@ void Interferometer::pull(SampleVector::iterator& begin, unsigned int nbSamples,
|
||||
|
||||
void Interferometer::applySettings(const InterferometerSettings& settings, const QList<QString>& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "Interferometer::applySettings:" << settings.getDebugString(settingsKeys, force) << "force: " << force;
|
||||
qDebug() << "Interferometer::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if (m_running && (settingsKeys.contains("log2Decim")
|
||||
|| settingsKeys.contains("filterChainHash") || force))
|
||||
|
||||
@ -56,7 +56,7 @@ ChannelAnalyzer::ChannelAnalyzer(DeviceAPI *deviceAPI) :
|
||||
m_basebandSink = new ChannelAnalyzerBaseband();
|
||||
m_basebandSink->moveToThread(&m_thread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(m_settings, QStringList(), true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -144,7 +144,7 @@ void ChannelAnalyzer::start()
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband *msg =
|
||||
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(m_settings, true);
|
||||
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(m_settings, QStringList(), true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
if (getMessageQueueToGUI())
|
||||
@ -169,7 +169,7 @@ bool ChannelAnalyzer::handleMessage(const Message& cmd)
|
||||
qDebug("ChannelAnalyzer::handleMessage: MsgConfigureChannelAnalyzer");
|
||||
MsgConfigureChannelAnalyzer& cfg = (MsgConfigureChannelAnalyzer&) cmd;
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -200,98 +200,14 @@ void ChannelAnalyzer::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
ChannelAnalyzerSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings);
|
||||
applySettings(settings, QStringList({"inputFrequencyOffset"}), false);
|
||||
}
|
||||
|
||||
void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, bool force)
|
||||
void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "ChannelAnalyzer::applySettings:"
|
||||
<< " m_rationalDownSample: " << settings.m_rationalDownSample
|
||||
<< " m_rationalDownSamplerRate: " << settings.m_rationalDownSamplerRate
|
||||
<< " m_rcc: " << settings.m_rrc
|
||||
<< " m_rrcRolloff: " << settings.m_rrcRolloff / 100.0
|
||||
<< " m_bandwidth: " << settings.m_bandwidth
|
||||
<< " m_lowCutoff: " << settings.m_lowCutoff
|
||||
<< " m_log2Decim: " << settings.m_log2Decim
|
||||
<< " m_ssb: " << settings.m_ssb
|
||||
<< " m_pll: " << settings.m_pll
|
||||
<< " m_fll: " << settings.m_fll
|
||||
<< " m_costasLoop: " << settings.m_costasLoop
|
||||
<< " m_pllPskOrder: " << settings.m_pllPskOrder
|
||||
<< " m_pllBandwidth: " << settings.m_pllBandwidth
|
||||
<< " m_pllDampingFactor: " << settings.m_pllDampingFactor
|
||||
<< " m_pllLoopGain: " << settings.m_pllLoopGain
|
||||
<< " m_inputType: " << (int) settings.m_inputType
|
||||
<< " m_useReverseAPI:" << settings.m_useReverseAPI
|
||||
<< " m_reverseAPIAddress:" << settings.m_reverseAPIAddress
|
||||
<< " m_reverseAPIPort:" << settings.m_reverseAPIPort
|
||||
<< " m_reverseAPIDeviceIndex:" << settings.m_reverseAPIDeviceIndex
|
||||
<< " m_reverseAPIChannelIndex:" << settings.m_reverseAPIChannelIndex;
|
||||
qDebug() << "ChannelAnalyzer::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
|
||||
reverseAPIKeys.append("inputFrequencyOffset");
|
||||
}
|
||||
if ((settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force) {
|
||||
reverseAPIKeys.append("rationalDownSample");
|
||||
}
|
||||
if ((settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate) || force) {
|
||||
reverseAPIKeys.append("rationalDownSamplerRate");
|
||||
}
|
||||
if ((settings.m_bandwidth != m_settings.m_bandwidth) || force) {
|
||||
reverseAPIKeys.append("bandwidth");
|
||||
}
|
||||
if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) {
|
||||
reverseAPIKeys.append("lowCutoff");
|
||||
}
|
||||
if ((settings.m_log2Decim != m_settings.m_log2Decim) || force) {
|
||||
reverseAPIKeys.append("log2Decim");
|
||||
}
|
||||
if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) {
|
||||
reverseAPIKeys.append("lowCutoff");
|
||||
}
|
||||
if ((settings.m_ssb != m_settings.m_ssb) || force) {
|
||||
reverseAPIKeys.append("ssb");
|
||||
}
|
||||
if ((settings.m_pll != m_settings.m_pll) || force) {
|
||||
reverseAPIKeys.append("pll");
|
||||
}
|
||||
if ((settings.m_fll != m_settings.m_fll) || force) {
|
||||
reverseAPIKeys.append("fll");
|
||||
}
|
||||
if ((settings.m_costasLoop != m_settings.m_costasLoop) || force) {
|
||||
reverseAPIKeys.append("costasLoop");
|
||||
}
|
||||
if ((settings.m_rrc != m_settings.m_rrc) || force) {
|
||||
reverseAPIKeys.append("rrc");
|
||||
}
|
||||
if ((settings.m_rrcRolloff != m_settings.m_rrcRolloff) || force) {
|
||||
reverseAPIKeys.append("rrcRolloff");
|
||||
}
|
||||
if ((settings.m_pllPskOrder != m_settings.m_pllPskOrder) || force) {
|
||||
reverseAPIKeys.append("pllPskOrder");
|
||||
}
|
||||
if ((settings.m_pllBandwidth != m_settings.m_pllBandwidth) || force) {
|
||||
reverseAPIKeys.append("pllBandwidth");
|
||||
}
|
||||
if ((settings.m_pllDampingFactor != m_settings.m_pllDampingFactor) || force) {
|
||||
reverseAPIKeys.append("pllDampingFactor");
|
||||
}
|
||||
if ((settings.m_pllLoopGain != m_settings.m_pllLoopGain) || force) {
|
||||
reverseAPIKeys.append("pllLoopGain");
|
||||
}
|
||||
if ((settings.m_inputType != m_settings.m_inputType) || force) {
|
||||
reverseAPIKeys.append("inputType");
|
||||
}
|
||||
if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) {
|
||||
reverseAPIKeys.append("rgbColor");
|
||||
}
|
||||
if ((settings.m_title != m_settings.m_title) || force) {
|
||||
reverseAPIKeys.append("title");
|
||||
}
|
||||
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex"))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -302,32 +218,34 @@ void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, boo
|
||||
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
|
||||
emit streamIndexChanged(settings.m_streamIndex);
|
||||
}
|
||||
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband *msg
|
||||
= ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(settings, force);
|
||||
= ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(settings, settingsKeys, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = settingsKeys.contains("useReverseAPI")
|
||||
|| settingsKeys.contains("reverseAPIAddress")
|
||||
|| settingsKeys.contains("reverseAPIPort")
|
||||
|| settingsKeys.contains("reverseAPIDeviceIndex")
|
||||
|| settingsKeys.contains("reverseAPIChannelIndex");
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
int ChannelAnalyzer::webapiSettingsGet(
|
||||
@ -360,13 +278,13 @@ int ChannelAnalyzer::webapiSettingsPutPatch(
|
||||
ChannelAnalyzerSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureChannelAnalyzer *msg = MsgConfigureChannelAnalyzer::create(settings, force);
|
||||
MsgConfigureChannelAnalyzer *msg = MsgConfigureChannelAnalyzer::create(settings, channelSettingsKeys, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("ChannelAnalyzer::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureChannelAnalyzer *msgToGUI = MsgConfigureChannelAnalyzer::create(settings, force);
|
||||
MsgConfigureChannelAnalyzer *msgToGUI = MsgConfigureChannelAnalyzer::create(settings, channelSettingsKeys, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -570,7 +488,7 @@ void ChannelAnalyzer::webapiFormatChannelSettings(
|
||||
}
|
||||
|
||||
void ChannelAnalyzer::webapiReverseSendSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const ChannelAnalyzerSettings& settings,
|
||||
bool force
|
||||
)
|
||||
@ -600,7 +518,7 @@ void ChannelAnalyzer::webapiReverseSendSettings(
|
||||
|
||||
void ChannelAnalyzer::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const ChannelAnalyzerSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@ -624,7 +542,7 @@ void ChannelAnalyzer::sendChannelSettings(
|
||||
}
|
||||
|
||||
void ChannelAnalyzer::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const ChannelAnalyzerSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -47,19 +47,22 @@ public:
|
||||
|
||||
public:
|
||||
const ChannelAnalyzerSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureChannelAnalyzer* create(const ChannelAnalyzerSettings& settings, bool force) {
|
||||
return new MsgConfigureChannelAnalyzer(settings, force);
|
||||
static MsgConfigureChannelAnalyzer* create(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) {
|
||||
return new MsgConfigureChannelAnalyzer(settings, settingsKeys, force);
|
||||
}
|
||||
|
||||
private:
|
||||
ChannelAnalyzerSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureChannelAnalyzer(const ChannelAnalyzerSettings& settings, bool force) :
|
||||
MsgConfigureChannelAnalyzer(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -149,16 +152,16 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force);
|
||||
void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const ChannelAnalyzerSettings& settings,
|
||||
bool force
|
||||
);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const ChannelAnalyzerSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -125,7 +125,7 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureChannelAnalyzerBaseband& cfg = (MsgConfigureChannelAnalyzerBaseband&) cmd;
|
||||
qDebug() << "ChannelAnalyzerBaseband::handleMessage: MsgConfigureChannelAnalyzerBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -148,7 +148,7 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, bool force)
|
||||
void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if ((settings.m_log2Decim != m_settings.m_log2Decim)
|
||||
|| (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)
|
||||
@ -160,7 +160,7 @@ void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& setti
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settings, settingsKeys, force);
|
||||
m_settings = settings;
|
||||
}
|
||||
|
||||
|
||||
@ -39,20 +39,23 @@ public:
|
||||
|
||||
public:
|
||||
const ChannelAnalyzerSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureChannelAnalyzerBaseband* create(const ChannelAnalyzerSettings& settings, bool force)
|
||||
static MsgConfigureChannelAnalyzerBaseband* create(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
return new MsgConfigureChannelAnalyzerBaseband(settings, force);
|
||||
return new MsgConfigureChannelAnalyzerBaseband(settings, settingsKeys, force);
|
||||
}
|
||||
|
||||
private:
|
||||
ChannelAnalyzerSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureChannelAnalyzerBaseband(const ChannelAnalyzerSettings& settings, bool force) :
|
||||
MsgConfigureChannelAnalyzerBaseband(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -85,7 +88,7 @@ private:
|
||||
QRecursiveMutex m_mutex;
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
|
||||
void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -226,14 +226,14 @@ bool ChannelAnalyzerGUI::deserialize(const QByteArray& data)
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
displaySettings();
|
||||
applySettings(true); // will have true
|
||||
applySettings(QStringList(), true); // will have true
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true); // will have true
|
||||
applySettings(QStringList(), true); // will have true
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -291,7 +291,7 @@ void ChannelAnalyzerGUI::channelMarkerChangedByCursor()
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::channelMarkerHighlightedByCursor()
|
||||
@ -324,7 +324,7 @@ void ChannelAnalyzerGUI::on_rationalDownSamplerRate_changed(quint64 value)
|
||||
{
|
||||
m_settings.m_rationalDownSamplerRate = value;
|
||||
setSinkSampleRate();
|
||||
applySettings();
|
||||
applySettings(QStringList({"rationalDownSamplerRate"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_pll_toggled(bool checked)
|
||||
@ -335,7 +335,7 @@ void ChannelAnalyzerGUI::on_pll_toggled(bool checked)
|
||||
|
||||
m_settings.m_pll = checked;
|
||||
setPLLVisibility();
|
||||
applySettings();
|
||||
applySettings(QStringList({"pll"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index)
|
||||
@ -343,7 +343,7 @@ void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index)
|
||||
m_settings.m_fll = (index == 1);
|
||||
m_settings.m_costasLoop = (index == 2);
|
||||
setPLLVisibility();
|
||||
applySettings();
|
||||
applySettings(QStringList({"fll", "costasLoop"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index)
|
||||
@ -352,7 +352,7 @@ void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index)
|
||||
m_settings.m_pllPskOrder = (1<<(index+1));
|
||||
else
|
||||
m_settings.m_pllPskOrder = (1<<index);
|
||||
applySettings();
|
||||
applySettings(QStringList({"pllPskOrder"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_pllBandwidth_valueChanged(int value)
|
||||
@ -360,7 +360,7 @@ void ChannelAnalyzerGUI::on_pllBandwidth_valueChanged(int value)
|
||||
m_settings.m_pllBandwidth = value/1000.0;
|
||||
QString bandwidthStr = QString::number(m_settings.m_pllBandwidth, 'f', 3);
|
||||
ui->pllBandwidthText->setText(bandwidthStr);
|
||||
applySettings();
|
||||
applySettings(QStringList({"pllBandwidth"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value)
|
||||
@ -368,7 +368,7 @@ void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value)
|
||||
m_settings.m_pllDampingFactor = value/10.0;
|
||||
QString factorStr = QString::number(m_settings.m_pllDampingFactor, 'f', 1);
|
||||
ui->pllDampingFactorText->setText(factorStr);
|
||||
applySettings();
|
||||
applySettings(QStringList({"pllDampingFactor"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value)
|
||||
@ -376,14 +376,14 @@ void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value)
|
||||
m_settings.m_pllLoopGain = value;
|
||||
QString gainStr = QString::number(m_settings.m_pllLoopGain, 'f', 0);
|
||||
ui->pllLoopGainText->setText(gainStr);
|
||||
applySettings();
|
||||
applySettings(QStringList({"pllLoopGain"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_useRationalDownsampler_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_rationalDownSample = checked;
|
||||
setSinkSampleRate();
|
||||
applySettings();
|
||||
applySettings(QStringList({"rationalDownSample"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index)
|
||||
@ -397,7 +397,7 @@ void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index)
|
||||
}
|
||||
|
||||
ui->scopeGUI->traceLengthChange();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputType"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value)
|
||||
@ -405,13 +405,13 @@ void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_rrcFilter_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_rrc = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList({"rrc"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value)
|
||||
@ -419,7 +419,7 @@ void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value)
|
||||
m_settings.m_rrcRolloff = value;
|
||||
QString rolloffStr = QString::number(value/100.0, 'f', 2);
|
||||
ui->rrcRolloffText->setText(rolloffStr);
|
||||
applySettings();
|
||||
applySettings(QStringList({"rrcRolloff"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_BW_valueChanged(int value)
|
||||
@ -428,7 +428,7 @@ void ChannelAnalyzerGUI::on_BW_valueChanged(int value)
|
||||
setFiltersUIBoundaries();
|
||||
m_settings.m_bandwidth = ui->BW->value() * 100;
|
||||
m_settings.m_lowCutoff = ui->lowCut->value() * 100;
|
||||
applySettings();
|
||||
applySettings(QStringList({"bandwidth", "lowCutoff"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value)
|
||||
@ -437,7 +437,7 @@ void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value)
|
||||
setFiltersUIBoundaries();
|
||||
m_settings.m_bandwidth = ui->BW->value() * 100;
|
||||
m_settings.m_lowCutoff = ui->lowCut->value() * 100;
|
||||
applySettings();
|
||||
applySettings(QStringList({"bandwidth", "lowCutoff"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index)
|
||||
@ -448,7 +448,7 @@ void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index)
|
||||
|
||||
m_settings.m_log2Decim = index;
|
||||
setSinkSampleRate();
|
||||
applySettings();
|
||||
applySettings(QStringList({"log2Decim"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::on_ssb_toggled(bool checked)
|
||||
@ -460,7 +460,7 @@ void ChannelAnalyzerGUI::on_ssb_toggled(bool checked)
|
||||
ui->BWLabel->setText("BP");
|
||||
}
|
||||
setFiltersUIBoundaries();
|
||||
applySettings();
|
||||
applySettings(QStringList({"ssb"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
@ -469,7 +469,7 @@ void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList({"rollupState"}));
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p)
|
||||
@ -514,7 +514,16 @@ void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({
|
||||
"rgbColor",
|
||||
"title",
|
||||
"useReverseAPI",
|
||||
"reverseAPIAddress",
|
||||
"reverseAPIPort",
|
||||
"reverseAPIDeviceIndex",
|
||||
"reverseAPIChannelIndex",
|
||||
"streamIndex"
|
||||
}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -596,7 +605,7 @@ ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *device
|
||||
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true); // will have true
|
||||
DialPopup::addPopupsToChildDials(this);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
@ -704,12 +713,12 @@ void ChannelAnalyzerGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void ChannelAnalyzerGUI::applySettings(bool force)
|
||||
void ChannelAnalyzerGUI::applySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
ChannelAnalyzer::MsgConfigureChannelAnalyzer* message =
|
||||
ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, force);
|
||||
ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, settingsKeys, force);
|
||||
m_channelAnalyzer->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ private:
|
||||
void setFiltersUIBoundaries();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void displayPLLSettings();
|
||||
void setPLLVisibility();
|
||||
|
||||
@ -196,3 +196,177 @@ bool ChannelAnalyzerSettings::deserialize(const QByteArray& data)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelAnalyzerSettings::applySettings(const QStringList& settingsKeys, const ChannelAnalyzerSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rationalDownSample")) {
|
||||
m_rationalDownSample = settings.m_rationalDownSample;
|
||||
}
|
||||
if (settingsKeys.contains("rationalDownSamplerRate")) {
|
||||
m_rationalDownSamplerRate = settings.m_rationalDownSamplerRate;
|
||||
}
|
||||
if (settingsKeys.contains("bandwidth")) {
|
||||
m_bandwidth = settings.m_bandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("lowCutoff")) {
|
||||
m_lowCutoff = settings.m_lowCutoff;
|
||||
}
|
||||
if (settingsKeys.contains("log2Decim")) {
|
||||
m_log2Decim = settings.m_log2Decim;
|
||||
}
|
||||
if (settingsKeys.contains("ssb")) {
|
||||
m_ssb = settings.m_ssb;
|
||||
}
|
||||
if (settingsKeys.contains("pll")) {
|
||||
m_pll = settings.m_pll;
|
||||
}
|
||||
if (settingsKeys.contains("fll")) {
|
||||
m_fll = settings.m_fll;
|
||||
}
|
||||
if (settingsKeys.contains("costasLoop")) {
|
||||
m_costasLoop = settings.m_costasLoop;
|
||||
}
|
||||
if (settingsKeys.contains("rrc")) {
|
||||
m_rrc = settings.m_rrc;
|
||||
}
|
||||
if (settingsKeys.contains("rrcRolloff")) {
|
||||
m_rrcRolloff = settings.m_rrcRolloff;
|
||||
}
|
||||
if (settingsKeys.contains("pllPskOrder")) {
|
||||
m_pllPskOrder = settings.m_pllPskOrder;
|
||||
}
|
||||
if (settingsKeys.contains("pllBandwidth")) {
|
||||
m_pllBandwidth = settings.m_pllBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("pllDampingFactor")) {
|
||||
m_pllDampingFactor = settings.m_pllDampingFactor;
|
||||
}
|
||||
if (settingsKeys.contains("pllLoopGain")) {
|
||||
m_pllLoopGain = settings.m_pllLoopGain;
|
||||
}
|
||||
if (settingsKeys.contains("inputType")) {
|
||||
m_inputType = settings.m_inputType;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString ChannelAnalyzerSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rationalDownSample") || force) {
|
||||
ostr << " m_rationalDownSample: " << m_rationalDownSample;
|
||||
}
|
||||
if (settingsKeys.contains("rationalDownSamplerRate") || force) {
|
||||
ostr << " m_rationalDownSamplerRate: " << m_rationalDownSamplerRate;
|
||||
}
|
||||
if (settingsKeys.contains("bandwidth") || force) {
|
||||
ostr << " m_bandwidth: " << m_bandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("lowCutoff") || force) {
|
||||
ostr << " m_lowCutoff: " << m_lowCutoff;
|
||||
}
|
||||
if (settingsKeys.contains("log2Decim") || force) {
|
||||
ostr << " m_log2Decim: " << m_log2Decim;
|
||||
}
|
||||
if (settingsKeys.contains("ssb") || force) {
|
||||
ostr << " m_ssb: " << m_ssb;
|
||||
}
|
||||
if (settingsKeys.contains("pll") || force) {
|
||||
ostr << " m_pll: " << m_pll;
|
||||
}
|
||||
if (settingsKeys.contains("fll") || force) {
|
||||
ostr << " m_fll: " << m_fll;
|
||||
}
|
||||
if (settingsKeys.contains("costasLoop") || force) {
|
||||
ostr << " m_costasLoop: " << m_costasLoop;
|
||||
}
|
||||
if (settingsKeys.contains("rrc") || force) {
|
||||
ostr << " m_rrc: " << m_rrc;
|
||||
}
|
||||
if (settingsKeys.contains("rrcRolloff") || force) {
|
||||
ostr << " m_rrcRolloff: " << m_rrcRolloff;
|
||||
}
|
||||
if (settingsKeys.contains("pllPskOrder") || force) {
|
||||
ostr << " m_pllPskOrder: " << m_pllPskOrder;
|
||||
}
|
||||
if (settingsKeys.contains("pllBandwidth") || force) {
|
||||
ostr << " m_pllBandwidth: " << m_pllBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("pllDampingFactor") || force) {
|
||||
ostr << " m_pllDampingFactor: " << m_pllDampingFactor;
|
||||
}
|
||||
if (settingsKeys.contains("pllLoopGain") || force) {
|
||||
ostr << " m_pllLoopGain: " << m_pllLoopGain;
|
||||
}
|
||||
if (settingsKeys.contains("inputType") || force) {
|
||||
ostr << " m_inputType: " << m_inputType;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
@ -75,6 +75,8 @@ struct ChannelAnalyzerSettings
|
||||
void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const ChannelAnalyzerSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@ ChannelAnalyzerSink::ChannelAnalyzerSink() :
|
||||
m_costasLoop.computeCoefficients(m_settings.m_pllBandwidth);
|
||||
|
||||
applyChannelSettings(m_channelSampleRate, m_sinkSampleRate, m_channelFrequencyOffset, true);
|
||||
applySettings(m_settings, true);
|
||||
applySettings(m_settings, QStringList(), true);
|
||||
}
|
||||
|
||||
ChannelAnalyzerSink::~ChannelAnalyzerSink()
|
||||
@ -243,26 +243,9 @@ void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowC
|
||||
RRCFilter->create_rrc_filter(bandwidth / sampleRate, m_settings.m_rrcRolloff / 100.0);
|
||||
}
|
||||
|
||||
void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, bool force)
|
||||
void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "ChannelAnalyzerSink::applySettings:"
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
|
||||
<< " m_rcc: " << settings.m_rrc
|
||||
<< " m_rrcRolloff: " << settings.m_rrcRolloff / 100.0
|
||||
<< " m_bandwidth: " << settings.m_bandwidth
|
||||
<< " m_lowCutoff: " << settings.m_lowCutoff
|
||||
<< " m_log2Decim: " << settings.m_log2Decim
|
||||
<< " m_rationalDownSample: " << settings.m_rationalDownSample
|
||||
<< " m_rationalDownSamplerRate: " << settings.m_rationalDownSamplerRate
|
||||
<< " m_ssb: " << settings.m_ssb
|
||||
<< " m_pll: " << settings.m_pll
|
||||
<< " m_fll: " << settings.m_fll
|
||||
<< " m_costasLoop: " << settings.m_costasLoop
|
||||
<< " m_pllPskOrder: " << settings.m_pllPskOrder
|
||||
<< " m_pllBandwidth: " << settings.m_pllBandwidth
|
||||
<< " m_pllDampingFactor: " << settings.m_pllDampingFactor
|
||||
<< " m_pllLoopGain: " << settings.m_pllLoopGain
|
||||
<< " m_inputType: " << (int) settings.m_inputType;
|
||||
qDebug() << "ChannelAnalyzerSink::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
bool doApplySampleRate = false;
|
||||
|
||||
if ((settings.m_bandwidth != m_settings.m_bandwidth) ||
|
||||
@ -331,7 +314,11 @@ void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings,
|
||||
}
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
|
||||
qDebug() << "ChannelAnalyzerSink::applySettings:"
|
||||
<< " m_rationalDownSample: " << settings.m_rationalDownSample;
|
||||
|
||||
@ -43,7 +43,7 @@ public:
|
||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
||||
|
||||
void applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
|
||||
void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false);
|
||||
|
||||
double getMagSq() const { return m_magsq; }
|
||||
double getMagSqAvg() const { return (double) m_channelPowerAvg; }
|
||||
|
||||
@ -54,7 +54,7 @@ AISDemod::AISDemod(DeviceAPI *deviceAPI) :
|
||||
m_basebandSink->setChannel(this);
|
||||
m_basebandSink->moveToThread(&m_thread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(m_settings, QStringList(), true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -128,7 +128,7 @@ void AISDemod::start()
|
||||
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(m_settings, true);
|
||||
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(m_settings, QStringList(), true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -146,7 +146,7 @@ bool AISDemod::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureAISDemod& cfg = (MsgConfigureAISDemod&) cmd;
|
||||
qDebug() << "AISDemod::handleMessage: MsgConfigureAISDemod";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -251,27 +251,18 @@ void AISDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
AISDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(settings, QStringList({"inputFrequencyOffset"}), false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, false);
|
||||
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, QStringList({"inputFrequencyOffset"}), false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void AISDemod::applySettings(const AISDemodSettings& settings, bool force)
|
||||
void AISDemod::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "AISDemod::applySettings:"
|
||||
<< " m_logEnabled: " << settings.m_logEnabled
|
||||
<< " m_logFilename: " << settings.m_logFilename
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< " force: " << force;
|
||||
qDebug() << "AISDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
@ -311,7 +302,8 @@ void AISDemod::applySettings(const AISDemodSettings& settings, bool force)
|
||||
if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) {
|
||||
reverseAPIKeys.append("useFileTime");
|
||||
}
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
|
||||
if (settingsKeys.contains("streamIndex"))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -326,17 +318,18 @@ void AISDemod::applySettings(const AISDemodSettings& settings, bool force)
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(settings, force);
|
||||
AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(settings, settingsKeys, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = settingsKeys.contains("useReverseAPI") ||
|
||||
settingsKeys.contains("reverseAPIAddress") ||
|
||||
settingsKeys.contains("reverseAPIPort") ||
|
||||
settingsKeys.contains("reverseAPIDeviceIndex") ||
|
||||
settingsKeys.contains("reverseAPIChannelIndex") ||
|
||||
settingsKeys.contains("reverseAPIChannelType");
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
if ((settings.m_logEnabled != m_settings.m_logEnabled)
|
||||
@ -381,14 +374,14 @@ bool AISDemod::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, true);
|
||||
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, QStringList(), true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, true);
|
||||
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, QStringList(), true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -443,13 +436,13 @@ int AISDemod::webapiSettingsPutPatch(
|
||||
AISDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(settings, force);
|
||||
MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(settings, channelSettingsKeys, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("AISDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, force);
|
||||
MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, channelSettingsKeys, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -612,7 +605,7 @@ void AISDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
|
||||
}
|
||||
}
|
||||
|
||||
void AISDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force)
|
||||
void AISDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@ -638,7 +631,7 @@ void AISDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
|
||||
}
|
||||
|
||||
void AISDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const AISDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -52,20 +52,23 @@ public:
|
||||
|
||||
public:
|
||||
const AISDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAISDemod* create(const AISDemodSettings& settings, bool force)
|
||||
static MsgConfigureAISDemod* create(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
return new MsgConfigureAISDemod(settings, force);
|
||||
return new MsgConfigureAISDemod(settings, settingsKeys, force);
|
||||
}
|
||||
|
||||
private:
|
||||
AISDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAISDemod(const AISDemodSettings& settings, bool force) :
|
||||
MsgConfigureAISDemod(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -184,11 +187,11 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const AISDemodSettings& settings, bool force = false);
|
||||
void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const AISDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -136,7 +136,7 @@ bool AISDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureAISDemodBaseband& cfg = (MsgConfigureAISDemodBaseband&) cmd;
|
||||
qDebug() << "AISDemodBaseband::handleMessage: MsgConfigureAISDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -156,7 +156,7 @@ bool AISDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool force)
|
||||
void AISDemodBaseband::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||
{
|
||||
@ -164,9 +164,13 @@ void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool forc
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settings, settingsKeys, force);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void AISDemodBaseband::setBasebandSampleRate(int sampleRate)
|
||||
|
||||
@ -44,20 +44,23 @@ public:
|
||||
|
||||
public:
|
||||
const AISDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAISDemodBaseband* create(const AISDemodSettings& settings, bool force)
|
||||
static MsgConfigureAISDemodBaseband* create(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
return new MsgConfigureAISDemodBaseband(settings, force);
|
||||
return new MsgConfigureAISDemodBaseband(settings, settingsKeys, force);
|
||||
}
|
||||
|
||||
private:
|
||||
AISDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAISDemodBaseband(const AISDemodSettings& settings, bool force) :
|
||||
MsgConfigureAISDemodBaseband(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -92,7 +95,7 @@ private:
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void calculateOffset(AISDemodSink *sink);
|
||||
void applySettings(const AISDemodSettings& settings, bool force = false);
|
||||
void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -132,7 +132,7 @@ void AISDemodGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray AISDemodGUI::serialize() const
|
||||
@ -144,7 +144,7 @@ bool AISDemodGUI::deserialize(const QByteArray& data)
|
||||
{
|
||||
if(m_settings.deserialize(data)) {
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
} else {
|
||||
resetToDefaults();
|
||||
@ -548,7 +548,7 @@ void AISDemodGUI::channelMarkerChangedByCursor()
|
||||
{
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::channelMarkerHighlightedByCursor()
|
||||
@ -561,7 +561,7 @@ void AISDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_rfBW_valueChanged(int value)
|
||||
@ -570,28 +570,28 @@ void AISDemodGUI::on_rfBW_valueChanged(int value)
|
||||
ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
|
||||
m_channelMarker.setBandwidth(bw);
|
||||
m_settings.m_rfBandwidth = bw;
|
||||
applySettings();
|
||||
applySettings(QStringList({"rfBandwidth"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_fmDev_valueChanged(int value)
|
||||
{
|
||||
ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_fmDeviation = value * 100.0;
|
||||
applySettings();
|
||||
applySettings(QStringList({"fmDeviation"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_threshold_valueChanged(int value)
|
||||
{
|
||||
ui->thresholdText->setText(QString("%1").arg(value));
|
||||
m_settings.m_correlationThreshold = value;
|
||||
applySettings();
|
||||
applySettings(QStringList({"correlationThreshold"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_filterMMSI_editingFinished()
|
||||
{
|
||||
m_settings.m_filterMMSI = ui->filterMMSI->text();
|
||||
filter();
|
||||
applySettings();
|
||||
applySettings(QStringList({"filterMMSI"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_clearTable_clicked()
|
||||
@ -602,25 +602,25 @@ void AISDemodGUI::on_clearTable_clicked()
|
||||
void AISDemodGUI::on_udpEnabled_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_udpEnabled = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList({"udpEnabled"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_udpAddress_editingFinished()
|
||||
{
|
||||
m_settings.m_udpAddress = ui->udpAddress->text();
|
||||
applySettings();
|
||||
applySettings(QStringList({"udpAddress"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_udpPort_editingFinished()
|
||||
{
|
||||
m_settings.m_udpPort = ui->udpPort->text().toInt();
|
||||
applySettings();
|
||||
applySettings(QStringList({"udpPort"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_udpFormat_currentIndexChanged(int value)
|
||||
{
|
||||
m_settings.m_udpFormat = (AISDemodSettings::UDPFormat)value;
|
||||
applySettings();
|
||||
applySettings(QStringList({"udpFormat"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_messages_cellDoubleClicked(int row, int column)
|
||||
@ -662,7 +662,7 @@ void AISDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void AISDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -707,7 +707,8 @@ void AISDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress",
|
||||
"reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -831,7 +832,7 @@ AISDemodGUI::AISDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
||||
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
DialPopup::addPopupsToChildDials(this);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
@ -864,11 +865,11 @@ void AISDemodGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void AISDemodGUI::applySettings(bool force)
|
||||
void AISDemodGUI::applySettings(const QStringList& settingsKeys, const bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
AISDemod::MsgConfigureAISDemod* message = AISDemod::MsgConfigureAISDemod::create( m_settings, force);
|
||||
AISDemod::MsgConfigureAISDemod* message = AISDemod::MsgConfigureAISDemod::create( m_settings, settingsKeys, force);
|
||||
m_aisDemod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
@ -973,13 +974,13 @@ void AISDemodGUI::on_showSlotMap_clicked(bool checked)
|
||||
{
|
||||
ui->slotMapWidget->setVisible(checked);
|
||||
m_settings.m_showSlotMap = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList({"showSlotMap"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_logEnable_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_logEnabled = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList({"logEnabled"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::on_logFilename_clicked()
|
||||
@ -995,7 +996,7 @@ void AISDemodGUI::on_logFilename_clicked()
|
||||
{
|
||||
m_settings.m_logFilename = fileNames[0];
|
||||
ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename));
|
||||
applySettings();
|
||||
applySettings(QStringList({"logFilename"}));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1092,7 +1093,7 @@ void AISDemodGUI::on_logOpen_clicked()
|
||||
void AISDemodGUI::on_useFileTime_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_useFileTime = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList({"useFileTime"}));
|
||||
}
|
||||
|
||||
void AISDemodGUI::makeUIConnections()
|
||||
|
||||
@ -113,7 +113,7 @@ private:
|
||||
virtual ~AISDemodGUI();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void messageReceived(const QByteArray& message, const QDateTime& dateTime, int slot, int slots);
|
||||
bool handleMessage(const Message& message);
|
||||
|
||||
@ -211,4 +211,158 @@ bool AISDemodSettings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void AISDemodSettings::applySettings(const QStringList& settingsKeys, const AISDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("baud")) {
|
||||
m_baud = settings.m_baud;
|
||||
}
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth")) {
|
||||
m_rfBandwidth = settings.m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("fmDeviation")) {
|
||||
m_fmDeviation = settings.m_fmDeviation;
|
||||
}
|
||||
if (settingsKeys.contains("correlationThreshold")) {
|
||||
m_correlationThreshold = settings.m_correlationThreshold;
|
||||
}
|
||||
if (settingsKeys.contains("filterMMSI")) {
|
||||
m_filterMMSI = settings.m_filterMMSI;
|
||||
}
|
||||
if (settingsKeys.contains("udpEnabled")) {
|
||||
m_udpEnabled = settings.m_udpEnabled;
|
||||
}
|
||||
if (settingsKeys.contains("udpAddress")) {
|
||||
m_udpAddress = settings.m_udpAddress;
|
||||
}
|
||||
if (settingsKeys.contains("udpPort")) {
|
||||
m_udpPort = settings.m_udpPort;
|
||||
}
|
||||
if (settingsKeys.contains("udpFormat")) {
|
||||
m_udpFormat = settings.m_udpFormat;
|
||||
}
|
||||
if (settingsKeys.contains("logFilename")) {
|
||||
m_logFilename = settings.m_logFilename;
|
||||
}
|
||||
if (settingsKeys.contains("logEnabled")) {
|
||||
m_logEnabled = settings.m_logEnabled;
|
||||
}
|
||||
if (settingsKeys.contains("showSlotMap")) {
|
||||
m_showSlotMap = settings.m_showSlotMap;
|
||||
}
|
||||
if (settingsKeys.contains("useFileTime")) {
|
||||
m_useFileTime = settings.m_useFileTime;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString AISDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("baud") || force) {
|
||||
ostr << " m_baud: " << m_baud;
|
||||
}
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth") || force) {
|
||||
ostr << " m_rfBandwidth: " << m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("fmDeviation") || force) {
|
||||
ostr << " m_fmDeviation: " << m_fmDeviation;
|
||||
}
|
||||
if (settingsKeys.contains("correlationThreshold") || force) {
|
||||
ostr << " m_correlationThreshold: " << m_correlationThreshold;
|
||||
}
|
||||
if (settingsKeys.contains("filterMMSI") || force) {
|
||||
ostr << " m_filterMMSI: " << m_filterMMSI.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("udpEnabled") || force) {
|
||||
ostr << " m_udpEnabled: " << m_udpEnabled;
|
||||
}
|
||||
if (settingsKeys.contains("udpAddress") || force) {
|
||||
ostr << " m_udpAddress: " << m_udpAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("udpPort") || force) {
|
||||
ostr << " m_udpPort: " << m_udpPort;
|
||||
}
|
||||
if (settingsKeys.contains("udpFormat") || force) {
|
||||
ostr << " m_udpFormat: " << m_udpFormat;
|
||||
}
|
||||
if (settingsKeys.contains("logFilename") || force) {
|
||||
ostr << " m_logFilename: " << m_logFilename.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("logEnabled") || force) {
|
||||
ostr << " m_logEnabled: " << m_logEnabled;
|
||||
}
|
||||
if (settingsKeys.contains("showSlotMap") || force) {
|
||||
ostr << " m_showSlotMap: " << m_showSlotMap;
|
||||
}
|
||||
if (settingsKeys.contains("useFileTime") || force) {
|
||||
ostr << " m_useFileTime: " << m_useFileTime;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
@ -80,6 +80,8 @@ struct AISDemodSettings
|
||||
void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const AISDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
};
|
||||
|
||||
#endif /* INCLUDE_AISDEMODSETTINGS_H */
|
||||
|
||||
@ -50,7 +50,7 @@ AISDemodSink::AISDemodSink(AISDemod *aisDemod) :
|
||||
m_sampleBuffer[i].resize(m_sampleBufferSize);
|
||||
}
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(m_settings, QStringList(), true);
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
}
|
||||
|
||||
@ -398,23 +398,22 @@ void AISDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
qDebug() << "AISDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol;
|
||||
}
|
||||
|
||||
void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
|
||||
void AISDemodSink::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "AISDemodSink::applySettings:"
|
||||
<< " force: " << force;
|
||||
qDebug() << "AISDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
||||
if ((settingsKeys.contains("rfBandwidth")) || force)
|
||||
{
|
||||
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
|
||||
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE;
|
||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||
}
|
||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
|
||||
if ((settingsKeys.contains("fmDeviation")) || force)
|
||||
{
|
||||
m_phaseDiscri.setFMScaling(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
|
||||
}
|
||||
|
||||
if ((settings.m_baud != m_settings.m_baud) || force)
|
||||
if ((settingsKeys.contains("baud")) || force)
|
||||
{
|
||||
m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud;
|
||||
qDebug() << "AISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
|
||||
@ -447,5 +446,9 @@ void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ public:
|
||||
|
||||
void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; }
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const AISDemodSettings& settings, bool force = false);
|
||||
void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
|
||||
void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; }
|
||||
void setChannel(ChannelAPI *channel) { m_channel = channel; }
|
||||
|
||||
|
||||
@ -60,7 +60,7 @@ AMDemod::AMDemod(DeviceAPI *deviceAPI) :
|
||||
m_lastTs(0)
|
||||
{
|
||||
setObjectName(m_channelId);
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -140,7 +140,7 @@ void AMDemod::start()
|
||||
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(m_settings, true);
|
||||
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
m_running = true;
|
||||
@ -164,7 +164,7 @@ bool AMDemod::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureAMDemod& cfg = (MsgConfigureAMDemod&) cmd;
|
||||
qDebug() << "AMDemod::handleMessage: MsgConfigureAMDemod";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -205,92 +205,20 @@ void AMDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
AMDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList("inputFrequencyOffset"), settings, false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, false);
|
||||
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(QStringList("inputFrequencyOffset"), settings, false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
|
||||
void AMDemod::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "AMDemod::applySettings:"
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_afBandwidth: " << settings.m_afBandwidth
|
||||
<< " m_volume: " << settings.m_volume
|
||||
<< " m_squelch: " << settings.m_squelch
|
||||
<< " m_audioMute: " << settings.m_audioMute
|
||||
<< " m_bandpassEnable: " << settings.m_bandpassEnable
|
||||
<< " m_audioDeviceName: " << settings.m_audioDeviceName
|
||||
<< " m_pll: " << settings.m_pll
|
||||
<< " m_syncAMOperation: " << (int) settings.m_syncAMOperation
|
||||
<< " m_frequencyMode: " << settings.m_frequencyMode
|
||||
<< " m_frequency: " << settings.m_frequency
|
||||
<< " m_snap: " << settings.m_snap
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< " force: " << force;
|
||||
qDebug() << "AMDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || force) {
|
||||
reverseAPIKeys.append("rfBandwidth");
|
||||
}
|
||||
if ((m_settings.m_afBandwidth != settings.m_afBandwidth) || force) {
|
||||
reverseAPIKeys.append("afBandwidth");
|
||||
}
|
||||
if ((m_settings.m_bandpassEnable != settings.m_bandpassEnable) || force) {
|
||||
reverseAPIKeys.append("bandpassEnable");
|
||||
}
|
||||
if ((m_settings.m_squelch != settings.m_squelch) || force) {
|
||||
reverseAPIKeys.append("squelch");
|
||||
}
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) {
|
||||
reverseAPIKeys.append("audioDeviceName");
|
||||
}
|
||||
|
||||
if ((m_settings.m_pll != settings.m_pll) || force)
|
||||
{
|
||||
reverseAPIKeys.append("pll");
|
||||
reverseAPIKeys.append("syncAMOperation");
|
||||
}
|
||||
|
||||
if ((m_settings.m_syncAMOperation != settings.m_syncAMOperation) || force)
|
||||
{
|
||||
reverseAPIKeys.append("pll");
|
||||
reverseAPIKeys.append("syncAMOperation");
|
||||
}
|
||||
|
||||
if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) {
|
||||
reverseAPIKeys.append("inputFrequencyOffset");
|
||||
}
|
||||
|
||||
if ((m_settings.m_audioMute != settings.m_audioMute) || force) {
|
||||
reverseAPIKeys.append("audioMute");
|
||||
}
|
||||
|
||||
if ((m_settings.m_volume != settings.m_volume) || force) {
|
||||
reverseAPIKeys.append("volume");
|
||||
}
|
||||
|
||||
if ((m_settings.m_frequencyMode != settings.m_frequencyMode) || force) {
|
||||
reverseAPIKeys.append("frequencyMode");
|
||||
}
|
||||
if ((m_settings.m_frequency != settings.m_frequency) || force) {
|
||||
reverseAPIKeys.append("frequency");
|
||||
}
|
||||
if ((m_settings.m_snap != settings.m_snap) || force) {
|
||||
reverseAPIKeys.append("snap");
|
||||
}
|
||||
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex"))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -301,34 +229,36 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
|
||||
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
|
||||
emit streamIndexChanged(settings.m_streamIndex);
|
||||
}
|
||||
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
if (m_running)
|
||||
{
|
||||
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(settings, force);
|
||||
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = (settingsKeys.contains("useReverseAPI")) ||
|
||||
(settingsKeys.contains("reverseAPIAddress")) ||
|
||||
(settingsKeys.contains("reverseAPIPort")) ||
|
||||
(settingsKeys.contains("reverseAPIDeviceIndex")) ||
|
||||
(settingsKeys.contains("reverseAPIChannelIndex"));
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray AMDemod::serialize() const
|
||||
@ -340,14 +270,14 @@ bool AMDemod::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true);
|
||||
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true);
|
||||
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -402,13 +332,13 @@ int AMDemod::webapiSettingsPutPatch(
|
||||
AMDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(settings, force);
|
||||
MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("AMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, force);
|
||||
MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(channelSettingsKeys, settings, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -598,7 +528,7 @@ void AMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
response.getAmDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
|
||||
}
|
||||
|
||||
void AMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force)
|
||||
void AMDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@ -625,7 +555,7 @@ void AMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, con
|
||||
|
||||
void AMDemod::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const AMDemodSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@ -649,7 +579,7 @@ void AMDemod::sendChannelSettings(
|
||||
}
|
||||
|
||||
void AMDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const AMDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -46,20 +46,23 @@ public:
|
||||
|
||||
public:
|
||||
const AMDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAMDemod* create(const AMDemodSettings& settings, bool force)
|
||||
static MsgConfigureAMDemod* create(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureAMDemod(settings, force);
|
||||
return new MsgConfigureAMDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
AMDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAMDemod(const AMDemodSettings& settings, bool force) :
|
||||
MsgConfigureAMDemod(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -159,18 +162,18 @@ private:
|
||||
qint64 m_lastTs;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const AMDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const AMDemodSettings& settings,
|
||||
bool force
|
||||
);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const AMDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -137,7 +137,7 @@ bool AMDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureAMDemodBaseband& cfg = (MsgConfigureAMDemodBaseband&) cmd;
|
||||
qDebug() << "AMDemodBaseband::handleMessage: MsgConfigureAMDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -164,9 +164,9 @@ bool AMDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force)
|
||||
void AMDemodBaseband::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
|
||||
{
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||
if ((settingsKeys.contains("inputFrequencyOffset")) || force)
|
||||
{
|
||||
m_channelizer.setChannelization(m_sink.getAudioSampleRate(), settings.m_inputFrequencyOffset);
|
||||
m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset());
|
||||
@ -178,7 +178,7 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
|
||||
if ((settingsKeys.contains("audioDeviceName")) || force)
|
||||
{
|
||||
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
|
||||
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
|
||||
@ -195,9 +195,13 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settingsKeys, settings, force);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
int AMDemodBaseband::getChannelSampleRate() const
|
||||
|
||||
@ -40,20 +40,23 @@ public:
|
||||
|
||||
public:
|
||||
const AMDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAMDemodBaseband* create(const AMDemodSettings& settings, bool force)
|
||||
static MsgConfigureAMDemodBaseband* create(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureAMDemodBaseband(settings, force);
|
||||
return new MsgConfigureAMDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
AMDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAMDemodBaseband(const AMDemodSettings& settings, bool force) :
|
||||
MsgConfigureAMDemodBaseband(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -89,7 +92,7 @@ private:
|
||||
QRecursiveMutex m_mutex;
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const AMDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -55,7 +55,7 @@ void AMDemodGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray AMDemodGUI::serialize() const
|
||||
@ -67,7 +67,7 @@ bool AMDemodGUI::deserialize(const QByteArray& data)
|
||||
{
|
||||
if(m_settings.deserialize(data)) {
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
} else {
|
||||
resetToDefaults();
|
||||
@ -237,7 +237,7 @@ void AMDemodGUI::on_frequencyMode_currentIndexChanged(int index)
|
||||
}
|
||||
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("frequencyMode"));
|
||||
}
|
||||
|
||||
// Calculate input frequency offset, when device center frequency changes
|
||||
@ -253,7 +253,7 @@ void AMDemodGUI::calcOffset()
|
||||
m_channelMarker.setCenterFrequency(offset);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("inputFrequencyOffset"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -285,7 +285,7 @@ void AMDemodGUI::channelMarkerChangedByCursor()
|
||||
ui->deltaFrequency->blockSignals(false);
|
||||
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset", "frequency"}));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
@ -316,7 +316,7 @@ void AMDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(offset);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"frequency", "inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_pll_toggled(bool checked)
|
||||
@ -328,19 +328,19 @@ void AMDemodGUI::on_pll_toggled(bool checked)
|
||||
}
|
||||
|
||||
m_settings.m_pll = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("pll"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_ssb_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_syncAMOperation = checked ? m_samUSB ? AMDemodSettings::SyncAMUSB : AMDemodSettings::SyncAMLSB : AMDemodSettings::SyncAMDSB;
|
||||
applySettings();
|
||||
applySettings(QStringList("syncAMOperation"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_bandpassEnable_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_bandpassEnable = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("bandpassEnable"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_rfBW_valueChanged(int value)
|
||||
@ -349,34 +349,34 @@ void AMDemodGUI::on_rfBW_valueChanged(int value)
|
||||
m_channelMarker.setBandwidth(value * 100);
|
||||
m_settings.m_rfBandwidth = value * 100;
|
||||
ui->afBW->setMaximum(value);
|
||||
applySettings();
|
||||
applySettings(QStringList("rfBandwidth"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_afBW_valueChanged(int value)
|
||||
{
|
||||
ui->afBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_afBandwidth = value * 100;
|
||||
applySettings();
|
||||
applySettings(QStringList("afBandwidth"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_volume_valueChanged(int value)
|
||||
{
|
||||
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_volume = value / 10.0;
|
||||
applySettings();
|
||||
applySettings(QStringList("volume"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_squelch_valueChanged(int value)
|
||||
{
|
||||
ui->squelchText->setText(QString("%1 dB").arg(value));
|
||||
m_settings.m_squelch = value;
|
||||
applySettings();
|
||||
applySettings(QStringList("squelch"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::on_audioMute_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_audioMute = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("audioMute"));
|
||||
}
|
||||
|
||||
void AMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
@ -389,7 +389,7 @@ void AMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
*/
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void AMDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -434,7 +434,10 @@ void AMDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({"title", "rgbColor", "useReverseAPI",
|
||||
"reverseAPIAddress", "reverseAPIPort",
|
||||
"reverseAPIDeviceIndex", "reverseAPIChannelIndex",
|
||||
"streamIndex"}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -507,7 +510,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
|
||||
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
|
||||
@ -521,11 +524,11 @@ void AMDemodGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void AMDemodGUI::applySettings(bool force)
|
||||
void AMDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
AMDemod::MsgConfigureAMDemod* message = AMDemod::MsgConfigureAMDemod::create( m_settings, force);
|
||||
AMDemod::MsgConfigureAMDemod* message = AMDemod::MsgConfigureAMDemod::create(settingsKeys, m_settings, force);
|
||||
m_amDemod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
@ -626,7 +629,7 @@ void AMDemodGUI::audioSelect(const QPoint& p)
|
||||
if (audioSelect.m_selected)
|
||||
{
|
||||
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
|
||||
applySettings();
|
||||
applySettings(QStringList("audioDeviceName"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -646,7 +649,7 @@ void AMDemodGUI::samSSBSelect(const QPoint& p)
|
||||
if (m_settings.m_syncAMOperation != AMDemodSettings::SyncAMDSB)
|
||||
{
|
||||
m_settings.m_syncAMOperation = m_samUSB ? AMDemodSettings::SyncAMUSB : AMDemodSettings::SyncAMLSB;
|
||||
applySettings();
|
||||
applySettings(QStringList("syncAMOperation"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -685,7 +688,7 @@ void AMDemodGUI::snapClicked()
|
||||
}
|
||||
|
||||
displaySnap();
|
||||
applySettings();
|
||||
applySettings(QStringList({"snap"}));
|
||||
}
|
||||
|
||||
void AMDemodGUI::applySnap()
|
||||
|
||||
@ -92,7 +92,7 @@ private:
|
||||
virtual ~AMDemodGUI();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
bool handleMessage(const Message& message);
|
||||
void makeUIConnections();
|
||||
|
||||
@ -178,4 +178,152 @@ bool AMDemodSettings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void AMDemodSettings::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth")) {
|
||||
m_rfBandwidth = settings.m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("squelch")) {
|
||||
m_squelch = settings.m_squelch;
|
||||
}
|
||||
if (settingsKeys.contains("volume")) {
|
||||
m_volume = settings.m_volume;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute")) {
|
||||
m_audioMute = settings.m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("bandpassEnable")) {
|
||||
m_bandpassEnable = settings.m_bandpassEnable;
|
||||
}
|
||||
if (settingsKeys.contains("afBandwidth")) {
|
||||
m_afBandwidth = settings.m_afBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName")) {
|
||||
m_audioDeviceName = settings.m_audioDeviceName;
|
||||
}
|
||||
if (settingsKeys.contains("pll")) {
|
||||
m_pll = settings.m_pll;
|
||||
}
|
||||
if (settingsKeys.contains("syncAMOperation")) {
|
||||
m_syncAMOperation = settings.m_syncAMOperation;
|
||||
}
|
||||
if (settingsKeys.contains("frequencyMode")) {
|
||||
m_frequencyMode = settings.m_frequencyMode;
|
||||
}
|
||||
if (settingsKeys.contains("frequency")) {
|
||||
m_frequency = settings.m_frequency;
|
||||
}
|
||||
if (settingsKeys.contains("snap")) {
|
||||
m_snap = settings.m_snap;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString AMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth") || force) {
|
||||
ostr << " m_rfBandwidth: " << m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("squelch") || force) {
|
||||
ostr << " m_squelch: " << m_squelch;
|
||||
}
|
||||
if (settingsKeys.contains("volume") || force) {
|
||||
ostr << " m_volume: " << m_volume;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute") || force) {
|
||||
ostr << " m_audioMute: " << m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("bandpassEnable") || force) {
|
||||
ostr << " m_bandpassEnable: " << m_bandpassEnable;
|
||||
}
|
||||
if (settingsKeys.contains("afBandwidth") || force) {
|
||||
ostr << " m_afBandwidth: " << m_afBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName") || force) {
|
||||
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("pll") || force) {
|
||||
ostr << " m_pll: " << m_pll;
|
||||
}
|
||||
if (settingsKeys.contains("syncAMOperation") || force) {
|
||||
ostr << " m_syncAMOperation: " << m_syncAMOperation;
|
||||
}
|
||||
if (settingsKeys.contains("frequencyMode") || force) {
|
||||
ostr << " m_frequencyMode: " << m_frequencyMode;
|
||||
}
|
||||
if (settingsKeys.contains("frequency") || force) {
|
||||
ostr << " m_frequency: " << m_frequency;
|
||||
}
|
||||
if (settingsKeys.contains("snap") || force) {
|
||||
ostr << " m_snap: " << m_snap;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
@ -74,6 +74,8 @@ struct AMDemodSettings
|
||||
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -60,7 +60,7 @@ AMDemodSink::AMDemodSink() :
|
||||
m_pll.computeCoefficients(0.05, 0.707, 1000);
|
||||
m_syncAMBuffIndex = 0;
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
}
|
||||
|
||||
@ -264,24 +264,13 @@ void AMDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequen
|
||||
m_channelFrequencyOffset = channelFrequencyOffset;
|
||||
}
|
||||
|
||||
void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force)
|
||||
void AMDemodSink::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "AMDemodSink::applySettings:"
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_volume: " << settings.m_volume
|
||||
<< " m_squelch: " << settings.m_squelch
|
||||
<< " m_audioMute: " << settings.m_audioMute
|
||||
<< " m_bandpassEnable: " << settings.m_bandpassEnable
|
||||
<< " m_afBandwidth: " << settings.m_afBandwidth
|
||||
<< " m_audioDeviceName: " << settings.m_audioDeviceName
|
||||
<< " m_pll: " << settings.m_pll
|
||||
<< " m_syncAMOperation: " << (int) settings.m_syncAMOperation
|
||||
<< " force: " << force;
|
||||
qDebug() << "AMDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
|
||||
(m_settings.m_bandpassEnable != settings.m_bandpassEnable) ||
|
||||
(m_settings.m_afBandwidth != settings.m_afBandwidth) || force)
|
||||
if((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) ||
|
||||
(settingsKeys.contains("bandpassEnable") && (settings.m_bandpassEnable != m_settings.m_bandpassEnable)) ||
|
||||
(settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force)
|
||||
{
|
||||
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2f);
|
||||
m_interpolatorDistanceRemain = 0;
|
||||
@ -291,11 +280,11 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force)
|
||||
DSBFilter->create_dsb_filter((2.0f * settings.m_rfBandwidth) / (float) m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((m_settings.m_squelch != settings.m_squelch) || force) {
|
||||
if ((settingsKeys.contains("squelch") && (m_settings.m_squelch != settings.m_squelch)) || force) {
|
||||
m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch);
|
||||
}
|
||||
|
||||
if ((m_settings.m_pll != settings.m_pll) || force)
|
||||
if ((settingsKeys.contains("pll") && (m_settings.m_pll != settings.m_pll)) || force)
|
||||
{
|
||||
if (settings.m_pll)
|
||||
{
|
||||
@ -308,11 +297,15 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_settings.m_syncAMOperation != settings.m_syncAMOperation) || force) {
|
||||
if ((settingsKeys.contains("syncAMOperation") && (m_settings.m_syncAMOperation != settings.m_syncAMOperation)) || force) {
|
||||
m_syncAMBuffIndex = 0;
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void AMDemodSink::applyAudioSampleRate(int sampleRate)
|
||||
|
||||
@ -43,7 +43,7 @@ public:
|
||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
||||
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const AMDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false);
|
||||
void applyAudioSampleRate(int sampleRate);
|
||||
|
||||
int getAudioSampleRate() const { return m_audioSampleRate; }
|
||||
|
||||
@ -62,7 +62,7 @@ APTDemod::APTDemod(DeviceAPI *deviceAPI) :
|
||||
m_basebandSink->setImagWorkerMessageQueue(m_imageWorker->getInputMessageQueue());
|
||||
m_imageWorker->moveToThread(&m_imageThread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -149,7 +149,7 @@ void APTDemod::startBasebandSink()
|
||||
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(m_settings, true);
|
||||
APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ void APTDemod::startImageWorker()
|
||||
m_imageWorker->startWork();
|
||||
m_imageThread.start();
|
||||
|
||||
APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msg = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(m_settings, true);
|
||||
APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msg = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(QStringList(), m_settings, true);
|
||||
m_imageWorker->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -202,7 +202,7 @@ bool APTDemod::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureAPTDemod& cfg = (MsgConfigureAPTDemod&) cmd;
|
||||
qDebug() << "APTDemod::handleMessage: MsgConfigureAPTDemod";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -239,116 +239,20 @@ void APTDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
APTDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList({"inputFrequencyOffset"}), settings, false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, false);
|
||||
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(QStringList({"inputFrequencyOffset"}), settings, false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemod::applySettings(const APTDemodSettings& settings, bool force)
|
||||
void APTDemod::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "APTDemod::applySettings:"
|
||||
<< " m_cropNoise: " << settings.m_cropNoise
|
||||
<< " m_denoise: " << settings.m_denoise
|
||||
<< " m_linearEqualise: " << settings.m_linearEqualise
|
||||
<< " m_histogramEqualise: " << settings.m_histogramEqualise
|
||||
<< " m_precipitationOverlay: " << settings.m_precipitationOverlay
|
||||
<< " m_flip: " << settings.m_flip
|
||||
<< " m_channels: " << settings.m_channels
|
||||
<< " m_decodeEnabled: " << settings.m_decodeEnabled
|
||||
<< " m_autoSave: " << settings.m_autoSave
|
||||
<< " m_autoSavePath: " << settings.m_autoSavePath
|
||||
<< " m_autoSaveMinScanLines: " << settings.m_autoSaveMinScanLines
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< " force: " << force;
|
||||
qDebug() << "APTDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
|
||||
reverseAPIKeys.append("inputFrequencyOffset");
|
||||
}
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
|
||||
reverseAPIKeys.append("rfBandwidth");
|
||||
}
|
||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {
|
||||
reverseAPIKeys.append("fmDeviation");
|
||||
}
|
||||
if ((settings.m_denoise != m_settings.m_denoise) || force) {
|
||||
reverseAPIKeys.append("denoise");
|
||||
}
|
||||
if ((settings.m_linearEqualise != m_settings.m_linearEqualise) || force) {
|
||||
reverseAPIKeys.append("linearEqualise");
|
||||
}
|
||||
if ((settings.m_histogramEqualise != m_settings.m_histogramEqualise) || force) {
|
||||
reverseAPIKeys.append("histogramEqualise");
|
||||
}
|
||||
if ((settings.m_precipitationOverlay != m_settings.m_precipitationOverlay) || force) {
|
||||
reverseAPIKeys.append("precipitationOverlay");
|
||||
}
|
||||
if ((settings.m_flip != m_settings.m_flip) || force) {
|
||||
reverseAPIKeys.append("flip");
|
||||
}
|
||||
if ((settings.m_channels != m_settings.m_channels) || force) {
|
||||
reverseAPIKeys.append("channels");
|
||||
}
|
||||
if ((settings.m_decodeEnabled != m_settings.m_decodeEnabled) || force) {
|
||||
reverseAPIKeys.append("decodeEnabled");
|
||||
}
|
||||
if ((settings.m_autoSave != m_settings.m_autoSave) || force) {
|
||||
reverseAPIKeys.append("autoSave");
|
||||
}
|
||||
if ((settings.m_autoSavePath != m_settings.m_autoSavePath) || force) {
|
||||
reverseAPIKeys.append("autoSavePath");
|
||||
}
|
||||
if ((settings.m_autoSaveMinScanLines != m_settings.m_autoSaveMinScanLines) || force) {
|
||||
reverseAPIKeys.append("autoSaveMinScanLines");
|
||||
}
|
||||
if ((settings.m_saveCombined != m_settings.m_saveCombined) || force) {
|
||||
reverseAPIKeys.append("saveCombined");
|
||||
}
|
||||
if ((settings.m_saveSeparate != m_settings.m_saveSeparate) || force) {
|
||||
reverseAPIKeys.append("saveSeparate");
|
||||
}
|
||||
if ((settings.m_saveProjection != m_settings.m_saveProjection) || force) {
|
||||
reverseAPIKeys.append("saveProjection");
|
||||
}
|
||||
if ((settings.m_scanlinesPerImageUpdate != m_settings.m_scanlinesPerImageUpdate) || force) {
|
||||
reverseAPIKeys.append("scanlinesPerImageUpdate");
|
||||
}
|
||||
if ((settings.m_transparencyThreshold != m_settings.m_transparencyThreshold) || force) {
|
||||
reverseAPIKeys.append("transparencyThreshold");
|
||||
}
|
||||
if ((settings.m_opacityThreshold != m_settings.m_opacityThreshold) || force) {
|
||||
reverseAPIKeys.append("opacityThreshold");
|
||||
}
|
||||
if ((settings.m_palettes != m_settings.m_palettes) || force) {
|
||||
reverseAPIKeys.append("palettes");
|
||||
}
|
||||
if ((settings.m_palette != m_settings.m_palette) || force) {
|
||||
reverseAPIKeys.append("palette");
|
||||
}
|
||||
if ((settings.m_horizontalPixelsPerDegree != m_settings.m_horizontalPixelsPerDegree) || force) {
|
||||
reverseAPIKeys.append("horizontalPixelsPerDegree");
|
||||
}
|
||||
if ((settings.m_verticalPixelsPerDegree != m_settings.m_verticalPixelsPerDegree) || force) {
|
||||
reverseAPIKeys.append("verticalPixelsPerDegree");
|
||||
}
|
||||
if ((settings.m_satTimeOffset != m_settings.m_satTimeOffset) || force) {
|
||||
reverseAPIKeys.append("satTimeOffset");
|
||||
}
|
||||
if ((settings.m_satYaw != m_settings.m_satYaw) || force) {
|
||||
reverseAPIKeys.append("satYaw");
|
||||
}
|
||||
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex"))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -359,26 +263,24 @@ void APTDemod::applySettings(const APTDemodSettings& settings, bool force)
|
||||
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
|
||||
emit streamIndexChanged(settings.m_streamIndex);
|
||||
}
|
||||
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg
|
||||
= APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settings, force);
|
||||
= APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msgToImg
|
||||
= APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(settings, force);
|
||||
= APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(settingsKeys, settings, force);
|
||||
m_imageWorker->getInputMessageQueue()->push(msgToImg);
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = (settingsKeys.contains("useReverseAPI")) ||
|
||||
(settingsKeys.contains("reverseAPIAddress")) ||
|
||||
(settingsKeys.contains("reverseAPIPort")) ||
|
||||
(settingsKeys.contains("reverseAPIDeviceIndex")) ||
|
||||
(settingsKeys.contains("reverseAPIChannelIndex"));
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
@ -393,14 +295,14 @@ bool APTDemod::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true);
|
||||
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true);
|
||||
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -436,13 +338,13 @@ int APTDemod::webapiSettingsPutPatch(
|
||||
APTDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(settings, force);
|
||||
MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("APTDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, force);
|
||||
MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(channelSettingsKeys, settings, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -645,7 +547,7 @@ void APTDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force)
|
||||
void APTDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@ -671,7 +573,7 @@ void APTDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
|
||||
}
|
||||
|
||||
void APTDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const APTDemodSettings& settings,
|
||||
bool force
|
||||
@ -825,9 +727,9 @@ int APTDemod::webapiActionsPost(
|
||||
settings.m_aosDateTime = QDateTime::fromString(*aos->getDateTime(), Qt::ISODateWithMs);
|
||||
settings.m_northToSouth = aos->getNorthToSouthPass();
|
||||
|
||||
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false));
|
||||
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
|
||||
if (m_guiMessageQueue) {
|
||||
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false));
|
||||
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
|
||||
}
|
||||
}
|
||||
|
||||
@ -858,10 +760,10 @@ int APTDemod::webapiActionsPost(
|
||||
// Disable decoder
|
||||
APTDemodSettings settings = m_settings;
|
||||
settings.m_decodeEnabled = false;
|
||||
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false));
|
||||
m_inputMessageQueue.push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
|
||||
|
||||
if (m_guiMessageQueue) {
|
||||
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false));
|
||||
m_guiMessageQueue->push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -48,20 +48,23 @@ public:
|
||||
|
||||
public:
|
||||
const APTDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAPTDemod* create(const APTDemodSettings& settings, bool force)
|
||||
static MsgConfigureAPTDemod* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureAPTDemod(settings, force);
|
||||
return new MsgConfigureAPTDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
APTDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAPTDemod(const APTDemodSettings& settings, bool force) :
|
||||
MsgConfigureAPTDemod(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -282,10 +285,10 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const APTDemodSettings& settings, bool force = false);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force);
|
||||
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const APTDemodSettings& settings, bool force);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const APTDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -129,7 +129,7 @@ bool APTDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureAPTDemodBaseband& cfg = (MsgConfigureAPTDemodBaseband&) cmd;
|
||||
qDebug() << "APTDemodBaseband::handleMessage: MsgConfigureAPTDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -154,17 +154,21 @@ bool APTDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemodBaseband::applySettings(const APTDemodSettings& settings, bool force)
|
||||
void APTDemodBaseband::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||
if ((settingsKeys.contains("m_inputFrequencyOffset")) || force)
|
||||
{
|
||||
m_channelizer->setChannelization(APTDEMOD_AUDIO_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settingsKeys, settings, force);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemodBaseband::setBasebandSampleRate(int sampleRate)
|
||||
|
||||
@ -40,20 +40,23 @@ public:
|
||||
|
||||
public:
|
||||
const APTDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAPTDemodBaseband* create(const APTDemodSettings& settings, bool force)
|
||||
static MsgConfigureAPTDemodBaseband* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureAPTDemodBaseband(settings, force);
|
||||
return new MsgConfigureAPTDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
APTDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAPTDemodBaseband(const APTDemodSettings& settings, bool force) :
|
||||
MsgConfigureAPTDemodBaseband(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -85,7 +88,7 @@ private:
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void calculateOffset(APTDemodSink *sink);
|
||||
void applySettings(const APTDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -101,7 +101,7 @@ void APTDemodGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray APTDemodGUI::serialize() const
|
||||
@ -114,7 +114,7 @@ bool APTDemodGUI::deserialize(const QByteArray& data)
|
||||
if(m_settings.deserialize(data))
|
||||
{
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
} else {
|
||||
resetToDefaults();
|
||||
@ -296,7 +296,7 @@ void APTDemodGUI::channelMarkerChangedByCursor()
|
||||
{
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("inputFrequencyOffset"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::channelMarkerHighlightedByCursor()
|
||||
@ -309,7 +309,7 @@ void APTDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("inputFrequencyOffset"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_rfBW_valueChanged(int value)
|
||||
@ -318,14 +318,14 @@ void APTDemodGUI::on_rfBW_valueChanged(int value)
|
||||
ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
|
||||
m_channelMarker.setBandwidth(bw);
|
||||
m_settings.m_rfBandwidth = bw;
|
||||
applySettings();
|
||||
applySettings(QStringList("rfBandwidth"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_fmDev_valueChanged(int value)
|
||||
{
|
||||
ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_fmDeviation = value * 100.0;
|
||||
applySettings();
|
||||
applySettings(QStringList("fmDeviation"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::displayLabels()
|
||||
@ -385,7 +385,7 @@ void APTDemodGUI::on_channels_currentIndexChanged(int index)
|
||||
m_settings.m_precipitationOverlay = false;
|
||||
}
|
||||
displayLabels();
|
||||
applySettings();
|
||||
applySettings(QStringList("channels"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_transparencyThreshold_valueChanged(int value)
|
||||
@ -394,13 +394,14 @@ void APTDemodGUI::on_transparencyThreshold_valueChanged(int value)
|
||||
ui->transparencyThresholdText->setText(QString::number(m_settings.m_transparencyThreshold));
|
||||
// Don't applySettings while tracking, as processing an image takes a long time
|
||||
if (!ui->transparencyThreshold->isSliderDown()) {
|
||||
applySettings();
|
||||
applySettings(QStringList("transparencyThreshold"), false);
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_transparencyThreshold_sliderReleased()
|
||||
{
|
||||
applySettings();
|
||||
m_settings.m_transparencyThreshold = ui->transparencyThreshold->value();
|
||||
applySettings(QStringList("transparencyThreshold"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_opacityThreshold_valueChanged(int value)
|
||||
@ -409,43 +410,44 @@ void APTDemodGUI::on_opacityThreshold_valueChanged(int value)
|
||||
ui->opacityThresholdText->setText(QString::number(m_settings.m_opacityThreshold));
|
||||
// Don't applySettings while tracking, as processing an image takes a long time
|
||||
if (!ui->opacityThreshold->isSliderDown()) {
|
||||
applySettings();
|
||||
applySettings(QStringList("opacityThreshold"), false);
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_opacityThreshold_sliderReleased()
|
||||
{
|
||||
applySettings();
|
||||
m_settings.m_opacityThreshold = ui->opacityThreshold->value();
|
||||
applySettings(QStringList("opacityThreshold"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_cropNoise_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_cropNoise = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("cropNoise"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_denoise_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_denoise = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("denoise"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_linear_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_linearEqualise = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("linearEqualise"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_histogram_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_histogramEqualise = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("histogramEqualise"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_precipitation_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_precipitationOverlay = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("precipitationOverlay"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_flip_clicked(bool checked)
|
||||
@ -456,13 +458,13 @@ void APTDemodGUI::on_flip_clicked(bool checked)
|
||||
} else {
|
||||
ui->image->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
|
||||
}
|
||||
applySettings();
|
||||
applySettings(QStringList("flip"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::on_startStop_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_decodeEnabled = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("decodeEnabled"), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::resetDecoder()
|
||||
@ -490,7 +492,21 @@ void APTDemodGUI::on_showSettings_clicked()
|
||||
if (dialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
displayPalettes();
|
||||
applySettings();
|
||||
applySettings(QStringList({
|
||||
"satelliteTrackerControl",
|
||||
"satelliteName",
|
||||
"autoSave",
|
||||
"saveCombined",
|
||||
"saveSeparate",
|
||||
"saveProjection",
|
||||
"autoSavePath",
|
||||
"autoSaveMinScanLines",
|
||||
"scanlinesPerImageUpdate",
|
||||
"horizontalPixelsPerDegree",
|
||||
"verticalPixelsPerDegree",
|
||||
"satTimeOffset",
|
||||
"satYaw",
|
||||
}), false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -551,7 +567,7 @@ void APTDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList(), false);
|
||||
}
|
||||
|
||||
void APTDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -596,7 +612,19 @@ void APTDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList(
|
||||
{
|
||||
"rgbColor",
|
||||
"title",
|
||||
"useReverseAPI",
|
||||
"reverseAPIAddress",
|
||||
"reverseAPIPort",
|
||||
"reverseAPIDeviceIndex",
|
||||
"reverseAPIChannelIndex",
|
||||
"streamIndex"
|
||||
}),
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -679,7 +707,7 @@ APTDemodGUI::APTDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
||||
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
DialPopup::addPopupsToChildDials(this);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
@ -743,11 +771,11 @@ void APTDemodGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void APTDemodGUI::applySettings(bool force)
|
||||
void APTDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create( m_settings, force);
|
||||
APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create(settingsKeys, m_settings, force);
|
||||
m_aptDemod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -121,7 +121,7 @@ private:
|
||||
virtual ~APTDemodGUI();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void displayPalettes();
|
||||
void displayLabels();
|
||||
|
||||
@ -49,20 +49,23 @@ public:
|
||||
|
||||
public:
|
||||
const APTDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureAPTDemodImageWorker* create(const APTDemodSettings& settings, bool force)
|
||||
static MsgConfigureAPTDemodImageWorker* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureAPTDemodImageWorker(settings, force);
|
||||
return new MsgConfigureAPTDemodImageWorker(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
APTDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureAPTDemodImageWorker(const APTDemodSettings& settings, bool force) :
|
||||
MsgConfigureAPTDemodImageWorker(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
|
||||
@ -218,4 +218,260 @@ bool APTDemodSettings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void APTDemodSettings::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth")) {
|
||||
m_rfBandwidth = settings.m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("fmDeviation")) {
|
||||
m_fmDeviation = settings.m_fmDeviation;
|
||||
}
|
||||
if (settingsKeys.contains("cropNoise")) {
|
||||
m_cropNoise = settings.m_cropNoise;
|
||||
}
|
||||
if (settingsKeys.contains("denoise")) {
|
||||
m_denoise = settings.m_denoise;
|
||||
}
|
||||
if (settingsKeys.contains("linearEqualise")) {
|
||||
m_linearEqualise = settings.m_linearEqualise;
|
||||
}
|
||||
if (settingsKeys.contains("histogramEqualise")) {
|
||||
m_histogramEqualise = settings.m_histogramEqualise;
|
||||
}
|
||||
if (settingsKeys.contains("precipitationOverlay")) {
|
||||
m_precipitationOverlay = settings.m_precipitationOverlay;
|
||||
}
|
||||
if (settingsKeys.contains("flip")) {
|
||||
m_flip = settings.m_flip;
|
||||
}
|
||||
if (settingsKeys.contains("channels")) {
|
||||
m_channels = settings.m_channels;
|
||||
}
|
||||
if (settingsKeys.contains("decodeEnabled")) {
|
||||
m_decodeEnabled = settings.m_decodeEnabled;
|
||||
}
|
||||
if (settingsKeys.contains("satelliteTrackerControl")) {
|
||||
m_satelliteTrackerControl = settings.m_satelliteTrackerControl;
|
||||
}
|
||||
if (settingsKeys.contains("satelliteName")) {
|
||||
m_satelliteName = settings.m_satelliteName;
|
||||
}
|
||||
if (settingsKeys.contains("autoSave")) {
|
||||
m_autoSave = settings.m_autoSave;
|
||||
}
|
||||
if (settingsKeys.contains("autoSavePath")) {
|
||||
m_autoSavePath = settings.m_autoSavePath;
|
||||
}
|
||||
if (settingsKeys.contains("autoSaveMinScanLines")) {
|
||||
m_autoSaveMinScanLines = settings.m_autoSaveMinScanLines;
|
||||
}
|
||||
if (settingsKeys.contains("saveCombined")) {
|
||||
m_saveCombined = settings.m_saveCombined;
|
||||
}
|
||||
if (settingsKeys.contains("saveSeparate")) {
|
||||
m_saveSeparate = settings.m_saveSeparate;
|
||||
}
|
||||
if (settingsKeys.contains("saveProjection")) {
|
||||
m_saveProjection = settings.m_saveProjection;
|
||||
}
|
||||
if (settingsKeys.contains("scanlinesPerImageUpdate")) {
|
||||
m_scanlinesPerImageUpdate = settings.m_scanlinesPerImageUpdate;
|
||||
}
|
||||
if (settingsKeys.contains("transparencyThreshold")) {
|
||||
m_transparencyThreshold = settings.m_transparencyThreshold;
|
||||
}
|
||||
if (settingsKeys.contains("opacityThreshold")) {
|
||||
m_opacityThreshold = settings.m_opacityThreshold;
|
||||
}
|
||||
if (settingsKeys.contains("palettes")) {
|
||||
m_palettes = settings.m_palettes;
|
||||
}
|
||||
if (settingsKeys.contains("palette")) {
|
||||
m_palette = settings.m_palette;
|
||||
}
|
||||
if (settingsKeys.contains("horizontalPixelsPerDegree")) {
|
||||
m_horizontalPixelsPerDegree = settings.m_horizontalPixelsPerDegree;
|
||||
}
|
||||
if (settingsKeys.contains("verticalPixelsPerDegree")) {
|
||||
m_verticalPixelsPerDegree = settings.m_verticalPixelsPerDegree;
|
||||
}
|
||||
if (settingsKeys.contains("satTimeOffset")) {
|
||||
m_satTimeOffset = settings.m_satTimeOffset;
|
||||
}
|
||||
if (settingsKeys.contains("satYaw")) {
|
||||
m_satYaw = settings.m_satYaw;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
if (settingsKeys.contains("tle")) {
|
||||
m_tle = settings.m_tle;
|
||||
}
|
||||
if (settingsKeys.contains("aosDateTime")) {
|
||||
m_aosDateTime = settings.m_aosDateTime;
|
||||
}
|
||||
if (settingsKeys.contains("northToSouth")) {
|
||||
m_northToSouth = settings.m_northToSouth;
|
||||
}
|
||||
}
|
||||
|
||||
QString APTDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth") || force) {
|
||||
ostr << " m_rfBandwidth: " << m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("fmDeviation") || force) {
|
||||
ostr << " m_fmDeviation: " << m_fmDeviation;
|
||||
}
|
||||
if (settingsKeys.contains("cropNoise") || force) {
|
||||
ostr << " m_cropNoise: " << m_cropNoise;
|
||||
}
|
||||
if (settingsKeys.contains("denoise") || force) {
|
||||
ostr << " m_denoise: " << m_denoise;
|
||||
}
|
||||
if (settingsKeys.contains("linearEqualise") || force) {
|
||||
ostr << " m_linearEqualise: " << m_linearEqualise;
|
||||
}
|
||||
if (settingsKeys.contains("histogramEqualise") || force) {
|
||||
ostr << " m_histogramEqualise: " << m_histogramEqualise;
|
||||
}
|
||||
if (settingsKeys.contains("precipitationOverlay") || force) {
|
||||
ostr << " m_precipitationOverlay: " << m_precipitationOverlay;
|
||||
}
|
||||
if (settingsKeys.contains("flip") || force) {
|
||||
ostr << " m_flip: " << m_flip;
|
||||
}
|
||||
if (settingsKeys.contains("channels") || force) {
|
||||
ostr << " m_channels: " << m_channels;
|
||||
}
|
||||
if (settingsKeys.contains("decodeEnabled") || force) {
|
||||
ostr << " m_decodeEnabled: " << m_decodeEnabled;
|
||||
}
|
||||
if (settingsKeys.contains("satelliteTrackerControl") || force) {
|
||||
ostr << " m_satelliteTrackerControl: " << m_satelliteTrackerControl;
|
||||
}
|
||||
if (settingsKeys.contains("satelliteName") || force) {
|
||||
ostr << " m_satelliteName: " << m_satelliteName.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("autoSave") || force) {
|
||||
ostr << " m_autoSave: " << m_autoSave;
|
||||
}
|
||||
if (settingsKeys.contains("autoSavePath") || force) {
|
||||
ostr << " m_autoSavePath: " << m_autoSavePath.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("autoSaveMinScanLines") || force) {
|
||||
ostr << " m_autoSaveMinScanLines: " << m_autoSaveMinScanLines;
|
||||
}
|
||||
if (settingsKeys.contains("saveCombined") || force) {
|
||||
ostr << " m_saveCombined: " << m_saveCombined;
|
||||
}
|
||||
if (settingsKeys.contains("saveSeparate") || force) {
|
||||
ostr << " m_saveSeparate: " << m_saveSeparate;
|
||||
}
|
||||
if (settingsKeys.contains("saveProjection") || force) {
|
||||
ostr << " m_saveProjection: " << m_saveProjection;
|
||||
}
|
||||
if (settingsKeys.contains("scanlinesPerImageUpdate") || force) {
|
||||
ostr << " m_scanlinesPerImageUpdate: " << m_scanlinesPerImageUpdate;
|
||||
}
|
||||
if (settingsKeys.contains("transparencyThreshold") || force) {
|
||||
ostr << " m_transparencyThreshold: " << m_transparencyThreshold;
|
||||
}
|
||||
if (settingsKeys.contains("opacityThreshold") || force) {
|
||||
ostr << " m_opacityThreshold: " << m_opacityThreshold;
|
||||
}
|
||||
if (settingsKeys.contains("palettes") || force) {
|
||||
ostr << " m_palettes: " << m_palettes.join(";").toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("palette") || force) {
|
||||
ostr << " m_palette: " << m_palette;
|
||||
}
|
||||
if (settingsKeys.contains("horizontalPixelsPerDegree") || force) {
|
||||
ostr << " m_horizontalPixelsPerDegree: " << m_horizontalPixelsPerDegree;
|
||||
}
|
||||
if (settingsKeys.contains("verticalPixelsPerDegree") || force) {
|
||||
ostr << " m_verticalPixelsPerDegree: " << m_verticalPixelsPerDegree;
|
||||
}
|
||||
if (settingsKeys.contains("satTimeOffset") || force) {
|
||||
ostr << " m_satTimeOffset: " << m_satTimeOffset;
|
||||
}
|
||||
if (settingsKeys.contains("satYaw") || force) {
|
||||
ostr << " m_satYaw: " << m_satYaw;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
if (settingsKeys.contains("tle") || force) {
|
||||
ostr << " m_tle: " << m_tle.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("aosDateTime") || force) {
|
||||
ostr << " m_aosDateTime: " << m_aosDateTime.toString().toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("northToSouth") || force) {
|
||||
ostr << " m_northToSouth: " << m_northToSouth;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
@ -81,6 +81,8 @@ struct APTDemodSettings
|
||||
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
};
|
||||
|
||||
#endif /* INCLUDE_APTDEMODSETTINGS_H */
|
||||
|
||||
@ -35,7 +35,7 @@ APTDemodSink::APTDemodSink() :
|
||||
|
||||
m_magsq = 0.0;
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
|
||||
m_samplesLength = APTDEMOD_AUDIO_SAMPLE_RATE * APT_MAX_HEIGHT / 2; // APT broadcasts at 2 lines per second
|
||||
@ -176,25 +176,30 @@ void APTDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
m_channelFrequencyOffset = channelFrequencyOffset;
|
||||
}
|
||||
|
||||
void APTDemodSink::applySettings(const APTDemodSettings& settings, bool force)
|
||||
void APTDemodSink::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "APTDemodSink::applySettings:"
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_fmDeviation: " << settings.m_fmDeviation
|
||||
<< " m_decodeEnabled: " << settings.m_decodeEnabled
|
||||
<< " force: " << force;
|
||||
qDebug() << "APTDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
||||
if (settingsKeys.contains("decodeEnabled") || force)
|
||||
{
|
||||
m_settings.m_decodeEnabled = settings.m_decodeEnabled;
|
||||
}
|
||||
|
||||
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force)
|
||||
{
|
||||
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth, 2.2);
|
||||
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) APTDEMOD_AUDIO_SAMPLE_RATE;
|
||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||
}
|
||||
|
||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
|
||||
if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force)
|
||||
{
|
||||
m_phaseDiscri.setFMScaling(APTDEMOD_AUDIO_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ public:
|
||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
||||
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const APTDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false);
|
||||
void setImageWorkerMessageQueue(MessageQueue *messageQueue) { m_imageWorkerMessageQueue = messageQueue; }
|
||||
|
||||
double getMagSq() const { return m_magsq; }
|
||||
|
||||
@ -50,7 +50,7 @@ ATVDemod::ATVDemod(DeviceAPI *deviceAPI) :
|
||||
);
|
||||
m_basebandSink->moveToThread(&m_thread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -106,7 +106,7 @@ void ATVDemod::start()
|
||||
DSPSignalNotification* notifToSink = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||
m_basebandSink->getInputMessageQueue()->push(notifToSink);
|
||||
|
||||
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(m_settings, true);
|
||||
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -129,7 +129,7 @@ bool ATVDemod::handleMessage(const Message& cmd)
|
||||
if (MsgConfigureATVDemod::match(cmd))
|
||||
{
|
||||
MsgConfigureATVDemod& cfg = (MsgConfigureATVDemod&) cmd;
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -161,41 +161,20 @@ void ATVDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
ATVDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList("inputFrequencyOffset"), settings, false);
|
||||
|
||||
if (getMessageQueueToGUI())
|
||||
{
|
||||
MsgConfigureATVDemod *msg = MsgConfigureATVDemod::create(settings, false);
|
||||
MsgConfigureATVDemod *msg = MsgConfigureATVDemod::create(QStringList("inputFrequencyOffset"), settings, false);
|
||||
getMessageQueueToGUI()->push(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void ATVDemod::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
void ATVDemod::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "ATVDemod::applySettings:"
|
||||
<< "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset
|
||||
<< "m_bfoFrequency:" << settings.m_bfoFrequency
|
||||
<< "m_atvModulation:" << settings.m_atvModulation
|
||||
<< "m_fmDeviation:" << settings.m_fmDeviation
|
||||
<< "m_fftFiltering:" << settings.m_fftFiltering
|
||||
<< "m_fftOppBandwidth:" << settings.m_fftOppBandwidth
|
||||
<< "m_fftBandwidth:" << settings.m_fftBandwidth
|
||||
<< "m_nbLines:" << settings.m_nbLines
|
||||
<< "m_fps:" << settings.m_fps
|
||||
<< "m_atvStd:" << settings.m_atvStd
|
||||
<< "m_hSync:" << settings.m_hSync
|
||||
<< "m_vSync:" << settings.m_vSync
|
||||
<< "m_invertVideo:" << settings.m_invertVideo
|
||||
<< "m_halfFrames:" << settings.m_halfFrames
|
||||
<< "m_levelSynchroTop:" << settings.m_levelSynchroTop
|
||||
<< "m_levelBlack:" << settings.m_levelBlack
|
||||
<< "m_rgbColor:" << settings.m_rgbColor
|
||||
<< "m_title:" << settings.m_title
|
||||
<< "m_udpAddress:" << settings.m_udpAddress
|
||||
<< "m_udpPort:" << settings.m_udpPort
|
||||
<< "force:" << force;
|
||||
qDebug() << "ATVDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("m_streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -208,10 +187,14 @@ void ATVDemod::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(settings, force);
|
||||
ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void ATVDemod::handleIndexInDeviceSetChanged(int index)
|
||||
|
||||
@ -43,20 +43,23 @@ public:
|
||||
public:
|
||||
const ATVDemodSettings& getSettings() const { return m_settings; }
|
||||
bool getForce() const { return m_force; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
|
||||
static MsgConfigureATVDemod* create(const ATVDemodSettings& settings, bool force)
|
||||
static MsgConfigureATVDemod* create(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureATVDemod(settings, force);
|
||||
return new MsgConfigureATVDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
ATVDemodSettings m_settings;
|
||||
bool m_force;
|
||||
QStringList m_settingsKeys;
|
||||
|
||||
MsgConfigureATVDemod(const ATVDemodSettings& settings, bool force) :
|
||||
MsgConfigureATVDemod(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_force(force)
|
||||
m_force(force),
|
||||
m_settingsKeys(settingsKeys)
|
||||
{ }
|
||||
};
|
||||
|
||||
@ -112,7 +115,7 @@ private:
|
||||
int m_basebandSampleRate; //!< sample rate stored from device message used when starting baseband sink
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const ATVDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleIndexInDeviceSetChanged(int index);
|
||||
|
||||
@ -126,7 +126,7 @@ bool ATVDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureATVDemodBaseband& cfg = (MsgConfigureATVDemodBaseband&) cmd;
|
||||
qDebug() << "ATVDemodBaseband::handleMessage: MsgConfigureATVDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -147,18 +147,18 @@ bool ATVDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void ATVDemodBaseband::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
void ATVDemodBaseband::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug("ATVDemodBaseband::applySettings");
|
||||
qDebug() << "ATVDemodBaseband::applySettings" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)|| force)
|
||||
if ((settingsKeys.contains("m_inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
|
||||
{
|
||||
unsigned int desiredSampleRate = m_channelizer->getBasebandSampleRate();
|
||||
m_channelizer->setChannelization(desiredSampleRate, settings.m_inputFrequencyOffset);
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settingsKeys, settings, force);
|
||||
m_settings = settings;
|
||||
}
|
||||
|
||||
|
||||
@ -41,20 +41,23 @@ public:
|
||||
|
||||
public:
|
||||
const ATVDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureATVDemodBaseband* create(const ATVDemodSettings& settings, bool force)
|
||||
static MsgConfigureATVDemodBaseband* create(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureATVDemodBaseband(settings, force);
|
||||
return new MsgConfigureATVDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
ATVDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureATVDemodBaseband(const ATVDemodSettings& settings, bool force) :
|
||||
MsgConfigureATVDemodBaseband(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -87,7 +90,7 @@ private:
|
||||
QRecursiveMutex m_mutex;
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const ATVDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -55,7 +55,7 @@ void ATVDemodGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray ATVDemodGUI::serialize() const
|
||||
@ -68,14 +68,14 @@ bool ATVDemodGUI::deserialize(const QByteArray& data)
|
||||
if(m_settings.deserialize(data))
|
||||
{
|
||||
displaySettings();
|
||||
applySettings(true); // will have true
|
||||
applySettings(QStringList(), true); // will have true
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true); // will have true
|
||||
applySettings(QStringList(), true); // will have true
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -184,7 +184,7 @@ void ATVDemodGUI::channelMarkerChangedByCursor()
|
||||
qDebug("ATVDemodGUI::channelMarkerChangedByCursor");
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("inputFrequencyOffset"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::channelMarkerHighlightedByCursor()
|
||||
@ -247,7 +247,16 @@ void ATVDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({
|
||||
"rgbColor",
|
||||
"title",
|
||||
"useReverseAPI",
|
||||
"reverseAPIAddress",
|
||||
"reverseAPIPort",
|
||||
"reverseAPIDeviceIndex",
|
||||
"reverseAPIChannelIndex"
|
||||
}),
|
||||
false);
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -259,7 +268,7 @@ void ATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList(), false);
|
||||
}
|
||||
|
||||
ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* objParent) :
|
||||
@ -343,13 +352,13 @@ ATVDemodGUI::~ATVDemodGUI()
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void ATVDemodGUI::applySettings(bool force)
|
||||
void ATVDemodGUI::applySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
qDebug() << "ATVDemodGUI::applySettings: " << force << " m_doApplySettings: " << m_doApplySettings;
|
||||
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
ATVDemod::MsgConfigureATVDemod *msg = ATVDemod::MsgConfigureATVDemod::create(m_settings, force);
|
||||
ATVDemod::MsgConfigureATVDemod *msg = ATVDemod::MsgConfigureATVDemod::create(settingsKeys, m_settings, force);
|
||||
m_atvDemod->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
}
|
||||
@ -459,58 +468,58 @@ void ATVDemodGUI::on_synchLevel_valueChanged(int value)
|
||||
{
|
||||
ui->synchLevelText->setText(QString("%1 mV").arg(value));
|
||||
m_settings.m_levelSynchroTop = value / 1000.0f;
|
||||
applySettings();
|
||||
applySettings(QStringList("levelSynchroTop"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_blackLevel_valueChanged(int value)
|
||||
{
|
||||
ui->blackLevelText->setText(QString("%1 mV").arg(value));
|
||||
m_settings.m_levelBlack = value / 1000.0f;
|
||||
applySettings();
|
||||
applySettings(QStringList("levelBlack"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_hSync_clicked()
|
||||
{
|
||||
m_settings.m_hSync = ui->hSync->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("hSync"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_vSync_clicked()
|
||||
{
|
||||
m_settings.m_vSync = ui->vSync->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("vSync"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_invertVideo_clicked()
|
||||
{
|
||||
m_settings.m_invertVideo = ui->invertVideo->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("invertVideo"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_halfImage_clicked()
|
||||
{
|
||||
m_settings.m_halfFrames = ui->halfImage->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("halfFrames"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_nbLines_currentIndexChanged(int index)
|
||||
{
|
||||
m_settings.m_nbLines = ATVDemodSettings::getNumberOfLines(index);
|
||||
applySampleRate();
|
||||
applySettings();
|
||||
applySettings(QStringList("nbLines"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_fps_currentIndexChanged(int index)
|
||||
{
|
||||
m_settings.m_fps = ATVDemodSettings::getFps(index);
|
||||
applySampleRate();
|
||||
applySettings();
|
||||
applySettings(QStringList("fps"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_standard_currentIndexChanged(int index)
|
||||
{
|
||||
m_settings.m_atvStd = (ATVDemodSettings::ATVStd) index;
|
||||
applySettings();
|
||||
applySettings(QStringList("atvStd"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_reset_clicked(bool checked)
|
||||
@ -524,7 +533,7 @@ void ATVDemodGUI::on_modulation_currentIndexChanged(int index)
|
||||
m_settings.m_atvModulation = (ATVDemodSettings::ATVModulation) index;
|
||||
setRFFiltersSlidersRange(m_basebandSampleRate);
|
||||
setChannelMarkerBandwidth();
|
||||
applySettings();
|
||||
applySettings(QStringList("atvModulation"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_rfBW_valueChanged(int value)
|
||||
@ -532,7 +541,7 @@ void ATVDemodGUI::on_rfBW_valueChanged(int value)
|
||||
m_settings.m_fftBandwidth = value * m_rfSliderDivisor;
|
||||
ui->rfBWText->setText(QString("%1k").arg((value * m_rfSliderDivisor) / 1000.0, 0, 'f', 0));
|
||||
setChannelMarkerBandwidth();
|
||||
applySettings();
|
||||
applySettings(QStringList("fftBandwidth"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_rfOppBW_valueChanged(int value)
|
||||
@ -540,7 +549,7 @@ void ATVDemodGUI::on_rfOppBW_valueChanged(int value)
|
||||
m_settings.m_fftOppBandwidth = value * m_rfSliderDivisor;
|
||||
ui->rfOppBWText->setText(QString("%1k").arg((value * m_rfSliderDivisor) / 1000.0, 0, 'f', 0));
|
||||
setChannelMarkerBandwidth();
|
||||
applySettings();
|
||||
applySettings(QStringList("fftOppBandwidth"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_rfFiltering_toggled(bool checked)
|
||||
@ -548,7 +557,7 @@ void ATVDemodGUI::on_rfFiltering_toggled(bool checked)
|
||||
m_settings.m_fftFiltering = checked;
|
||||
setRFFiltersSlidersRange(m_basebandSampleRate);
|
||||
setChannelMarkerBandwidth();
|
||||
applySettings();
|
||||
applySettings(QStringList("fftFiltering"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
@ -556,21 +565,21 @@ void ATVDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_settings.m_inputFrequencyOffset = value;
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("inputFrequencyOffset"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_bfo_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_bfoFrequency = value;
|
||||
ui->bfoText->setText(QString("%1").arg(value * 1.0, 0, 'f', 0));
|
||||
applySettings();
|
||||
applySettings(QStringList("bfoFrequency"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_fmDeviation_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_fmDeviation = value / 1000.0f;
|
||||
ui->fmDeviationText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
|
||||
applySettings();
|
||||
applySettings(QStringList("fmDeviation"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_amScaleFactor_valueChanged(int value)
|
||||
@ -578,7 +587,7 @@ void ATVDemodGUI::on_amScaleFactor_valueChanged(int value)
|
||||
m_settings.m_amScalingFactor = value;
|
||||
ui->amScaleFactor->setValue(m_settings.m_amScalingFactor);
|
||||
ui->amScaleFactorText->setText(QString("%1").arg(m_settings.m_amScalingFactor));
|
||||
applySettings();
|
||||
applySettings(QStringList("amScalingFactor"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_amScaleOffset_valueChanged(int value)
|
||||
@ -586,7 +595,7 @@ void ATVDemodGUI::on_amScaleOffset_valueChanged(int value)
|
||||
m_settings.m_amOffsetFactor = value;
|
||||
ui->amScaleOffset->setValue(m_settings.m_amOffsetFactor);
|
||||
ui->amScaleOffsetText->setText(QString("%1").arg(m_settings.m_amOffsetFactor));
|
||||
applySettings();
|
||||
applySettings(QStringList("amOffsetFactor"), false);
|
||||
}
|
||||
|
||||
void ATVDemodGUI::on_screenTabWidget_currentChanged(int index)
|
||||
|
||||
@ -91,7 +91,7 @@ private:
|
||||
explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* objParent = 0);
|
||||
virtual ~ATVDemodGUI();
|
||||
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void displayRFBandwidths();
|
||||
void applySampleRate();
|
||||
|
||||
@ -343,6 +343,198 @@ int ATVDemodSettings::getNumberOfLinesIndex(int nbLines)
|
||||
}
|
||||
}
|
||||
|
||||
void ATVDemodSettings::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("bfoFrequency")) {
|
||||
m_bfoFrequency = settings.m_bfoFrequency;
|
||||
}
|
||||
if (settingsKeys.contains("atvModulation")) {
|
||||
m_atvModulation = settings.m_atvModulation;
|
||||
}
|
||||
if (settingsKeys.contains("fmDeviation")) {
|
||||
m_fmDeviation = settings.m_fmDeviation;
|
||||
}
|
||||
if (settingsKeys.contains("amScalingFactor")) {
|
||||
m_amScalingFactor = settings.m_amScalingFactor;
|
||||
}
|
||||
if (settingsKeys.contains("amOffsetFactor")) {
|
||||
m_amOffsetFactor = settings.m_amOffsetFactor;
|
||||
}
|
||||
if (settingsKeys.contains("fftFiltering")) {
|
||||
m_fftFiltering = settings.m_fftFiltering;
|
||||
}
|
||||
if (settingsKeys.contains("fftOppBandwidth")) {
|
||||
m_fftOppBandwidth = settings.m_fftOppBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("fftBandwidth")) {
|
||||
m_fftBandwidth = settings.m_fftBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("nbLines")) {
|
||||
m_nbLines = settings.m_nbLines;
|
||||
}
|
||||
if (settingsKeys.contains("fps")) {
|
||||
m_fps = settings.m_fps;
|
||||
}
|
||||
if (settingsKeys.contains("atvStd")) {
|
||||
m_atvStd = settings.m_atvStd;
|
||||
}
|
||||
if (settingsKeys.contains("hSync")) {
|
||||
m_hSync = settings.m_hSync;
|
||||
}
|
||||
if (settingsKeys.contains("vSync")) {
|
||||
m_vSync = settings.m_vSync;
|
||||
}
|
||||
if (settingsKeys.contains("invertVideo")) {
|
||||
m_invertVideo = settings.m_invertVideo;
|
||||
}
|
||||
if (settingsKeys.contains("halfFrames")) {
|
||||
m_halfFrames = settings.m_halfFrames;
|
||||
}
|
||||
if (settingsKeys.contains("levelSynchroTop")) {
|
||||
m_levelSynchroTop = settings.m_levelSynchroTop;
|
||||
}
|
||||
if (settingsKeys.contains("levelBlack")) {
|
||||
m_levelBlack = settings.m_levelBlack;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("udpAddress")) {
|
||||
m_udpAddress = settings.m_udpAddress;
|
||||
}
|
||||
if (settingsKeys.contains("udpPort")) {
|
||||
m_udpPort = settings.m_udpPort;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString ATVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("bfoFrequency") || force) {
|
||||
ostr << " m_bfoFrequency: " << m_bfoFrequency;
|
||||
}
|
||||
if (settingsKeys.contains("atvModulation") || force) {
|
||||
ostr << " m_atvModulation: " << m_atvModulation;
|
||||
}
|
||||
if (settingsKeys.contains("fmDeviation") || force) {
|
||||
ostr << " m_fmDeviation: " << m_fmDeviation;
|
||||
}
|
||||
if (settingsKeys.contains("amScalingFactor") || force) {
|
||||
ostr << " m_amScalingFactor: " << m_amScalingFactor;
|
||||
}
|
||||
if (settingsKeys.contains("amOffsetFactor") || force) {
|
||||
ostr << " m_amOffsetFactor: " << m_amOffsetFactor;
|
||||
}
|
||||
if (settingsKeys.contains("fftFiltering") || force) {
|
||||
ostr << " m_fftFiltering: " << m_fftFiltering;
|
||||
}
|
||||
if (settingsKeys.contains("fftOppBandwidth") || force) {
|
||||
ostr << " m_fftOppBandwidth: " << m_fftOppBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("fftBandwidth") || force) {
|
||||
ostr << " m_fftBandwidth: " << m_fftBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("nbLines") || force) {
|
||||
ostr << " m_nbLines: " << m_nbLines;
|
||||
}
|
||||
if (settingsKeys.contains("fps") || force) {
|
||||
ostr << " m_fps: " << m_fps;
|
||||
}
|
||||
if (settingsKeys.contains("atvStd") || force) {
|
||||
ostr << " m_atvStd: " << m_atvStd;
|
||||
}
|
||||
if (settingsKeys.contains("hSync") || force) {
|
||||
ostr << " m_hSync: " << m_hSync;
|
||||
}
|
||||
if (settingsKeys.contains("vSync") || force) {
|
||||
ostr << " m_vSync: " << m_vSync;
|
||||
}
|
||||
if (settingsKeys.contains("invertVideo") || force) {
|
||||
ostr << " m_invertVideo: " << m_invertVideo;
|
||||
}
|
||||
if (settingsKeys.contains("halfFrames") || force) {
|
||||
ostr << " m_halfFrames: " << m_halfFrames;
|
||||
}
|
||||
if (settingsKeys.contains("levelSynchroTop") || force) {
|
||||
ostr << " m_levelSynchroTop: " << m_levelSynchroTop;
|
||||
}
|
||||
if (settingsKeys.contains("levelBlack") || force) {
|
||||
ostr << " m_levelBlack: " << m_levelBlack;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("udpAddress") || force) {
|
||||
ostr << " m_udpAddress: " << m_udpAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("udpPort") || force) {
|
||||
ostr << " m_udpPort: " << m_udpPort;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
float ATVDemodSettings::getNominalLineTime(int nbLines, int fps)
|
||||
{
|
||||
return 1.0f / ((float) nbLines * (float) fps);
|
||||
|
||||
@ -91,6 +91,8 @@ struct ATVDemodSettings
|
||||
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
|
||||
int getRFSliderDivisor(unsigned int sampleRate);
|
||||
|
||||
|
||||
@ -70,7 +70,7 @@ ATVDemodSink::ATVDemodSink() :
|
||||
|
||||
m_objPhaseDiscri.setFMScaling(1.0f);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
}
|
||||
|
||||
@ -465,33 +465,11 @@ void ATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
m_channelFrequencyOffset = channelFrequencyOffset;
|
||||
}
|
||||
|
||||
void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
void ATVDemodSink::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "ATVDemodSink::applySettings:"
|
||||
<< "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset
|
||||
<< "m_bfoFrequency:" << settings.m_bfoFrequency
|
||||
<< "m_atvModulation:" << settings.m_atvModulation
|
||||
<< "m_fmDeviation:" << settings.m_fmDeviation
|
||||
<< "m_fftFiltering:" << settings.m_fftFiltering
|
||||
<< "m_fftOppBandwidth:" << settings.m_fftOppBandwidth
|
||||
<< "m_fftBandwidth:" << settings.m_fftBandwidth
|
||||
<< "m_nbLines:" << settings.m_nbLines
|
||||
<< "m_fps:" << settings.m_fps
|
||||
<< "m_atvStd:" << settings.m_atvStd
|
||||
<< "m_hSync:" << settings.m_hSync
|
||||
<< "m_vSync:" << settings.m_vSync
|
||||
<< "m_invertVideo:" << settings.m_invertVideo
|
||||
<< "m_halfFrames:" << settings.m_halfFrames
|
||||
<< "m_levelSynchroTop:" << settings.m_levelSynchroTop
|
||||
<< "m_levelBlack:" << settings.m_levelBlack
|
||||
<< "m_rgbColor:" << settings.m_rgbColor
|
||||
<< "m_title:" << settings.m_title
|
||||
<< "m_udpAddress:" << settings.m_udpAddress
|
||||
<< "m_udpPort:" << settings.m_udpPort
|
||||
<< "force:" << force;
|
||||
qDebug() << "ATVDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_fftBandwidth != m_settings.m_fftBandwidth)
|
||||
|| (settings.m_fftOppBandwidth != m_settings.m_fftOppBandwidth) || force)
|
||||
if (settingsKeys.contains("fftBandwidth") || settingsKeys.contains("fftOppBandwidth") || force)
|
||||
{
|
||||
m_DSBFilter->create_asym_filter(
|
||||
settings.m_fftOppBandwidth / (float) m_channelSampleRate,
|
||||
@ -501,7 +479,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
m_DSBFilterBufferIndex = 0;
|
||||
}
|
||||
|
||||
if ((settings.m_bfoFrequency != m_settings.m_bfoFrequency) || force)
|
||||
if (settingsKeys.contains("bfoFrequency") || force)
|
||||
{
|
||||
m_bfoPLL.configure((float) settings.m_bfoFrequency / (float) m_channelSampleRate,
|
||||
100.0 / m_channelSampleRate,
|
||||
@ -509,9 +487,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
m_bfoFilter.setFrequencies(m_channelSampleRate, settings.m_bfoFrequency);
|
||||
}
|
||||
|
||||
if ((settings.m_nbLines != m_settings.m_nbLines)
|
||||
|| (settings.m_fps != m_settings.m_fps)
|
||||
|| (settings.m_atvStd != m_settings.m_atvStd) || force)
|
||||
if (settingsKeys.contains("nbLines") || settingsKeys.contains("fps") || settingsKeys.contains("atvStd") || force)
|
||||
{
|
||||
unsigned int samplesPerLineNom;
|
||||
ATVDemodSettings::getBaseValues(m_channelSampleRate, settings.m_nbLines * settings.m_fps, samplesPerLineNom);
|
||||
@ -539,13 +515,17 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force)
|
||||
m_fieldIndex = 0;
|
||||
}
|
||||
|
||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {
|
||||
if (settingsKeys.contains("fmDeviation") || force) {
|
||||
m_objPhaseDiscri.setFMScaling(1.0f / settings.m_fmDeviation);
|
||||
}
|
||||
|
||||
if ((settings.m_levelBlack != m_settings.m_levelBlack) || force) {
|
||||
if (settingsKeys.contains("levelBlack") || force) {
|
||||
m_sampleRangeCorrection = 255.0f / (1.0f - m_settings.m_levelBlack);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ public:
|
||||
void setVideoTabIndex(int videoTabIndex) { m_videoTabIndex = videoTabIndex; }
|
||||
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const ATVDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false);
|
||||
|
||||
private:
|
||||
struct ATVConfigPrivate
|
||||
|
||||
@ -58,7 +58,7 @@ BFMDemod::BFMDemod(DeviceAPI *deviceAPI) :
|
||||
m_basebandSampleRate(0)
|
||||
{
|
||||
setObjectName(m_channelId);
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -140,7 +140,7 @@ void BFMDemod::start()
|
||||
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, 0);
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(m_settings, true);
|
||||
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
SpectrumSettings spectrumSettings = m_spectrumVis.getSettings();
|
||||
@ -170,7 +170,7 @@ bool BFMDemod::handleMessage(const Message& cmd)
|
||||
MsgConfigureBFMDemod& cfg = (MsgConfigureBFMDemod&) cmd;
|
||||
qDebug() << "BFMDemod::handleMessage: MsgConfigureBFMDemod";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -202,73 +202,20 @@ void BFMDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
BFMDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList({"inputFrequencyOffset"}), settings, false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(settings, false);
|
||||
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(QStringList({"inputFrequencyOffset"}), settings, false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force)
|
||||
void BFMDemod::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:"
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_afBandwidth: " << settings.m_afBandwidth
|
||||
<< " m_deEmphasis: " << settings.getDeEmphasisTimeConstant()
|
||||
<< " m_volume: " << settings.m_volume
|
||||
<< " m_squelch: " << settings.m_squelch
|
||||
<< " m_audioStereo: " << settings.m_audioStereo
|
||||
<< " m_lsbStereo: " << settings.m_lsbStereo
|
||||
<< " m_showPilot: " << settings.m_showPilot
|
||||
<< " m_rdsActive: " << settings.m_rdsActive
|
||||
<< " m_audioDeviceName: " << settings.m_audioDeviceName
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " force: " << force;
|
||||
qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
|
||||
reverseAPIKeys.append("inputFrequencyOffset");
|
||||
}
|
||||
if ((settings.m_volume != m_settings.m_volume) || force) {
|
||||
reverseAPIKeys.append("volume");
|
||||
}
|
||||
if ((settings.m_audioMute != m_settings.m_audioMute) || force) {
|
||||
reverseAPIKeys.append("audioMute");
|
||||
}
|
||||
if ((settings.m_audioStereo != m_settings.m_audioStereo) || force) {
|
||||
reverseAPIKeys.append("audioStereo");
|
||||
}
|
||||
if ((settings.m_lsbStereo != m_settings.m_lsbStereo) || force) {
|
||||
reverseAPIKeys.append("lsbStereo");
|
||||
}
|
||||
if ((settings.m_showPilot != m_settings.m_showPilot) || force) {
|
||||
reverseAPIKeys.append("showPilot");
|
||||
}
|
||||
if ((settings.m_rdsActive != m_settings.m_rdsActive) || force) {
|
||||
reverseAPIKeys.append("rdsActive");
|
||||
}
|
||||
if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) {
|
||||
reverseAPIKeys.append("afBandwidth");
|
||||
}
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
|
||||
reverseAPIKeys.append("rfBandwidth");
|
||||
}
|
||||
if ((settings.m_deEmphasis != m_settings.m_deEmphasis) || force) {
|
||||
reverseAPIKeys.append("deEmphasis");
|
||||
}
|
||||
if ((settings.m_squelch != m_settings.m_squelch) || force) {
|
||||
reverseAPIKeys.append("squelch");
|
||||
}
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) {
|
||||
reverseAPIKeys.append("audioDeviceName");
|
||||
}
|
||||
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -279,34 +226,36 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force)
|
||||
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
|
||||
emit streamIndexChanged(settings.m_streamIndex);
|
||||
}
|
||||
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
if (m_running)
|
||||
{
|
||||
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(settings, force);
|
||||
BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
|
||||
(settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) ||
|
||||
(settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) ||
|
||||
(settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) ||
|
||||
(settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex));
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray BFMDemod::serialize() const
|
||||
@ -318,14 +267,14 @@ bool BFMDemod::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true);
|
||||
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true);
|
||||
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -361,13 +310,13 @@ int BFMDemod::webapiSettingsPutPatch(
|
||||
BFMDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(settings, force);
|
||||
MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("BFMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(settings, force);
|
||||
MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(channelSettingsKeys, settings, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -609,7 +558,7 @@ void BFMDemod::webapiFormatRDSReport(SWGSDRangel::SWGRDSReport *report)
|
||||
}
|
||||
}
|
||||
|
||||
void BFMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
void BFMDemod::webapiReverseSendSettings(const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@ -636,7 +585,7 @@ void BFMDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
|
||||
|
||||
void BFMDemod::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QStringList& channelSettingsKeys,
|
||||
const BFMDemodSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@ -660,7 +609,7 @@ void BFMDemod::sendChannelSettings(
|
||||
}
|
||||
|
||||
void BFMDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QStringList& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const BFMDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -52,20 +52,23 @@ public:
|
||||
|
||||
public:
|
||||
const BFMDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureBFMDemod* create(const BFMDemodSettings& settings, bool force)
|
||||
static MsgConfigureBFMDemod* create(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureBFMDemod(settings, force);
|
||||
return new MsgConfigureBFMDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
BFMDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureBFMDemod(const BFMDemodSettings& settings, bool force) :
|
||||
MsgConfigureBFMDemod(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -173,19 +176,19 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const BFMDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force = false);
|
||||
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||
void webapiFormatRDSReport(SWGSDRangel::SWGRDSReport *report);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BFMDemodSettings& settings, bool force);
|
||||
void webapiReverseSendSettings(const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QStringList& channelSettingsKeys,
|
||||
const BFMDemodSettings& settings,
|
||||
bool force
|
||||
);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QStringList& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const BFMDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -143,7 +143,7 @@ bool BFMDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureBFMDemodBaseband& cfg = (MsgConfigureBFMDemodBaseband&) cmd;
|
||||
qDebug() << "BFMDemodBaseband::handleMessage: MsgConfigureBFMDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -182,10 +182,10 @@ bool BFMDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool force)
|
||||
void BFMDemodBaseband::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
{
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth)
|
||||
|| (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth))
|
||||
|| (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
|
||||
{
|
||||
m_channelizer->setChannelization(BFMDemodSettings::requiredBW(settings.m_rfBandwidth), settings.m_inputFrequencyOffset);
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
@ -209,7 +209,7 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc
|
||||
}
|
||||
}
|
||||
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
|
||||
if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force)
|
||||
{
|
||||
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
|
||||
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
|
||||
@ -223,9 +223,13 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc
|
||||
}
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settingsKeys, settings, force);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
int BFMDemodBaseband::getChannelSampleRate() const
|
||||
|
||||
@ -41,20 +41,23 @@ public:
|
||||
|
||||
public:
|
||||
const BFMDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureBFMDemodBaseband* create(const BFMDemodSettings& settings, bool force)
|
||||
static MsgConfigureBFMDemodBaseband* create(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureBFMDemodBaseband(settings, force);
|
||||
return new MsgConfigureBFMDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
BFMDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureBFMDemodBaseband(const BFMDemodSettings& settings, bool force) :
|
||||
MsgConfigureBFMDemodBaseband(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -103,7 +106,7 @@ private:
|
||||
MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; }
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const BFMDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -72,7 +72,7 @@ void BFMDemodGUI::resetToDefaults()
|
||||
ui->g14AltFrequencies->setEnabled(false);
|
||||
blockApplySettings(false);
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray BFMDemodGUI::serialize() const
|
||||
@ -84,7 +84,7 @@ bool BFMDemodGUI::deserialize(const QByteArray& data)
|
||||
{
|
||||
if(m_settings.deserialize(data)) {
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
} else {
|
||||
resetToDefaults();
|
||||
@ -148,7 +148,7 @@ void BFMDemodGUI::channelMarkerChangedByCursor()
|
||||
{
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::channelMarkerHighlightedByCursor()
|
||||
@ -161,7 +161,7 @@ void BFMDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_rfBW_valueChanged(int value)
|
||||
@ -169,40 +169,40 @@ void BFMDemodGUI::on_rfBW_valueChanged(int value)
|
||||
ui->rfBWText->setText(QString("%1 kHz").arg(BFMDemodSettings::getRFBW(value) / 1000.0));
|
||||
m_channelMarker.setBandwidth(BFMDemodSettings::getRFBW(value));
|
||||
m_settings.m_rfBandwidth = BFMDemodSettings::getRFBW(value);
|
||||
applySettings();
|
||||
applySettings(QStringList({"rfBandwidth"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_afBW_valueChanged(int value)
|
||||
{
|
||||
ui->afBWText->setText(QString("%1 kHz").arg(value));
|
||||
m_settings.m_afBandwidth = value * 1000.0;
|
||||
applySettings();
|
||||
applySettings(QStringList({"afBandwidth"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_deEmphasis_currentIndexChanged(int index)
|
||||
{
|
||||
m_settings.m_deEmphasis = static_cast<BFMDemodSettings::DeEmphasis>(index);
|
||||
applySettings();
|
||||
applySettings(QStringList({"deEmphasis"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_volume_valueChanged(int value)
|
||||
{
|
||||
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_volume = value / 10.0;
|
||||
applySettings();
|
||||
applySettings(QStringList({"volume"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_squelch_valueChanged(int value)
|
||||
{
|
||||
ui->squelchText->setText(QString("%1 dB").arg(value));
|
||||
m_settings.m_squelch = value;
|
||||
applySettings();
|
||||
applySettings(QStringList({"squelch"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_audioMute_toggled(bool mute)
|
||||
{
|
||||
m_settings.m_audioMute = mute;
|
||||
applySettings();
|
||||
applySettings(QStringList({"audioMute"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_audioStereo_toggled(bool stereo)
|
||||
@ -213,25 +213,25 @@ void BFMDemodGUI::on_audioStereo_toggled(bool stereo)
|
||||
}
|
||||
|
||||
m_settings.m_audioStereo = stereo;
|
||||
applySettings();
|
||||
applySettings(QStringList({"audioStereo"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_lsbStereo_toggled(bool lsb)
|
||||
{
|
||||
m_settings.m_lsbStereo = lsb;
|
||||
applySettings();
|
||||
applySettings(QStringList({"lsbStereo"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_showPilot_clicked()
|
||||
{
|
||||
m_settings.m_showPilot = ui->showPilot->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList({"showPilot"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_rds_clicked()
|
||||
{
|
||||
m_settings.m_rdsActive = ui->rds->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList({"rdsActive"}));
|
||||
}
|
||||
|
||||
void BFMDemodGUI::on_clearData_clicked(bool checked)
|
||||
@ -339,7 +339,7 @@ void BFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void BFMDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -384,7 +384,9 @@ void BFMDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({"title", "rgbColor", "useReverseAPI",
|
||||
"reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex",
|
||||
"reverseAPIChannelIndex", "streamIndex"}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -472,7 +474,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
||||
rdsUpdate(true);
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
|
||||
@ -486,11 +488,11 @@ void BFMDemodGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void BFMDemodGUI::applySettings(bool force)
|
||||
void BFMDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
BFMDemod::MsgConfigureBFMDemod* msgConfig = BFMDemod::MsgConfigureBFMDemod::create( m_settings, force);
|
||||
BFMDemod::MsgConfigureBFMDemod* msgConfig = BFMDemod::MsgConfigureBFMDemod::create(channelSettingsKeys, m_settings, force);
|
||||
m_bfmDemod->getInputMessageQueue()->push(msgConfig);
|
||||
}
|
||||
}
|
||||
@ -562,7 +564,7 @@ void BFMDemodGUI::audioSelect(const QPoint& p)
|
||||
if (audioSelect.m_selected)
|
||||
{
|
||||
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
|
||||
applySettings();
|
||||
applySettings(QStringList({"audioDeviceName"}));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -91,7 +91,7 @@ private:
|
||||
virtual ~BFMDemodGUI();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void rdsUpdate(bool force);
|
||||
void rdsUpdateFixedFields();
|
||||
|
||||
@ -195,6 +195,150 @@ bool BFMDemodSettings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void BFMDemodSettings::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth")) {
|
||||
m_rfBandwidth = settings.m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("afBandwidth")) {
|
||||
m_afBandwidth = settings.m_afBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("volume")) {
|
||||
m_volume = settings.m_volume;
|
||||
}
|
||||
if (settingsKeys.contains("squelch")) {
|
||||
m_squelch = settings.m_squelch;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute")) {
|
||||
m_audioMute = settings.m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("audioStereo")) {
|
||||
m_audioStereo = settings.m_audioStereo;
|
||||
}
|
||||
if (settingsKeys.contains("lsbStereo")) {
|
||||
m_lsbStereo = settings.m_lsbStereo;
|
||||
}
|
||||
if (settingsKeys.contains("showPilot")) {
|
||||
m_showPilot = settings.m_showPilot;
|
||||
}
|
||||
if (settingsKeys.contains("rdsActive")) {
|
||||
m_rdsActive = settings.m_rdsActive;
|
||||
}
|
||||
if (settingsKeys.contains("deEmphasis")) {
|
||||
m_deEmphasis = settings.m_deEmphasis;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName")) {
|
||||
m_audioDeviceName = settings.m_audioDeviceName;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString BFMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth") || force) {
|
||||
ostr << " m_rfBandwidth: " << m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("afBandwidth") || force) {
|
||||
ostr << " m_afBandwidth: " << m_afBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("volume") || force) {
|
||||
ostr << " m_volume: " << m_volume;
|
||||
}
|
||||
if (settingsKeys.contains("squelch") || force) {
|
||||
ostr << " m_squelch: " << m_squelch;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute") || force) {
|
||||
ostr << " m_audioMute: " << m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("audioStereo") || force) {
|
||||
ostr << " m_audioStereo: " << m_audioStereo;
|
||||
}
|
||||
if (settingsKeys.contains("lsbStereo") || force) {
|
||||
ostr << " m_lsbStereo: " << m_lsbStereo;
|
||||
}
|
||||
if (settingsKeys.contains("showPilot") || force) {
|
||||
ostr << " m_showPilot: " << m_showPilot;
|
||||
}
|
||||
if (settingsKeys.contains("rdsActive") || force) {
|
||||
ostr << " m_rdsActive: " << m_rdsActive;
|
||||
}
|
||||
if (settingsKeys.contains("deEmphasis") || force) {
|
||||
ostr << " m_deEmphasis: " << m_deEmphasis;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName") || force) {
|
||||
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
int BFMDemodSettings::getRFBW(int index)
|
||||
{
|
||||
if (index < 0) {
|
||||
|
||||
@ -71,6 +71,8 @@ struct BFMDemodSettings
|
||||
void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
|
||||
static int getRFBW(int index);
|
||||
static int getRFBWIndex(int rfbw);
|
||||
|
||||
@ -76,7 +76,7 @@ BFMDemodSink::BFMDemodSink() :
|
||||
m_demodBuffer.resize(1<<13);
|
||||
m_demodBufferFill = 0;
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
}
|
||||
|
||||
@ -331,37 +331,23 @@ void BFMDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
m_channelFrequencyOffset = channelFrequencyOffset;
|
||||
}
|
||||
|
||||
void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force)
|
||||
void BFMDemodSink::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "BFMDemodSink::applySettings: MsgConfigureBFMDemod:"
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_afBandwidth: " << settings.m_afBandwidth
|
||||
<< " m_deEmphasis: " << settings.getDeEmphasisTimeConstant()
|
||||
<< " m_volume: " << settings.m_volume
|
||||
<< " m_squelch: " << settings.m_squelch
|
||||
<< " m_audioStereo: " << settings.m_audioStereo
|
||||
<< " m_lsbStereo: " << settings.m_lsbStereo
|
||||
<< " m_showPilot: " << settings.m_showPilot
|
||||
<< " m_rdsActive: " << settings.m_rdsActive
|
||||
<< " m_audioDeviceName: " << settings.m_audioDeviceName
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " force: " << force;
|
||||
qDebug() << "BFMDemodSink::applySettings: MsgConfigureBFMDemod:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_audioStereo && (settings.m_audioStereo != m_settings.m_audioStereo)) || force)
|
||||
if ((settingsKeys.contains("audioStereo") && (settings.m_audioStereo != m_settings.m_audioStereo)) || force)
|
||||
{
|
||||
m_pilotPLL.configure(19000.0/m_channelSampleRate, 50.0/m_channelSampleRate, 0.01);
|
||||
applyAudioSampleRate(m_audioSampleRate); // re-apply audio sample rate to reconfigure interpolators
|
||||
}
|
||||
|
||||
if ((settings.getDeEmphasisTimeConstant() != m_settings.getDeEmphasisTimeConstant()) || force)
|
||||
if ((settingsKeys.contains("deEmphasis") && (settings.getDeEmphasisTimeConstant() != m_settings.getDeEmphasisTimeConstant())) || force)
|
||||
{
|
||||
m_deemphasisFilterX.configure(settings.getDeEmphasisTimeConstant() * m_audioSampleRate);
|
||||
m_deemphasisFilterY.configure(settings.getDeEmphasisTimeConstant() * m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force)
|
||||
if ((settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force)
|
||||
{
|
||||
m_interpolator.create(16, m_channelSampleRate, settings.m_afBandwidth);
|
||||
m_interpolatorDistanceRemain = (Real) m_channelSampleRate / m_audioSampleRate;
|
||||
@ -378,7 +364,7 @@ void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force)
|
||||
m_lowpass.create(21, m_audioSampleRate, settings.m_afBandwidth);
|
||||
}
|
||||
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
||||
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force)
|
||||
{
|
||||
Real lowCut = -(settings.m_rfBandwidth / 2.0) / m_channelSampleRate;
|
||||
Real hiCut = (settings.m_rfBandwidth / 2.0) / m_channelSampleRate;
|
||||
@ -386,7 +372,7 @@ void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force)
|
||||
m_phaseDiscri.setFMScaling(m_channelSampleRate / m_fmExcursion);
|
||||
}
|
||||
|
||||
if ((settings.m_squelch != m_settings.m_squelch) || force) {
|
||||
if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) {
|
||||
m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0);
|
||||
}
|
||||
|
||||
|
||||
@ -84,7 +84,7 @@ public:
|
||||
RDSParser& getRDSParser() { return m_rdsParser; }
|
||||
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const BFMDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& keys, const BFMDemodSettings& settings, bool force = false);
|
||||
|
||||
AudioFifo *getAudioFifo() { return &m_audioFifo; }
|
||||
void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); }
|
||||
|
||||
@ -69,7 +69,7 @@ DABDemod::DABDemod(DeviceAPI *deviceAPI) :
|
||||
m_basebandSink->setChannel(this);
|
||||
m_basebandSink->moveToThread(&m_thread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -143,7 +143,7 @@ void DABDemod::start()
|
||||
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(m_settings, true);
|
||||
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ bool DABDemod::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureDABDemod& cfg = (MsgConfigureDABDemod&) cmd;
|
||||
qDebug() << "DABDemod::handleMessage: MsgConfigureDABDemod";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -313,25 +313,18 @@ void DABDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
DABDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList({"inputFrequencyOffset"}), settings, false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(settings, false);
|
||||
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(QStringList({"inputFrequencyOffset"}), settings, false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void DABDemod::applySettings(const DABDemodSettings& settings, bool force)
|
||||
void DABDemod::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "DABDemod::applySettings:"
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< " force: " << force;
|
||||
qDebug() << "DABDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
@ -353,7 +346,7 @@ void DABDemod::applySettings(const DABDemodSettings& settings, bool force)
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) {
|
||||
reverseAPIKeys.append("audioDeviceName");
|
||||
}
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -368,17 +361,17 @@ void DABDemod::applySettings(const DABDemodSettings& settings, bool force)
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(settings, force);
|
||||
DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
|
||||
(settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) ||
|
||||
(settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) ||
|
||||
(settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) ||
|
||||
(settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex));
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
@ -393,14 +386,14 @@ bool DABDemod::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(m_settings, true);
|
||||
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(m_settings, true);
|
||||
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -455,13 +448,13 @@ int DABDemod::webapiSettingsPutPatch(
|
||||
DABDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(settings, force);
|
||||
MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("DABDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(settings, force);
|
||||
MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(channelSettingsKeys, settings, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -583,7 +576,7 @@ void DABDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
|
||||
}
|
||||
}
|
||||
|
||||
void DABDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force)
|
||||
void DABDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@ -609,7 +602,7 @@ void DABDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
|
||||
}
|
||||
|
||||
void DABDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const DABDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -44,19 +44,22 @@ public:
|
||||
public:
|
||||
const DABDemodSettings& getSettings() const { return m_settings; }
|
||||
bool getForce() const { return m_force; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
|
||||
static MsgConfigureDABDemod* create(const DABDemodSettings& settings, bool force)
|
||||
static MsgConfigureDABDemod* create(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDABDemod(settings, force);
|
||||
return new MsgConfigureDABDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DABDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDABDemod(const DABDemodSettings& settings, bool force) :
|
||||
MsgConfigureDABDemod(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -411,11 +414,11 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const DABDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const DABDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -138,7 +138,7 @@ bool DABDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureDABDemodBaseband& cfg = (MsgConfigureDABDemodBaseband&) cmd;
|
||||
qDebug() << "DABDemodBaseband::handleMessage: MsgConfigureDABDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -174,15 +174,15 @@ bool DABDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void DABDemodBaseband::applySettings(const DABDemodSettings& settings, bool force)
|
||||
void DABDemodBaseband::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
|
||||
{
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||
if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
|
||||
{
|
||||
m_channelizer->setChannelization(DABDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
|
||||
if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force)
|
||||
{
|
||||
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
|
||||
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
|
||||
@ -196,9 +196,13 @@ void DABDemodBaseband::applySettings(const DABDemodSettings& settings, bool forc
|
||||
m_sink.applyAudioSampleRate(audioSampleRate);
|
||||
}
|
||||
}
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settingsKeys, settings, force);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void DABDemodBaseband::setBasebandSampleRate(int sampleRate)
|
||||
|
||||
@ -42,20 +42,23 @@ public:
|
||||
|
||||
public:
|
||||
const DABDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureDABDemodBaseband* create(const DABDemodSettings& settings, bool force)
|
||||
static MsgConfigureDABDemodBaseband* create(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDABDemodBaseband(settings, force);
|
||||
return new MsgConfigureDABDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DABDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDABDemodBaseband(const DABDemodSettings& settings, bool force) :
|
||||
MsgConfigureDABDemodBaseband(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -89,7 +92,7 @@ private:
|
||||
QRecursiveMutex m_mutex;
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const DABDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -122,7 +122,7 @@ void DABDemodGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray DABDemodGUI::serialize() const
|
||||
@ -134,7 +134,7 @@ bool DABDemodGUI::deserialize(const QByteArray& data)
|
||||
{
|
||||
if(m_settings.deserialize(data)) {
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
} else {
|
||||
resetToDefaults();
|
||||
@ -203,7 +203,7 @@ void DABDemodGUI::on_programs_cellDoubleClicked(int row, int column)
|
||||
double centreFreq = frequencyInHz-m_settings.m_inputFrequencyOffset;
|
||||
ChannelWebAPIUtils::setCenterFrequency(m_dabDemod->getDeviceSetIndex(), centreFreq);
|
||||
clearProgram();
|
||||
applySettings();
|
||||
applySettings(QStringList({"program"}));
|
||||
}
|
||||
|
||||
// Ensemble name can sometimes be decoded after program name, so we
|
||||
@ -365,7 +365,7 @@ void DABDemodGUI::channelMarkerChangedByCursor()
|
||||
{
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void DABDemodGUI::channelMarkerHighlightedByCursor()
|
||||
@ -378,20 +378,20 @@ void DABDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList({"inputFrequencyOffset"}));
|
||||
}
|
||||
|
||||
void DABDemodGUI::on_audioMute_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_audioMute = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList({"audioMute"}));
|
||||
}
|
||||
|
||||
void DABDemodGUI::on_volume_valueChanged(int value)
|
||||
{
|
||||
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_volume = value / 10.0;
|
||||
applySettings();
|
||||
applySettings(QStringList({"volume"}));
|
||||
}
|
||||
|
||||
void DABDemodGUI::on_rfBW_valueChanged(int value)
|
||||
@ -400,14 +400,14 @@ void DABDemodGUI::on_rfBW_valueChanged(int value)
|
||||
ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
|
||||
m_channelMarker.setBandwidth(bw);
|
||||
m_settings.m_rfBandwidth = bw;
|
||||
applySettings();
|
||||
applySettings(QStringList({"rfBandwidth"}));
|
||||
}
|
||||
|
||||
void DABDemodGUI::on_filter_editingFinished()
|
||||
{
|
||||
m_settings.m_filter = ui->filter->text();
|
||||
filter();
|
||||
applySettings();
|
||||
applySettings(QStringList({"filter"}));
|
||||
}
|
||||
|
||||
void DABDemodGUI::on_clearTable_clicked()
|
||||
@ -446,7 +446,7 @@ void DABDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void DABDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -491,7 +491,9 @@ void DABDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress",
|
||||
"reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex",
|
||||
"streamIndex"}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -574,7 +576,7 @@ DABDemodGUI::DABDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
||||
|
||||
displaySettings();
|
||||
makeUIConnections();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
m_resizer.enableChildMouseTracking();
|
||||
}
|
||||
|
||||
@ -588,11 +590,11 @@ void DABDemodGUI::blockApplySettings(bool block)
|
||||
m_doApplySettings = !block;
|
||||
}
|
||||
|
||||
void DABDemodGUI::applySettings(bool force)
|
||||
void DABDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force)
|
||||
{
|
||||
if (m_doApplySettings)
|
||||
{
|
||||
DABDemod::MsgConfigureDABDemod* message = DABDemod::MsgConfigureDABDemod::create( m_settings, force);
|
||||
DABDemod::MsgConfigureDABDemod* message = DABDemod::MsgConfigureDABDemod::create(channelSettingsKeys, m_settings, force);
|
||||
m_dabDemod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
@ -706,7 +708,7 @@ void DABDemodGUI::audioSelect(const QPoint& p)
|
||||
if (audioSelect.m_selected)
|
||||
{
|
||||
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
|
||||
applySettings();
|
||||
applySettings(QStringList({"audioDeviceName"}));
|
||||
}
|
||||
}
|
||||
|
||||
@ -796,4 +798,3 @@ void DABDemodGUI::on_findOnMap_clicked()
|
||||
qDebug() << "Finding " << id;
|
||||
FeatureWebAPIUtils::mapFind(id);
|
||||
}
|
||||
|
||||
|
||||
@ -90,7 +90,7 @@ private:
|
||||
virtual ~DABDemodGUI();
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& channelSettingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void updateEnsembleName(const QString& ensemble);
|
||||
int findProgramRowById(int id);
|
||||
|
||||
@ -175,4 +175,116 @@ bool DABDemodSettings::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void DABDemodSettings::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("inputFrequencyOffset")) {
|
||||
m_inputFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth")) {
|
||||
m_rfBandwidth = settings.m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("filter")) {
|
||||
m_filter = settings.m_filter;
|
||||
}
|
||||
if (settingsKeys.contains("program")) {
|
||||
m_program = settings.m_program;
|
||||
}
|
||||
if (settingsKeys.contains("volume")) {
|
||||
m_volume = settings.m_volume;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute")) {
|
||||
m_audioMute = settings.m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName")) {
|
||||
m_audioDeviceName = settings.m_audioDeviceName;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString DABDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("inputFrequencyOffset") || force) {
|
||||
ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth") || force) {
|
||||
ostr << " m_rfBandwidth: " << m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("filter") || force) {
|
||||
ostr << " m_filter: " << m_filter.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("program") || force) {
|
||||
ostr << " m_program: " << m_program.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("volume") || force) {
|
||||
ostr << " m_volume: " << m_volume;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute") || force) {
|
||||
ostr << " m_audioMute: " << m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName") || force) {
|
||||
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
@ -64,6 +64,8 @@ struct DABDemodSettings
|
||||
void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; }
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
};
|
||||
|
||||
#endif /* INCLUDE_DABDEMODSETTINGS_H */
|
||||
|
||||
@ -507,7 +507,7 @@ DABDemodSink::DABDemodSink() :
|
||||
m_demodBuffer.resize(1<<13);
|
||||
m_demodBufferFill = 0;
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
|
||||
m_api.dabMode = 1; // Latest DAB spec only has mode 1
|
||||
@ -613,19 +613,18 @@ void DABDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
m_channelFrequencyOffset = channelFrequencyOffset;
|
||||
}
|
||||
|
||||
void DABDemodSink::applySettings(const DABDemodSettings& settings, bool force)
|
||||
void DABDemodSink::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "DABDemodSink::applySettings:"
|
||||
<< " force: " << force;
|
||||
qDebug() << "DABDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
|
||||
if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force)
|
||||
{
|
||||
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
|
||||
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) DABDEMOD_CHANNEL_SAMPLE_RATE;
|
||||
m_interpolatorDistanceRemain = m_interpolatorDistance;
|
||||
}
|
||||
|
||||
if ((settings.m_program != m_settings.m_program) || force)
|
||||
if ((settingsKeys.contains("program") && (settings.m_program != m_settings.m_program)) || force)
|
||||
{
|
||||
if (!settings.m_program.isEmpty()) {
|
||||
setProgram(settings.m_program);
|
||||
|
||||
@ -49,7 +49,7 @@ public:
|
||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
||||
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void applySettings(const DABDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false);
|
||||
void applyAudioSampleRate(int sampleRate);
|
||||
void applyDABAudioSampleRate(int sampleRate);
|
||||
int getAudioSampleRate() const { return m_audioSampleRate; }
|
||||
|
||||
@ -53,7 +53,7 @@ DATVDemod::DATVDemod(DeviceAPI *deviceAPI) :
|
||||
m_basebandSink = new DATVDemodBaseband();
|
||||
m_basebandSink->moveToThread(&m_thread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -123,7 +123,7 @@ void DATVDemod::start()
|
||||
m_basebandSink->startWork();
|
||||
m_thread.start();
|
||||
|
||||
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(m_settings, true);
|
||||
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@ bool DATVDemod::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureDATVDemod& objCfg = (MsgConfigureDATVDemod&) cmd;
|
||||
qDebug() << "DATVDemod::handleMessage: MsgConfigureDATVDemod";
|
||||
applySettings(objCfg.getSettings(), objCfg.getForce());
|
||||
applySettings(objCfg.getSettingsKeys(), objCfg.getSettings(), objCfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -172,104 +172,21 @@ void DATVDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
DATVDemodSettings settings = m_settings;
|
||||
settings.m_centerFrequency = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList("centerFrequency"), settings, false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(settings, false);
|
||||
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(QStringList("centerFrequency"), settings, false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
void DATVDemod::applySettings(const QList<QString>& settingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
{
|
||||
QString debugMsg = tr("DATVDemod::applySettings: force: %1").arg(force);
|
||||
settings.debug(debugMsg);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if (settings.m_rgbColor != m_settings.m_rgbColor) {
|
||||
reverseAPIKeys.append("rgbColor");
|
||||
}
|
||||
if (settings.m_title != m_settings.m_title) {
|
||||
reverseAPIKeys.append("title");
|
||||
}
|
||||
if (settings.m_rfBandwidth != m_settings.m_rfBandwidth) {
|
||||
reverseAPIKeys.append("rfBandwidth");
|
||||
}
|
||||
if (settings.m_centerFrequency != m_settings.m_centerFrequency) {
|
||||
reverseAPIKeys.append("centerFrequency");
|
||||
}
|
||||
if (settings.m_standard != m_settings.m_standard) {
|
||||
reverseAPIKeys.append("standard");
|
||||
}
|
||||
if (settings.m_modulation != m_settings.m_modulation) {
|
||||
reverseAPIKeys.append("modulation");
|
||||
}
|
||||
if (settings.m_fec != m_settings.m_fec) {
|
||||
reverseAPIKeys.append("fec");
|
||||
}
|
||||
if (settings.m_softLDPC != m_settings.m_softLDPC) {
|
||||
reverseAPIKeys.append("softLDPC");
|
||||
}
|
||||
if (settings.m_softLDPCMaxTrials != m_settings.m_softLDPCMaxTrials) {
|
||||
reverseAPIKeys.append("softLDPCMaxTrials");
|
||||
}
|
||||
if (settings.m_maxBitflips != m_settings.m_maxBitflips) {
|
||||
reverseAPIKeys.append("maxBitflips");
|
||||
}
|
||||
if (settings.m_audioMute != m_settings.m_audioMute) {
|
||||
reverseAPIKeys.append("audioMute");
|
||||
}
|
||||
if (settings.m_audioDeviceName != m_settings.m_audioDeviceName) {
|
||||
reverseAPIKeys.append("audioDeviceName");
|
||||
}
|
||||
if (settings.m_symbolRate != m_settings.m_symbolRate) {
|
||||
reverseAPIKeys.append("symbolRate");
|
||||
}
|
||||
if (settings.m_notchFilters != m_settings.m_notchFilters) {
|
||||
reverseAPIKeys.append("notchFilters");
|
||||
}
|
||||
if (settings.m_allowDrift != m_settings.m_allowDrift) {
|
||||
reverseAPIKeys.append("allowDrift");
|
||||
}
|
||||
if (settings.m_fastLock != m_settings.m_fastLock) {
|
||||
reverseAPIKeys.append("fastLock");
|
||||
}
|
||||
if (settings.m_filter != m_settings.m_filter) {
|
||||
reverseAPIKeys.append("filter");
|
||||
}
|
||||
if (settings.m_hardMetric != m_settings.m_hardMetric) {
|
||||
reverseAPIKeys.append("hardMetric");
|
||||
}
|
||||
if (settings.m_rollOff != m_settings.m_rollOff) {
|
||||
reverseAPIKeys.append("rollOff");
|
||||
}
|
||||
if (settings.m_viterbi != m_settings.m_viterbi) {
|
||||
reverseAPIKeys.append("viterbi");
|
||||
}
|
||||
if (settings.m_excursion != m_settings.m_excursion) {
|
||||
reverseAPIKeys.append("excursion");
|
||||
}
|
||||
if (settings.m_audioVolume != m_settings.m_audioVolume) {
|
||||
reverseAPIKeys.append("audioVolume");
|
||||
}
|
||||
if (settings.m_videoMute != m_settings.m_videoMute) {
|
||||
reverseAPIKeys.append("videoMute");
|
||||
}
|
||||
if (settings.m_udpTSAddress != m_settings.m_udpTSAddress) {
|
||||
reverseAPIKeys.append("udpTSAddress");
|
||||
}
|
||||
if (settings.m_udpTSPort != m_settings.m_udpTSPort) {
|
||||
reverseAPIKeys.append("udpTSPort");
|
||||
}
|
||||
if (settings.m_udpTS != m_settings.m_udpTS) {
|
||||
reverseAPIKeys.append("udpTS");
|
||||
}
|
||||
if (settings.m_playerEnable != m_settings.m_playerEnable) {
|
||||
reverseAPIKeys.append("playerEnable");
|
||||
}
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -280,28 +197,26 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
|
||||
emit streamIndexChanged(settings.m_streamIndex);
|
||||
}
|
||||
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settings, force);
|
||||
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI != m_settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
|
||||
(settingsKeys.contains("reverseAPIAddress") && (settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress)) ||
|
||||
(settingsKeys.contains("reverseAPIPort") && (settings.m_reverseAPIPort != m_settings.m_reverseAPIPort)) ||
|
||||
(settingsKeys.contains("reverseAPIDeviceIndex") && (settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex)) ||
|
||||
(settingsKeys.contains("reverseAPIChannelIndex") && (settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex));
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
sendChannelSettings(pipes, settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
@ -353,14 +268,14 @@ int DATVDemod::webapiSettingsPutPatch(
|
||||
DATVDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureDATVDemod *msg = MsgConfigureDATVDemod::create(settings, force);
|
||||
MsgConfigureDATVDemod *msg = MsgConfigureDATVDemod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("DATVDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(settings, force);
|
||||
MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(channelSettingsKeys, settings, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -589,7 +504,7 @@ void DATVDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
|
||||
|
||||
void DATVDemod::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const DATVDemodSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@ -613,7 +528,7 @@ void DATVDemod::sendChannelSettings(
|
||||
}
|
||||
|
||||
void DATVDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const DATVDemodSettings& settings,
|
||||
bool force
|
||||
@ -728,7 +643,7 @@ void DATVDemod::webapiFormatChannelSettings(
|
||||
}
|
||||
}
|
||||
|
||||
void DATVDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
void DATVDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
|
||||
@ -142,20 +142,23 @@ public:
|
||||
|
||||
public:
|
||||
const DATVDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureDATVDemod* create(const DATVDemodSettings& settings, bool force)
|
||||
static MsgConfigureDATVDemod* create(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDATVDemod(settings, force);
|
||||
return new MsgConfigureDATVDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DATVDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDATVDemod(const DATVDemodSettings& settings, bool force) :
|
||||
MsgConfigureDATVDemod(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -170,17 +173,17 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const DATVDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QList<QString>& settingsKeys, const DATVDemodSettings& settings, bool force = false);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DATVDemodSettings& settings, bool force);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const DATVDemodSettings& settings,
|
||||
bool force
|
||||
);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const DATVDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -128,7 +128,7 @@ bool DATVDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureDATVDemodBaseband& cfg = (MsgConfigureDATVDemodBaseband&) cmd;
|
||||
qDebug() << "DATVDemodBaseband::handleMessage: MsgConfigureDATVDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -149,12 +149,12 @@ bool DATVDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
void DATVDemodBaseband::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug("DATVDemodBaseband::applySettings");
|
||||
qDebug() << "DATVDemodBaseband::applySettings" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settings.m_centerFrequency != m_settings.m_centerFrequency) ||
|
||||
(settings.m_symbolRate != m_settings.m_symbolRate) || force)
|
||||
if ((settingsKeys.contains("centerFrequency") && (settings.m_centerFrequency != m_settings.m_centerFrequency)) ||
|
||||
(settingsKeys.contains("symbolRate") && (settings.m_symbolRate != m_settings.m_symbolRate)) || force)
|
||||
{
|
||||
unsigned int desiredSampleRate = 2 * settings.m_symbolRate; // m_channelizer->getBasebandSampleRate();
|
||||
m_channelizer->setChannelization(desiredSampleRate, settings.m_centerFrequency);
|
||||
@ -162,15 +162,20 @@ void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool fo
|
||||
m_sink->applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
|
||||
if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force)
|
||||
{
|
||||
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
|
||||
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
|
||||
audioDeviceManager->addAudioSink(m_sink->getAudioFifo(), getInputMessageQueue(), audioDeviceIndex);
|
||||
}
|
||||
|
||||
m_sink->applySettings(settings, force);
|
||||
m_settings = settings;
|
||||
m_sink->applySettings(settingsKeys, settings, force);
|
||||
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
int DATVDemodBaseband::getChannelSampleRate() const
|
||||
|
||||
@ -41,20 +41,23 @@ public:
|
||||
|
||||
public:
|
||||
const DATVDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureDATVDemodBaseband* create(const DATVDemodSettings& settings, bool force)
|
||||
static MsgConfigureDATVDemodBaseband* create(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDATVDemodBaseband(settings, force);
|
||||
return new MsgConfigureDATVDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DATVDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDATVDemodBaseband(const DATVDemodSettings& settings, bool force) :
|
||||
MsgConfigureDATVDemodBaseband(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -106,7 +109,7 @@ private:
|
||||
QRecursiveMutex m_mutex;
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void applySettings(const DATVDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
|
||||
@ -73,7 +73,7 @@ void DATVDemodGUI::resetToDefaults()
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
}
|
||||
|
||||
QByteArray DATVDemodGUI::serialize() const
|
||||
@ -86,7 +86,7 @@ bool DATVDemodGUI::deserialize(const QByteArray& arrData)
|
||||
if (m_settings.deserialize(arrData))
|
||||
{
|
||||
displaySettings();
|
||||
applySettings(true);
|
||||
applySettings(QStringList(), true);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@ -150,7 +150,7 @@ void DATVDemodGUI::channelMarkerChangedByCursor()
|
||||
{
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
m_settings.m_centerFrequency = m_channelMarker.getCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("centerFrequency"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::channelMarkerHighlightedByCursor()
|
||||
@ -165,7 +165,7 @@ void DATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
(void) rollDown;
|
||||
|
||||
getRollupContents()->saveState(m_rollupState);
|
||||
applySettings();
|
||||
applySettings(QStringList());
|
||||
}
|
||||
|
||||
void DATVDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
@ -210,7 +210,10 @@ void DATVDemodGUI::onMenuDialogCalled(const QPoint &p)
|
||||
updateIndexLabel();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList({"title", "color",
|
||||
"useReverseAPI", "reverseAPIAddress", "reverseAPIPort",
|
||||
"reverseAPIDeviceIndex", "reverseAPIChannelIndex",
|
||||
"streamIndex"}));
|
||||
}
|
||||
|
||||
resetContextMenuType();
|
||||
@ -481,7 +484,7 @@ void DATVDemodGUI::displaySystemConfiguration()
|
||||
ui->cmbFEC->blockSignals(false);
|
||||
}
|
||||
|
||||
void DATVDemodGUI::applySettings(bool force)
|
||||
void DATVDemodGUI::applySettings(const QStringList& settingsKeys, const bool force)
|
||||
{
|
||||
if (m_blnDoApplySettings)
|
||||
{
|
||||
@ -492,7 +495,7 @@ void DATVDemodGUI::applySettings(bool force)
|
||||
QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force ? "true" : "false");
|
||||
m_settings.debug(msg);
|
||||
|
||||
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force);
|
||||
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(settingsKeys, m_settings, force);
|
||||
m_datvDemod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
}
|
||||
@ -524,7 +527,7 @@ void DATVDemodGUI::audioSelect(const QPoint& p)
|
||||
if (audioSelect.m_selected)
|
||||
{
|
||||
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
|
||||
applySettings();
|
||||
applySettings(QStringList("audioDeviceName"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -538,7 +541,7 @@ void DATVDemodGUI::ldpcToolSelect(const QPoint& p)
|
||||
if (ldpcDialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
m_settings.m_softLDPCMaxTrials = ldpcDialog.getMaxTrials();
|
||||
applySettings();
|
||||
applySettings(QStringList("softLDPCMaxTrials"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -683,7 +686,7 @@ void DATVDemodGUI::on_cmbStandard_currentIndexChanged(int index)
|
||||
|
||||
m_settings.validateSystemConfiguration();
|
||||
displaySystemConfiguration();
|
||||
applySettings();
|
||||
applySettings(QStringList("standard"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1)
|
||||
@ -693,7 +696,7 @@ void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1)
|
||||
m_settings.m_modulation = DATVDemodSettings::getModulationFromStr(strModulation);
|
||||
m_settings.validateSystemConfiguration();
|
||||
displaySystemConfiguration();
|
||||
|
||||
applySettings(QStringList("modulation"));
|
||||
//Viterbi only for BPSK and QPSK
|
||||
if ((m_settings.m_modulation != DATVDemodSettings::BPSK)
|
||||
&& (m_settings.m_modulation != DATVDemodSettings::QPSK))
|
||||
@ -701,7 +704,7 @@ void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1)
|
||||
ui->chkViterbi->setChecked(false);
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList("modulation"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_cmbFEC_currentIndexChanged(int arg1)
|
||||
@ -709,31 +712,31 @@ void DATVDemodGUI::on_cmbFEC_currentIndexChanged(int arg1)
|
||||
(void) arg1;
|
||||
QString strFEC = ui->cmbFEC->currentText();
|
||||
m_settings.m_fec = DATVDemodSettings::getCodeRateFromStr(strFEC);
|
||||
applySettings();
|
||||
applySettings(QStringList("fec"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_softLDPC_clicked()
|
||||
{
|
||||
m_settings.m_softLDPC = ui->softLDPC->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("softLDPC"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_maxBitflips_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_maxBitflips = value;
|
||||
applySettings();
|
||||
applySettings(QStringList("maxBitflips"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_chkViterbi_clicked()
|
||||
{
|
||||
m_settings.m_viterbi = ui->chkViterbi->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("viterbi"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_chkHardMetric_clicked()
|
||||
{
|
||||
m_settings.m_hardMetric = ui->chkHardMetric->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("hardMetric"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_resetDefaults_clicked()
|
||||
@ -747,7 +750,7 @@ void DATVDemodGUI::on_spiSymbolRate_valueChanged(int value)
|
||||
ui->datvStdSR->blockSignals(true);
|
||||
ui->datvStdSR->setValue(indexFromSymbolRate(value));
|
||||
ui->datvStdSR->blockSignals(false);
|
||||
applySettings();
|
||||
applySettings(QStringList("symbolRate"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_datvStdSR_valueChanged(int value)
|
||||
@ -761,19 +764,19 @@ void DATVDemodGUI::on_datvStdSR_valueChanged(int value)
|
||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||
ui->rfBandwidth->blockSignals(false);
|
||||
ui->spiSymbolRate->blockSignals(false);
|
||||
applySettings();
|
||||
applySettings(QStringList({"symbolRate", "rfBandwidth"}));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_spiNotchFilters_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_notchFilters = value;
|
||||
applySettings();
|
||||
applySettings(QStringList("notchFilters"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_chkAllowDrift_clicked()
|
||||
{
|
||||
m_settings.m_allowDrift = ui->chkAllowDrift->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("allowDrift"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_fullScreen_clicked()
|
||||
@ -819,45 +822,45 @@ void DATVDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_settings.m_centerFrequency = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
applySettings(QStringList("centerFrequency"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_rfBandwidth_changed(qint64 value)
|
||||
{
|
||||
m_channelMarker.setBandwidth(value);
|
||||
m_settings.m_rfBandwidth = m_channelMarker.getBandwidth();
|
||||
applySettings();
|
||||
applySettings(QStringList("rfBandwidth"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_chkFastlock_clicked()
|
||||
{
|
||||
m_settings.m_fastLock = ui->chkFastlock->isChecked();
|
||||
applySettings();
|
||||
applySettings(QStringList("fastLock"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_audioMute_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_audioMute = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("audioMute"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_videoMute_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_videoMute = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("videoMute"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_audioVolume_valueChanged(int value)
|
||||
{
|
||||
ui->audioVolumeText->setText(tr("%1").arg(value));
|
||||
m_settings.m_audioVolume = value;
|
||||
applySettings();
|
||||
applySettings(QStringList("audioVolume"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_udpTS_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_udpTS = checked;
|
||||
applySettings();
|
||||
applySettings(QStringList("udpTS"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_StreamMetaDataChanged(DataTSMetaData2 *objMetaData)
|
||||
@ -907,7 +910,7 @@ void DATVDemodGUI::on_playerEnable_clicked()
|
||||
connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applySettings(QStringList("playerEnable"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::displayRRCParameters(bool blnVisible)
|
||||
@ -929,25 +932,25 @@ void DATVDemodGUI::on_cmbFilter_currentIndexChanged(int index)
|
||||
}
|
||||
|
||||
displayRRCParameters(index == 2);
|
||||
applySettings();
|
||||
applySettings(QStringList("filter"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_spiRollOff_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_rollOff = ((float) value) / 100.0f;
|
||||
applySettings();
|
||||
applySettings(QStringList("rollOff"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_spiExcursion_valueChanged(int value)
|
||||
{
|
||||
m_settings.m_excursion = value;
|
||||
applySettings();
|
||||
applySettings(QStringList("excursion"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_udpTSAddress_editingFinished()
|
||||
{
|
||||
m_settings.m_udpTSAddress = ui->udpTSAddress->text();
|
||||
applySettings();
|
||||
applySettings(QStringList("udpTSAddress"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::on_udpTSPort_editingFinished()
|
||||
@ -961,7 +964,7 @@ void DATVDemodGUI::on_udpTSPort_editingFinished()
|
||||
|
||||
m_settings.m_udpTSPort = udpPort;
|
||||
ui->udpTSPort->setText(tr("%1").arg(udpPort));
|
||||
applySettings();
|
||||
applySettings(QStringList("udpTSPort"));
|
||||
}
|
||||
|
||||
void DATVDemodGUI::makeUIConnections()
|
||||
|
||||
@ -143,7 +143,7 @@ private:
|
||||
virtual ~DATVDemodGUI();
|
||||
|
||||
void blockApplySettings(bool blnBlock);
|
||||
void applySettings(bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
void displaySettings();
|
||||
void displaySystemConfiguration();
|
||||
QString formatBytes(qint64 intBytes);
|
||||
|
||||
@ -349,6 +349,228 @@ void DATVDemodSettings::validateSystemConfiguration()
|
||||
}
|
||||
}
|
||||
|
||||
void DATVDemodSettings::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings)
|
||||
{
|
||||
if (settingsKeys.contains("rgbColor")) {
|
||||
m_rgbColor = settings.m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title")) {
|
||||
m_title = settings.m_title;
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth")) {
|
||||
m_rfBandwidth = settings.m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("centerFrequency")) {
|
||||
m_centerFrequency = settings.m_centerFrequency;
|
||||
}
|
||||
if (settingsKeys.contains("standard")) {
|
||||
m_standard = settings.m_standard;
|
||||
}
|
||||
if (settingsKeys.contains("modulation")) {
|
||||
m_modulation = settings.m_modulation;
|
||||
}
|
||||
if (settingsKeys.contains("fec")) {
|
||||
m_fec = settings.m_fec;
|
||||
}
|
||||
if (settingsKeys.contains("softLDPC")) {
|
||||
m_softLDPC = settings.m_softLDPC;
|
||||
}
|
||||
if (settingsKeys.contains("softLDPCMaxTrials")) {
|
||||
m_softLDPCMaxTrials = settings.m_softLDPCMaxTrials;
|
||||
}
|
||||
if (settingsKeys.contains("maxBitflips")) {
|
||||
m_maxBitflips = settings.m_maxBitflips;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute")) {
|
||||
m_audioMute = settings.m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName")) {
|
||||
m_audioDeviceName = settings.m_audioDeviceName;
|
||||
}
|
||||
if (settingsKeys.contains("symbolRate")) {
|
||||
m_symbolRate = settings.m_symbolRate;
|
||||
}
|
||||
if (settingsKeys.contains("notchFilters")) {
|
||||
m_notchFilters = settings.m_notchFilters;
|
||||
}
|
||||
if (settingsKeys.contains("allowDrift")) {
|
||||
m_allowDrift = settings.m_allowDrift;
|
||||
}
|
||||
if (settingsKeys.contains("fastLock")) {
|
||||
m_fastLock = settings.m_fastLock;
|
||||
}
|
||||
if (settingsKeys.contains("filter")) {
|
||||
m_filter = settings.m_filter;
|
||||
}
|
||||
if (settingsKeys.contains("hardMetric")) {
|
||||
m_hardMetric = settings.m_hardMetric;
|
||||
}
|
||||
if (settingsKeys.contains("rollOff")) {
|
||||
m_rollOff = settings.m_rollOff;
|
||||
}
|
||||
if (settingsKeys.contains("viterbi")) {
|
||||
m_viterbi = settings.m_viterbi;
|
||||
}
|
||||
if (settingsKeys.contains("excursion")) {
|
||||
m_excursion = settings.m_excursion;
|
||||
}
|
||||
if (settingsKeys.contains("audioVolume")) {
|
||||
m_audioVolume = settings.m_audioVolume;
|
||||
}
|
||||
if (settingsKeys.contains("videoMute")) {
|
||||
m_videoMute = settings.m_videoMute;
|
||||
}
|
||||
if (settingsKeys.contains("udpTSAddress")) {
|
||||
m_udpTSAddress = settings.m_udpTSAddress;
|
||||
}
|
||||
if (settingsKeys.contains("udpTSPort")) {
|
||||
m_udpTSPort = settings.m_udpTSPort;
|
||||
}
|
||||
if (settingsKeys.contains("udpTS")) {
|
||||
m_udpTS = settings.m_udpTS;
|
||||
}
|
||||
if (settingsKeys.contains("playerEnable")) {
|
||||
m_playerEnable = settings.m_playerEnable;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex")) {
|
||||
m_streamIndex = settings.m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI")) {
|
||||
m_useReverseAPI = settings.m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress")) {
|
||||
m_reverseAPIAddress = settings.m_reverseAPIAddress;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort")) {
|
||||
m_reverseAPIPort = settings.m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex")) {
|
||||
m_workspaceIndex = settings.m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden")) {
|
||||
m_hidden = settings.m_hidden;
|
||||
}
|
||||
}
|
||||
|
||||
QString DATVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
|
||||
if (settingsKeys.contains("rgbColor") || force) {
|
||||
ostr << " m_rgbColor: " << m_rgbColor;
|
||||
}
|
||||
if (settingsKeys.contains("title") || force) {
|
||||
ostr << " m_title: " << m_title.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("rfBandwidth") || force) {
|
||||
ostr << " m_rfBandwidth: " << m_rfBandwidth;
|
||||
}
|
||||
if (settingsKeys.contains("centerFrequency") || force) {
|
||||
ostr << " m_centerFrequency: " << m_centerFrequency;
|
||||
}
|
||||
if (settingsKeys.contains("standard") || force) {
|
||||
ostr << " m_standard: " << m_standard;
|
||||
}
|
||||
if (settingsKeys.contains("modulation") || force) {
|
||||
ostr << " m_modulation: " << m_modulation;
|
||||
}
|
||||
if (settingsKeys.contains("fec") || force) {
|
||||
ostr << " m_fec: " << m_fec;
|
||||
}
|
||||
if (settingsKeys.contains("softLDPC") || force) {
|
||||
ostr << " m_softLDPC: " << m_softLDPC;
|
||||
}
|
||||
if (settingsKeys.contains("softLDPCMaxTrials") || force) {
|
||||
ostr << " m_softLDPCMaxTrials: " << m_softLDPCMaxTrials;
|
||||
}
|
||||
if (settingsKeys.contains("maxBitflips") || force) {
|
||||
ostr << " m_maxBitflips: " << m_maxBitflips;
|
||||
}
|
||||
if (settingsKeys.contains("audioMute") || force) {
|
||||
ostr << " m_audioMute: " << m_audioMute;
|
||||
}
|
||||
if (settingsKeys.contains("audioDeviceName") || force) {
|
||||
ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("symbolRate") || force) {
|
||||
ostr << " m_symbolRate: " << m_symbolRate;
|
||||
}
|
||||
if (settingsKeys.contains("notchFilters") || force) {
|
||||
ostr << " m_notchFilters: " << m_notchFilters;
|
||||
}
|
||||
if (settingsKeys.contains("allowDrift") || force) {
|
||||
ostr << " m_allowDrift: " << m_allowDrift;
|
||||
}
|
||||
if (settingsKeys.contains("fastLock") || force) {
|
||||
ostr << " m_fastLock: " << m_fastLock;
|
||||
}
|
||||
if (settingsKeys.contains("filter") || force) {
|
||||
ostr << " m_filter: " << m_filter;
|
||||
}
|
||||
if (settingsKeys.contains("hardMetric") || force) {
|
||||
ostr << " m_hardMetric: " << m_hardMetric;
|
||||
}
|
||||
if (settingsKeys.contains("rollOff") || force) {
|
||||
ostr << " m_rollOff: " << m_rollOff;
|
||||
}
|
||||
if (settingsKeys.contains("viterbi") || force) {
|
||||
ostr << " m_viterbi: " << m_viterbi;
|
||||
}
|
||||
if (settingsKeys.contains("excursion") || force) {
|
||||
ostr << " m_excursion: " << m_excursion;
|
||||
}
|
||||
if (settingsKeys.contains("audioVolume") || force) {
|
||||
ostr << " m_audioVolume: " << m_audioVolume;
|
||||
}
|
||||
if (settingsKeys.contains("videoMute") || force) {
|
||||
ostr << " m_videoMute: " << m_videoMute;
|
||||
}
|
||||
if (settingsKeys.contains("udpTSAddress") || force) {
|
||||
ostr << " m_udpTSAddress: " << m_udpTSAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("udpTSPort") || force) {
|
||||
ostr << " m_udpTSPort: " << m_udpTSPort;
|
||||
}
|
||||
if (settingsKeys.contains("udpTS") || force) {
|
||||
ostr << " m_udpTS: " << m_udpTS;
|
||||
}
|
||||
if (settingsKeys.contains("playerEnable") || force) {
|
||||
ostr << " m_playerEnable: " << m_playerEnable;
|
||||
}
|
||||
if (settingsKeys.contains("streamIndex") || force) {
|
||||
ostr << " m_streamIndex: " << m_streamIndex;
|
||||
}
|
||||
if (settingsKeys.contains("useReverseAPI") || force) {
|
||||
ostr << " m_useReverseAPI: " << m_useReverseAPI;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIAddress") || force) {
|
||||
ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIPort") || force) {
|
||||
ostr << " m_reverseAPIPort: " << m_reverseAPIPort;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIDeviceIndex") || force) {
|
||||
ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("reverseAPIChannelIndex") || force) {
|
||||
ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex;
|
||||
}
|
||||
if (settingsKeys.contains("workspaceIndex") || force) {
|
||||
ostr << " m_workspaceIndex: " << m_workspaceIndex;
|
||||
}
|
||||
if (settingsKeys.contains("hidden") || force) {
|
||||
ostr << " m_hidden: " << m_hidden;
|
||||
}
|
||||
|
||||
return QString(ostr.str().c_str());
|
||||
}
|
||||
|
||||
DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromStr(const QString& str)
|
||||
{
|
||||
if (str == "BPSK") {
|
||||
@ -591,4 +813,3 @@ DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromLeanDVBCod
|
||||
return DATVDemodSettings::DATVModulation::MOD_UNSET;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -125,6 +125,8 @@ struct DATVDemodSettings
|
||||
void debug(const QString& msg) const;
|
||||
bool isDifferent(const DATVDemodSettings& other); // true if a change of settings should trigger DVB framework config update
|
||||
void validateSystemConfiguration();
|
||||
void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings);
|
||||
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
|
||||
|
||||
static DATVModulation getModulationFromStr(const QString& str);
|
||||
static DATVCodeRate getCodeRateFromStr(const QString& str);
|
||||
|
||||
@ -31,6 +31,9 @@
|
||||
#include <QMutexLocker>
|
||||
|
||||
#include "datvdemodreport.h"
|
||||
#ifndef SERVER_MODE
|
||||
#include "datvideorender.h"
|
||||
#endif
|
||||
|
||||
const unsigned int DATVDemodSink::m_rfFilterFftLength = 512;
|
||||
|
||||
@ -68,9 +71,11 @@ DATVDemodSink::~DATVDemodSink()
|
||||
stopVideo();
|
||||
CleanUpDATVFramework();
|
||||
|
||||
#ifndef SERVER_MODE
|
||||
if (m_videoThread) {
|
||||
delete m_videoThread;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void DATVDemodSink::stopVideo()
|
||||
@ -100,6 +105,8 @@ void DATVDemodSink::SetVideoRender(DATVideoRender *screen)
|
||||
m_videoRender->setAudioFIFO(&m_audioFifo);
|
||||
m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream);
|
||||
m_videoThread->setObjectName("vtDATVDemodSink");
|
||||
#else
|
||||
(void) screen;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1372,11 +1379,11 @@ void DATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequ
|
||||
m_settings.m_centerFrequency = channelFrequencyOffset;
|
||||
|
||||
if (callApplySettings) {
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
}
|
||||
}
|
||||
|
||||
void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
void DATVDemodSink::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force)
|
||||
{
|
||||
QString msg = QObject::tr("DATVDemodSink::applySettings: force: %1").arg(force);
|
||||
settings.debug(msg);
|
||||
@ -1388,21 +1395,21 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
}
|
||||
|
||||
#ifndef SERVER_MODE
|
||||
if ((settings.m_audioVolume) != (m_settings.m_audioVolume) || force)
|
||||
if ((settingsKeys.contains("audioVolume") && (settings.m_audioVolume != m_settings.m_audioVolume)) || force)
|
||||
{
|
||||
if (m_videoRender) {
|
||||
m_videoRender->setAudioVolume(settings.m_audioVolume);
|
||||
}
|
||||
}
|
||||
|
||||
if ((settings.m_audioMute) != (m_settings.m_audioMute) || force)
|
||||
if ((settingsKeys.contains("audioMute") && (settings.m_audioMute != m_settings.m_audioMute)) || force)
|
||||
{
|
||||
if (m_videoRender) {
|
||||
m_videoRender->setAudioMute(settings.m_audioMute);
|
||||
}
|
||||
}
|
||||
|
||||
if ((settings.m_videoMute) != (m_settings.m_videoMute) || force)
|
||||
if ((settingsKeys.contains("videoMute") && (settings.m_videoMute != m_settings.m_videoMute)) || force)
|
||||
{
|
||||
if (m_videoRender) {
|
||||
m_videoRender->setVideoMute(settings.m_videoMute);
|
||||
@ -1410,9 +1417,9 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth)
|
||||
|| (m_settings.m_symbolRate != settings.m_symbolRate)
|
||||
|| (m_settings.m_centerFrequency != settings.m_centerFrequency) || force)
|
||||
if (settingsKeys.contains("rfBandwidth") ||
|
||||
settingsKeys.contains("symbolRate") ||
|
||||
settingsKeys.contains("centerFrequency") || force)
|
||||
{
|
||||
m_interpolator.create(m_interpolatorPhaseSteps, m_channelSampleRate, settings.m_rfBandwidth / 2.2, m_interpolatorTapsPerPhase);
|
||||
m_interpolatorDistanceRemain = 0;
|
||||
@ -1420,7 +1427,7 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
m_nco.setFreq(-(float) settings.m_centerFrequency, (float) m_channelSampleRate);
|
||||
}
|
||||
|
||||
if ((m_settings.m_udpTS != settings.m_udpTS) || force)
|
||||
if ((settingsKeys.contains("udpTS") && (m_settings.m_udpTS != settings.m_udpTS)) || force)
|
||||
{
|
||||
m_udpStream.setActive(settings.m_udpTS);
|
||||
|
||||
@ -1429,17 +1436,17 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_settings.m_symbolRate != settings.m_symbolRate) || force) {
|
||||
if ((settingsKeys.contains("symbolRate") && (m_settings.m_symbolRate != settings.m_symbolRate)) || force) {
|
||||
if (r_videoplayer) {
|
||||
r_videoplayer->setSymbolRate(settings.m_symbolRate);
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) {
|
||||
if ((settingsKeys.contains("udpTSAddress") && (m_settings.m_udpTSAddress != settings.m_udpTSAddress)) || force) {
|
||||
m_udpStream.setAddress(settings.m_udpTSAddress);
|
||||
}
|
||||
|
||||
if ((m_settings.m_udpTSPort != settings.m_udpTSPort) || force) {
|
||||
if ((settingsKeys.contains("udpTSPort") && (m_settings.m_udpTSPort != settings.m_udpTSPort)) || force) {
|
||||
m_udpStream.setPort(settings.m_udpTSPort);
|
||||
}
|
||||
|
||||
@ -1447,7 +1454,11 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
|
||||
m_blnNeedConfigUpdate = true;
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
int DATVDemodSink::getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate)
|
||||
|
||||
@ -115,7 +115,7 @@ public:
|
||||
return r_cnrMeter ? r_cnrMeter->m_nbAvg : 1;
|
||||
}
|
||||
|
||||
void applySettings(const DATVDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force = false);
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
|
||||
private:
|
||||
@ -316,7 +316,7 @@ private:
|
||||
leansdr::datvvideoplayer<leansdr::tspacket> *r_videoplayer;
|
||||
|
||||
//CONSTELLATION
|
||||
#ifndef SERVER_MODE
|
||||
#ifndef SERVER_MODE
|
||||
leansdr::datvconstellation<leansdr::f32> *r_scope_symbols;
|
||||
leansdr::datvdvbs2constellation<leansdr::f32> *r_scope_symbols_dvbs2;
|
||||
#endif
|
||||
|
||||
@ -58,7 +58,7 @@ DSCDemod::DSCDemod(DeviceAPI *deviceAPI) :
|
||||
m_basebandSink->setChannel(this);
|
||||
m_basebandSink->moveToThread(&m_thread);
|
||||
|
||||
applySettings(m_settings, true);
|
||||
applySettings(QStringList(), m_settings, true);
|
||||
|
||||
m_deviceAPI->addChannelSink(this);
|
||||
m_deviceAPI->addChannelSinkAPI(this);
|
||||
@ -132,7 +132,7 @@ void DSCDemod::start()
|
||||
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||
|
||||
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(m_settings, true);
|
||||
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(QStringList(), m_settings, true);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
}
|
||||
|
||||
@ -150,7 +150,7 @@ bool DSCDemod::handleMessage(const Message& cmd)
|
||||
{
|
||||
MsgConfigureDSCDemod& cfg = (MsgConfigureDSCDemod&) cmd;
|
||||
qDebug() << "DSCDemod::handleMessage: MsgConfigureDSCDemod";
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -257,64 +257,20 @@ void DSCDemod::setCenterFrequency(qint64 frequency)
|
||||
{
|
||||
DSCDemodSettings settings = m_settings;
|
||||
settings.m_inputFrequencyOffset = frequency;
|
||||
applySettings(settings, false);
|
||||
applySettings(QStringList("inputFrequencyOffset"), settings, false);
|
||||
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(settings, false);
|
||||
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(QStringList("inputFrequencyOffset"), settings, false);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
}
|
||||
|
||||
void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force)
|
||||
void DSCDemod::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "DSCDemod::applySettings:"
|
||||
<< " m_logEnabled: " << settings.m_logEnabled
|
||||
<< " m_logFilename: " << settings.m_logFilename
|
||||
<< " m_streamIndex: " << settings.m_streamIndex
|
||||
<< " m_useReverseAPI: " << settings.m_useReverseAPI
|
||||
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
|
||||
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
|
||||
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
|
||||
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
|
||||
<< " force: " << force;
|
||||
qDebug() << "DSCDemod::applySettings:" << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
|
||||
reverseAPIKeys.append("inputFrequencyOffset");
|
||||
}
|
||||
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
|
||||
reverseAPIKeys.append("rfBandwidth");
|
||||
}
|
||||
if ((settings.m_filterInvalid != m_settings.m_filterInvalid) || force) {
|
||||
reverseAPIKeys.append("filterInvalid");
|
||||
}
|
||||
if ((settings.m_filterColumn != m_settings.m_filterColumn) || force) {
|
||||
reverseAPIKeys.append("filterColumn");
|
||||
}
|
||||
if ((settings.m_filter != m_settings.m_filter) || force) {
|
||||
reverseAPIKeys.append("filter");
|
||||
}
|
||||
if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) {
|
||||
reverseAPIKeys.append("udpEnabled");
|
||||
}
|
||||
if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) {
|
||||
reverseAPIKeys.append("udpAddress");
|
||||
}
|
||||
if ((settings.m_udpPort != m_settings.m_udpPort) || force) {
|
||||
reverseAPIKeys.append("udpPort");
|
||||
}
|
||||
if ((settings.m_logFilename != m_settings.m_logFilename) || force) {
|
||||
reverseAPIKeys.append("logFilename");
|
||||
}
|
||||
if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) {
|
||||
reverseAPIKeys.append("logEnabled");
|
||||
}
|
||||
if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) {
|
||||
reverseAPIKeys.append("useFileTime");
|
||||
}
|
||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||
if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex))
|
||||
{
|
||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||
{
|
||||
@ -325,25 +281,23 @@ void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force)
|
||||
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
|
||||
emit streamIndexChanged(settings.m_streamIndex);
|
||||
}
|
||||
|
||||
reverseAPIKeys.append("streamIndex");
|
||||
}
|
||||
|
||||
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(settings, force);
|
||||
DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(settingsKeys, settings, force);
|
||||
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||
|
||||
if (settings.m_useReverseAPI)
|
||||
{
|
||||
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
|
||||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
|
||||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
|
||||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
|
||||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
|
||||
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
|
||||
bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI != m_settings.m_useReverseAPI)) && settings.m_useReverseAPI) ||
|
||||
(settingsKeys.contains("reverseAPIAddress") && (settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress)) ||
|
||||
(settingsKeys.contains("reverseAPIPort") && (settings.m_reverseAPIPort != m_settings.m_reverseAPIPort)) ||
|
||||
(settingsKeys.contains("reverseAPIDeviceIndex") && (settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex)) ||
|
||||
(settingsKeys.contains("reverseAPIChannelIndex") && (settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex));
|
||||
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
|
||||
}
|
||||
|
||||
if ((settings.m_logEnabled != m_settings.m_logEnabled)
|
||||
|| (settings.m_logFilename != m_settings.m_logFilename)
|
||||
if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled))
|
||||
|| (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename))
|
||||
|| force)
|
||||
{
|
||||
if (m_logFile.isOpen())
|
||||
@ -372,7 +326,11 @@ void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force)
|
||||
}
|
||||
}
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
void DSCDemod::sendSampleRateToDemodAnalyzer()
|
||||
@ -403,14 +361,14 @@ bool DSCDemod::deserialize(const QByteArray& data)
|
||||
{
|
||||
if (m_settings.deserialize(data))
|
||||
{
|
||||
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(m_settings, true);
|
||||
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.resetToDefaults();
|
||||
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(m_settings, true);
|
||||
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(QStringList(), m_settings, true);
|
||||
m_inputMessageQueue.push(msg);
|
||||
return false;
|
||||
}
|
||||
@ -446,13 +404,13 @@ int DSCDemod::webapiSettingsPutPatch(
|
||||
DSCDemodSettings settings = m_settings;
|
||||
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
|
||||
|
||||
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(settings, force);
|
||||
MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(channelSettingsKeys, settings, force);
|
||||
m_inputMessageQueue.push(msg);
|
||||
|
||||
qDebug("DSCDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||
if (m_guiMessageQueue) // forward to GUI if any
|
||||
{
|
||||
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(settings, force);
|
||||
MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(channelSettingsKeys, settings, force);
|
||||
m_guiMessageQueue->push(msgToGUI);
|
||||
}
|
||||
|
||||
@ -631,7 +589,7 @@ void DSCDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response
|
||||
response.getDscDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
|
||||
}
|
||||
|
||||
void DSCDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force)
|
||||
void DSCDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
@ -657,7 +615,7 @@ void DSCDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, co
|
||||
}
|
||||
|
||||
void DSCDemod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const DSCDemodSettings& settings,
|
||||
bool force
|
||||
|
||||
@ -53,20 +53,23 @@ public:
|
||||
|
||||
public:
|
||||
const DSCDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureDSCDemod* create(const DSCDemodSettings& settings, bool force)
|
||||
static MsgConfigureDSCDemod* create(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDSCDemod(settings, force);
|
||||
return new MsgConfigureDSCDemod(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DSCDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDSCDemod(const DSCDemodSettings& settings, bool force) :
|
||||
MsgConfigureDSCDemod(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -184,11 +187,11 @@ private:
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const DSCDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force);
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DSCDemodSettings& settings, bool force);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const DSCDemodSettings& settings,
|
||||
bool force
|
||||
@ -202,4 +205,3 @@ private slots:
|
||||
};
|
||||
|
||||
#endif // INCLUDE_DSCDEMOD_H
|
||||
|
||||
|
||||
@ -136,7 +136,7 @@ bool DSCDemodBaseband::handleMessage(const Message& cmd)
|
||||
MsgConfigureDSCDemodBaseband& cfg = (MsgConfigureDSCDemodBaseband&) cmd;
|
||||
qDebug() << "DSCDemodBaseband::handleMessage: MsgConfigureDSCDemodBaseband";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -157,17 +157,21 @@ bool DSCDemodBaseband::handleMessage(const Message& cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void DSCDemodBaseband::applySettings(const DSCDemodSettings& settings, bool force)
|
||||
void DSCDemodBaseband::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
|
||||
{
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
|
||||
if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force)
|
||||
{
|
||||
m_channelizer->setChannelization(DSCDemodSettings::DSCDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
m_sink.applySettings(settings, force);
|
||||
m_sink.applySettings(settingsKeys, settings, force);
|
||||
|
||||
m_settings = settings;
|
||||
if (force) {
|
||||
m_settings = settings;
|
||||
} else {
|
||||
m_settings.applySettings(settingsKeys, settings);
|
||||
}
|
||||
}
|
||||
|
||||
int DSCDemodBaseband::getChannelSampleRate() const
|
||||
@ -180,4 +184,3 @@ void DSCDemodBaseband::setBasebandSampleRate(int sampleRate)
|
||||
m_channelizer->setBasebandSampleRate(sampleRate);
|
||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||
}
|
||||
|
||||
|
||||
@ -44,20 +44,23 @@ public:
|
||||
|
||||
public:
|
||||
const DSCDemodSettings& getSettings() const { return m_settings; }
|
||||
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
|
||||
bool getForce() const { return m_force; }
|
||||
|
||||
static MsgConfigureDSCDemodBaseband* create(const DSCDemodSettings& settings, bool force)
|
||||
static MsgConfigureDSCDemodBaseband* create(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force)
|
||||
{
|
||||
return new MsgConfigureDSCDemodBaseband(settings, force);
|
||||
return new MsgConfigureDSCDemodBaseband(settingsKeys, settings, force);
|
||||
}
|
||||
|
||||
private:
|
||||
DSCDemodSettings m_settings;
|
||||
QStringList m_settingsKeys;
|
||||
bool m_force;
|
||||
|
||||
MsgConfigureDSCDemodBaseband(const DSCDemodSettings& settings, bool force) :
|
||||
MsgConfigureDSCDemodBaseband(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) :
|
||||
Message(),
|
||||
m_settings(settings),
|
||||
m_settingsKeys(settingsKeys),
|
||||
m_force(force)
|
||||
{ }
|
||||
};
|
||||
@ -93,7 +96,7 @@ private:
|
||||
|
||||
bool handleMessage(const Message& cmd);
|
||||
void calculateOffset(DSCDemodSink *sink);
|
||||
void applySettings(const DSCDemodSettings& settings, bool force = false);
|
||||
void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false);
|
||||
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
@ -101,4 +104,3 @@ private slots:
|
||||
};
|
||||
|
||||
#endif // INCLUDE_DSCDEMODBASEBAND_H
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user