wfview/include/MainController.h

612 lines
24 KiB
C
Raw Permalink Normal View History

#ifndef MAINCONTROLLER_H
#define MAINCONTROLLER_H
#include <QObject>
#include <QSettings>
2026-05-24 08:06:10 +01:00
#include <QThread>
2026-05-24 12:25:55 +01:00
#include <QTimer>
2026-05-24 17:09:55 +01:00
#include <QVariantMap>
#include "ReceiverController.h"
#include "RigCreatorController.h"
2026-01-18 22:08:12 +00:00
#include "SelectRadioController.h"
2026-01-29 08:20:12 +00:00
#include "CWSenderController.h"
#include "prefs.h"
#include "rigctld.h"
#include "tciserver.h"
#include "wfviewtypes.h"
#include "rigserver.h"
2026-01-18 12:19:55 +00:00
#include "MemoriesModel.h"
#include "rigcommander.h"
#include "icomcommander.h"
#include "kenwoodcommander.h"
#include "yaesucommander.h"
2026-01-12 10:56:27 +00:00
#include "themebridge.h"
#include "SettingsController.h"
2026-05-23 15:11:05 +01:00
#include "txaudioprocessor.h"
#include "rxaudioprocessor.h"
#include "audiohandler.h"
#include "audiorouting.h"
class MainController : public QObject {
Q_OBJECT
2026-01-12 10:56:27 +00:00
2026-01-18 12:19:55 +00:00
Q_PROPERTY(MemoriesModel* memoriesModel READ memoriesModel NOTIFY memoriesModelChanged)
Q_PROPERTY(bool slowLoad READ slowLoad WRITE setSlowLoad NOTIFY slowLoadChanged)
2026-01-29 08:20:12 +00:00
Q_PROPERTY(CWSenderController* cwSender READ cwSender CONSTANT)
Q_PROPERTY(SelectRadioController* selectRadio READ selectRadio CONSTANT)
2026-01-12 10:56:27 +00:00
public:
enum connectionStatus_t { connDisconnected, connConnecting, connConnected };
Q_ENUM (connectionStatus_t)
enum underlay_t { underlayNone, underlayPeak, underlayAverage };
2026-01-12 10:56:27 +00:00
Q_ENUM (underlay_t)
enum connectionType_t { connectionUSB, connectionLAN, connectionWiFi, connectionWAN };
Q_ENUM (connectionType_t)
Q_PROPERTY(QString windowTitle READ getWindowTitle WRITE setWindowTitle NOTIFY windowTitleChanged)
2026-05-27 09:24:39 +01:00
Q_PROPERTY(QString footerMessageText READ footerMessageText NOTIFY footerMessageTextChanged)
Q_PROPERTY(QString radioStatusText READ radioStatusText NOTIFY radioStatusTextChanged)
Q_PROPERTY(QString rigModelName READ rigModelName NOTIFY rigModelNameChanged)
2026-05-24 13:27:57 +01:00
Q_PROPERTY(QString clusterOutputText READ clusterOutputText NOTIFY clusterOutputTextChanged)
Q_PROPERTY(int receiverCount READ receiverCount NOTIFY receiverCountChanged)
Q_PROPERTY(SettingsController* settings READ getSettings CONSTANT)
2026-01-12 10:56:27 +00:00
Q_PROPERTY(connectionStatus_t connStatus READ getConnStatus WRITE setConnStatus NOTIFY connStatusChanged)
Q_PROPERTY(ThemeBridge* theme READ theme CONSTANT)
Q_PROPERTY(quint64 stepSize READ getStepSize WRITE setStepSize NOTIFY stepSizeChanged)
2026-01-18 12:19:55 +00:00
Q_PROPERTY(QVariantMap uiSpecs READ getUiSpecs NOTIFY uiSpecsChanged)
2026-05-23 18:21:27 +01:00
Q_PROPERTY(int txPower READ txPower WRITE setTxPower NOTIFY txPowerChanged)
Q_PROPERTY(int localAfGain READ localAfGain WRITE setLocalAfGain NOTIFY localAfGainChanged)
Q_PROPERTY(bool localAudioAvailable READ localAudioAvailable NOTIFY localAudioAvailableChanged)
Q_PROPERTY(int rxAudioLevel READ rxAudioLevel NOTIFY audioLevelsChanged)
Q_PROPERTY(int txAudioLevel READ txAudioLevel NOTIFY audioLevelsChanged)
2026-05-23 18:21:27 +01:00
Q_PROPERTY(int monitorGain READ monitorGain WRITE setMonitorGain NOTIFY monitorGainChanged)
2026-05-25 09:25:27 +01:00
Q_PROPERTY(bool monitorEnabled READ monitorEnabled WRITE setMonitorEnabled NOTIFY monitorEnabledChanged)
2026-05-23 18:21:27 +01:00
Q_PROPERTY(int micGain READ micGain WRITE setMicGain NOTIFY micGainChanged)
2026-05-24 12:15:26 +01:00
Q_PROPERTY(QString modGainLabel READ modGainLabel NOTIFY modSourcesChanged)
Q_PROPERTY(int modGainMin READ modGainMin NOTIFY modSourcesChanged)
Q_PROPERTY(int modGainMax READ modGainMax NOTIFY modSourcesChanged)
Q_PROPERTY(int modSourceRevision READ modSourceRevision NOTIFY modSourcesChanged)
2026-05-23 18:21:27 +01:00
Q_PROPERTY(int ritFrequency READ ritFrequency WRITE setRitFrequency NOTIFY ritFrequencyChanged)
Q_PROPERTY(bool transmitting READ transmitting WRITE setTransmit NOTIFY transmittingChanged)
Q_PROPERTY(bool tunerEnabled READ tunerEnabled WRITE setTunerEnabled NOTIFY tunerEnabledChanged)
Q_PROPERTY(bool ritEnabled READ ritEnabled WRITE setRitEnabled NOTIFY ritEnabledChanged)
Q_PROPERTY(bool dualScope READ dualScope WRITE setDualScope NOTIFY dualScopeChanged)
Q_PROPERTY(bool dualWatch READ dualWatch WRITE setDualWatch NOTIFY dualWatchChanged)
Q_PROPERTY(bool splitEnabled READ splitEnabled WRITE setSplitEnabled NOTIFY splitEnabledChanged)
Q_PROPERTY(bool compressorEnabled READ compressorEnabled WRITE setCompressorEnabled NOTIFY compressorEnabledChanged)
Q_PROPERTY(bool voxEnabled READ voxEnabled WRITE setVoxEnabled NOTIFY voxEnabledChanged)
Q_PROPERTY(double optionalMeter2Level READ optionalMeter2Level NOTIFY optionalMetersChanged)
Q_PROPERTY(double optionalMeter3Level READ optionalMeter3Level NOTIFY optionalMetersChanged)
2026-06-04 11:05:36 +01:00
Q_PROPERTY(QVariantMap repeaterState READ repeaterState NOTIFY repeaterStateChanged)
Q_PROPERTY(QVariantList repeaterToneModel READ repeaterToneOptions NOTIFY repeaterModelsChanged)
Q_PROPERTY(QVariantList repeaterDtcsModel READ repeaterDtcsOptions NOTIFY repeaterModelsChanged)
2026-01-12 10:56:27 +00:00
Q_DECLARE_FLAGS(prefIfItems, prefIfItem)
Q_DECLARE_FLAGS(prefRsItems, prefRsItem)
Q_DECLARE_FLAGS(prefRaItems ,prefRaItem)
Q_DECLARE_FLAGS(prefCtItems, prefCtItem)
Q_DECLARE_FLAGS(prefLanItems, prefLanItem)
Q_DECLARE_FLAGS(prefClusterItems, prefClusterItem)
Q_DECLARE_FLAGS(prefUDPItems, prefUDPItem)
Q_DECLARE_FLAGS(prefServerItems, prefServerItem)
Q_FLAGS(prefIfItems)
Q_FLAGS(prefRsItems)
Q_FLAGS(prefRaItems)
Q_FLAGS(prefCtItems)
Q_FLAGS(prefLanItems)
Q_FLAGS(prefClusterItems)
Q_FLAGS(prefUDPItems)
Q_FLAGS(prefServerItems)
explicit MainController(QString settingsFile, QString logFileName, bool debugMode, QObject *parent=nullptr);
~MainController() override { shutdown(); } // still fine as a backup
QString getWindowTitle() const { return windowTitle; }
2026-05-27 09:24:39 +01:00
QString footerMessageText() const { return m_footerMessageText; }
QString radioStatusText() const { return m_radioStatusText; }
QString rigModelName() const { return m_rigModelName; }
2026-05-24 13:27:57 +01:00
QString clusterOutputText() const { return m_clusterOutputText; }
int receiverCount() const { return receivers.size(); }
2026-02-01 12:02:00 +00:00
Q_INVOKABLE void updateApplicationPalette();
Q_INVOKABLE QObject* receiver(int i) const {
if (i < 0 || i >= receivers.size()) return nullptr;
return receivers[i];
}
Q_INVOKABLE bool isReceiverDetached(int i) const {
if (i < 0 || i >= detached.size()) return false;
return detached[i];
}
2026-05-24 17:09:55 +01:00
Q_INVOKABLE void setReceiverDetached(int i, bool v);
2026-02-01 12:02:00 +00:00
SettingsController* getSettings() const { return m_settings.get(); }
2026-01-29 08:20:12 +00:00
SelectRadioController* selectRadio() const { return m_selRad.get(); }
CWSenderController* cwSender() const { return m_cwSender.get(); }
2026-01-12 10:56:27 +00:00
ThemeBridge* theme() { return &m_theme; }
Q_INVOKABLE void syncTheme(QObject* obj) {
Q_UNUSED(obj)
2026-01-12 10:56:27 +00:00
m_theme.syncFromAppPalette();
}
2026-01-29 08:20:12 +00:00
// Method to show the radio selector
Q_INVOKABLE void showSelectRadio() {
m_selRad->setVisible(true);
}
Q_INVOKABLE void showCWSender()
{
2026-05-31 09:29:36 +01:00
if (!rigCaps || !rigCaps->hasTransmit || !rigCaps->commands.contains(funcSendCW))
return;
2026-01-29 08:20:12 +00:00
m_cwSender->setVisible(true);
}
2026-01-12 10:56:27 +00:00
connectionStatus_t getConnStatus() { return connStatus;}
void setConnStatus(connectionStatus_t c) {
if (c != connStatus) {
if (c == connDisconnected)
resetTxAudioOwnership();
2026-01-12 10:56:27 +00:00
connStatus =c;
emit connStatusChanged();
updateAudioRouteState();
2026-01-12 10:56:27 +00:00
}
}
quint64 getStepSize() { return stepSize;}
void setStepSize(quint64 s);
QVariantMap getUiSpecs() const { return uiSpecs; }
2026-05-23 18:21:27 +01:00
int txPower() const { return m_txPower; }
int localAfGain() const { return prefs ? int(prefs->localAFgain) : 0; }
bool localAudioAvailable() const;
int rxAudioLevel() const { return m_rxAudioLevel; }
int txAudioLevel() const { return m_txAudioLevel; }
2026-05-23 18:21:27 +01:00
int monitorGain() const { return m_monitorGain; }
2026-05-25 09:25:27 +01:00
bool monitorEnabled() const { return m_monitorEnabled; }
2026-05-23 18:21:27 +01:00
int micGain() const { return m_micGain; }
2026-05-24 12:15:26 +01:00
QString modGainLabel() const { return m_modGainLabel; }
int modGainMin() const { return m_modGainMin; }
int modGainMax() const { return m_modGainMax; }
int modSourceRevision() const { return m_modSourceRevision; }
2026-05-23 18:21:27 +01:00
int ritFrequency() const { return m_ritFrequency; }
bool transmitting() const { return m_transmitting; }
bool tunerEnabled() const { return m_tunerEnabled; }
bool ritEnabled() const { return m_ritEnabled; }
bool dualScope() const { return m_dualScope; }
bool dualWatch() const { return m_dualWatch; }
bool splitEnabled() const { return m_splitEnabled; }
bool compressorEnabled() const { return m_compressorEnabled; }
bool voxEnabled() const { return m_voxEnabled; }
double optionalMeter2Level() const { return m_optionalMeter2Level; }
double optionalMeter3Level() const { return m_optionalMeter3Level; }
2026-01-12 10:56:27 +00:00
2026-01-18 12:19:55 +00:00
MemoriesModel* memoriesModel() const { return m_memoriesModel; }
bool slowLoad() const { return m_slowLoad; }
void setSlowLoad(bool value) {
if (m_slowLoad != value) {
m_slowLoad = value;
emit slowLoadChanged();
if (m_slowLoad && !m_memoriesModel) {
createMemoriesModel();
}
}
}
2026-05-31 09:29:36 +01:00
Q_INVOKABLE bool canOpenMemories() const {
return rigCaps && rigCaps->commands.contains(funcMemoryContents);
}
2026-01-18 12:19:55 +00:00
Q_INVOKABLE void openMemories() {
2026-05-31 09:29:36 +01:00
if (!canOpenMemories())
return;
2026-01-18 12:19:55 +00:00
if (!m_memoriesModel) {
createMemoriesModel();
}
}
2026-05-23 15:11:05 +01:00
Q_INVOKABLE void applyAudioProcessingSettings();
Q_INVOKABLE void ensureAudioProcessors();
Q_INVOKABLE void startAnrNoiseProfile();
Q_INVOKABLE void stopAnrNoiseProfile();
Q_INVOKABLE void setRxMuted(bool muted); // runtime-only; not persisted
2026-05-23 18:21:27 +01:00
Q_INVOKABLE void powerOn();
Q_INVOKABLE void powerOff();
Q_INVOKABLE void toggleTransmit();
Q_INVOKABLE void tuneNow();
Q_INVOKABLE void setFrequencyLock(bool locked);
Q_INVOKABLE void selectMainSub();
Q_INVOKABLE void swapMainSub();
Q_INVOKABLE void equalizeMainSub();
Q_INVOKABLE QVariantList optionalMeterOptions() const;
Q_INVOKABLE QVariantList shortcutCommandOptions() const;
Q_INVOKABLE QVariantList shortcutAppCommandOptions() const;
Q_INVOKABLE QVariantList shortcutRadioCommandOptions() const;
Q_INVOKABLE void runShortcutCommand(const QString& commandName, int action, int value, int receiver);
Q_INVOKABLE void runShortcutAppAction(const QString& commandName);
Q_INVOKABLE QVariantMap optionalMeterExtremities(int meterType) const;
Q_INVOKABLE bool isOptionalMeterAvailable(int meterType) const;
Q_INVOKABLE void setOptionalMeterType(int slot, int meterType);
2026-05-24 12:15:26 +01:00
Q_INVOKABLE QVariantList modSourceOptions(int dataMode) const;
Q_INVOKABLE int modSourceReg(int dataMode) const;
Q_INVOKABLE bool modSourceSupported(int dataMode) const;
Q_INVOKABLE void setModSource(int dataMode, int reg);
2026-06-04 11:05:36 +01:00
Q_INVOKABLE QVariantList repeaterToneOptions() const;
Q_INVOKABLE QVariantList repeaterDtcsOptions() const;
Q_INVOKABLE void refreshRepeaterState();
Q_INVOKABLE void setRepeaterDuplex(int mode);
Q_INVOKABLE void setRepeaterToneMode(int mode, bool secondaryVfo = false);
Q_INVOKABLE void setRepeaterToneFrequency(int tone, bool secondaryVfo = false);
Q_INVOKABLE void setRepeaterTsqlFrequency(int tone, bool secondaryVfo = false);
Q_INVOKABLE void setRepeaterDtcsCode(int tone, bool txInvert, bool rxInvert);
Q_INVOKABLE void setRepeaterOffsetMHz(const QString& mhz);
Q_INVOKABLE void setRepeaterSplitFromOffsetKHz(const QString& khz, bool plus, bool autoEnableSplit);
Q_INVOKABLE void setRepeaterSplitTxFrequencyMHz(const QString& mhz, bool autoEnableSplit);
Q_INVOKABLE void setRepeaterQuickSplit(bool enabled);
Q_INVOKABLE QString platformName() const;
2026-05-24 12:25:55 +01:00
Q_INVOKABLE void syncRadioClock();
2026-05-24 13:27:57 +01:00
Q_INVOKABLE void connectCluster();
Q_INVOKABLE void disconnectCluster();
Q_INVOKABLE void clearClusterOutput();
2026-05-27 09:24:39 +01:00
Q_INVOKABLE void testWfShareConnection();
2026-05-24 15:17:56 +01:00
Q_INVOKABLE void resetUsbControllers();
Q_INVOKABLE void revertSettingsToDefault();
2026-05-24 17:09:55 +01:00
Q_INVOKABLE QVariantMap restoredMainWindowGeometry() const;
Q_INVOKABLE void saveMainWindowGeometry(int x, int y, int width, int height, bool maximized);
2026-05-23 18:21:27 +01:00
public slots:
void setTxPower(int value);
void setLocalAfGain(int value);
2026-05-23 18:21:27 +01:00
void setMonitorGain(int value);
2026-05-25 09:25:27 +01:00
void setMonitorEnabled(bool enabled);
2026-05-23 18:21:27 +01:00
void setMicGain(int value);
void setRitFrequency(int value);
void setTransmit(bool enabled);
void setTunerEnabled(bool enabled);
void setRitEnabled(bool enabled);
void setDualScope(bool enabled);
void setDualWatch(bool enabled);
void setSplitEnabled(bool enabled);
void setCompressorEnabled(bool enabled);
void setVoxEnabled(bool enabled);
2026-05-23 15:11:05 +01:00
signals:
void windowTitleChanged();
2026-05-27 09:24:39 +01:00
void footerMessageTextChanged();
void radioStatusTextChanged();
void rigModelNameChanged();
2026-05-31 09:29:36 +01:00
void appShortcutActivated(QString commandName, int receiver);
void receiverCountChanged();
void receiverDetachedChanged(int index, bool detached);
void detachedChanged();
void sendSerialCommSetup(rigTypedef rigList, quint16 rigCivAddr, QString rigSerialPort, quint32 rigBaudRate,QString vsp, bool vspUseQueue, quint16 tcp, quint8 wf);
void sendNetworkCommSetup(rigTypedef rigList, quint16 rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp, bool vspUseQueue, quint16 tcp);
2026-05-27 09:24:39 +01:00
void sendWfShareCommSetup(rigTypedef rigList, quint16 rigCivAddr, QString host, quint16 port,
QString username, QString password, QString calledNumber,
audioSetup rxSetup, audioSetup txSetup);
void sendCloseComm();
void sendLocalAudioVolume(quint8 level);
void sendTxAudioToRig(const audioPacket &packet);
void setCIVAddr(quint16 newRigCIVAddr);
void setRigID(quint16 rigID);
void setPTTType(pttType_t enabled);
void sendPowerOn();
void sendPowerOff();
2026-01-12 10:56:27 +00:00
void connStatusChanged();
void stepSizeChanged();
void uiSpecsChanged();
2026-01-18 12:19:55 +00:00
// Memories
void memoryReceived(memoryType mem);
void memoryNameReceived(memoryTagType tag);
void memorySplitReceived(memorySplitType split);
void memoriesModelChanged();
void slowLoadChanged();
2026-05-23 15:11:05 +01:00
void txAudioSpectrumChanged(QVariantList input, QVariantList output, double sampleRate);
void rxAudioSpectrumChanged(QVariantList input, QVariantList output, double sampleRate);
void txAudioMetersChanged(double input, double output, double gainReduction);
void rxAudioMetersChanged(double input, double output);
void audioProcessingBlocksChanged(quint64 txBlocks, quint64 rxBlocks);
void audioProcessingSpectrumStateChanged(bool txEnabled, bool rxEnabled);
2026-05-23 18:21:27 +01:00
void txPowerChanged();
void localAfGainChanged();
void localAudioAvailableChanged();
void audioLevelsChanged();
2026-05-23 18:21:27 +01:00
void monitorGainChanged();
2026-05-25 09:25:27 +01:00
void monitorEnabledChanged();
2026-05-23 18:21:27 +01:00
void micGainChanged();
2026-05-24 12:15:26 +01:00
void modSourcesChanged();
2026-05-23 18:21:27 +01:00
void ritFrequencyChanged();
void transmittingChanged();
void tunerEnabledChanged();
void ritEnabledChanged();
void dualScopeChanged();
void dualWatchChanged();
void splitEnabledChanged();
void compressorEnabledChanged();
void voxEnabledChanged();
void optionalMetersChanged();
2026-05-24 13:27:57 +01:00
void clusterOutputTextChanged();
2026-06-04 11:05:36 +01:00
void repeaterStateChanged();
void repeaterModelsChanged();
public slots:
void onRadioPacket(const QByteArray &packet);
void setWindowTitle(const QString &t);
void connectionHandler();
void shutdown();
2026-05-24 14:11:30 +01:00
Q_INVOKABLE void quitApplication();
2026-05-30 21:29:02 +01:00
protected:
bool eventFilter(QObject* watched, QEvent* event) override;
private slots:
void receiveValueFromQueue(cacheItem c);
void receiveRigCaps(rigCapabilities* caps);
2026-05-24 10:16:55 +01:00
void receiveStatusUpdate(networkStatus status);
void receiveNetworkAudioLevels(networkAudioLevels levels);
void routeRxAudioToSinks(const audioPacket &packet);
void routeLocalTxAudioToRadio(const audioPacket &packet);
void routeTciTxAudioToRadio(const audioPacket &packet);
void handleTciTransmitRequested(bool transmit);
void handleRigCtlTransmitRequested(bool transmit);
void handleExternalTransmitRequested(bool transmit);
void receiveCommReady();
2026-05-27 09:24:39 +01:00
void receivePortError(errorType err);
2026-05-24 08:06:10 +01:00
void ctChanged(SettingsController::prefCtItems items);
2026-05-24 13:27:57 +01:00
void clusterChanged(SettingsController::prefClusterItems items);
2026-05-24 08:06:10 +01:00
#if defined(USB_CONTROLLER)
void changeFrequency(int value);
void doShuttle(bool up, quint8 level);
#endif
void buttonControl(const COMMAND* cmd);
2026-01-12 10:56:27 +00:00
void ifChanged(prefIfItems items);
void colChanged(prefColItems items);
2026-05-24 21:44:51 +01:00
void lanChanged(SettingsController::prefLanItems items);
2026-01-12 10:56:27 +00:00
//void rsChanged(prefRsItems items);
2026-05-24 21:44:51 +01:00
void raChanged(prefRaItems items);
2026-01-12 10:56:27 +00:00
//void ctChanged(prefCtItems items);
//void clusterChanged(prefClusterItems items);
//void udpChanged(prefUDPItems items);
//void serverChanged(prefServerItems items);
private:
2026-01-12 10:56:27 +00:00
void buildUiSpecs();
void setRadioStatusText(const QString& text);
2026-05-27 09:24:39 +01:00
void setFooterMessageText(const QString& text);
void setRigModelName(const QString& modelName);
2026-05-24 12:15:26 +01:00
funcs modSourceCommand(int dataMode) const;
funcType inputLevelCommand(inputTypes input) const;
uchar currentDataMode() const;
void receiveModInput(const rigInput& input, int dataMode);
void processModLevel(inputTypes input, int level);
void updateCurrentModSource(bool requestLevel);
void handleDataModeChanged(int receiver);
2026-05-24 08:06:10 +01:00
#if defined(USB_CONTROLLER)
void setupUsbControllerDevice();
void stopUsbControllerDevice();
#endif
funcs meterCommandForType(meter_t meterType) const;
2026-05-29 13:01:34 +01:00
void updatePrimaryMeterForTransmit(bool transmitting);
void configureOptionalMeter(int slot, meter_t meterType);
void receiveOptionalMeter(meter_t meterType, double level);
2026-01-12 10:56:27 +00:00
QVariantMap uiSpecs;
2026-06-04 11:05:36 +01:00
QVariantMap repeaterState() const;
//void setDefPrefs();
//void loadSettings(QString file); // Look for saved preferences
void setManufacturer(manufacturersType_t man);
void setAppTheme(bool isCustom);
2026-05-24 23:21:31 +01:00
void openRigConnection();
void startRigConnection();
void getInitialRigState();
void setInitialTiming();
2026-05-23 15:11:05 +01:00
void applyTxAudioProcPrefs(const txAudioProcessingPrefs& p);
void applyRxAudioProcPrefs(const rxAudioProcessingPrefs& p);
2026-05-24 12:25:55 +01:00
void prepareRadioClockSync();
void sendRadioClockSync();
2026-05-24 13:27:57 +01:00
void setupClusterClient();
void stopClusterClient();
void applyClusterSettingsToClient(bool includeTcpEnable);
void appendClusterOutput(const QString& text);
void receiveClusterSpots(quint8 receiver, const QList<spotData> &spots);
2026-05-25 11:53:10 +01:00
void setupRigCtlServer();
void stopRigCtlServer();
2026-05-24 21:44:51 +01:00
void setupTciServer();
void stopTciServer();
void setupTciRxBridge();
void stopTciRxBridge();
void setupUsbAudioBridge();
void stopUsbAudioBridge();
void setupLocalTxBridge();
void stopLocalTxBridge();
void setupTciUsbTxBridge();
void setTxAudioSource(TxAudioInput source);
bool requestTxAudioOwnership(PttOrigin origin, TxAudioInput source);
bool releaseTxAudioOwnership(PttOrigin origin);
void resetTxAudioOwnership();
void setTxAudioInterlockError(PttOrigin requestedOrigin, TxAudioInput requestedSource);
void clearTxAudioInterlockError();
void setRxAudioLevel(int level);
void setTxAudioLevel(int level);
void publishTxAudioDiagnosticLevel(const audioPacket& packet, TxAudioInput source);
audioHandlerBase* createAudioHandler(const audioSetup& setup);
void disposeAudioHandler(audioHandlerBase*& handler, QThread*& thread);
AudioRouteState currentAudioRoute() const;
void updateAudioRouteState();
2026-05-30 21:29:02 +01:00
void tuneFrequencyHz(qint64 hzDelta, int receiver = -1);
2026-06-04 11:05:36 +01:00
quint64 parseRepeaterFrequencyHz(const QString& text, double multiplier, const QString& fieldName) const;
toneInfo toneFromList(const std::vector<toneInfo>& tones, int tone, bool secondaryVfo = false) const;
void setRepeaterAccessMode(rptAccessTxRx_t mode, bool secondaryVfo = false);
void updateRepeaterToneMode(rptAccessTxRx_t mode);
void updateRepeaterOffset(freqt offset);
QString windowTitle = "wfview";
2026-05-27 09:24:39 +01:00
QString m_footerMessageText;
QString m_radioStatusText;
QString m_rigModelName;
2026-05-24 13:27:57 +01:00
QString m_clusterOutputText;
QVector<ReceiverController*> receivers;
QVector<bool> detached;
QSettings* settings = nullptr;
preferences* prefs;
udpPreferences* udpPrefs;
SERVERCONFIG* serverConfig;
QHash<quint16,rigInfo> rigList;
rigCapabilities* rigCaps = nullptr;
cachingQueue* queue;
rigServer* server = nullptr;
QThread* serverThread = nullptr;
rigCtlD* rigCtl = nullptr;
tciServer* tci = nullptr;
QThread* tciThread = nullptr;
2026-05-24 13:27:57 +01:00
dxClusterClient* cluster = nullptr;
QThread* clusterThread = nullptr;
rigCommander * rig = nullptr;
QThread* rigThread = nullptr;
2026-05-23 15:11:05 +01:00
TxAudioProcessor* txProc = nullptr;
RxAudioProcessor* rxProc = nullptr;
audioHandlerBase* usbRadioRxAudio = nullptr;
QThread* usbRadioRxThread = nullptr;
audioHandlerBase* usbRxOutputAudio = nullptr;
QThread* usbRxOutputThread = nullptr;
audioHandlerBase* tciRxOutputAudio = nullptr;
QThread* tciRxOutputThread = nullptr;
audioHandlerBase* usbTxInputAudio = nullptr;
QThread* usbTxInputThread = nullptr;
audioHandlerBase* usbRadioTxAudio = nullptr;
QThread* usbRadioTxThread = nullptr;
audioHandlerBase* tciTxInputAudio = nullptr;
QThread* tciTxInputThread = nullptr;
AudioRouteState m_audioRoute;
TxAudioSourceArbiter m_txAudioArbiter;
TxAudioInput m_activeTxAudioSource = TxAudioInput::None;
int m_rxAudioLevel = 0;
int m_txAudioLevel = 0;
2026-05-23 15:11:05 +01:00
double m_txAudioInputLevel = 0.0;
double m_txAudioOutputLevel = 0.0;
double m_txAudioGainReduction = 0.0;
double m_rxAudioInputLevel = 0.0;
double m_rxAudioOutputLevel = 0.0;
quint64 m_txAudioBlocks = 0;
quint64 m_rxAudioBlocks = 0;
bool m_txSpectrumEnabled = false;
bool m_rxSpectrumEnabled = false;
bool m_audioProcessorSignalsConnected = false;
2026-05-23 18:21:27 +01:00
int m_txPower = 0;
int m_monitorGain = 0;
2026-05-25 09:25:27 +01:00
bool m_monitorEnabled = false;
2026-05-23 18:21:27 +01:00
int m_micGain = 0;
2026-05-24 12:15:26 +01:00
QString m_modGainLabel = "Mic";
int m_modGainMin = 0;
int m_modGainMax = 255;
int m_modSourceRevision = 0;
rigInput m_currentModSrc[4];
2026-05-23 18:21:27 +01:00
int m_ritFrequency = 0;
bool m_transmitting = false;
bool m_tunerEnabled = false;
bool m_ritEnabled = false;
bool m_dualScope = false;
bool m_dualWatch = false;
bool m_splitEnabled = false;
bool m_compressorEnabled = false;
bool m_voxEnabled = false;
2026-06-04 11:05:36 +01:00
duplexMode_t m_repeaterDuplexMode = dmSplitOff;
rptAccessTxRx_t m_repeaterToneMode = ratrNN;
int m_repeaterTone = 670;
int m_repeaterTsql = 670;
int m_repeaterDtcs = 23;
bool m_repeaterDtcsTxInvert = false;
bool m_repeaterDtcsRxInvert = false;
quint64 m_repeaterOffsetHz = 0;
bool m_repeaterQuickSplit = false;
bool m_repeaterWarnNotFm = false;
freqt m_repeaterMainFrequency;
bool m_repeaterHaveMainFrequency = false;
bool m_repeaterLastSplitPlus = false;
double m_optionalMeter2Level = 0.0;
double m_optionalMeter3Level = 0.0;
2026-05-24 12:25:55 +01:00
QTimer radioClockSyncTimer;
timekind radioClockTime;
datekind radioClockDate;
timekind radioClockUtcOffset;
bool waitingToSetRadioClock = false;
2026-05-23 18:21:27 +01:00
uchar currentReceiver = 0;
bool freqLock = false;
2026-05-24 08:06:10 +01:00
#if defined(USB_CONTROLLER)
usbController *usbControllerDev = nullptr;
QThread *usbControllerThread = nullptr;
#endif
2026-01-18 22:08:12 +00:00
connectionStatus_t connStatus = connDisconnected;
bool shuttingDown = false;
int cmdInterval_ms = 100;
int cmdStartupInterval_ms = 250;
2026-05-27 09:24:39 +01:00
int wfShareCmdInterval_ms = 25;
std::unique_ptr<SettingsController> m_settings;
2026-01-29 08:20:12 +00:00
std::unique_ptr<SelectRadioController> m_selRad;
std::unique_ptr<CWSenderController> m_cwSender;
2026-01-12 10:56:27 +00:00
ThemeBridge m_theme;
quint64 stepSize=100; // should this be a setting?
2026-01-18 12:19:55 +00:00
void createMemoriesModel() {
if (!m_memoriesModel) {
m_memoriesModel = new MemoriesModel(this);
// Set any properties needed
m_memoriesModel->setIsAdmin(false);
m_memoriesModel->setSlowLoad(m_slowLoad);
m_memoriesModel->populate();
emit memoriesModelChanged();
}
}
MemoriesModel* m_memoriesModel = nullptr;
bool m_slowLoad = false;
QVariantMap frequencyDisplay;
2026-02-01 12:02:00 +00:00
QPalette palette;
2026-02-01 19:38:30 +00:00
QPalette systemPalette;
};
#endif // MAINCONTROLLER_H