mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-10-09 08:40:49 -04:00
The sawtooth and square patterns had a fixed 1000 sample pulse width. Both now take a period, and the square pattern a duty cycle, from the GUI, a preset or the web API, with the period shown in seconds beside the sample count. A period of zero divides by zero in the sawtooth and wraps the unsigned sample counter in the square pattern, giving a cycle of four billion samples, so it is refused at every entrance: a minimum of one on the spin box, a clamp when an older or hand edited preset is read, a clamp on the web API, and a clamp in the worker for anything that reaches it another way. The duty cycle is held to 0 to 100 the same way. Also fixes the worker's timer. It is now parented to the worker so that it moves to the worker thread with it, and it runs between startWork and stopWork rather than from construction. TestSourceInput::stop() runs in another thread, and Qt will not stop a timer from one, so the stop is asked of the worker and waited for. The m_running flag it replaces is gone, along with the test of it in every tick. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
106 lines
4.0 KiB
C++
106 lines
4.0 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2015-2020, 2022 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
|
|
// Copyright (C) 2022 Jon Beniston, M7RCE <jon@beniston.com> //
|
|
// //
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
// it under the terms of the GNU General Public License as published by //
|
|
// the Free Software Foundation as version 3 of the License, or //
|
|
// (at your option) any later version. //
|
|
// //
|
|
// This program is distributed in the hope that it will be useful, //
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
// GNU General Public License V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _TESTSOURCE_TESTSOURCEGUI_H_
|
|
#define _TESTSOURCE_TESTSOURCEGUI_H_
|
|
|
|
#include <device/devicegui.h>
|
|
#include <QTimer>
|
|
#include <QWidget>
|
|
|
|
#include "util/messagequeue.h"
|
|
|
|
#include "testsourcesettings.h"
|
|
#include "testsourceinput.h"
|
|
|
|
class DeviceUISet;
|
|
|
|
namespace Ui {
|
|
class TestSourceGui;
|
|
}
|
|
|
|
class TestSourceGui : public DeviceGUI {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit TestSourceGui(DeviceUISet *deviceUISet, QWidget* parent = 0);
|
|
virtual ~TestSourceGui();
|
|
virtual void destroy();
|
|
|
|
void resetToDefaults();
|
|
QByteArray serialize() const;
|
|
bool deserialize(const QByteArray& data);
|
|
virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
|
|
|
private:
|
|
Ui::TestSourceGui* ui;
|
|
|
|
TestSourceSettings m_settings;
|
|
QList<QString> m_settingsKeys;
|
|
QTimer m_updateTimer;
|
|
QTimer m_statusTimer;
|
|
bool m_doApplySettings;
|
|
bool m_forceSettings;
|
|
DeviceSampleSource* m_sampleSource;
|
|
std::size_t m_tickCount;
|
|
int m_deviceSampleRate;
|
|
quint64 m_deviceCenterFrequency; //!< Center frequency in device
|
|
int m_lastEngineState;
|
|
MessageQueue m_inputMessageQueue;
|
|
|
|
void blockApplySettings(bool block) { m_doApplySettings = !block; }
|
|
void displaySettings();
|
|
void sendSettings();
|
|
void updateSampleRateAndFrequency();
|
|
void displayAmplitude();
|
|
void displayPeriod();
|
|
void updateAmpCoarseLimit();
|
|
void updateAmpFineLimit();
|
|
void updateFrequencyShiftLimit();
|
|
bool handleMessage(const Message& message);
|
|
void makeUIConnections();
|
|
|
|
private slots:
|
|
void handleInputMessages();
|
|
void on_startStop_toggled(bool checked);
|
|
void on_centerFrequency_changed(quint64 value);
|
|
void on_autoCorr_currentIndexChanged(int index);
|
|
void on_frequencyShift_changed(qint64 value);
|
|
void on_decimation_currentIndexChanged(int index);
|
|
void on_fcPos_currentIndexChanged(int index);
|
|
void on_sampleRate_changed(quint64 value);
|
|
void on_sampleSize_currentIndexChanged(int index);
|
|
void on_amplitudeCoarse_valueChanged(int value);
|
|
void on_amplitudeFine_valueChanged(int value);
|
|
void on_modulation_currentIndexChanged(int index);
|
|
void on_modulationFrequency_valueChanged(int value);
|
|
void on_amModulation_valueChanged(int value);
|
|
void on_fmDeviation_valueChanged(int value);
|
|
void on_dcBias_valueChanged(int value);
|
|
void on_iBias_valueChanged(int value);
|
|
void on_qBias_valueChanged(int value);
|
|
void on_phaseImbalance_valueChanged(int value);
|
|
void on_period_valueChanged(int value);
|
|
void on_dutyCycle_valueChanged(int value);
|
|
void openDeviceSettingsDialog(const QPoint& p);
|
|
void updateStatus();
|
|
void updateHardware();
|
|
};
|
|
|
|
#endif // _TESTSOURCE_TESTSOURCEGUI_H_
|