2018-06-19 12:58:52 -07:00
# include "wfmain.h"
2025-05-19 12:14:34 +01:00
# include "icomserver.h"
2018-06-19 12:58:52 -07:00
# include "ui_wfmain.h"
2018-11-24 00:10:05 -08:00
# include "rigidentities.h"
2021-02-23 21:21:22 +00:00
# include "logcategories.h"
2018-06-19 12:58:52 -07:00
2023-04-19 14:51:23 +01:00
2024-07-12 19:09:42 -07:00
// This code is copyright 2017-2024 Elliott H. Liggett and Phil E. Taylor
2019-01-23 17:19:35 -08:00
// All rights reserved
2022-09-14 17:07:23 -07:00
// Log support:
QScopedPointer < QFile > m_logFile ;
QMutex logMutex ;
QMutex logTextMutex ;
2024-06-04 00:59:41 +01:00
QScopedPointer < QTextStream > logStream ;
2023-11-26 16:23:16 +00:00
QVector < QPair < QtMsgType , QString > > logStringBuffer ;
2022-09-14 17:07:23 -07:00
# ifdef QT_DEBUG
bool debugModeLogging = true ;
# else
bool debugModeLogging = false ;
# endif
2024-09-22 16:03:05 -07:00
bool insaneDebugLogging = false ;
2024-12-29 14:59:52 +00:00
bool rigctlDebugLogging = false ;
2024-09-22 16:03:05 -07:00
2022-09-23 17:42:36 +01:00
wfmain : : wfmain ( const QString settingsFile , const QString logFile , bool debugMode , QWidget * parent ) :
2018-06-19 12:58:52 -07:00
QMainWindow ( parent ) ,
2022-09-23 17:18:42 +01:00
ui ( new Ui : : wfmain ) ,
logFilename ( logFile )
2018-06-19 12:58:52 -07:00
{
2020-01-04 17:12:35 -08:00
QGuiApplication : : setApplicationDisplayName ( " wfview " ) ;
QGuiApplication : : setApplicationName ( QString ( " wfview " ) ) ;
2019-02-08 16:19:36 -08:00
2020-03-12 20:06:33 -07:00
setWindowIcon ( QIcon ( QString ( " :resources/wfview.png " ) ) ) ;
2025-12-08 19:56:35 +00:00
2022-09-14 17:07:23 -07:00
this - > debugMode = debugMode ;
debugModeLogging = debugMode ;
2025-12-08 19:56:35 +00:00
qInfo ( ) < < " wfmain constructed " < < this ;
2020-01-04 17:12:35 -08:00
setWindowTitle ( QString ( " wfview " ) ) ;
2019-02-08 16:19:36 -08:00
2026-01-02 18:59:51 +00:00
2025-12-08 19:56:35 +00:00
ui - > setupUi ( this ) ;
2023-09-24 21:00:21 +01:00
ui - > monitorLabel - > setText ( " <a href= \" # \" style= \" color:white; text-decoration:none; \" >Mon</a> " ) ;
2022-09-23 16:46:33 +01:00
logWindow = new loggingWindow ( logFile ) ;
2022-09-14 17:07:23 -07:00
initLogging ( ) ;
2022-09-15 11:52:08 -07:00
logWindow - > setInitialDebugState ( debugMode ) ;
2024-03-24 23:17:39 +00:00
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " wfview version: %1 (Git:%2 on %3 at %4 by %5@%6) " )
. arg ( QString ( WFVIEW_VERSION ) , GITSHORT , __DATE__ , __TIME__ , UNAME , HOST ) ;
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " Operating System: %0 (%1) " ) . arg ( QSysInfo : : prettyProductName ( ) , QSysInfo : : buildCpuArchitecture ( ) ) ;
qInfo ( logSystem ( ) ) . noquote ( ) < < " Looking for External Dependencies: " ;
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " QT Runtime Version: %0 " ) . arg ( qVersion ( ) ) ;
if ( strncmp ( QT_VERSION_STR , qVersion ( ) , sizeof ( QT_VERSION_STR ) ) )
{
qWarning ( logSystem ( ) ) . noquote ( ) < < QString ( " QT Build Version Mismatch: %0 " ) . arg ( QT_VERSION_STR ) ;
}
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " OPUS Version: %0 " ) . arg ( opus_get_version_string ( ) ) ;
# ifdef HID_API_VERSION_MAJOR
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " HIDAPI Version: %0.%1.%2 " )
. arg ( HID_API_VERSION_MAJOR )
. arg ( HID_API_VERSION_MINOR )
. arg ( HID_API_VERSION_PATCH ) ;
if ( HID_API_VERSION ! = HID_API_MAKE_VERSION ( hid_version ( ) - > major , hid_version ( ) - > minor , hid_version ( ) - > patch ) ) {
qWarning ( logSystem ( ) ) . noquote ( ) < < QString ( " HIDAPI Version mismatch: %0.%1.%2 " )
. arg ( hid_version ( ) - > major )
. arg ( hid_version ( ) - > minor )
. arg ( hid_version ( ) - > patch ) ;
}
# endif
# ifdef EIGEN_WORLD_VERSION
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " EIGEN Version: %0.%1.%2 " ) . arg ( EIGEN_WORLD_VERSION ) . arg ( EIGEN_MAJOR_VERSION ) . arg ( EIGEN_MINOR_VERSION ) ;
# endif
# ifdef QCUSTOMPLOT_VERSION_STR
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " QCUSTOMPLOT Version: %0 " ) . arg ( QCUSTOMPLOT_VERSION_STR ) ;
# endif
# ifdef RTAUDIO_VERSION
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " RTAUDIO Version: %0 " ) . arg ( RTAUDIO_VERSION ) ;
if ( RTAUDIO_VERSION ! = RtAudio : : getVersion ( ) )
{
qWarning ( logSystem ( ) ) . noquote ( ) < < QString ( " RTAUDIO Version Mismatch: %0 " ) . arg ( RtAudio : : getVersion ( ) . c_str ( ) ) ;
}
# endif
qInfo ( logSystem ( ) ) . noquote ( ) < < QString ( " PORTAUDIO Version: %0 " ) . arg ( Pa_GetVersionText ( ) ) ;
2022-09-14 17:07:23 -07:00
2021-02-10 21:22:38 -08:00
cal = new calibrationWindow ( ) ;
2021-03-30 23:37:35 -07:00
rpt = new repeaterSetup ( ) ;
2021-02-13 10:02:45 -08:00
sat = new satelliteSetup ( ) ;
2021-07-08 00:31:59 -07:00
abtBox = new aboutbox ( ) ;
2022-01-21 19:23:32 +00:00
selRad = new selectRadio ( ) ;
2023-02-10 13:03:37 -08:00
bandbtns = new bandbuttons ( ) ;
2024-11-02 13:43:59 +00:00
2023-02-11 18:39:02 -08:00
finputbtns = new frequencyinputwidget ( ) ;
2023-02-18 19:25:02 -08:00
setupui = new settingswidget ( ) ;
2025-01-14 13:35:14 +00:00
2025-01-06 12:51:56 +00:00
connect ( setupui , SIGNAL ( havePortError ( errorType ) ) , this , SLOT ( receivePortError ( errorType ) ) ) ;
2021-02-13 10:02:45 -08:00
2024-03-24 23:17:39 +00:00
2026-01-12 10:56:27 +00:00
2025-12-15 09:30:32 +00:00
2023-06-08 08:20:50 +01:00
this - > setObjectName ( " wfmain " ) ;
2023-05-12 00:24:01 +01:00
queue = cachingQueue : : getInstance ( this ) ;
2026-01-02 18:59:51 +00:00
//connect(queue,SIGNAL(sendValue(cacheItem)),this,SLOT(receiveValue(cacheItem)));
//connect(queue,SIGNAL(sendMessage(QString)),this,SLOT(showStatusBarText(QString)));
//connect(queue,SIGNAL(intervalUpdated(qint64)),this,SLOT(updatedQueueInterval(qint64)));
2025-01-06 12:51:56 +00:00
2026-01-02 18:59:51 +00:00
//connect(queue, SIGNAL(finished()), queue, SLOT(deleteLater()));
2024-09-30 12:09:29 +01:00
2025-01-02 10:09:42 +00:00
// Disable all controls until connected.
enableControls ( false ) ;
2025-01-01 13:40:58 +00:00
2023-04-28 19:17:14 +01:00
// We need to populate the list of rigs as early as possible so do it now
2023-09-22 19:06:09 +01:00
2024-04-29 09:01:52 +01:00
// Setup the connectiontimer as we may need it soon!
2026-01-02 18:59:51 +00:00
//ConnectionTimer.setSingleShot(true);
//connect(&ConnectionTimer,SIGNAL(timeout()), this,SLOT(connectionTimeout()));
2024-03-24 23:17:39 +00:00
2024-03-25 12:42:08 +00:00
// Make sure we know about any changes to rigCaps
2026-01-02 18:59:51 +00:00
//connect(queue, SIGNAL(rigCapsUpdated(rigCapabilities*)), this, SLOT(receiveRigCaps(rigCapabilities*)));
2024-03-24 23:17:39 +00:00
2021-05-28 20:51:19 -07:00
setupKeyShortcuts ( ) ;
2019-02-01 12:21:54 -08:00
2021-05-28 20:51:19 -07:00
setupMainUI ( ) ;
2023-02-19 18:29:22 -08:00
connectSettingsWidget ( ) ;
2019-02-01 12:21:54 -08:00
2021-05-28 21:01:29 -07:00
setSerialDevicesUI ( ) ;
2019-02-01 12:21:54 -08:00
2021-05-28 21:27:06 -07:00
setDefPrefs ( ) ;
2019-02-01 12:21:54 -08:00
2022-09-18 17:42:41 +01:00
2021-05-28 21:27:06 -07:00
getSettingsFilePath ( settingsFile ) ;
2019-02-01 12:21:54 -08:00
2022-08-22 16:49:35 -07:00
setDefaultColorPresets ( ) ;
2018-11-29 13:41:42 -08:00
loadSettings ( ) ; // Look for saved preferences
2025-03-01 20:58:32 -08:00
logWindow - > ingestSettings ( prefs ) ;
2022-05-12 01:46:20 +01:00
2025-01-11 13:43:40 +00:00
setManufacturer ( prefs . manufacturer ) ;
2024-05-20 14:35:36 +01:00
setServerToPrefs ( ) ;
2023-01-02 01:11:25 +00:00
//setAudioDevicesUI(); // no need to call this as it will be called by the updated() signal
2022-05-12 01:46:20 +01:00
2021-02-21 23:58:23 -08:00
setTuningSteps ( ) ; // TODO: Combine into preferences
2018-11-27 22:02:37 -08:00
2024-01-27 22:13:47 +00:00
changeFullScreenMode ( prefs . useFullScreen ) ;
useSystemTheme ( prefs . useSystemTheme ) ;
2025-01-06 12:51:56 +00:00
// Don't update prefs until system theme is loaded.
// This is so we can popup any dialog boxes in the correct theme.
setupui - > updateIfPrefs ( ( int ) if_all ) ;
setupui - > updateColPrefs ( ( int ) col_all ) ;
setupui - > updateRaPrefs ( ( int ) ra_all ) ;
setupui - > updateRsPrefs ( ( int ) rs_all ) ; // Most of these come from the rig anyway
setupui - > updateCtPrefs ( ( int ) ct_all ) ;
setupui - > updateClusterPrefs ( ( int ) cl_all ) ;
setupui - > updateLanPrefs ( ( int ) l_all ) ;
setupui - > updateUdpPrefs ( ( int ) u_all ) ;
setupui - > updateServerConfigs ( ( int ) s_all ) ;
2024-01-27 22:13:47 +00:00
finputbtns - > setAutomaticSidebandSwitching ( prefs . automaticSidebandSwitching ) ;
2019-01-28 15:46:14 -08:00
2026-01-02 18:59:51 +00:00
2025-01-14 13:35:14 +00:00
qDebug ( logSystem ( ) ) < < " Running setInitialTiming() " ;
2026-01-02 18:59:51 +00:00
//setInitialTiming();
2019-02-03 21:51:30 -08:00
2024-04-14 15:59:16 -07:00
fts = new FirstTimeSetup ( ) ;
if ( prefs . hasRunSetup ) {
qDebug ( logSystem ( ) ) < < " Running openRig() " ;
openRig ( ) ;
} else {
qInfo ( logSystem ( ) ) < < " Detected first-time run. Showing the First Time Setup widget. " ;
2024-06-10 23:58:33 +01:00
connect ( fts , & FirstTimeSetup : : exitProgram , this , [ = ] ( ) {
2024-04-14 15:59:16 -07:00
qInfo ( logSystem ( ) ) < < " User elected exit program. " ;
prefs . settingsChanged = false ;
prefs . confirmExit = false ;
2024-06-23 11:59:41 +01:00
QTimer : : singleShot ( 10 , this , [ & ] ( ) {
2024-04-14 15:59:16 -07:00
on_exitBtn_clicked ( ) ;
} ) ;
} ) ;
2024-06-10 23:58:33 +01:00
connect ( fts , & FirstTimeSetup : : showSettings , this , [ = ] ( const bool networkEnabled ) {
2024-04-14 15:59:16 -07:00
qInfo ( logSystem ( ) ) < < " User elected to visit the Settings UI. " ;
prefs . enableLAN = networkEnabled ;
setupui - > updateLanPrefs ( ( int ) l_all ) ;
showAndRaiseWidget ( setupui ) ;
prefs . settingsChanged = true ;
prefs . hasRunSetup = true ;
} ) ;
2024-06-23 11:59:41 +01:00
connect ( fts , & FirstTimeSetup : : skipSetup , this , [ = ] ( ) {
2024-04-14 15:59:16 -07:00
qInfo ( logSystem ( ) ) < < " User elected to skip the setup. Marking setup complete. " ;
prefs . settingsChanged = true ;
prefs . hasRunSetup = true ;
} ) ;
fts - > exec ( ) ;
}
2019-02-04 10:32:16 -08:00
2022-09-29 17:17:51 +01:00
cluster = new dxClusterClient ( ) ;
clusterThread = new QThread ( this ) ;
2022-09-30 17:05:42 +01:00
clusterThread - > setObjectName ( " dxcluster() " ) ;
2022-09-29 17:17:51 +01:00
cluster - > moveToThread ( clusterThread ) ;
connect ( this , SIGNAL ( setClusterEnableUdp ( bool ) ) , cluster , SLOT ( enableUdp ( bool ) ) ) ;
2022-09-30 17:05:42 +01:00
connect ( this , SIGNAL ( setClusterEnableTcp ( bool ) ) , cluster , SLOT ( enableTcp ( bool ) ) ) ;
2022-09-29 17:17:51 +01:00
connect ( this , SIGNAL ( setClusterUdpPort ( int ) ) , cluster , SLOT ( setUdpPort ( int ) ) ) ;
2022-09-30 17:05:42 +01:00
connect ( this , SIGNAL ( setClusterServerName ( QString ) ) , cluster , SLOT ( setTcpServerName ( QString ) ) ) ;
connect ( this , SIGNAL ( setClusterTcpPort ( int ) ) , cluster , SLOT ( setTcpPort ( int ) ) ) ;
connect ( this , SIGNAL ( setClusterUserName ( QString ) ) , cluster , SLOT ( setTcpUserName ( QString ) ) ) ;
connect ( this , SIGNAL ( setClusterPassword ( QString ) ) , cluster , SLOT ( setTcpPassword ( QString ) ) ) ;
connect ( this , SIGNAL ( setClusterTimeout ( int ) ) , cluster , SLOT ( setTcpTimeout ( int ) ) ) ;
2022-10-31 12:39:27 +00:00
connect ( this , SIGNAL ( setClusterSkimmerSpots ( bool ) ) , cluster , SLOT ( enableSkimmerSpots ( bool ) ) ) ;
2022-09-30 17:05:42 +01:00
2022-09-29 17:17:51 +01:00
connect ( clusterThread , SIGNAL ( finished ( ) ) , cluster , SLOT ( deleteLater ( ) ) ) ;
2022-09-30 17:05:42 +01:00
2022-09-29 17:17:51 +01:00
clusterThread - > start ( ) ;
2022-09-30 17:05:42 +01:00
emit setClusterUdpPort ( prefs . clusterUdpPort ) ;
emit setClusterEnableUdp ( prefs . clusterUdpEnable ) ;
2023-06-11 10:33:16 +01:00
for ( int f = 0 ; f < prefs . clusters . size ( ) ; f + + )
2022-09-30 17:05:42 +01:00
{
2023-06-11 10:33:16 +01:00
if ( prefs . clusters [ f ] . isdefault )
2022-09-30 17:05:42 +01:00
{
2023-06-11 10:33:16 +01:00
emit setClusterServerName ( prefs . clusters [ f ] . server ) ;
emit setClusterTcpPort ( prefs . clusters [ f ] . port ) ;
emit setClusterUserName ( prefs . clusters [ f ] . userName ) ;
emit setClusterPassword ( prefs . clusters [ f ] . password ) ;
emit setClusterTimeout ( prefs . clusters [ f ] . timeout ) ;
emit setClusterSkimmerSpots ( prefs . clusterSkimmerSpotsEnable ) ;
2022-09-30 17:05:42 +01:00
}
}
emit setClusterEnableTcp ( prefs . clusterTcpEnable ) ;
2022-01-06 10:08:36 +00:00
2021-05-28 20:51:19 -07:00
amTransmitting = false ;
2021-06-12 08:57:52 +01:00
2025-01-14 13:35:14 +00:00
setupLambdaSlots ( ) ;
2023-07-06 10:36:11 +01:00
2023-11-26 17:00:35 +00:00
# if defined(USB_CONTROLLER)
2023-04-11 20:25:29 +01:00
# if defined(USB_HOTPLUG) && defined(Q_OS_LINUX)
uDev = udev_new ( ) ;
if ( ! uDev )
{
qInfo ( logUsbControl ( ) ) < < " Cannot register udev, hotplug of USB devices is not available " ;
return ;
}
uDevMonitor = udev_monitor_new_from_netlink ( uDev , " udev " ) ;
if ( ! uDevMonitor )
{
qInfo ( logUsbControl ( ) ) < < " Cannot register udev_monitor, hotplug of USB devices is not available " ;
return ;
}
2024-04-14 15:59:16 -07:00
int fd = udev_monitor_get_fd ( uDevMonitor ) ;
2023-04-11 20:25:29 +01:00
uDevNotifier = new QSocketNotifier ( fd , QSocketNotifier : : Read , this ) ;
2024-04-14 15:59:16 -07:00
connect ( uDevNotifier , SIGNAL ( activated ( int ) ) , this , SLOT ( uDevEvent ( ) ) ) ;
2023-04-11 20:25:29 +01:00
udev_monitor_enable_receiving ( uDevMonitor ) ;
# endif
2023-01-12 19:20:52 +00:00
# endif
2022-09-18 17:42:41 +01:00
2025-07-19 08:41:16 +01:00
// Add right-click menu
this - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( this , & QMainWindow : : customContextMenuRequested , this , & : : wfmain : : popupScreenMenu ) ;
screenMenu = new QMenu ( this ) ;
QLabel * header = new QLabel ( " Enable Display " ) ;
header - > setStyleSheet ( " QLabel {border-bottom: 1px solid; padding:5px;} " ) ;
QWidgetAction * headerAction = new QWidgetAction ( screenMenu ) ;
headerAction - > setDefaultWidget ( header ) ;
screenMenu - > addAction ( headerAction ) ;
2025-08-04 18:19:37 +01:00
QList < QWidget * > items = this - > findChildren < QWidget * > ( ) ;
for ( const auto & g : items )
{
if ( g - > objectName ( ) ! = " " & & g - > isVisible ( ) )
{
QCheckBox * chk = new QCheckBox ( g - > objectName ( ) , screenMenu ) ;
chk - > setChecked ( true ) ;
chk - > setStyleSheet ( " QCheckBox {padding:5px;} " ) ;
# if (QT_VERSION >= QT_VERSION_CHECK(6,7,0))
QObject : : connect ( chk , & QCheckBox : : checkStateChanged , this , [ g ] ( Qt : : CheckState state ) {
# else
QObject : : connect ( chk , & QCheckBox : : stateChanged , this , [ g ] ( int state ) {
# endif
g - > setVisible ( state ) ;
} ) ;
QWidgetAction * chkAction = new QWidgetAction ( screenMenu ) ;
chkAction - > setDefaultWidget ( chk ) ;
screenMenu - > addAction ( chkAction ) ;
}
}
2025-07-19 08:41:16 +01:00
for ( int i = 1 ; i < 5 ; i + + )
{
//QAction* act = new QAction(QString("Action %0").arg(i),this);
//act->setCheckable(true);
//screenMenu->addAction(act);
}
}
void wfmain : : popupScreenMenu ( QPoint pos )
{
screenMenu - > popup ( this - > mapToGlobal ( pos ) ) ;
2021-05-28 20:51:19 -07:00
}
2019-02-05 16:11:25 -08:00
2021-05-28 20:51:19 -07:00
wfmain : : ~ wfmain ( )
{
2025-12-08 19:56:35 +00:00
qInfo ( ) < < " wfmain destroyed " < < this ;
2026-01-02 18:59:51 +00:00
if ( rigThread ! = nullptr ) {
2023-09-26 19:13:31 -07:00
rigThread - > quit ( ) ;
rigThread - > wait ( ) ;
}
2023-09-19 23:04:48 +01:00
2026-01-02 18:59:51 +00:00
if ( serverThread ! = nullptr ) {
2021-05-28 20:51:19 -07:00
serverThread - > quit ( ) ;
serverThread - > wait ( ) ;
}
2024-06-03 19:43:00 +01:00
2025-01-10 13:38:40 +00:00
// Delete all shortcuts
for ( const auto & s : shortcuts )
{
delete s ;
}
shortcuts . clear ( ) ;
2024-06-03 19:43:00 +01:00
// Each rig needs deleting before we close.
2024-10-26 10:33:32 +01:00
for ( auto & rig : serverConfig . rigs ) {
2024-06-03 19:43:00 +01:00
delete rig ;
}
2026-01-02 18:59:51 +00:00
if ( clusterThread ! = nullptr ) {
2022-09-29 17:17:51 +01:00
clusterThread - > quit ( ) ;
clusterThread - > wait ( ) ;
}
2023-09-19 23:04:48 +01:00
2026-01-02 18:59:51 +00:00
if ( tciThread ! = nullptr ) {
2023-09-19 23:04:48 +01:00
tciThread - > quit ( ) ;
tciThread - > wait ( ) ;
}
2026-01-02 18:59:51 +00:00
if ( rigCtl ! = nullptr ) {
2021-05-28 20:51:19 -07:00
delete rigCtl ;
}
2022-05-12 01:46:20 +01:00
2026-01-02 18:59:51 +00:00
if ( colorPrefs ! = nullptr ) {
2023-09-24 21:00:21 +01:00
delete colorPrefs ;
}
2021-05-28 20:51:19 -07:00
delete rpt ;
delete ui ;
delete settings ;
2023-01-12 19:20:52 +00:00
# if defined(USB_CONTROLLER)
2026-01-02 18:59:51 +00:00
if ( usbControllerThread ! = nullptr ) {
2022-04-22 11:11:21 +01:00
usbControllerThread - > quit ( ) ;
usbControllerThread - > wait ( ) ;
2021-06-01 17:48:19 +01:00
}
2023-04-12 10:24:00 +01:00
# if defined(Q_OS_LINUX)
if ( uDevMonitor )
{
udev_monitor_unref ( uDevMonitor ) ;
udev_unref ( uDev ) ;
delete uDevNotifier ;
}
# endif
2024-06-04 00:59:41 +01:00
2023-01-12 19:20:52 +00:00
# endif
2024-06-04 00:59:41 +01:00
2026-01-02 18:59:51 +00:00
//logStream->flush();
2021-05-28 20:51:19 -07:00
}
2020-03-10 11:08:36 -07:00
2021-05-28 20:51:19 -07:00
void wfmain : : closeEvent ( QCloseEvent * event )
{
2023-06-08 08:20:50 +01:00
if ( on_exitBtn_clicked ( ) )
2021-05-28 20:51:19 -07:00
event - > ignore ( ) ;
2023-06-08 08:20:50 +01:00
2021-05-28 20:51:19 -07:00
}
2020-03-17 15:15:01 -07:00
2021-05-28 20:51:19 -07:00
void wfmain : : openRig ( )
{
// This function is intended to handle opening a connection to the rig.
// the connection can be either serial or network,
// and this function is also responsible for initiating the search for a rig model and capabilities.
// Any errors, such as unable to open connection or unable to open port, are to be reported to the user.
2020-03-17 15:15:01 -07:00
2021-05-28 20:51:19 -07:00
//TODO: if(hasRunPreviously)
2019-02-05 16:11:25 -08:00
2021-05-28 20:51:19 -07:00
//TODO: if(useNetwork){...
2023-09-25 19:35:22 +01:00
2021-05-28 20:51:19 -07:00
// } else {
2021-05-19 21:36:34 -07:00
2021-05-28 20:51:19 -07:00
// if (prefs.fileWasNotFound) {
// showRigSettings(); // rig setting dialog box for network/serial, CIV, hostname, port, baud rate, serial device, etc
// TODO: How do we know if the setting was loaded?
2021-05-19 21:36:34 -07:00
2023-07-17 11:09:14 +01:00
emit connectionStatus ( true ) ; // Signal any other parts that need to know if we are connecting/connected.
2022-09-17 22:31:43 +01:00
ui - > connectBtn - > setText ( " Cancel connection " ) ; // We are attempting to connect
2023-07-17 11:09:14 +01:00
connStatus = connConnecting ;
2024-04-29 10:12:31 +01:00
isRadioAdmin = true ; // Set user to admin, will be reset if not.
// M0VSE: This could be in a better place maybe?
2023-12-18 10:47:16 +00:00
if ( prefs . audioSystem = = tciAudio )
{
prefs . rxSetup . tci = tci ;
prefs . txSetup . tci = tci ;
}
2021-05-28 20:51:19 -07:00
makeRig ( ) ;
2021-05-05 14:11:00 +01:00
2024-03-24 23:17:39 +00:00
2021-05-28 20:51:19 -07:00
if ( prefs . enableLAN )
2021-05-20 19:24:40 +01:00
{
2023-07-17 11:09:14 +01:00
// "We need to setup the tx/rx audio:
2022-04-18 20:29:50 +01:00
udpPrefs . waterfallFormat = prefs . waterfallFormat ;
2024-07-10 13:12:24 +01:00
// 60 second connection timeout.
ConnectionTimer . start ( 60000 ) ;
2026-01-02 18:59:51 +00:00
emit sendNetworkCommSetup ( rigList , prefs . radioCIVAddr , udpPrefs , prefs . rxSetup , prefs . txSetup , prefs . virtualSerialPort , prefs . tcpPort ) ;
2021-05-28 20:51:19 -07:00
} else {
2022-09-23 17:42:36 +01:00
if ( ( prefs . serialPortRadio . toLower ( ) = = QString ( " auto " ) ) )
2021-05-20 19:24:40 +01:00
{
2021-05-28 20:51:19 -07:00
findSerialPort ( ) ;
} else {
2022-09-23 17:42:36 +01:00
serialPortRig = prefs . serialPortRadio ;
2021-05-20 19:24:40 +01:00
}
2026-01-02 18:59:51 +00:00
emit sendSerialCommSetup ( rigList , prefs . radioCIVAddr , serialPortRig , prefs . serialPortBaud , prefs . virtualSerialPort , prefs . tcpPort , prefs . waterfallFormat ) ;
2021-07-24 22:53:36 -07:00
ui - > statusBar - > showMessage ( QString ( " Connecting to rig using serial port " ) . append ( serialPortRig ) , 1000 ) ;
2025-05-04 09:52:43 +01:00
2021-05-20 19:24:40 +01:00
}
2024-05-20 14:35:36 +01:00
2025-05-04 10:00:55 +01:00
2021-05-28 20:51:19 -07:00
}
2021-05-16 13:34:04 +01:00
2023-10-30 19:14:35 +00:00
// Deprecated (moved to makeRig())
2021-05-28 20:51:19 -07:00
void wfmain : : rigConnections ( )
{
}
2021-02-11 00:33:25 -08:00
2021-05-28 20:51:19 -07:00
void wfmain : : makeRig ( )
{
2026-01-02 18:59:51 +00:00
if ( rigThread = = nullptr )
2021-05-28 20:51:19 -07:00
{
2025-01-14 13:35:14 +00:00
switch ( prefs . manufacturer ) {
case manufIcom :
rig = new icomCommander ( ) ;
break ;
case manufKenwood :
rig = new kenwoodCommander ( ) ;
break ;
2025-05-10 12:35:35 +01:00
case manufYaesu :
rig = new yaesuCommander ( ) ;
break ;
2025-01-14 13:35:14 +00:00
default :
qCritical ( ) < < " Unknown Manufacturer, aborting... " ;
break ;
}
2021-05-28 20:51:19 -07:00
rigThread = new QThread ( this ) ;
2022-05-02 16:11:35 +01:00
rigThread - > setObjectName ( " rigCommander() " ) ;
2021-05-28 20:51:19 -07:00
// Thread:
rig - > moveToThread ( rigThread ) ;
connect ( rigThread , SIGNAL ( started ( ) ) , rig , SLOT ( process ( ) ) ) ;
connect ( rigThread , SIGNAL ( finished ( ) ) , rig , SLOT ( deleteLater ( ) ) ) ;
rigThread - > start ( ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 20:51:19 -07:00
// Rig status and Errors:
2024-11-13 09:34:20 +00:00
connect ( rig , SIGNAL ( havePortError ( errorType ) ) , this , SLOT ( receivePortError ( errorType ) ) ) ;
2022-01-22 15:12:36 +00:00
connect ( rig , SIGNAL ( haveStatusUpdate ( networkStatus ) ) , this , SLOT ( receiveStatusUpdate ( networkStatus ) ) ) ;
2022-08-23 22:24:05 -07:00
connect ( rig , SIGNAL ( haveNetworkAudioLevels ( networkAudioLevels ) ) , this , SLOT ( receiveNetworkAudioLevels ( networkAudioLevels ) ) ) ;
2023-07-06 10:36:11 +01:00
2022-01-21 19:23:32 +00:00
connect ( rig , SIGNAL ( requestRadioSelection ( QList < radio_cap_packet > ) ) , this , SLOT ( radioSelection ( QList < radio_cap_packet > ) ) ) ;
2023-12-18 15:48:17 +00:00
connect ( rig , SIGNAL ( setRadioUsage ( quint8 , bool , quint8 , QString , QString ) ) , selRad , SLOT ( setInUse ( quint8 , bool , quint8 , QString , QString ) ) ) ;
2024-04-29 10:12:31 +01:00
connect ( rig , SIGNAL ( setRadioUsage ( quint8 , bool , quint8 , QString , QString ) ) , this , SLOT ( radioInUse ( quint8 , bool , quint8 , QString , QString ) ) ) ;
2022-01-23 17:54:40 +00:00
connect ( selRad , SIGNAL ( selectedRadio ( quint8 ) ) , rig , SLOT ( setCurrentRadio ( quint8 ) ) ) ;
2021-05-28 20:51:19 -07:00
// Rig comm setup:
2024-12-30 14:19:52 +00:00
connect ( this , SIGNAL ( setPTTType ( pttType_t ) ) , rig , SLOT ( setPTTType ( pttType_t ) ) ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 20:51:19 -07:00
connect ( rig , SIGNAL ( haveBaudRate ( quint32 ) ) , this , SLOT ( receiveBaudRate ( quint32 ) ) ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 20:51:19 -07:00
connect ( this , SIGNAL ( sendCloseComm ( ) ) , rig , SLOT ( closeComm ( ) ) ) ;
connect ( this , SIGNAL ( sendChangeLatency ( quint16 ) ) , rig , SLOT ( changeLatency ( quint16 ) ) ) ;
2025-05-10 12:35:35 +01:00
connect ( this , SIGNAL ( setRigID ( quint16 ) ) , rig , SLOT ( setRigID ( quint16 ) ) ) ;
2024-03-25 12:42:08 +00:00
2021-05-28 20:51:19 -07:00
connect ( rig , SIGNAL ( commReady ( ) ) , this , SLOT ( receiveCommReady ( ) ) ) ;
2018-06-19 12:58:52 -07:00
2024-05-20 14:35:36 +01:00
if ( serverConfig . enabled ) {
2025-05-19 12:14:34 +01:00
qInfo ( logRigServer ( ) ) < < " **** Connecting rig instance to server " ;
connect ( rig , SIGNAL ( haveAudioData ( audioPacket ) ) , server , SLOT ( receiveAudioData ( audioPacket ) ) ) ;
connect ( rig , SIGNAL ( haveDataForServer ( QByteArray ) ) , server , SLOT ( dataForServer ( QByteArray ) ) ) ;
connect ( server , SIGNAL ( haveDataFromServer ( QByteArray ) ) , rig , SLOT ( dataFromServer ( QByteArray ) ) ) ;
2024-05-20 14:35:36 +01:00
}
2023-10-30 19:14:35 +00:00
2025-05-10 12:35:35 +01:00
connect ( this , SIGNAL ( setCIVAddr ( quint16 ) ) , rig , SLOT ( setCIVAddr ( quint16 ) ) ) ;
2023-10-30 19:14:35 +00:00
connect ( this , SIGNAL ( sendPowerOn ( ) ) , rig , SLOT ( powerOn ( ) ) ) ;
connect ( this , SIGNAL ( sendPowerOff ( ) ) , rig , SLOT ( powerOff ( ) ) ) ;
connect ( this , SIGNAL ( getDebug ( ) ) , rig , SLOT ( getDebug ( ) ) ) ;
connect ( rig , SIGNAL ( haveRptOffsetFrequency ( freqt ) ) , rpt , SLOT ( handleRptOffsetFrequency ( freqt ) ) ) ;
connect ( this - > rpt , & repeaterSetup : : getTone , this - > rig ,
2024-02-12 10:06:08 -08:00
[ = ] ( ) {
qDebug ( logSystem ( ) ) < < " Asking for TONE " ;
queue - > add ( priorityImmediate , funcRepeaterTone , false , false ) ; } ) ;
2023-10-30 19:14:35 +00:00
connect ( this - > rpt , & repeaterSetup : : getTSQL , this - > rig ,
2024-02-12 13:36:39 -08:00
[ = ] ( ) {
qDebug ( logSystem ( ) ) < < " Asking for TSQL " ;
queue - > add ( priorityImmediate , funcRepeaterTSQL , false , false ) ; } ) ;
2023-10-30 19:14:35 +00:00
connect ( this - > rpt , & repeaterSetup : : setDTCS , this - > rig ,
2024-02-12 13:36:39 -08:00
[ = ] ( const toneInfo & t ) {
qDebug ( logSystem ( ) ) < < " Setting DCS, code = " < < t . tone ;
queue - > add ( priorityImmediate , queueItem ( funcRepeaterDTCS , QVariant : : fromValue < toneInfo > ( t ) , false ) ) ; } ) ;
2023-10-30 19:14:35 +00:00
connect ( this - > rpt , & repeaterSetup : : getRptAccessMode , this - > rig ,
[ = ] ( ) {
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcToneSquelchType ) ) {
2023-10-30 19:14:35 +00:00
queue - > add ( priorityImmediate , funcToneSquelchType , false , false ) ;
} else {
queue - > add ( priorityImmediate , funcRepeaterTone , false , false ) ;
queue - > add ( priorityImmediate , funcRepeaterTSQL , false , false ) ;
}
} ) ;
connect ( this - > rig , & rigCommander : : haveDuplexMode , this - > rpt ,
[ = ] ( const duplexMode_t & dm ) {
if ( dm = = dmSplitOn )
this - > splitModeEnabled = true ;
else
this - > splitModeEnabled = false ;
} ) ;
connect ( this - > rpt , & repeaterSetup : : selectVFO , this - > rig ,
[ = ] ( const vfo_t & v ) { queue - > add ( priorityImmediate , queueItem ( funcSelectVFO , QVariant : : fromValue < vfo_t > ( v ) , false ) ) ; } ) ;
connect ( this - > rpt , & repeaterSetup : : equalizeVFOsAB , this - > rig ,
[ = ] ( ) { queue - > add ( priorityImmediate , funcVFOEqualAB , false , false ) ; } ) ;
connect ( this - > rpt , & repeaterSetup : : equalizeVFOsMS , this - > rig ,
[ = ] ( ) { queue - > add ( priorityImmediate , funcVFOEqualMS , false , false ) ; } ) ;
connect ( this - > rpt , & repeaterSetup : : swapVFOs , this - > rig ,
[ = ] ( ) { queue - > add ( priorityImmediate , funcVFOSwapMS , false , false ) ; } ) ;
connect ( this - > rpt , & repeaterSetup : : setRptDuplexOffset , this - > rig ,
2024-08-04 20:30:59 -07:00
[ = ] ( const freqt & fOffset ) {
queue - > add ( priorityImmediate , queueItem ( funcSendFreqOffset , QVariant : : fromValue < freqt > ( fOffset ) , false ) ) ; } ) ;
2023-10-30 19:14:35 +00:00
connect ( this - > rpt , & repeaterSetup : : getRptDuplexOffset , this - > rig ,
[ = ] ( ) { queue - > add ( priorityImmediate , funcReadFreqOffset , false , false ) ; } ) ;
2022-01-29 22:50:58 +00:00
// Create link for server so it can have easy access to rig.
2026-01-02 18:59:51 +00:00
if ( serverConfig . rigs . first ( ) ! = nullptr ) {
2022-01-29 22:50:58 +00:00
serverConfig . rigs . first ( ) - > rig = rig ;
serverConfig . rigs . first ( ) - > rigThread = rigThread ;
2021-03-22 09:10:03 +00:00
}
2021-05-16 13:34:04 +01:00
}
2021-05-28 20:51:19 -07:00
}
2021-02-16 16:16:46 +00:00
2021-05-28 20:51:19 -07:00
void wfmain : : removeRig ( )
{
2024-03-25 10:43:23 +00:00
ConnectionTimer . stop ( ) ;
2024-12-30 23:13:36 +00:00
2026-01-02 18:59:51 +00:00
if ( rigThread ! = nullptr )
2021-05-05 14:11:00 +01:00
{
2023-09-24 10:32:59 +01:00
rigThread - > quit ( ) ;
rigThread - > wait ( ) ;
2026-01-02 18:59:51 +00:00
rig = nullptr ;
rigThread = nullptr ;
2021-05-05 14:11:00 +01:00
}
2024-11-16 14:44:21 +00:00
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr )
2024-11-16 14:44:21 +00:00
{
prefs . cwCutNumbers = cw - > getCutNumbers ( ) ;
prefs . cwSendImmediate = cw - > getSendImmediate ( ) ;
prefs . cwSidetoneEnabled = cw - > getSidetoneEnable ( ) ;
prefs . cwSidetoneLevel = cw - > getSidetoneLevel ( ) ;
prefs . cwMacroList = cw - > getMacroText ( ) ;
delete cw ;
2026-01-02 18:59:51 +00:00
cw = nullptr ;
2024-11-16 14:44:21 +00:00
ui - > cwButton - > setEnabled ( false ) ;
}
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
delete receiver ;
}
receivers . clear ( ) ;
2024-12-31 18:38:43 +00:00
currentReceiver = 0 ;
2025-01-02 10:09:42 +00:00
// Disable all controls until connected.
enableControls ( false ) ;
2025-01-01 13:40:58 +00:00
2021-05-28 20:51:19 -07:00
}
2021-05-11 09:38:05 +01:00
2021-05-28 20:51:19 -07:00
void wfmain : : findSerialPort ( )
{
// Find the ICOM radio connected, or, if none, fall back to OS default.
// qInfo(logSystem()) << "Searching for serial port...";
2022-04-08 14:40:05 +01:00
bool found = false ;
// First try to find first Icom port:
2023-12-17 19:41:22 +00:00
for ( const QSerialPortInfo & serialPortInfo : QSerialPortInfo : : availablePorts ( ) )
2021-05-28 20:51:19 -07:00
{
2022-04-08 14:40:05 +01:00
if ( serialPortInfo . serialNumber ( ) . left ( 3 ) = = " IC- " ) {
qInfo ( logSystem ( ) ) < < " Serial Port found: " < < serialPortInfo . portName ( ) < < " Manufacturer: " < < serialPortInfo . manufacturer ( ) < < " Product ID " < < serialPortInfo . description ( ) < < " S/N " < < serialPortInfo . serialNumber ( ) ;
# if defined(Q_OS_LINUX) || defined(Q_OS_MAC)
serialPortRig = ( QString ( " /dev/ " ) + serialPortInfo . portName ( ) ) ;
# else
serialPortRig = serialPortInfo . portName ( ) ;
# endif
found = true ;
break ;
}
}
if ( ! found ) {
QDirIterator it73 ( " /dev/serial/by-id " , QStringList ( ) < < " *IC-7300* " , QDir : : Files , QDirIterator : : Subdirectories ) ;
QDirIterator it97 ( " /dev/serial " , QStringList ( ) < < " *IC-9700*A* " , QDir : : Files , QDirIterator : : Subdirectories ) ;
QDirIterator it785x ( " /dev/serial " , QStringList ( ) < < " *IC-785*A* " , QDir : : Files , QDirIterator : : Subdirectories ) ;
QDirIterator it705 ( " /dev/serial " , QStringList ( ) < < " *IC-705*A " , QDir : : Files , QDirIterator : : Subdirectories ) ;
QDirIterator it7610 ( " /dev/serial " , QStringList ( ) < < " *IC-7610*A " , QDir : : Files , QDirIterator : : Subdirectories ) ;
QDirIterator itR8600 ( " /dev/serial " , QStringList ( ) < < " *IC-R8600*A " , QDir : : Files , QDirIterator : : Subdirectories ) ;
if ( ! it73 . filePath ( ) . isEmpty ( ) )
{
// IC-7300
serialPortRig = it73 . filePath ( ) ; // first
} else if ( ! it97 . filePath ( ) . isEmpty ( ) )
{
// IC-9700
serialPortRig = it97 . filePath ( ) ;
} else if ( ! it785x . filePath ( ) . isEmpty ( ) )
{
// IC-785x
serialPortRig = it785x . filePath ( ) ;
} else if ( ! it705 . filePath ( ) . isEmpty ( ) )
{
// IC-705
serialPortRig = it705 . filePath ( ) ;
} else if ( ! it7610 . filePath ( ) . isEmpty ( ) )
{
// IC-7610
serialPortRig = it7610 . filePath ( ) ;
} else if ( ! itR8600 . filePath ( ) . isEmpty ( ) )
{
// IC-R8600
serialPortRig = itR8600 . filePath ( ) ;
}
else {
//fall back:
qInfo ( logSystem ( ) ) < < " Could not find Icom serial port. Falling back to OS default. Use --port to specify, or modify preferences. " ;
2021-05-17 17:05:19 +01:00
# ifdef Q_OS_MAC
2022-04-08 14:40:05 +01:00
serialPortRig = QString ( " /dev/tty.SLAB_USBtoUART " ) ;
2021-05-17 17:05:19 +01:00
# endif
2021-05-28 20:51:19 -07:00
# ifdef Q_OS_LINUX
2022-04-08 14:40:05 +01:00
serialPortRig = QString ( " /dev/ttyUSB0 " ) ;
2021-05-28 20:51:19 -07:00
# endif
# ifdef Q_OS_WIN
2022-04-08 14:40:05 +01:00
serialPortRig = QString ( " COM1 " ) ;
2021-05-28 20:51:19 -07:00
# endif
2022-04-08 14:40:05 +01:00
}
2021-05-28 20:51:19 -07:00
}
}
2021-05-11 09:38:05 +01:00
2021-02-07 01:03:02 -08:00
void wfmain : : receiveCommReady ( )
{
2024-03-24 23:17:39 +00:00
//qInfo(logSystem()) << "Received CommReady!! ";
2025-06-03 20:22:51 +01:00
if ( ! prefs . enableLAN )
2021-06-14 20:22:15 -07:00
{
// If we're not using the LAN, then we're on serial, and
// we already know the baud rate and can calculate the timing parameters.
calculateTimingParameters ( ) ;
}
2021-02-07 01:03:02 -08:00
if ( prefs . radioCIVAddr = = 0 )
{
// tell rigCommander to broadcast a request for all rig IDs.
2021-05-15 18:53:16 +01:00
// qInfo(logSystem()) << "Beginning search from wfview for rigCIV (auto-detection broadcast)";
2021-05-18 00:29:06 -07:00
ui - > statusBar - > showMessage ( QString ( " Searching CI-V bus for connected radios. " ) , 1000 ) ;
2023-05-12 00:24:01 +01:00
2025-01-17 00:43:57 +00:00
queue - > addUnique ( priorityHigh , funcTransceiverId , true ) ;
2021-02-07 01:03:02 -08:00
} else {
// don't bother, they told us the CIV they want, stick with it.
// We still query the rigID to find the model, but at least we know the CIV.
2025-08-09 10:41:29 +01:00
qInfo ( logSystem ( ) ) < < QString ( " Skipping automatic CIV, using user-supplied value of 0x%1 " ) . arg ( prefs . radioCIVAddr , 2 , 16 ) ;
2021-05-18 00:29:06 -07:00
showStatusBarText ( QString ( " Using user-supplied radio CI-V address of 0x%1 " ) . arg ( prefs . radioCIVAddr , 2 , 16 ) ) ;
2021-11-06 23:59:03 -07:00
if ( prefs . CIVisRadioModel )
{
2025-08-09 10:41:29 +01:00
qInfo ( logSystem ( ) ) < < QString ( " Skipping Rig ID query, using user-supplied model from CI-V address: 0x%1 " ) . arg ( prefs . radioCIVAddr , 2 , 16 ) ;
2022-11-23 23:26:11 -08:00
emit setCIVAddr ( prefs . radioCIVAddr ) ;
2021-11-06 23:59:03 -07:00
emit setRigID ( prefs . radioCIVAddr ) ;
} else {
2022-11-23 23:26:11 -08:00
emit setCIVAddr ( prefs . radioCIVAddr ) ;
2025-01-17 00:43:57 +00:00
queue - > addUnique ( priorityHigh , funcTransceiverId , true ) ;
2024-04-30 09:42:54 +01:00
2021-11-06 23:59:03 -07:00
}
2021-05-11 09:38:05 +01:00
}
2025-05-06 18:29:08 +01:00
if ( prefs . autoPowerOn )
{
// After 2s send powerOn command
QTimer : : singleShot ( 2000 , rig , SLOT ( powerOn ( ) ) ) ;
}
2021-02-07 01:03:02 -08:00
}
2021-05-05 14:11:00 +01:00
2023-01-05 19:37:53 +00:00
void wfmain : : receivePortError ( errorType err )
2021-02-02 01:05:59 -08:00
{
2023-01-05 19:37:53 +00:00
if ( err . alert ) {
2023-01-05 20:00:31 +00:00
connectionHandler ( false ) ; // Force disconnect
2025-01-06 12:51:56 +00:00
QMessageBox : : critical ( this , err . device , QString ( " %0: %1 " ) . arg ( err . device , err . message ) , QMessageBox : : Ok ) ;
2023-01-05 19:37:53 +00:00
}
2023-09-25 19:35:22 +01:00
else
2023-01-05 19:37:53 +00:00
{
qInfo ( logSystem ( ) ) < < " wfmain: received error for device: " < < err . device < < " with message: " < < err . message ;
ui - > statusBar - > showMessage ( QString ( " ERROR: using device " ) . append ( err . device ) . append ( " : " ) . append ( err . message ) , 10000 ) ;
}
2021-02-02 01:05:59 -08:00
// TODO: Dialog box, exit, etc
}
2021-02-16 16:16:46 +00:00
2022-01-22 15:12:36 +00:00
void wfmain : : receiveStatusUpdate ( networkStatus status )
2021-02-05 20:26:18 +00:00
{
2023-09-25 19:35:22 +01:00
2025-01-06 21:05:28 +00:00
if ( queue - > interval ( ) = = - 1 )
{
return ;
}
2025-01-06 13:11:09 +00:00
// If we have received very high network latency, increase queue interval, don't set it to higher than 500ms though.
2025-01-09 00:35:26 +00:00
if ( prefs . polling_ms ! = 0 & & queue - > interval ( ) = = quint32 ( delayedCmdIntervalLAN_ms ) & & ( status . networkLatency / 2 ) > quint32 ( delayedCmdIntervalLAN_ms ) )
2025-01-06 13:11:09 +00:00
{
2025-01-09 00:35:26 +00:00
qInfo ( logRig ( ) ) < < QString ( " 1/2 network latency %0 exceeds configured queue interval %1, increasing " ) . arg ( status . networkLatency / 2 ) . arg ( delayedCmdIntervalLAN_ms ) ;
queue - > interval ( qMin ( quint32 ( status . networkLatency / 2 ) , quint32 ( 500 ) ) ) ;
2025-01-06 13:11:09 +00:00
}
2025-01-09 00:35:26 +00:00
else if ( prefs . polling_ms ! = 0 & & queue - > interval ( ) ! = quint32 ( delayedCmdIntervalLAN_ms ) & & ( status . networkLatency / 2 ) < quint32 ( delayedCmdIntervalLAN_ms ) )
2025-01-06 21:05:28 +00:00
{
// Maybe it was a temporary issue, restore to default
queue - > interval ( delayedCmdIntervalLAN_ms ) ;
}
2023-09-19 23:04:48 +01:00
//this->rigStatus->setText(QString("%0/%1 %2").arg(mainElapsed).arg(subElapsed).arg(status.message));
2022-01-22 15:12:36 +00:00
this - > rigStatus - > setText ( status . message ) ;
selRad - > audioOutputLevel ( status . rxAudioLevel ) ;
selRad - > audioInputLevel ( status . txAudioLevel ) ;
2024-11-18 09:03:14 +00:00
selRad - > addTimeDifference ( status . timeDifference ) ;
2022-01-22 15:12:36 +00:00
//qInfo(logSystem()) << "Got Status Update" << status.rxAudioLevel;
2021-02-05 20:26:18 +00:00
}
2021-02-18 09:14:41 +00:00
2022-08-23 22:24:05 -07:00
void wfmain : : receiveNetworkAudioLevels ( networkAudioLevels l )
2021-05-28 20:51:19 -07:00
{
2023-05-15 13:47:45 +01:00
meter_t m = meterNone ;
2022-08-23 22:24:05 -07:00
if ( l . haveRxLevels )
{
m = meterRxAudio ;
2022-08-24 21:52:36 -07:00
receiveMeter ( m , l . rxAudioPeak ) ;
2022-08-23 22:24:05 -07:00
}
if ( l . haveTxLevels )
{
m = meterTxMod ;
2022-08-24 21:52:36 -07:00
receiveMeter ( m , l . txAudioPeak ) ;
2022-08-23 22:24:05 -07:00
}
}
2021-05-28 20:51:19 -07:00
void wfmain : : setupMainUI ( )
{
2021-03-07 00:05:13 -08:00
// Set scroll wheel response (tick interval)
// and set arrow key response (single step)
2020-04-23 15:22:23 -07:00
ui - > rfGainSlider - > setTickInterval ( 100 ) ;
2021-03-07 00:05:13 -08:00
ui - > rfGainSlider - > setSingleStep ( 10 ) ;
2020-04-20 21:10:20 -07:00
2021-03-07 00:05:13 -08:00
ui - > afGainSlider - > setTickInterval ( 100 ) ;
ui - > afGainSlider - > setSingleStep ( 10 ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 20:51:19 -07:00
ui - > sqlSlider - > setTickInterval ( 100 ) ;
ui - > sqlSlider - > setSingleStep ( 10 ) ;
2021-02-18 09:14:41 +00:00
2021-05-28 20:51:19 -07:00
ui - > txPowerSlider - > setTickInterval ( 100 ) ;
ui - > txPowerSlider - > setSingleStep ( 10 ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 20:51:19 -07:00
ui - > micGainSlider - > setTickInterval ( 100 ) ;
ui - > micGainSlider - > setSingleStep ( 10 ) ;
2018-06-19 12:58:52 -07:00
2023-05-15 10:53:52 +01:00
ui - > monitorSlider - > setTickInterval ( 100 ) ;
ui - > monitorSlider - > setSingleStep ( 10 ) ;
2023-02-18 19:25:02 -08:00
// Keep this code when the rest is removed from this function:
2021-05-28 20:51:19 -07:00
qDebug ( logSystem ( ) ) < < " Running with debugging options enabled. " ;
2023-06-08 08:20:50 +01:00
2020-03-27 16:34:32 -07:00
2021-05-28 21:01:29 -07:00
rigStatus = new QLabel ( this ) ;
ui - > statusBar - > addPermanentWidget ( rigStatus ) ;
ui - > statusBar - > showMessage ( " Connecting to rig... " , 1000 ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 21:01:29 -07:00
pttLed = new QLedLabel ( this ) ;
ui - > statusBar - > addPermanentWidget ( pttLed ) ;
pttLed - > setState ( QLedLabel : : State : : StateOk ) ;
2023-01-29 10:39:24 -08:00
pttLed - > setToolTip ( " Receiving " ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 21:01:29 -07:00
connectedLed = new QLedLabel ( this ) ;
ui - > statusBar - > addPermanentWidget ( connectedLed ) ;
2018-06-19 12:58:52 -07:00
2021-05-28 21:01:29 -07:00
rigName = new QLabel ( this ) ;
2021-09-22 10:50:07 +01:00
rigName - > setAlignment ( Qt : : AlignRight ) ;
2021-05-28 21:01:29 -07:00
ui - > statusBar - > addPermanentWidget ( rigName ) ;
rigName - > setText ( " NONE " ) ;
2021-09-22 10:50:07 +01:00
rigName - > setFixedWidth ( 60 ) ;
2018-06-19 12:58:52 -07:00
2023-06-01 17:57:44 +01:00
freqt f ;
f . MHzDouble = 0.0 ;
f . Hz = 0 ;
2023-06-08 08:20:50 +01:00
2021-05-28 21:27:06 -07:00
oldFreqDialVal = ui - > freqDial - > value ( ) ;
2021-02-24 00:18:19 -08:00
2021-05-28 21:27:06 -07:00
ui - > tuneLockChk - > setChecked ( false ) ;
freqLock = false ;
2021-06-17 23:14:28 -07:00
2021-06-19 16:16:07 -07:00
connect (
2025-02-15 16:30:38 -08:00
ui - > txPowerSlider , & QSlider : : valueChanged , this ,
2025-05-18 09:10:44 +01:00
[ = ] ( const int & newValue ) {
if ( ui - > txPowerSlider - > maximum ( ) )
statusFromSliderPercent ( " Tx Power " , 255 * newValue / ui - > txPowerSlider - > maximum ( ) ) ;
}
2025-05-16 20:02:31 +01:00
) ;
2021-06-19 16:16:07 -07:00
connect (
2023-05-12 00:24:01 +01:00
ui - > rfGainSlider , & QSlider : : valueChanged , this ,
2025-05-18 09:10:44 +01:00
[ = ] ( const int & newValue ) {
if ( ui - > rfGainSlider - > maximum ( ) )
statusFromSliderPercent ( " RF Gain " , 255 * newValue / ui - > rfGainSlider - > maximum ( ) ) ;
}
2025-05-16 20:02:31 +01:00
) ;
2021-06-19 16:16:07 -07:00
connect (
2023-05-12 00:24:01 +01:00
ui - > afGainSlider , & QSlider : : valueChanged , this ,
2025-05-18 09:10:44 +01:00
[ = ] ( const int & newValue ) {
if ( ui - > afGainSlider - > maximum ( ) )
statusFromSliderPercent ( " AF Gain " , 255 * newValue / ui - > afGainSlider - > maximum ( ) ) ;
}
2025-05-16 20:02:31 +01:00
) ;
2021-06-19 16:16:07 -07:00
connect (
2023-05-12 00:24:01 +01:00
ui - > micGainSlider , & QSlider : : valueChanged , this ,
2025-05-18 09:10:44 +01:00
[ = ] ( const int & newValue ) {
if ( ui - > micGainSlider - > maximum ( ) )
statusFromSliderPercent ( " TX Audio Gain " , 255 * newValue / ui - > micGainSlider - > maximum ( ) ) ;
}
2021-06-19 16:16:07 -07:00
) ;
connect (
2023-05-12 00:24:01 +01:00
ui - > sqlSlider , & QSlider : : valueChanged , this ,
2025-05-18 09:10:44 +01:00
[ = ] ( const int & newValue ) {
if ( ui - > sqlSlider - > maximum ( ) )
statusFromSliderPercent ( " Squelch " , 255 * newValue / ui - > sqlSlider - > maximum ( ) ) ;
}
2025-05-16 20:02:31 +01:00
) ;
connect (
ui - > monitorSlider , & QSlider : : valueChanged , this ,
2025-05-18 09:10:44 +01:00
[ = ] ( const int & newValue ) {
if ( ui - > monitorSlider - > maximum ( ) )
statusFromSliderPercent ( " Monitor " , 255 * newValue / ui - > monitorSlider - > maximum ( ) ) ;
}
2025-05-16 20:02:31 +01:00
) ;
2021-06-19 16:16:07 -07:00
2023-05-27 00:26:01 +01:00
}
2021-11-05 10:09:31 -07:00
2023-02-19 18:29:22 -08:00
void wfmain : : connectSettingsWidget ( )
{
connect ( setupui , SIGNAL ( changedClusterPref ( prefClusterItem ) ) , this , SLOT ( extChangedClusterPref ( prefClusterItem ) ) ) ;
2023-05-27 20:26:53 +01:00
connect ( setupui , SIGNAL ( changedClusterPrefs ( quint64 ) ) , this , SLOT ( extChangedClusterPrefs ( quint64 ) ) ) ;
2023-02-19 18:29:22 -08:00
connect ( setupui , SIGNAL ( changedCtPref ( prefCtItem ) ) , this , SLOT ( extChangedCtPref ( prefCtItem ) ) ) ;
2023-05-27 20:26:53 +01:00
connect ( setupui , SIGNAL ( changedCtPrefs ( quint64 ) ) , this , SLOT ( extChangedCtPrefs ( quint64 ) ) ) ;
2023-02-19 18:29:22 -08:00
connect ( setupui , SIGNAL ( changedIfPref ( prefIfItem ) ) , this , SLOT ( extChangedIfPref ( prefIfItem ) ) ) ;
2023-05-27 20:26:53 +01:00
connect ( setupui , SIGNAL ( changedIfPrefs ( quint64 ) ) , this , SLOT ( extChangedIfPrefs ( quint64 ) ) ) ;
connect ( setupui , SIGNAL ( changedColPref ( prefColItem ) ) , this , SLOT ( extChangedColPref ( prefColItem ) ) ) ;
connect ( setupui , SIGNAL ( changedColPrefs ( quint64 ) ) , this , SLOT ( extChangedColPrefs ( quint64 ) ) ) ;
2023-02-19 18:29:22 -08:00
connect ( setupui , SIGNAL ( changedLanPref ( prefLanItem ) ) , this , SLOT ( extChangedLanPref ( prefLanItem ) ) ) ;
2023-05-27 20:26:53 +01:00
connect ( setupui , SIGNAL ( changedLanPrefs ( quint64 ) ) , this , SLOT ( extChangedLanPrefs ( quint64 ) ) ) ;
2023-02-19 18:29:22 -08:00
connect ( setupui , SIGNAL ( changedRaPref ( prefRaItem ) ) , this , SLOT ( extChangedRaPref ( prefRaItem ) ) ) ;
2023-05-27 20:26:53 +01:00
connect ( setupui , SIGNAL ( changedRaPrefs ( quint64 ) ) , this , SLOT ( extChangedRaPrefs ( quint64 ) ) ) ;
connect ( setupui , SIGNAL ( changedRsPref ( prefRsItem ) ) , this , SLOT ( extChangedRsPref ( prefRsItem ) ) ) ;
connect ( setupui , SIGNAL ( changedRsPrefs ( quint64 ) ) , this , SLOT ( extChangedRsPrefs ( quint64 ) ) ) ;
2023-02-19 18:29:22 -08:00
2023-06-08 21:58:22 +01:00
connect ( setupui , SIGNAL ( changedUdpPref ( prefUDPItem ) ) , this , SLOT ( extChangedUdpPref ( prefUDPItem ) ) ) ;
2023-05-27 20:26:53 +01:00
connect ( setupui , SIGNAL ( changedUdpPrefs ( quint64 ) ) , this , SLOT ( extChangedUdpPrefs ( quint64 ) ) ) ;
2023-02-19 22:11:48 -08:00
2023-06-08 21:58:22 +01:00
connect ( setupui , SIGNAL ( changedServerPref ( prefServerItem ) ) , this , SLOT ( extChangedServerPref ( prefServerItem ) ) ) ;
connect ( setupui , SIGNAL ( changedServerPrefs ( quint64 ) ) , this , SLOT ( extChangedServerPrefs ( quint64 ) ) ) ;
2023-07-17 11:09:14 +01:00
connect ( this , SIGNAL ( connectionStatus ( bool ) ) , setupui , SLOT ( connectionStatus ( bool ) ) ) ;
2024-02-06 22:45:16 -08:00
connect ( setupui , SIGNAL ( connectButtonPressed ( ) ) , this , SLOT ( handleExtConnectBtn ( ) ) ) ;
2024-04-13 20:04:35 -07:00
connect ( setupui , SIGNAL ( saveSettingsButtonPressed ( ) ) , this , SLOT ( on_saveSettingsBtn_clicked ( ) ) ) ;
connect ( setupui , SIGNAL ( revertSettingsButtonPressed ( ) ) , this , SLOT ( handleRevertSettingsBtn ( ) ) ) ;
2022-08-21 21:19:08 -07:00
}
2021-11-05 10:09:31 -07:00
2023-02-18 19:25:02 -08:00
// NOT Migrated, EHL TODO, carefully remove this function
2021-05-28 21:27:06 -07:00
void wfmain : : getSettingsFilePath ( QString settingsFile )
{
if ( settingsFile . isNull ( ) ) {
settings = new QSettings ( ) ;
}
else
{
QString file = settingsFile ;
QFile info ( settingsFile ) ;
QString path = " " ;
if ( ! QFileInfo ( info ) . isAbsolute ( ) )
{
path = QStandardPaths : : writableLocation ( QStandardPaths : : AppDataLocation ) ;
if ( path . isEmpty ( ) )
{
path = QDir : : homePath ( ) ;
}
path = path + " / " ;
file = info . fileName ( ) ;
}
settings = new QSettings ( path + file , QSettings : : Format : : IniFormat ) ;
}
}
void wfmain : : setInitialTiming ( )
{
2021-06-20 13:34:32 -07:00
loopTickCounter = 0 ;
2021-06-14 20:22:15 -07:00
delayedCmdIntervalLAN_ms = 70 ; // interval for regular delayed commands, including initial rig/UI state queries
2021-05-28 21:27:06 -07:00
delayedCmdIntervalSerial_ms = 100 ; // interval for regular delayed commands, including initial rig/UI state queries
delayedCmdStartupInterval_ms = 250 ; // interval for rigID polling
2023-05-12 00:24:01 +01:00
queue - > interval ( delayedCmdStartupInterval_ms ) ;
2021-05-28 21:27:06 -07:00
2019-01-23 17:19:35 -08:00
pttTimer = new QTimer ( this ) ;
pttTimer - > setInterval ( 180 * 1000 ) ; // 3 minute max transmit time in ms
pttTimer - > setSingleShot ( true ) ;
connect ( pttTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( handlePttLimit ( ) ) ) ;
2021-07-09 12:02:50 -07:00
timeSync = new QTimer ( this ) ;
connect ( timeSync , SIGNAL ( timeout ( ) ) , this , SLOT ( setRadioTimeDateSend ( ) ) ) ;
waitingToSetTimeDate = false ;
2021-07-09 18:13:11 -07:00
lastFreqCmdTime_ms = QDateTime : : currentMSecsSinceEpoch ( ) - 5000 ; // 5 seconds ago
2021-05-28 21:27:06 -07:00
}
void wfmain : : setServerToPrefs ( )
{
2023-09-25 19:35:22 +01:00
2021-05-28 21:27:06 -07:00
// Start server if enabled in config
2023-06-08 21:58:22 +01:00
//ui->serverSetupGroup->setEnabled(serverConfig.enabled);
2026-01-02 18:59:51 +00:00
if ( serverThread ! = nullptr ) {
2021-12-30 11:17:54 +00:00
serverThread - > quit ( ) ;
serverThread - > wait ( ) ;
2026-01-02 18:59:51 +00:00
serverThread = nullptr ;
server = nullptr ;
2021-12-30 11:17:54 +00:00
ui - > statusBar - > showMessage ( QString ( " Server disabled " ) , 1000 ) ;
}
2021-05-28 21:27:06 -07:00
if ( serverConfig . enabled ) {
serverConfig . lan = prefs . enableLAN ;
2022-05-05 18:09:16 +01:00
2025-05-19 23:08:55 +01:00
switch ( prefs . manufacturer )
{
case manufIcom :
server = new icomServer ( & serverConfig ) ;
break ;
case manufKenwood :
server = new kenwoodServer ( & serverConfig ) ;
break ;
case manufYaesu :
server = new yaesuServer ( & serverConfig ) ;
break ;
default :
return ;
2025-05-19 12:14:34 +01:00
2025-05-19 23:08:55 +01:00
}
2019-01-23 17:19:35 -08:00
2021-05-28 21:27:06 -07:00
serverThread = new QThread ( this ) ;
2019-01-28 15:36:17 -08:00
2025-05-19 12:14:34 +01:00
server - > moveToThread ( serverThread ) ;
2021-05-28 21:27:06 -07:00
2022-05-05 18:09:16 +01:00
if ( serverConfig . lan ) {
2025-05-19 12:14:34 +01:00
connect ( server , SIGNAL ( haveNetworkStatus ( networkStatus ) ) , this , SLOT ( receiveStatusUpdate ( networkStatus ) ) ) ;
2022-05-05 18:09:16 +01:00
} else {
qInfo ( logAudio ( ) ) < < " Audio Input device " < < serverConfig . rigs . first ( ) - > rxAudioSetup . name ;
qInfo ( logAudio ( ) ) < < " Audio Output device " < < serverConfig . rigs . first ( ) - > txAudioSetup . name ;
2021-06-10 09:41:56 +01:00
}
2025-05-19 12:14:34 +01:00
connect ( this , SIGNAL ( initServer ( ) ) , server , SLOT ( init ( ) ) ) ;
connect ( serverThread , SIGNAL ( finished ( ) ) , server , SLOT ( deleteLater ( ) ) ) ;
2024-05-20 14:35:36 +01:00
2021-05-28 21:27:06 -07:00
serverThread - > start ( ) ;
emit initServer ( ) ;
2021-12-30 11:17:54 +00:00
ui - > statusBar - > showMessage ( QString ( " Server enabled " ) , 1000 ) ;
2021-05-28 21:27:06 -07:00
}
2021-05-28 20:51:19 -07:00
}
2019-01-28 15:36:17 -08:00
2024-01-27 22:13:47 +00:00
void wfmain : : configureVFOs ( )
2021-05-28 20:51:19 -07:00
{
2024-01-29 18:16:39 +00:00
qInfo ( logSystem ( ) ) < < " Running configureVFOs() " ;
2018-11-24 22:21:36 -08:00
2024-01-29 18:40:29 +00:00
if ( QThread : : currentThread ( ) ! = QCoreApplication : : instance ( ) - > thread ( ) )
{
qCritical ( logSystem ( ) ) < < " Thread is NOT the main UI thread, cannot create VFO " ;
return ;
}
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
2025-01-06 23:10:11 +00:00
foreach ( receiverWidget * receiver , receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
ui - > vfoLayout - > removeWidget ( receiver ) ;
delete receiver ;
2024-01-27 22:13:47 +00:00
}
2024-03-30 20:40:27 +00:00
receivers . clear ( ) ;
2024-01-27 22:13:47 +00:00
}
2025-12-08 19:56:35 +00:00
2024-03-30 20:40:27 +00:00
for ( uchar i = 0 ; i < rigCaps - > numReceiver ; i + + )
2026-01-02 18:59:51 +00:00
{ /*
2025-01-06 23:10:11 +00:00
receiverWidget * receiver = new receiverWidget ( rigCaps - > hasSpectrum , i , rigCaps - > numVFO , this ) ;
2025-05-16 20:02:31 +01:00
receiver - > prepareScope ( rigCaps - > spectAmpMax , rigCaps - > spectLenMax ) ;
2024-07-23 09:18:27 +01:00
receiver - > setSeparators ( prefs . groupSeparator , prefs . decimalSeparator ) ;
2025-12-15 09:30:32 +00:00
//receiver->setUnderlayMode(prefs.underlayMode);
2024-03-30 20:40:27 +00:00
receiver - > wfAntiAliased ( prefs . wfAntiAlias ) ;
receiver - > wfInterpolate ( prefs . wfInterpolate ) ;
receiver - > setScrollSpeedXY ( prefs . scopeScrollX , prefs . scopeScrollY ) ;
receiver - > prepareWf ( i = = 0 ? prefs . mainWflength : prefs . subWflength ) ;
receiver - > setRange ( i = = 0 ? prefs . mainPlotFloor : prefs . subPlotFloor , i = = 0 ? prefs . mainPlotCeiling : prefs . subPlotCeiling ) ;
2025-12-20 11:22:55 +00:00
receiver - > setTheme ( WaterfallItem : : Theme ( i = = 0 ? prefs . mainWfTheme : prefs . subWfTheme ) , false ) ;
2024-03-30 20:40:27 +00:00
receiver - > setClickDragTuning ( prefs . clickDragTuningEnable ) ;
receiver - > setTuningFloorZeros ( prefs . niceTS ) ;
receiver - > resizePlasmaBuffer ( prefs . underlayBufferSize ) ;
receiver - > setUnit ( ( FctlUnit ) prefs . frequencyUnits ) ;
2025-01-05 15:39:20 +00:00
colorPrefsType p = colorPreset [ prefs . currentColorPresetNumber ] ;
receiver - > colorPreset ( & p ) ;
2024-03-30 20:40:27 +00:00
receiver - > setIdentity ( i = = 0 ? " Main Band " : " Sub Band " ) ;
ui - > vfoLayout - > addWidget ( receiver ) ;
2025-12-08 19:56:35 +00:00
ui - > vfoLayout - > setStretchFactor ( receiver , 1 ) ;
2024-01-27 22:13:47 +00:00
2024-03-30 20:40:27 +00:00
// Hide any secondary receivers until we need them!
2025-01-23 10:39:35 +00:00
receiver - > selected ( i = = 0 ? true : false ) ;
receiver - > setVisible ( i = = 0 ? true : false ) ;
2021-02-18 22:38:50 -08:00
2024-03-30 20:40:27 +00:00
connect ( receiver , SIGNAL ( frequencyRange ( uchar , double , double ) ) , cluster , SLOT ( freqRange ( uchar , double , double ) ) ) ;
2024-01-28 13:14:47 +00:00
2025-12-08 19:56:35 +00:00
connect ( cluster , SIGNAL ( sendSpots ( uchar , QVector < spotData > ) ) , receiver , SLOT ( receiveSpots ( uchar , QVector < spotData > ) ) ) ;
2024-01-27 22:13:47 +00:00
connect ( cluster , SIGNAL ( sendOutput ( QString ) ) , this , SLOT ( receiveClusterOutput ( QString ) ) ) ;
2024-03-30 20:40:27 +00:00
connect ( receiver , SIGNAL ( updateSettings ( uchar , int , quint16 , int , int ) ) , this , SLOT ( receiveScopeSettings ( uchar , int , quint16 , int , int ) ) ) ;
2021-11-06 23:59:03 -07:00
2024-03-30 20:40:27 +00:00
connect ( receiver , SIGNAL ( dataChanged ( modeInfo ) ) , this , SLOT ( dataModeChanged ( modeInfo ) ) ) ;
2024-01-27 22:13:47 +00:00
2025-01-06 23:10:11 +00:00
connect ( receiver , & receiverWidget : : bandChanged , receiver , [ = ] ( const uchar & rx , const bandType & b ) {
2024-11-02 13:43:59 +00:00
if ( rx = = currentReceiver & & rigCaps - > commands . contains ( funcAntenna ) ) {
ui - > antennaSelCombo - > setEnabled ( b . ants ) ;
if ( b . ants ) {
2024-12-08 13:55:48 +00:00
queue - > addUnique ( priorityMediumHigh , queueItem ( funcAntenna , true , i ) ) ;
2024-11-02 13:43:59 +00:00
} else {
queue - > del ( funcAntenna , i ) ;
}
}
} ) ;
2024-03-30 20:40:27 +00:00
connect ( receiver , SIGNAL ( showStatusBarText ( QString ) ) , this , SLOT ( showStatusBarText ( QString ) ) ) ;
2024-12-08 13:55:48 +00:00
connect ( receiver , SIGNAL ( sendScopeImage ( uchar ) ) , this , SLOT ( receiveScopeImage ( uchar ) ) ) ;
2024-03-30 20:40:27 +00:00
receivers . append ( receiver ) ;
2025-01-02 17:56:04 +00:00
// Currently tracking is disabled
//if (receivers.size() > 1)
//{
// connect(receivers[0], SIGNAL(sendTrack(int)),receivers[1], SLOT(receiveTrack(int)));
//}
2026-01-02 18:59:51 +00:00
*/
2024-01-27 22:13:47 +00:00
}
2018-06-19 12:58:52 -07:00
}
2021-05-28 21:01:29 -07:00
void wfmain : : setSerialDevicesUI ( )
2021-01-29 22:09:09 -08:00
{
2021-05-28 20:51:19 -07:00
}
2021-02-02 01:05:59 -08:00
2025-02-23 12:32:01 -08:00
QShortcut * wfmain : : setupKeyShortcut ( const QKeySequence k , bool appWide )
2021-05-28 20:51:19 -07:00
{
2025-01-10 13:38:40 +00:00
QShortcut * sc = new QShortcut ( this ) ;
sc - > setKey ( k ) ;
2025-02-23 12:32:01 -08:00
if ( appWide )
sc - > setContext ( Qt : : ApplicationShortcut ) ;
2025-01-10 13:38:40 +00:00
connect ( sc , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
2025-01-10 13:38:40 +00:00
this - > runShortcut ( k ) ;
2023-01-22 23:41:31 -08:00
} ) ;
2025-01-10 13:38:40 +00:00
return sc ;
}
2023-01-22 23:41:31 -08:00
2025-01-10 13:38:40 +00:00
void wfmain : : setupKeyShortcuts ( )
{
2025-02-23 12:32:01 -08:00
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F1 , true ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F2 , true ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F3 , true ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F4 , true ) ) ;
2025-01-10 13:38:40 +00:00
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F5 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F6 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F7 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F8 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F9 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F10 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F11 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F12 ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_T ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_R ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_P ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_I ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_U ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_Asterisk ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_Slash ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_Backslash ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_Minus ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_Plus ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : SHIFT | Qt : : Key_Minus ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : SHIFT | Qt : : Key_Plus ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_Minus ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_Plus ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_Q ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_PageUp ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_PageDown ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_F ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_M ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_K ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_J ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : SHIFT | Qt : : Key_K ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : SHIFT | Qt : : Key_J ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_K ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_J ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_H ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : Key_L ) ) ;
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : SHIFT | Qt : : Key_D ) ) ;
2025-01-14 13:35:14 +00:00
# if (QT_VERSION > QT_VERSION_CHECK(6,0,0))
2025-01-10 13:38:40 +00:00
shortcuts . append ( setupKeyShortcut ( Qt : : CTRL | Qt : : Key_D ) ) ;
# endif
2023-01-22 23:41:31 -08:00
2025-01-10 13:38:40 +00:00
}
2023-01-22 23:41:31 -08:00
2025-01-10 13:38:40 +00:00
void wfmain : : runShortcut ( const QKeySequence k )
{
2025-01-17 00:43:57 +00:00
qInfo ( ) < < " Running shortcut for key: " < < k ;
if ( k = = Qt : : Key_F1 )
{
this - > raise ( ) ;
}
else if ( k = = Qt : : Key_F11 )
{
if ( onFullscreen )
{
this - > showNormal ( ) ;
onFullscreen = false ;
prefs . useFullScreen = false ;
} else {
this - > showFullScreen ( ) ;
onFullscreen = true ;
prefs . useFullScreen = true ;
}
setupui - > updateIfPref ( if_useFullScreen ) ;
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_Q ) )
{
on_exitBtn_clicked ( ) ;
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_D ) | | k = = ( Qt : : CTRL | Qt : : SHIFT | Qt : : Key_D ) )
{
debugBtn_clicked ( ) ;
}
2026-01-02 18:59:51 +00:00
else if ( rigCaps = = nullptr )
2025-01-17 00:43:57 +00:00
{
2025-01-10 13:38:40 +00:00
// No rig yet
qWarning ( ) < < " Cannot run shortcut as not connected to rig " ;
return ;
}
2025-01-17 00:43:57 +00:00
// All of the below commands require a connected rig
2025-01-10 13:38:40 +00:00
bool freqUpdate = false ;
freqt f ;
2023-01-22 23:41:31 -08:00
2025-01-17 00:43:57 +00:00
if ( k = = Qt : : Key_F2 )
2025-01-14 13:35:14 +00:00
{
2025-01-10 13:38:40 +00:00
showAndRaiseWidget ( bandbtns ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F3 | | k = = Qt : : Key_Asterisk )
{
2025-01-10 13:38:40 +00:00
showAndRaiseWidget ( finputbtns ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F4 )
{
2025-01-10 13:38:40 +00:00
showAndRaiseWidget ( setupui ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F5 )
{
2025-01-10 13:38:40 +00:00
changeMode ( modeLSB , false , currentReceiver ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F6 )
{
2025-01-10 13:38:40 +00:00
changeMode ( modeUSB , false , currentReceiver ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F7 )
{
2025-01-10 13:38:40 +00:00
changeMode ( modeAM , false , currentReceiver ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F8 )
{
2025-01-10 13:38:40 +00:00
changeMode ( modeCW , false , currentReceiver ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F9 )
{
2025-01-10 13:38:40 +00:00
changeMode ( modeUSB , true , currentReceiver ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F10 )
{
2025-01-10 13:38:40 +00:00
changeMode ( modeFM , false , currentReceiver ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F12 )
{
2025-01-10 13:38:40 +00:00
showStatusBarText ( " Sending speech command to radio. " ) ;
2025-01-10 13:45:59 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSpeech , QVariant : : fromValue ( uchar ( 0U ) ) , false , currentReceiver ) ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_T ) )
{
2025-01-10 13:38:40 +00:00
// Transmit
qDebug ( logSystem ( ) ) < < " Activated Control-T shortcut " ;
showStatusBarText ( QString ( " Transmitting. Press Control-R to receive. " ) ) ;
extChangedRsPrefs ( rs_pttOn ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_R ) )
{
2025-01-10 13:38:40 +00:00
// Receive
extChangedRsPrefs ( rs_pttOff ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_P ) )
{
2025-01-10 13:38:40 +00:00
// Toggle PTT
if ( amTransmitting ) {
extChangedRsPrefs ( rs_pttOff ) ;
} else {
extChangedRsPrefs ( rs_pttOn ) ;
showStatusBarText ( QString ( " Transmitting. Press Control-P again to receive. " ) ) ;
2024-01-29 18:18:45 +00:00
}
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_I ) )
{
2025-01-10 13:38:40 +00:00
// Enable ATU
ui - > tuneEnableChk - > click ( ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_U ) )
{
2025-01-10 13:38:40 +00:00
// Run ATU tuning cycle
ui - > tuneNowBtn - > click ( ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_Slash )
{
2025-01-10 13:38:40 +00:00
for ( size_t i = 0 ; i < rigCaps - > modes . size ( ) ; i + + ) {
2025-12-15 09:30:32 +00:00
if ( rigCaps - > modes [ i ] . mk = = receivers [ currentReceiver ] - > getMode ( ) . mk )
2025-01-10 13:38:40 +00:00
{
if ( i + 1 < rigCaps - > modes . size ( ) ) {
changeMode ( rigCaps - > modes [ i + 1 ] . mk , false , currentReceiver ) ;
}
else {
changeMode ( rigCaps - > modes [ 0 ] . mk , false , currentReceiver ) ;
}
break ;
}
}
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_Backslash )
{
2025-01-10 13:38:40 +00:00
bool found = false ;
availableBands band = bandUnknown ;
auto b = rigCaps - > bands . cend ( ) ;
while ( b ! = rigCaps - > bands . cbegin ( ) )
{
b - - ;
if ( ( b - > region = = " " | | prefs . region = = b - > region ) )
{
2025-01-14 13:35:14 +00:00
if ( ! found & & b - > band = = bandbtns - > currentBand ( ) )
{
2025-01-10 13:38:40 +00:00
found = true ;
2025-01-14 13:35:14 +00:00
}
else if ( found & & b - > band ! = bandbtns - > currentBand ( ) )
{
2025-01-10 13:38:40 +00:00
qInfo ( ) < < " Got new band: " < < b - > band < < " Name: " < < b - > name < < " region " < < b - > region ;
band = b - > band ;
break ;
}
}
}
if ( band = = bandUnknown )
{
band = rigCaps - > bands [ rigCaps - > bands . size ( ) - 1 ] . band ;
}
bandbtns - > setBand ( band ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_Minus | | k = = Qt : : Key_J )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , - 1 , tsPlusHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_Plus | | k = = Qt : : Key_K )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , 1 , tsPlusHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : SHIFT | Qt : : Key_Minus ) | | k = = ( Qt : : SHIFT | Qt : : Key_J ) )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , - 1 , tsPlusShiftHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : SHIFT | Qt : : Key_Plus ) | | k = = ( Qt : : SHIFT | Qt : : Key_K ) )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , 1 , tsPlusShiftHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_Minus ) | | k = = ( Qt : : CTRL | Qt : : Key_J ) )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , - 1 , tsPlusControlHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = ( Qt : : CTRL | Qt : : Key_Plus ) | | k = = ( Qt : : CTRL | Qt : : Key_K ) )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , 1 , tsPlusControlHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_PageUp )
{
2025-01-10 13:38:40 +00:00
f . Hz = receivers [ 0 ] - > getFrequency ( ) . Hz + tsPageHz ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_PageDown )
{
2025-01-10 13:38:40 +00:00
f . Hz = receivers [ 0 ] - > getFrequency ( ) . Hz - tsPageHz ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_F )
{
2025-01-10 13:38:40 +00:00
showStatusBarText ( " Sending speech command (frequency) to radio. " ) ;
2025-01-10 13:45:59 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSpeech , QVariant : : fromValue < uchar > ( 1 ) , false , currentReceiver ) ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_M )
{
2025-01-10 13:38:40 +00:00
showStatusBarText ( " Sending speech command (mode) to radio. " ) ;
2025-01-10 13:45:59 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSpeech , QVariant : : fromValue < uchar > ( 2 ) , false , currentReceiver ) ) ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_H )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers . first ( ) - > getFrequency ( ) . Hz , - 1 , tsKnobHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
else if ( k = = Qt : : Key_L )
{
2025-01-10 13:38:40 +00:00
f . Hz = roundFrequencyWithStep ( receivers . first ( ) - > getFrequency ( ) . Hz , 1 , tsKnobHz ) ;
freqUpdate = true ;
2025-01-14 13:35:14 +00:00
}
2025-01-17 00:43:57 +00:00
2025-01-10 13:38:40 +00:00
2025-01-14 13:35:14 +00:00
if ( ! freqLock & & freqUpdate )
{
2025-01-10 13:38:40 +00:00
vfoCommandType t = queue - > getVfoCommand ( vfoA , currentReceiver , true ) ;
f . MHzDouble = f . Hz / ( double ) 1E6 ;
queue - > add ( priorityImmediate , queueItem ( t . freqFunc ,
QVariant : : fromValue < freqt > ( f ) , false , uchar ( t . receiver ) ) ) ;
}
2021-02-05 20:26:18 +00:00
}
2022-04-22 11:11:21 +01:00
void wfmain : : setupUsbControllerDevice ( )
2021-06-01 17:48:19 +01:00
{
2023-01-12 19:20:52 +00:00
# if defined (USB_CONTROLLER)
2023-04-02 20:07:13 +01:00
2026-01-02 18:59:51 +00:00
if ( usbWindow = = nullptr ) {
2023-04-02 20:07:13 +01:00
usbWindow = new controllerSetup ( ) ;
}
2023-04-15 11:25:35 +01:00
2022-04-22 11:11:21 +01:00
usbControllerDev = new usbController ( ) ;
usbControllerThread = new QThread ( this ) ;
2023-04-15 11:25:35 +01:00
usbControllerThread - > setObjectName ( " usb() " ) ;
2022-04-22 11:11:21 +01:00
usbControllerDev - > moveToThread ( usbControllerThread ) ;
connect ( usbControllerThread , SIGNAL ( started ( ) ) , usbControllerDev , SLOT ( run ( ) ) ) ;
connect ( usbControllerThread , SIGNAL ( finished ( ) ) , usbControllerDev , SLOT ( deleteLater ( ) ) ) ;
2023-04-15 11:25:35 +01:00
connect ( usbControllerThread , SIGNAL ( finished ( ) ) , usbWindow , SLOT ( deleteLater ( ) ) ) ; // Delete window when controller is deleted
2022-04-22 11:11:21 +01:00
connect ( usbControllerDev , SIGNAL ( sendJog ( int ) ) , this , SLOT ( changeFrequency ( int ) ) ) ;
2024-08-13 13:19:50 +01:00
connect ( usbControllerDev , SIGNAL ( doShuttle ( bool , quint8 ) ) , this , SLOT ( doShuttle ( bool , quint8 ) ) ) ;
2022-04-27 12:56:54 +01:00
connect ( usbControllerDev , SIGNAL ( button ( const COMMAND * ) ) , this , SLOT ( buttonControl ( const COMMAND * ) ) ) ;
2023-04-02 20:07:13 +01:00
connect ( usbControllerDev , SIGNAL ( removeDevice ( USBDEVICE * ) ) , usbWindow , SLOT ( removeDevice ( USBDEVICE * ) ) ) ;
connect ( usbControllerDev , SIGNAL ( initUI ( usbDevMap * , QVector < BUTTON > * , QVector < KNOB > * , QVector < COMMAND > * , QMutex * ) ) , usbWindow , SLOT ( init ( usbDevMap * , QVector < BUTTON > * , QVector < KNOB > * , QVector < COMMAND > * , QMutex * ) ) ) ;
2023-04-15 11:25:35 +01:00
connect ( usbControllerDev , SIGNAL ( changePage ( USBDEVICE * , int ) ) , usbWindow , SLOT ( pageChanged ( USBDEVICE * , int ) ) ) ;
2023-04-02 20:07:13 +01:00
connect ( usbControllerDev , SIGNAL ( setConnected ( USBDEVICE * ) ) , usbWindow , SLOT ( setConnected ( USBDEVICE * ) ) ) ;
2023-04-15 11:25:35 +01:00
connect ( usbControllerDev , SIGNAL ( newDevice ( USBDEVICE * ) ) , usbWindow , SLOT ( newDevice ( USBDEVICE * ) ) ) ;
2022-04-22 11:11:21 +01:00
usbControllerThread - > start ( QThread : : LowestPriority ) ;
2023-09-25 19:35:22 +01:00
2023-04-09 23:53:51 +01:00
connect ( usbWindow , SIGNAL ( sendRequest ( USBDEVICE * , usbFeatureType , int , QString , QImage * , QColor * ) ) , usbControllerDev , SLOT ( sendRequest ( USBDEVICE * , usbFeatureType , int , QString , QImage * , QColor * ) ) ) ;
connect ( this , SIGNAL ( sendControllerRequest ( USBDEVICE * , usbFeatureType , int , QString , QImage * , QColor * ) ) , usbControllerDev , SLOT ( sendRequest ( USBDEVICE * , usbFeatureType , int , QString , QImage * , QColor * ) ) ) ;
2023-04-15 11:25:35 +01:00
connect ( usbWindow , SIGNAL ( programPages ( USBDEVICE * , int ) ) , usbControllerDev , SLOT ( programPages ( USBDEVICE * , int ) ) ) ;
connect ( usbWindow , SIGNAL ( programDisable ( USBDEVICE * , bool ) ) , usbControllerDev , SLOT ( programDisable ( USBDEVICE * , bool ) ) ) ;
2023-04-02 20:07:13 +01:00
connect ( this , SIGNAL ( initUsbController ( QMutex * , usbDevMap * , QVector < BUTTON > * , QVector < KNOB > * ) ) , usbControllerDev , SLOT ( init ( QMutex * , usbDevMap * , QVector < BUTTON > * , QVector < KNOB > * ) ) ) ;
2023-03-28 19:07:54 +01:00
connect ( this , SIGNAL ( usbHotplug ( ) ) , usbControllerDev , SLOT ( run ( ) ) ) ;
2023-04-15 11:25:35 +01:00
connect ( usbWindow , SIGNAL ( backup ( USBDEVICE * , QString ) ) , usbControllerDev , SLOT ( backupController ( USBDEVICE * , QString ) ) ) ;
connect ( usbWindow , SIGNAL ( restore ( USBDEVICE * , QString ) ) , usbControllerDev , SLOT ( restoreController ( USBDEVICE * , QString ) ) ) ;
2023-02-12 16:45:21 +00:00
2023-01-12 19:20:52 +00:00
# endif
2021-06-04 11:14:01 +01:00
}
2021-06-05 00:23:16 +01:00
void wfmain : : pttToggle ( bool status )
2021-06-04 11:14:01 +01:00
{
2021-06-05 00:23:16 +01:00
// is it enabled?
2021-06-01 17:48:19 +01:00
2023-02-19 22:11:48 -08:00
if ( ! prefs . enablePTT )
2021-06-05 00:23:16 +01:00
{
showStatusBarText ( " PTT is disabled, not sending command. Change under Settings tab. " ) ;
return ;
}
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( status ) , false , uchar ( 0 ) ) ) ;
2021-06-05 00:23:16 +01:00
// Start 3 minute timer
if ( status )
pttTimer - > start ( ) ;
}
2024-08-13 13:19:50 +01:00
void wfmain : : doShuttle ( bool up , quint8 level )
2021-06-08 08:03:00 +01:00
{
if ( level = = 1 & & up )
2025-01-10 13:38:40 +00:00
runShortcut ( Qt : : SHIFT | Qt : : Key_Plus ) ;
2021-06-08 08:03:00 +01:00
else if ( level = = 1 & & ! up )
2025-01-10 13:38:40 +00:00
runShortcut ( Qt : : SHIFT | Qt : : Key_Minus ) ;
2021-06-08 08:03:00 +01:00
else if ( level > 1 & & level < 5 & & up )
for ( int i = 1 ; i < level ; i + + )
2025-01-10 13:38:40 +00:00
runShortcut ( Qt : : Key_Plus ) ;
2021-06-08 08:03:00 +01:00
else if ( level > 1 & & level < 5 & & ! up )
for ( int i = 1 ; i < level ; i + + )
2025-01-10 13:38:40 +00:00
runShortcut ( Qt : : Key_Minus ) ;
2021-06-08 08:03:00 +01:00
else if ( level > 4 & & up )
for ( int i = 4 ; i < level ; i + + )
2025-01-10 13:38:40 +00:00
runShortcut ( Qt : : CTRL | Qt : : Key_Plus ) ;
2021-06-08 08:03:00 +01:00
else if ( level > 4 & & ! up )
for ( int i = 4 ; i < level ; i + + )
2025-01-10 13:38:40 +00:00
runShortcut ( Qt : : CTRL | Qt : : Key_Minus ) ;
2021-06-08 08:03:00 +01:00
}
2022-04-27 12:56:54 +01:00
void wfmain : : buttonControl ( const COMMAND * cmd )
2021-08-19 10:21:09 +01:00
{
2025-01-30 11:47:05 +00:00
qDebug ( logUsbControl ( ) ) < < QString ( " executing command: %0 (%1) suffix:%2 value:%3 " ) . arg ( cmd - > text ) . arg ( funcString [ cmd - > command ] ) . arg ( cmd - > suffix ) . arg ( cmd - > value ) ;
2025-02-03 20:20:40 +00:00
quint8 vfo = 0 ;
2026-01-02 18:59:51 +00:00
if ( rigCaps = = nullptr ) {
2024-12-08 13:55:48 +00:00
return ;
}
2024-12-13 14:30:22 +00:00
2023-01-29 19:26:21 +00:00
switch ( cmd - > command ) {
2023-05-15 10:53:52 +01:00
case funcBandStackReg :
2024-07-15 16:53:27 +01:00
{
bool found = false ;
availableBands band = bandUnknown ;
2024-07-15 16:59:47 +01:00
if ( cmd - > value = = 1 ) {
2024-07-15 16:53:27 +01:00
auto b = rigCaps - > bands . cend ( ) ;
while ( b ! = rigCaps - > bands . cbegin ( ) )
{
b - - ;
if ( ( b - > region = = " " | | prefs . region = = b - > region ) )
2023-05-15 10:53:52 +01:00
{
2024-07-15 16:53:27 +01:00
if ( ! found & & b - > band = = bandbtns - > currentBand ( ) ) {
found = true ;
} else if ( found & & b - > band ! = bandbtns - > currentBand ( ) ) {
qInfo ( ) < < " Got new band: " < < b - > band < < " Name: " < < b - > name < < " region " < < b - > region ;
band = b - > band ;
break ;
2023-05-15 10:53:52 +01:00
}
2023-01-29 19:46:13 +00:00
}
2023-05-15 10:53:52 +01:00
}
2024-07-15 16:53:27 +01:00
if ( band = = bandUnknown )
{
band = rigCaps - > bands [ rigCaps - > bands . size ( ) - 1 ] . band ;
2023-01-29 19:46:13 +00:00
}
2024-07-15 16:59:47 +01:00
} else if ( cmd - > value = = - 1 ) {
2024-07-15 16:53:27 +01:00
auto b = rigCaps - > bands . cbegin ( ) ;
while ( b ! = rigCaps - > bands . cend ( ) )
2023-01-29 19:46:13 +00:00
{
2024-07-15 16:53:27 +01:00
if ( ( b - > region = = " " | | prefs . region = = b - > region ) )
2023-05-15 10:53:52 +01:00
{
2024-07-15 16:53:27 +01:00
if ( ! found & & b - > band = = bandbtns - > currentBand ( ) ) {
found = true ;
} else if ( found & & b - > band ! = bandbtns - > currentBand ( ) ) {
qInfo ( ) < < " Got band: " < < b - > band < < " Name: " < < b - > name < < " region " < < b - > region ;
band = b - > band ;
break ;
2023-05-15 10:53:52 +01:00
}
2023-01-29 19:46:13 +00:00
}
2024-07-15 16:53:27 +01:00
b + + ;
}
if ( band = = bandUnknown ) {
band = rigCaps - > bands [ 0 ] . band ;
2023-01-29 19:46:13 +00:00
}
2023-05-15 10:53:52 +01:00
} else {
2024-07-15 16:53:27 +01:00
band = cmd - > band ;
2023-01-29 19:46:13 +00:00
}
2024-07-15 16:53:27 +01:00
bandbtns - > setBand ( band ) ;
2023-01-29 19:26:21 +00:00
break ;
2024-07-15 16:53:27 +01:00
}
2024-08-13 08:56:13 +01:00
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
2024-11-13 09:34:20 +00:00
case funcUnselectedMode :
2025-02-03 20:20:40 +00:00
vfo = 1 ;
2024-11-13 09:34:20 +00:00
case funcMode :
2023-05-15 10:53:52 +01:00
case funcModeSet :
2024-12-08 13:55:48 +00:00
qInfo ( logRig ( ) ) < < " Setting mode " < < cmd - > value < < " or " < < cmd - > mode ;
2025-02-03 20:20:40 +00:00
if ( cmd - > suffix < receivers . size ( ) )
{
if ( cmd - > value = = 1 )
{
for ( size_t i = 0 ; i < rigCaps - > modes . size ( ) ; i + + )
2023-05-15 10:53:52 +01:00
{
2025-12-15 09:30:32 +00:00
if ( rigCaps - > modes [ i ] . mk = = receivers [ cmd - > suffix ] - > getMode ( ) . mk )
2025-02-03 20:20:40 +00:00
{
if ( i + 1 < rigCaps - > modes . size ( ) )
{
changeMode ( rigCaps - > modes [ i + 1 ] . mk , false , cmd - > suffix ) ;
}
else
{
changeMode ( rigCaps - > modes [ 0 ] . mk , false , cmd - > suffix ) ;
}
2023-05-15 10:53:52 +01:00
}
2023-01-29 19:26:21 +00:00
}
2023-05-15 10:53:52 +01:00
}
2025-02-03 20:20:40 +00:00
else if ( cmd - > value = = - 1 )
{
for ( size_t i = 0 ; i < rigCaps - > modes . size ( ) ; i + + )
2023-05-15 10:53:52 +01:00
{
2025-12-15 09:30:32 +00:00
if ( rigCaps - > modes [ i ] . mk = = receivers [ cmd - > suffix ] - > getMode ( ) . mk )
2025-02-03 20:20:40 +00:00
{
if ( i > 0 )
{
changeMode ( rigCaps - > modes [ i - 1 ] . mk , false , cmd - > suffix ) ;
}
else
{
changeMode ( rigCaps - > modes [ rigCaps - > modes . size ( ) - 1 ] . mk , false , cmd - > suffix ) ;
}
2023-05-15 10:53:52 +01:00
}
2023-01-29 19:26:21 +00:00
}
}
2025-02-03 20:20:40 +00:00
else
{
changeMode ( cmd - > mode , false , cmd - > suffix ) ;
}
2023-01-29 19:26:21 +00:00
}
break ;
2023-05-15 10:53:52 +01:00
case funcTuningStep :
2024-07-13 19:19:27 +01:00
if ( ( cmd - > value > 0 & & ui - > tuningStepCombo - > currentIndex ( ) < ui - > tuningStepCombo - > count ( ) - cmd - > value ) | |
( cmd - > value < 0 & & ui - > tuningStepCombo - > currentIndex ( ) > 0 ) )
{
ui - > tuningStepCombo - > setCurrentIndex ( ui - > tuningStepCombo - > currentIndex ( ) + cmd - > value ) ;
}
else
{
if ( cmd - > value < 0 )
ui - > tuningStepCombo - > setCurrentIndex ( ui - > tuningStepCombo - > count ( ) - 1 ) ;
2023-05-15 10:53:52 +01:00
else
ui - > tuningStepCombo - > setCurrentIndex ( 0 ) ;
2023-01-29 19:26:21 +00:00
}
break ;
2024-11-13 09:34:20 +00:00
case funcScopeSpan :
2025-02-03 20:20:40 +00:00
if ( cmd - > suffix < receivers . size ( ) ) {
2025-12-15 09:30:32 +00:00
//receivers[cmd->suffix]->setScopeSpanUser(cmd->value);
2023-01-30 00:31:33 +00:00
}
break ;
2024-07-13 19:19:27 +01:00
case funcUnselectedFreq :
2025-02-03 20:20:40 +00:00
vfo = 1 ;
2024-11-13 09:34:20 +00:00
case funcFreq :
2024-01-27 22:13:47 +00:00
case funcSelectedFreq :
2023-03-17 23:35:40 +00:00
{
2025-02-09 16:31:08 +00:00
if ( ! freqLock )
{
freqt f ;
if ( cmd - > suffix < receivers . size ( ) ) {
f . Hz = roundFrequencyWithStep ( receivers [ cmd - > suffix ] - > getFrequency ( ) . Hz , cmd - > value , tsWfScrollHz ) ;
} else {
f . Hz = 0 ;
}
f . MHzDouble = f . Hz / double ( 1E6 ) ;
f . VFO = ( selVFO_t ) cmd - > suffix ;
vfoCommandType t = queue - > getVfoCommand ( vfo ? vfoB : vfoA , cmd - > suffix , true ) ;
//qInfo() << "sending command" << funcString[t.freqFunc] << "freq:" << f.Hz << "rx:" << t.receiver << "vfo:" << t.vfo;
queue - > add ( priorityImmediate , queueItem ( t . freqFunc , QVariant : : fromValue < freqt > ( f ) , false , t . receiver ) ) ;
2023-03-17 23:35:40 +00:00
}
break ;
}
2024-12-13 14:30:22 +00:00
2024-12-08 16:34:57 +00:00
// These are 2 byte values, so use ushort (even though they would fit in a uchar)
2024-12-13 14:30:22 +00:00
case funcCwPitch :
case funcKeySpeed :
case funcAfGain :
2024-12-08 16:34:57 +00:00
case funcRfGain :
case funcSquelch :
case funcAPFLevel :
case funcNRLevel :
case funcPBTInner :
case funcPBTOuter :
case funcIFShift :
case funcRFPower :
case funcMicGain :
2024-12-13 23:15:27 +00:00
case funcLANModLevel :
case funcUSBModLevel :
case funcACCAModLevel :
2024-12-08 16:34:57 +00:00
case funcNotchFilter :
case funcCompressorLevel :
case funcBreakInDelay :
case funcNBLevel :
case funcDigiSelShift :
case funcDriveGain :
case funcMonitorGain :
case funcVoxGain :
case funcAntiVoxGain :
2024-12-13 14:30:22 +00:00
qInfo ( logUsbControl ( ) ) < < " Command " < < cmd - > command < < " Value " < < cmd - > value ;
2025-02-03 20:20:40 +00:00
queue - > add ( priorityImmediate , queueItem ( ( funcs ) cmd - > command , QVariant : : fromValue < ushort > ( cmd - > value ) , false , cmd - > suffix ) ) ;
2024-12-08 16:34:57 +00:00
break ;
2024-07-26 18:51:23 +01:00
case funcTransceiverStatus :
{
if ( cmd - > value = = - 1 )
{
// toggle PTT
on_transmitBtn_clicked ( ) ;
break ;
}
}
2023-01-29 19:26:21 +00:00
default :
2024-12-13 14:30:22 +00:00
qInfo ( logUsbControl ( ) ) < < " Command " < < cmd - > command < < " Value " < < cmd - > value < < " Suffix " < < cmd - > suffix ;
if ( cmd - > suffix = = 0xff ) {
2025-02-03 20:20:40 +00:00
queue - > add ( priorityImmediate , queueItem ( ( funcs ) cmd - > command , QVariant : : fromValue < uchar > ( cmd - > value ) , false , cmd - > suffix ) ) ;
2024-12-13 14:30:22 +00:00
} else {
2025-02-03 20:20:40 +00:00
queue - > add ( priorityImmediate , queueItem ( ( funcs ) cmd - > command , QVariant : : fromValue < uchar > ( cmd - > suffix ) , false , 0 ) ) ;
2024-12-13 14:30:22 +00:00
}
2023-01-29 19:26:21 +00:00
break ;
2021-08-19 10:21:09 +01:00
}
2024-08-13 08:56:13 +01:00
# if defined __GNUC__
# pragma GCC diagnostic pop
# endif
2021-08-19 10:21:09 +01:00
}
2021-06-05 00:23:16 +01:00
void wfmain : : stepUp ( )
{
if ( ui - > tuningStepCombo - > currentIndex ( ) < ui - > tuningStepCombo - > count ( ) - 1 )
ui - > tuningStepCombo - > setCurrentIndex ( ui - > tuningStepCombo - > currentIndex ( ) + 1 ) ;
}
void wfmain : : stepDown ( )
{
if ( ui - > tuningStepCombo - > currentIndex ( ) > 0 )
ui - > tuningStepCombo - > setCurrentIndex ( ui - > tuningStepCombo - > currentIndex ( ) - 1 ) ;
2021-06-01 17:48:19 +01:00
}
2022-04-22 11:11:21 +01:00
void wfmain : : changeFrequency ( int value ) {
if ( freqLock ) return ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
2024-01-29 10:43:41 +00:00
{
freqt f ;
2024-03-30 20:40:27 +00:00
f . Hz = roundFrequencyWithStep ( receivers [ 0 ] - > getFrequency ( ) . Hz , value , tsWfScrollHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2025-01-10 13:38:40 +00:00
vfoCommandType t = queue - > getVfoCommand ( vfoA , currentReceiver , true ) ;
queue - > add ( priorityImmediate , queueItem ( t . freqFunc ,
QVariant : : fromValue < freqt > ( f ) , false , uchar ( t . receiver ) ) ) ;
2024-01-29 10:43:41 +00:00
}
2022-04-22 11:11:21 +01:00
}
2018-11-24 22:21:36 -08:00
void wfmain : : setDefPrefs ( )
{
2024-04-14 15:59:16 -07:00
defPrefs . hasRunSetup = false ;
2021-02-04 21:03:16 -08:00
defPrefs . useFullScreen = false ;
2021-02-18 22:38:50 -08:00
defPrefs . useSystemTheme = false ;
2018-11-24 22:21:36 -08:00
defPrefs . drawPeaks = true ;
2022-08-22 17:57:54 -07:00
defPrefs . currentColorPresetNumber = 0 ;
2022-08-17 18:41:35 -07:00
defPrefs . underlayMode = underlayNone ;
2022-08-17 18:46:00 -07:00
defPrefs . underlayBufferSize = 64 ;
2023-04-02 21:11:14 +01:00
defPrefs . wfEnable = 2 ;
2021-07-14 22:44:05 -07:00
defPrefs . wfAntiAlias = false ;
defPrefs . wfInterpolate = true ;
2019-02-08 16:05:45 -08:00
defPrefs . stylesheetPath = QString ( " qdarkstyle/style.qss " ) ;
2021-01-29 22:09:09 -08:00
defPrefs . radioCIVAddr = 0x00 ; // previously was 0x94 for 7300.
2021-11-06 23:59:03 -07:00
defPrefs . CIVisRadioModel = false ;
2024-12-30 14:19:52 +00:00
defPrefs . pttType = pttCIV ;
2018-11-29 13:41:42 -08:00
defPrefs . serialPortRadio = QString ( " auto " ) ;
2020-03-30 14:09:52 -07:00
defPrefs . serialPortBaud = 115200 ;
2024-04-13 20:04:35 -07:00
defPrefs . enableLAN = false ;
2022-11-26 21:43:47 -08:00
defPrefs . polling_ms = 0 ; // 0 = Automatic
2023-01-23 21:34:35 +00:00
defPrefs . enablePTT = true ;
2018-11-24 22:21:36 -08:00
defPrefs . niceTS = true ;
2021-04-19 17:26:26 +01:00
defPrefs . enableRigCtlD = false ;
defPrefs . rigCtlPort = 4533 ;
2021-05-05 14:11:00 +01:00
defPrefs . virtualSerialPort = QString ( " none " ) ;
2021-07-05 16:45:19 -07:00
defPrefs . localAFgain = 255 ;
2023-09-26 10:32:56 +01:00
defPrefs . mainWflength = 160 ;
defPrefs . mainWfTheme = static_cast < int > ( QCPColorGradient : : gpJet ) ;
defPrefs . mainPlotFloor = 0 ;
defPrefs . mainPlotCeiling = 160 ;
defPrefs . subWflength = 160 ;
defPrefs . subWfTheme = static_cast < int > ( QCPColorGradient : : gpJet ) ;
defPrefs . subPlotFloor = 0 ;
defPrefs . subPlotCeiling = 160 ;
2023-09-25 10:03:31 -07:00
defPrefs . scopeScrollX = 120 ;
defPrefs . scopeScrollY = 120 ;
2021-07-11 17:30:02 +01:00
defPrefs . confirmExit = true ;
2021-07-20 14:45:44 +01:00
defPrefs . confirmPowerOff = true ;
2024-05-04 23:40:34 +01:00
defPrefs . confirmSettingsChanged = true ;
2024-11-12 13:42:14 +00:00
defPrefs . confirmMemories = false ;
2024-11-05 18:46:21 +00:00
defPrefs . meter1Type = meterS ;
2021-08-27 18:06:09 +01:00
defPrefs . meter2Type = meterNone ;
2024-02-05 13:42:00 -08:00
defPrefs . meter3Type = meterNone ;
2024-02-06 11:06:50 -08:00
defPrefs . compMeterReverse = false ;
2024-06-12 17:11:01 +01:00
defPrefs . region = " 1 " ;
defPrefs . showBands = true ;
2025-01-11 13:43:40 +00:00
defPrefs . manufacturer = manufIcom ;
2025-01-11 12:32:31 +00:00
defPrefs . useUTC = false ;
defPrefs . setRadioTime = false ;
2025-01-18 12:29:34 +00:00
defPrefs . forceVfoMode = true ;
2025-05-06 18:29:08 +01:00
defPrefs . autoPowerOn = true ;
2025-01-11 12:32:31 +00:00
2022-04-08 14:40:05 +01:00
defPrefs . tcpPort = 0 ;
2023-07-06 10:36:11 +01:00
defPrefs . tciPort = 50001 ;
2024-04-13 20:04:35 -07:00
defPrefs . clusterUdpEnable = false ;
defPrefs . clusterTcpEnable = false ;
2022-04-18 20:29:50 +01:00
defPrefs . waterfallFormat = 0 ;
2022-05-12 01:46:20 +01:00
defPrefs . audioSystem = qtAudio ;
2023-01-30 12:01:29 +00:00
defPrefs . enableUSBControllers = false ;
2024-07-23 09:18:27 +01:00
# if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
defPrefs . groupSeparator = QLocale ( ) . groupSeparator ( ) ;
defPrefs . decimalSeparator = QLocale ( ) . decimalPoint ( ) ;
# else
defPrefs . groupSeparator = QLocale ( ) . groupSeparator ( ) . at ( 0 ) ; // digit group separator
defPrefs . decimalSeparator = QLocale ( ) . decimalPoint ( ) . at ( 0 ) ; // digit group separator
# endif
2021-02-04 20:54:34 -08:00
2024-12-30 10:09:27 +00:00
// Audio
defPrefs . rxSetup . latency = 150 ;
defPrefs . txSetup . latency = 150 ;
defPrefs . rxSetup . isinput = false ;
defPrefs . txSetup . isinput = true ;
defPrefs . rxSetup . sampleRate = 48000 ;
defPrefs . rxSetup . codec = 4 ;
defPrefs . txSetup . codec = 4 ;
defPrefs . rxSetup . resampleQuality = 4 ;
// Cluster
defPrefs . clusterUdpEnable = false ;
defPrefs . clusterTcpEnable = false ;
defPrefs . clusterUdpPort = 12060 ;
// CW
defPrefs . cwCutNumbers = false ;
defPrefs . cwSendImmediate = false ;
defPrefs . cwSidetoneEnabled = true ;
defPrefs . cwSidetoneLevel = 100 ;
2021-03-01 19:53:12 +00:00
udpDefPrefs . ipAddress = QString ( " " ) ;
udpDefPrefs . controlLANPort = 50001 ;
udpDefPrefs . serialLANPort = 50002 ;
udpDefPrefs . audioLANPort = 50003 ;
2025-06-04 00:29:12 +01:00
udpDefPrefs . scopeLANPort = 50004 ;
2021-03-01 19:53:12 +00:00
udpDefPrefs . username = QString ( " " ) ;
udpDefPrefs . password = QString ( " " ) ;
2021-03-27 16:07:17 +00:00
udpDefPrefs . clientName = QHostInfo : : localHostName ( ) ;
2025-01-17 00:43:57 +00:00
udpDefPrefs . connectionType = connectionLAN ;
2025-01-24 12:37:52 +00:00
udpDefPrefs . adminLogin = false ;
2018-11-24 22:21:36 -08:00
}
2018-11-24 00:10:05 -08:00
void wfmain : : loadSettings ( )
{
2021-05-20 19:24:40 +01:00
qInfo ( logSystem ( ) ) < < " Loading settings from " < < settings - > fileName ( ) ;
2018-11-24 00:10:05 -08:00
2023-01-17 21:43:58 -08:00
QString currentVersionString = QString ( WFVIEW_VERSION ) ;
float currentVersionFloat = currentVersionString . toFloat ( ) ;
settings - > beginGroup ( " Program " ) ;
QString priorVersionString = settings - > value ( " version " , " unset " ) . toString ( ) ;
float priorVersionFloat = priorVersionString . toFloat ( ) ;
2023-01-29 15:08:47 +00:00
if ( currentVersionString ! = priorVersionString )
2023-01-17 21:43:58 -08:00
{
2023-01-17 21:49:17 -08:00
qWarning ( logSystem ( ) ) < < " Settings previously saved under version " < < priorVersionString < < " , you should review your settings and press SaveSettings. " ;
2023-01-17 21:43:58 -08:00
}
if ( priorVersionFloat > currentVersionFloat )
{
qWarning ( logSystem ( ) ) . noquote ( ) . nospace ( ) < < " It looks like the previous version of wfview ( " < < priorVersionString < < " ) was newer than this version ( " < < currentVersionString < < " ) " ;
}
prefs . version = priorVersionString ;
prefs . majorVersion = settings - > value ( " majorVersion " , defPrefs . majorVersion ) . toInt ( ) ;
prefs . minorVersion = settings - > value ( " minorVersion " , defPrefs . minorVersion ) . toInt ( ) ;
2024-04-14 15:59:16 -07:00
prefs . hasRunSetup = settings - > value ( " hasRunSetup " , defPrefs . hasRunSetup ) . toBool ( ) ;
2023-01-17 21:43:58 -08:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
// UI: (full screen, dark theme, draw peaks, colors, etc)
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Interface " ) ;
prefs . useFullScreen = settings - > value ( " UseFullScreen " , defPrefs . useFullScreen ) . toBool ( ) ;
prefs . useSystemTheme = settings - > value ( " UseSystemTheme " , defPrefs . useSystemTheme ) . toBool ( ) ;
2023-04-02 21:09:37 +01:00
prefs . wfEnable = settings - > value ( " WFEnable " , defPrefs . wfEnable ) . toInt ( ) ;
2023-06-05 09:27:37 +01:00
//ui->scopeEnableWFBtn->setCheckState(Qt::CheckState(prefs.wfEnable));
2023-09-26 10:32:56 +01:00
prefs . mainWfTheme = settings - > value ( " MainWFTheme " , defPrefs . mainWfTheme ) . toInt ( ) ;
prefs . subWfTheme = settings - > value ( " SubWFTheme " , defPrefs . subWfTheme ) . toInt ( ) ;
prefs . mainPlotFloor = settings - > value ( " MainPlotFloor " , defPrefs . mainPlotFloor ) . toInt ( ) ;
prefs . subPlotFloor = settings - > value ( " SubPlotFloor " , defPrefs . subPlotFloor ) . toInt ( ) ;
prefs . mainPlotCeiling = settings - > value ( " MainPlotCeiling " , defPrefs . mainPlotCeiling ) . toInt ( ) ;
prefs . subPlotCeiling = settings - > value ( " SubPlotCeiling " , defPrefs . subPlotCeiling ) . toInt ( ) ;
2023-09-23 13:03:38 -07:00
prefs . scopeScrollX = settings - > value ( " scopeScrollX " , defPrefs . scopeScrollX ) . toInt ( ) ;
prefs . scopeScrollY = settings - > value ( " scopeScrollY " , defPrefs . scopeScrollY ) . toInt ( ) ;
2024-07-24 20:24:56 +01:00
prefs . decimalSeparator = settings - > value ( " DecimalSeparator " , defPrefs . decimalSeparator ) . toChar ( ) ;
prefs . groupSeparator = settings - > value ( " GroupSeparator " , defPrefs . groupSeparator ) . toChar ( ) ;
2025-01-18 12:29:34 +00:00
prefs . forceVfoMode = settings - > value ( " ForceVfoMode " , defPrefs . groupSeparator ) . toBool ( ) ;
2025-05-06 18:29:08 +01:00
prefs . autoPowerOn = settings - > value ( " AutoPowerOn " , defPrefs . autoPowerOn ) . toBool ( ) ;
2023-09-26 10:32:56 +01:00
2021-05-20 19:24:40 +01:00
prefs . drawPeaks = settings - > value ( " DrawPeaks " , defPrefs . drawPeaks ) . toBool ( ) ;
2022-08-17 18:46:00 -07:00
prefs . underlayBufferSize = settings - > value ( " underlayBufferSize " , defPrefs . underlayBufferSize ) . toInt ( ) ;
2022-08-17 18:41:35 -07:00
prefs . underlayMode = static_cast < underlay_t > ( settings - > value ( " underlayMode " , defPrefs . underlayMode ) . toInt ( ) ) ;
2021-07-14 22:44:05 -07:00
prefs . wfAntiAlias = settings - > value ( " WFAntiAlias " , defPrefs . wfAntiAlias ) . toBool ( ) ;
prefs . wfInterpolate = settings - > value ( " WFInterpolate " , defPrefs . wfInterpolate ) . toBool ( ) ;
2023-09-26 10:32:56 +01:00
prefs . mainWflength = ( unsigned int ) settings - > value ( " MainWFLength " , defPrefs . mainWflength ) . toInt ( ) ;
prefs . subWflength = ( unsigned int ) settings - > value ( " SubWFLength " , defPrefs . subWflength ) . toInt ( ) ;
2021-05-20 19:24:40 +01:00
prefs . stylesheetPath = settings - > value ( " StylesheetPath " , defPrefs . stylesheetPath ) . toString ( ) ;
2023-06-01 17:57:44 +01:00
//ui->splitter->restoreState(settings->value("splitter").toByteArray());
2021-05-20 19:24:40 +01:00
restoreGeometry ( settings - > value ( " windowGeometry " ) . toByteArray ( ) ) ;
restoreState ( settings - > value ( " windowState " ) . toByteArray ( ) ) ;
2020-04-04 16:51:46 -07:00
setWindowState ( Qt : : WindowActive ) ; // Works around QT bug to returns window+keyboard focus.
2025-05-03 01:07:14 +01:00
2026-01-02 18:59:51 +00:00
if ( bandbtns ! = nullptr )
2025-05-03 01:07:14 +01:00
bandbtns - > setGeometry ( settings - > value ( " BandWindowGeometry " ) . toByteArray ( ) ) ;
2026-01-02 18:59:51 +00:00
if ( finputbtns ! = nullptr )
2025-05-03 01:07:14 +01:00
finputbtns - > setGeometry ( settings - > value ( " FreqWindowGeometry " ) . toByteArray ( ) ) ;
2021-07-11 17:30:02 +01:00
prefs . confirmExit = settings - > value ( " ConfirmExit " , defPrefs . confirmExit ) . toBool ( ) ;
2021-07-20 14:45:44 +01:00
prefs . confirmPowerOff = settings - > value ( " ConfirmPowerOff " , defPrefs . confirmPowerOff ) . toBool ( ) ;
2024-05-04 23:40:34 +01:00
prefs . confirmSettingsChanged = settings - > value ( " ConfirmSettingsChanged " , defPrefs . confirmSettingsChanged ) . toBool ( ) ;
2024-11-12 13:42:14 +00:00
prefs . confirmMemories = settings - > value ( " ConfirmMemories " , defPrefs . confirmMemories ) . toBool ( ) ;
2024-11-05 18:46:21 +00:00
prefs . meter1Type = static_cast < meter_t > ( settings - > value ( " Meter1Type " , defPrefs . meter1Type ) . toInt ( ) ) ;
2023-05-15 13:47:45 +01:00
prefs . meter2Type = static_cast < meter_t > ( settings - > value ( " Meter2Type " , defPrefs . meter2Type ) . toInt ( ) ) ;
2024-02-05 13:42:00 -08:00
prefs . meter3Type = static_cast < meter_t > ( settings - > value ( " Meter3Type " , defPrefs . meter3Type ) . toInt ( ) ) ;
2024-02-06 11:06:50 -08:00
prefs . compMeterReverse = settings - > value ( " compMeterReverse " , defPrefs . compMeterReverse ) . toBool ( ) ;
2022-10-11 13:17:23 +01:00
prefs . clickDragTuningEnable = settings - > value ( " ClickDragTuning " , false ) . toBool ( ) ;
2023-05-28 22:11:59 +01:00
2025-01-11 12:32:31 +00:00
prefs . useUTC = settings - > value ( " UseUTC " , defPrefs . useUTC ) . toBool ( ) ;
prefs . setRadioTime = settings - > value ( " SetRadioTime " , defPrefs . setRadioTime ) . toBool ( ) ;
2023-05-28 22:11:59 +01:00
prefs . rigCreatorEnable = settings - > value ( " RigCreator " , false ) . toBool ( ) ;
2024-06-12 17:11:01 +01:00
prefs . region = settings - > value ( " Region " , defPrefs . region ) . toString ( ) ;
2024-12-27 13:26:26 +00:00
bandbtns - > setRegion ( prefs . region ) ;
2024-06-12 17:11:01 +01:00
prefs . showBands = settings - > value ( " ShowBands " , defPrefs . showBands ) . toBool ( ) ;
2023-05-28 22:11:59 +01:00
ui - > rigCreatorBtn - > setEnabled ( prefs . rigCreatorEnable ) ;
2023-09-19 23:04:48 +01:00
prefs . frequencyUnits = settings - > value ( " FrequencyUnits " , 3 ) . toInt ( ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
2022-08-22 16:49:35 -07:00
// Load in the color presets. The default values are already loaded.
2021-04-26 23:40:08 -07:00
2022-08-22 16:49:35 -07:00
settings - > beginGroup ( " ColorPresets " ) ;
2022-11-23 13:36:13 -08:00
prefs . currentColorPresetNumber = settings - > value ( " currentColorPresetNumber " , defPrefs . currentColorPresetNumber ) . toInt ( ) ;
2022-08-22 16:49:35 -07:00
if ( prefs . currentColorPresetNumber > numColorPresetsTotal - 1 )
prefs . currentColorPresetNumber = 0 ;
2021-04-26 23:40:08 -07:00
2022-08-22 16:49:35 -07:00
int numPresetsInFile = settings - > beginReadArray ( " ColorPreset " ) ;
// We will use the number of presets that the working copy of wfview
// supports, as we must never exceed the available number.
2022-09-18 21:00:44 +01:00
if ( numPresetsInFile > 0 )
2022-08-22 16:49:35 -07:00
{
2022-09-18 21:00:44 +01:00
colorPrefsType * p ;
2022-08-22 16:49:35 -07:00
QString tempName ;
2022-09-18 21:00:44 +01:00
for ( int pn = 0 ; pn < numColorPresetsTotal ; pn + + )
2022-08-22 16:49:35 -07:00
{
settings - > setArrayIndex ( pn ) ;
p = & ( colorPreset [ pn ] ) ;
p - > presetNum = settings - > value ( " presetNum " , p - > presetNum ) . toInt ( ) ;
tempName = settings - > value ( " presetName " , * p - > presetName ) . toString ( ) ;
2022-09-18 21:00:44 +01:00
if ( ( ! tempName . isEmpty ( ) ) & & tempName . length ( ) < 11 )
2022-08-22 16:49:35 -07:00
{
p - > presetName - > clear ( ) ;
p - > presetName - > append ( tempName ) ;
}
2024-06-23 11:59:41 +01:00
p - > gridColor = colorFromString ( settings - > value ( " gridColor " , p - > gridColor . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > axisColor = colorFromString ( settings - > value ( " axisColor " , p - > axisColor . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > textColor = colorFromString ( settings - > value ( " textColor " , p - > textColor . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > spectrumLine = colorFromString ( settings - > value ( " spectrumLine " , p - > spectrumLine . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > spectrumFill = colorFromString ( settings - > value ( " spectrumFill " , p - > spectrumFill . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
2024-04-14 21:56:34 -07:00
p - > useSpectrumFillGradient = settings - > value ( " useSpectrumFillGradient " , p - > useSpectrumFillGradient ) . toBool ( ) ;
2024-06-23 11:59:41 +01:00
p - > spectrumFillTop = colorFromString ( settings - > value ( " spectrumFillTop " , p - > spectrumFillTop . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > spectrumFillBot = colorFromString ( settings - > value ( " spectrumFillBot " , p - > spectrumFillBot . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > underlayLine = colorFromString ( settings - > value ( " underlayLine " , p - > underlayLine . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > underlayFill = colorFromString ( settings - > value ( " underlayFill " , p - > underlayFill . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
2024-04-14 21:56:34 -07:00
p - > useUnderlayFillGradient = settings - > value ( " useUnderlayFillGradient " , p - > useUnderlayFillGradient ) . toBool ( ) ;
2024-06-23 11:59:41 +01:00
p - > underlayFillTop = colorFromString ( settings - > value ( " underlayFillTop " , p - > underlayFillTop . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > underlayFillBot = colorFromString ( settings - > value ( " underlayFillBot " , p - > underlayFillBot . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > plotBackground = colorFromString ( settings - > value ( " plotBackground " , p - > plotBackground . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > tuningLine = colorFromString ( settings - > value ( " tuningLine " , p - > tuningLine . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > passband = colorFromString ( settings - > value ( " passband " , p - > passband . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > pbt = colorFromString ( settings - > value ( " pbt " , p - > pbt . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > wfBackground = colorFromString ( settings - > value ( " wfBackground " , p - > wfBackground . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > wfGrid = colorFromString ( settings - > value ( " wfGrid " , p - > wfGrid . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > wfAxis = colorFromString ( settings - > value ( " wfAxis " , p - > wfAxis . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > wfText = colorFromString ( settings - > value ( " wfText " , p - > wfText . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > meterLevel = colorFromString ( settings - > value ( " meterLevel " , p - > meterLevel . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > meterAverage = colorFromString ( settings - > value ( " meterAverage " , p - > meterAverage . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > meterPeakLevel = colorFromString ( settings - > value ( " meterPeakLevel " , p - > meterPeakLevel . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > meterPeakScale = colorFromString ( settings - > value ( " meterPeakScale " , p - > meterPeakScale . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > meterLowerLine = colorFromString ( settings - > value ( " meterLowerLine " , p - > meterLowerLine . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > meterLowText = colorFromString ( settings - > value ( " meterLowText " , p - > meterLowText . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > clusterSpots = colorFromString ( settings - > value ( " clusterSpots " , p - > clusterSpots . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
2024-12-30 19:22:26 +00:00
p - > buttonOff = colorFromString ( settings - > value ( " buttonOff " , p - > buttonOff . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
p - > buttonOn = colorFromString ( settings - > value ( " buttonOn " , p - > buttonOn . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
2022-08-22 16:49:35 -07:00
}
}
settings - > endArray ( ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2021-04-26 23:40:08 -07:00
2018-11-24 00:10:05 -08:00
// Radio and Comms: C-IV addr, port to use
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Radio " ) ;
2025-01-14 13:35:14 +00:00
prefs . manufacturer = ( manufacturersType_t ) settings - > value ( " Manufacturer " , defPrefs . manufacturer ) . value < manufacturersType_t > ( ) ;
2025-05-10 12:35:35 +01:00
prefs . radioCIVAddr = ( quint16 ) settings - > value ( " RigCIVuInt " , defPrefs . radioCIVAddr ) . toInt ( ) ;
2021-11-06 23:59:03 -07:00
prefs . CIVisRadioModel = ( bool ) settings - > value ( " CIVisRadioModel " , defPrefs . CIVisRadioModel ) . toBool ( ) ;
2024-12-30 14:19:52 +00:00
prefs . pttType = ( pttType_t ) settings - > value ( " PTTType " , defPrefs . pttType ) . toInt ( ) ;
2021-05-20 19:24:40 +01:00
prefs . serialPortRadio = settings - > value ( " SerialPortRadio " , defPrefs . serialPortRadio ) . toString ( ) ;
2021-12-30 00:48:39 +00:00
prefs . serialPortBaud = ( quint32 ) settings - > value ( " SerialPortBaud " , defPrefs . serialPortBaud ) . toInt ( ) ;
2021-05-19 21:36:34 -07:00
2021-06-08 17:51:10 +01:00
if ( prefs . serialPortBaud > 0 )
{
serverConfig . baudRate = prefs . serialPortBaud ;
}
2022-11-26 21:43:47 -08:00
prefs . polling_ms = settings - > value ( " polling_ms " , defPrefs . polling_ms ) . toInt ( ) ;
2023-02-19 22:11:48 -08:00
// Migrated
2022-11-26 21:43:47 -08:00
if ( prefs . polling_ms = = 0 )
{
// Automatic
2023-02-19 22:11:48 -08:00
2022-11-26 21:43:47 -08:00
} else {
// Manual
2023-02-19 22:11:48 -08:00
2022-11-26 21:43:47 -08:00
}
2021-05-20 19:24:40 +01:00
prefs . virtualSerialPort = settings - > value ( " VirtualSerialPort " , defPrefs . virtualSerialPort ) . toString ( ) ;
2023-02-19 22:11:48 -08:00
2021-05-11 11:18:45 +01:00
2024-08-13 13:19:50 +01:00
prefs . localAFgain = ( quint8 ) settings - > value ( " localAFgain " , defPrefs . localAFgain ) . toUInt ( ) ;
2023-05-28 22:11:59 +01:00
prefs . rxSetup . localAFgain = prefs . localAFgain ;
prefs . txSetup . localAFgain = 255 ;
2022-01-15 16:31:50 +00:00
2022-05-12 01:46:20 +01:00
prefs . audioSystem = static_cast < audioType > ( settings - > value ( " AudioSystem " , defPrefs . audioSystem ) . toInt ( ) ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
// Misc. user settings (enable PTT, draw peaks, etc)
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Controls " ) ;
prefs . enablePTT = settings - > value ( " EnablePTT " , defPrefs . enablePTT ) . toBool ( ) ;
2023-06-08 08:20:50 +01:00
2021-05-20 19:24:40 +01:00
prefs . niceTS = settings - > value ( " NiceTS " , defPrefs . niceTS ) . toBool ( ) ;
2023-06-08 08:20:50 +01:00
2023-01-18 23:17:28 -08:00
prefs . automaticSidebandSwitching = settings - > value ( " automaticSidebandSwitching " , defPrefs . automaticSidebandSwitching ) . toBool ( ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " LAN " ) ;
2021-03-01 19:53:12 +00:00
2021-05-20 19:24:40 +01:00
prefs . enableLAN = settings - > value ( " EnableLAN " , defPrefs . enableLAN ) . toBool ( ) ;
2022-05-05 18:09:16 +01:00
// If LAN is enabled, server gets its audio straight from the LAN
2023-02-21 22:54:15 -08:00
// migrated, remove these
//ui->serverRXAudioInputCombo->setEnabled(!prefs.enableLAN);
//ui->serverTXAudioOutputCombo->setEnabled(!prefs.enableLAN);
2022-05-05 18:09:16 +01:00
2023-05-08 13:26:45 +01:00
// If LAN is not enabled, disable local audio input/output
2023-05-27 00:26:01 +01:00
//ui->audioOutputCombo->setEnabled(prefs.enableLAN);
//ui->audioInputCombo->setEnabled(prefs.enableLAN);
2023-05-08 13:26:45 +01:00
2021-05-30 23:26:36 -07:00
ui - > connectBtn - > setEnabled ( true ) ;
2021-04-19 17:26:26 +01:00
2021-05-20 19:24:40 +01:00
prefs . enableRigCtlD = settings - > value ( " EnableRigCtlD " , defPrefs . enableRigCtlD ) . toBool ( ) ;
prefs . rigCtlPort = settings - > value ( " RigCtlPort " , defPrefs . rigCtlPort ) . toInt ( ) ;
2021-04-19 17:26:26 +01:00
2023-07-06 10:36:11 +01:00
prefs . tcpPort = settings - > value ( " TCPServerPort " , defPrefs . tcpPort ) . toInt ( ) ;
prefs . tciPort = settings - > value ( " TCIServerPort " , defPrefs . tciPort ) . toInt ( ) ;
2022-04-18 20:29:50 +01:00
prefs . waterfallFormat = settings - > value ( " WaterfallFormat " , defPrefs . waterfallFormat ) . toInt ( ) ;
2021-05-20 19:24:40 +01:00
udpPrefs . ipAddress = settings - > value ( " IPAddress " , udpDefPrefs . ipAddress ) . toString ( ) ;
udpPrefs . controlLANPort = settings - > value ( " ControlLANPort " , udpDefPrefs . controlLANPort ) . toInt ( ) ;
2025-06-04 00:29:12 +01:00
udpPrefs . serialLANPort = settings - > value ( " SerialLANPort " , udpDefPrefs . serialLANPort ) . toInt ( ) ;
udpPrefs . audioLANPort = settings - > value ( " AudioLANPort " , udpDefPrefs . audioLANPort ) . toInt ( ) ;
udpPrefs . scopeLANPort = settings - > value ( " ScopeLANPort " , udpDefPrefs . scopeLANPort ) . toInt ( ) ;
2025-01-24 12:37:52 +00:00
udpPrefs . adminLogin = settings - > value ( " AdminLogin " , udpDefPrefs . adminLogin ) . toBool ( ) ;
2021-05-20 19:24:40 +01:00
udpPrefs . username = settings - > value ( " Username " , udpDefPrefs . username ) . toString ( ) ;
udpPrefs . password = settings - > value ( " Password " , udpDefPrefs . password ) . toString ( ) ;
2024-12-30 10:09:27 +00:00
prefs . rxSetup . isinput = defPrefs . rxSetup . isinput ;
prefs . txSetup . isinput = defPrefs . txSetup . isinput ;
prefs . rxSetup . latency = settings - > value ( " AudioRXLatency " , defPrefs . rxSetup . latency ) . toInt ( ) ;
prefs . txSetup . latency = settings - > value ( " AudioTXLatency " , defPrefs . txSetup . latency ) . toInt ( ) ;
2023-05-28 22:11:59 +01:00
2024-12-30 10:09:27 +00:00
prefs . rxSetup . sampleRate = settings - > value ( " AudioRXSampleRate " , defPrefs . rxSetup . sampleRate ) . toInt ( ) ;
2023-05-28 22:11:59 +01:00
prefs . txSetup . sampleRate = prefs . rxSetup . sampleRate ;
2024-12-30 10:09:27 +00:00
prefs . rxSetup . codec = settings - > value ( " AudioRXCodec " , defPrefs . rxSetup . codec ) . toInt ( ) ;
prefs . txSetup . codec = settings - > value ( " AudioTXCodec " , defPrefs . txSetup . codec ) . toInt ( ) ;
2023-05-28 22:11:59 +01:00
prefs . rxSetup . name = settings - > value ( " AudioOutput " , " Default Output Device " ) . toString ( ) ;
qInfo ( logGui ( ) ) < < " Got Audio Output from Settings: " < < prefs . rxSetup . name ;
prefs . txSetup . name = settings - > value ( " AudioInput " , " Default Input Device " ) . toString ( ) ;
qInfo ( logGui ( ) ) < < " Got Audio Input from Settings: " < < prefs . txSetup . name ;
2024-12-30 10:09:27 +00:00
prefs . rxSetup . resampleQuality = settings - > value ( " ResampleQuality " , defPrefs . rxSetup . resampleQuality ) . toInt ( ) ;
2023-05-28 22:11:59 +01:00
prefs . txSetup . resampleQuality = prefs . rxSetup . resampleQuality ;
2021-02-04 10:27:30 +00:00
2026-01-02 18:59:51 +00:00
if ( prefs . tciPort > 0 & & tci = = nullptr ) {
2023-09-19 23:04:48 +01:00
2023-11-27 15:53:19 +00:00
tci = new tciServer ( ) ;
2023-09-19 23:04:48 +01:00
tciThread = new QThread ( this ) ;
tciThread - > setObjectName ( " TCIServer() " ) ;
tci - > moveToThread ( tciThread ) ;
2023-12-18 10:47:16 +00:00
connect ( queue , SIGNAL ( rigCapsUpdated ( rigCapabilities * ) ) , tci , SLOT ( receiveRigCaps ( rigCapabilities * ) ) ) ;
2023-09-19 23:04:48 +01:00
connect ( this , SIGNAL ( tciInit ( quint16 ) ) , tci , SLOT ( init ( quint16 ) ) ) ;
connect ( tciThread , SIGNAL ( finished ( ) ) , tci , SLOT ( deleteLater ( ) ) ) ;
tciThread - > start ( QThread : : TimeCriticalPriority ) ;
emit tciInit ( prefs . tciPort ) ;
}
if ( prefs . audioSystem = = tciAudio )
{
prefs . rxSetup . tci = tci ;
prefs . txSetup . tci = tci ;
}
2025-01-17 00:43:57 +00:00
udpPrefs . connectionType = settings - > value ( " ConnectionType " , udpDefPrefs . connectionType ) . value < connectionType_t > ( ) ;
2021-05-20 19:24:40 +01:00
udpPrefs . clientName = settings - > value ( " ClientName " , udpDefPrefs . clientName ) . toString ( ) ;
2021-03-09 17:22:16 +00:00
2023-01-27 01:41:35 +00:00
udpPrefs . halfDuplex = settings - > value ( " HalfDuplex " , udpDefPrefs . halfDuplex ) . toBool ( ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2021-02-16 16:16:46 +00:00
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Server " ) ;
2025-01-06 12:51:56 +00:00
setupui - > acceptServerConfig ( & serverConfig ) ;
2021-05-20 19:24:40 +01:00
serverConfig . enabled = settings - > value ( " ServerEnabled " , false ) . toBool ( ) ;
2025-01-05 15:39:20 +00:00
serverConfig . disableUI = settings - > value ( " DisableUI " , false ) . toBool ( ) ;
2024-12-30 10:09:27 +00:00
// These defPrefs are actually for the client, but they are the same.
serverConfig . controlPort = settings - > value ( " ServerControlPort " , udpDefPrefs . controlLANPort ) . toInt ( ) ;
serverConfig . civPort = settings - > value ( " ServerCivPort " , udpDefPrefs . serialLANPort ) . toInt ( ) ;
serverConfig . audioPort = settings - > value ( " ServerAudioPort " , udpDefPrefs . audioLANPort ) . toInt ( ) ;
2021-02-16 16:16:46 +00:00
serverConfig . users . clear ( ) ;
2022-01-23 15:06:31 +00:00
int numUsers = settings - > beginReadArray ( " Users " ) ;
if ( numUsers > 0 ) {
{
for ( int f = 0 ; f < numUsers ; f + + )
{
settings - > setArrayIndex ( f ) ;
SERVERUSER user ;
user . username = settings - > value ( " Username " , " " ) . toString ( ) ;
user . password = settings - > value ( " Password " , " " ) . toString ( ) ;
user . userType = settings - > value ( " UserType " , 0 ) . toInt ( ) ;
serverConfig . users . append ( user ) ;
}
}
settings - > endArray ( ) ;
}
else {
/* Support old way of storing users*/
settings - > endArray ( ) ;
numUsers = settings - > value ( " ServerNumUsers " , 2 ) . toInt ( ) ;
for ( int f = 0 ; f < numUsers ; f + + )
{
SERVERUSER user ;
user . username = settings - > value ( " ServerUsername_ " + QString : : number ( f ) , " " ) . toString ( ) ;
user . password = settings - > value ( " ServerPassword_ " + QString : : number ( f ) , " " ) . toString ( ) ;
user . userType = settings - > value ( " ServerUserType_ " + QString : : number ( f ) , 0 ) . toInt ( ) ;
serverConfig . users . append ( user ) ;
}
2021-02-16 16:16:46 +00:00
}
2022-01-29 22:50:58 +00:00
RIGCONFIG * rigTemp = new RIGCONFIG ( ) ;
rigTemp - > rxAudioSetup . isinput = true ;
2022-04-20 13:35:23 +01:00
rigTemp - > txAudioSetup . isinput = false ;
2022-01-29 22:50:58 +00:00
rigTemp - > rxAudioSetup . localAFgain = 255 ;
rigTemp - > txAudioSetup . localAFgain = 255 ;
rigTemp - > rxAudioSetup . resampleQuality = 4 ;
rigTemp - > txAudioSetup . resampleQuality = 4 ;
2022-05-12 01:46:20 +01:00
rigTemp - > rxAudioSetup . type = prefs . audioSystem ;
rigTemp - > txAudioSetup . type = prefs . audioSystem ;
2024-12-30 15:32:04 +00:00
rigTemp - > pttType = prefs . pttType ; // Use the global PTT type.
2022-01-29 22:50:58 +00:00
rigTemp - > baudRate = prefs . serialPortBaud ;
2025-01-05 15:39:20 +00:00
rigTemp - > civAddr = 0 ;
2022-08-22 23:09:09 +01:00
rigTemp - > serialPort = prefs . serialPortRadio ;
2022-01-29 22:50:58 +00:00
QString guid = settings - > value ( " GUID " , " " ) . toString ( ) ;
if ( guid . isEmpty ( ) ) {
guid = QUuid : : createUuid ( ) . toString ( ) ;
settings - > setValue ( " GUID " , guid ) ;
}
2022-01-30 10:55:12 +00:00
# if (QT_VERSION >= QT_VERSION_CHECK(5,10,0))
2022-01-29 22:50:58 +00:00
memcpy ( rigTemp - > guid , QUuid : : fromString ( guid ) . toRfc4122 ( ) . constData ( ) , GUIDLEN ) ;
2022-01-30 10:55:12 +00:00
# endif
2022-01-14 19:57:12 +00:00
2025-01-06 12:51:56 +00:00
rigTemp - > rxAudioSetup . name = settings - > value ( " ServerAudioInput " , " " ) . toString ( ) ;
rigTemp - > txAudioSetup . name = settings - > value ( " ServerAudioOutput " , " " ) . toString ( ) ;
2023-09-19 23:04:48 +01:00
2022-01-29 22:50:58 +00:00
serverConfig . rigs . append ( rigTemp ) ;
2023-02-21 22:54:15 -08:00
// At this point, the users list has exactly one empty user.
2025-01-06 12:51:56 +00:00
//setupui->updateServerConfig(s_users);
2023-02-21 22:54:15 -08:00
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2021-02-16 16:16:46 +00:00
2018-11-24 00:10:05 -08:00
// Memory channels
2018-11-24 22:21:36 -08:00
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Memory " ) ;
int size = settings - > beginReadArray ( " Channel " ) ;
2018-11-24 22:21:36 -08:00
int chan = 0 ;
double freq ;
2024-08-13 13:19:50 +01:00
quint8 mode ;
2018-11-24 22:21:36 -08:00
bool isSet ;
2018-11-26 23:10:23 -08:00
// Annoying: QSettings will write the array to the
// preference file starting the array at 1 and ending at 100.
// Thus, we are writing the channel number each time.
// It is also annoying that they get written with their array
// numbers in alphabetical order without zero padding.
// Also annoying that the preference groups are not written in
// the order they are specified here.
2018-11-24 22:21:36 -08:00
2021-12-30 00:48:39 +00:00
for ( int i = 0 ; i < size ; i + + )
2018-11-24 22:21:36 -08:00
{
2021-05-20 19:24:40 +01:00
settings - > setArrayIndex ( i ) ;
chan = settings - > value ( " chan " , 0 ) . toInt ( ) ;
freq = settings - > value ( " freq " , 12.345 ) . toDouble ( ) ;
mode = settings - > value ( " mode " , 0 ) . toInt ( ) ;
isSet = settings - > value ( " isSet " , false ) . toBool ( ) ;
2018-11-24 22:21:36 -08:00
2021-12-30 00:48:39 +00:00
if ( isSet )
2018-11-24 22:21:36 -08:00
{
2023-05-15 13:51:04 +01:00
mem . setPreset ( chan , freq , ( rigMode_t ) mode ) ;
2018-11-24 22:21:36 -08:00
}
}
2021-05-20 19:24:40 +01:00
settings - > endArray ( ) ;
settings - > endGroup ( ) ;
2021-02-16 16:16:46 +00:00
2022-09-30 17:05:42 +01:00
settings - > beginGroup ( " Cluster " ) ;
2023-09-25 19:35:22 +01:00
2024-12-30 10:09:27 +00:00
prefs . clusterUdpEnable = settings - > value ( " UdpEnabled " , defPrefs . clusterUdpEnable ) . toBool ( ) ;
prefs . clusterTcpEnable = settings - > value ( " TcpEnabled " , defPrefs . clusterTcpEnable ) . toBool ( ) ;
prefs . clusterUdpPort = settings - > value ( " UdpPort " , defPrefs . clusterUdpPort ) . toInt ( ) ;
2022-09-30 17:05:42 +01:00
int numClusters = settings - > beginReadArray ( " Servers " ) ;
2023-06-11 10:33:16 +01:00
prefs . clusters . clear ( ) ;
2022-09-30 17:05:42 +01:00
if ( numClusters > 0 ) {
{
for ( int f = 0 ; f < numClusters ; f + + )
{
settings - > setArrayIndex ( f ) ;
clusterSettings c ;
c . server = settings - > value ( " ServerName " , " " ) . toString ( ) ;
c . port = settings - > value ( " Port " , 7300 ) . toInt ( ) ;
c . userName = settings - > value ( " UserName " , " " ) . toString ( ) ;
c . password = settings - > value ( " Password " , " " ) . toString ( ) ;
c . timeout = settings - > value ( " Timeout " , 0 ) . toInt ( ) ;
2022-09-30 17:26:21 +01:00
c . isdefault = settings - > value ( " Default " , false ) . toBool ( ) ;
2022-09-30 17:05:42 +01:00
if ( ! c . server . isEmpty ( ) ) {
2023-06-11 10:33:16 +01:00
prefs . clusters . append ( c ) ;
2022-09-30 17:05:42 +01:00
}
}
}
}
settings - > endArray ( ) ;
2023-01-21 11:18:26 -08:00
settings - > endGroup ( ) ;
2022-09-30 17:05:42 +01:00
2023-01-21 11:18:26 -08:00
// CW Memory Load:
settings - > beginGroup ( " Keyer " ) ;
2024-12-30 10:09:27 +00:00
prefs . cwCutNumbers = settings - > value ( " CutNumbers " , defPrefs . cwCutNumbers ) . toBool ( ) ;
prefs . cwSendImmediate = settings - > value ( " SendImmediate " , defPrefs . cwSendImmediate ) . toBool ( ) ;
prefs . cwSidetoneEnabled = settings - > value ( " SidetoneEnabled " , defPrefs . cwSidetoneEnabled ) . toBool ( ) ;
prefs . cwSidetoneLevel = settings - > value ( " SidetoneLevel " , defPrefs . cwSidetoneLevel ) . toInt ( ) ;
2024-11-16 14:44:21 +00:00
2023-01-21 11:18:26 -08:00
int numMemories = settings - > beginReadArray ( " macros " ) ;
if ( numMemories = = 10 )
{
for ( int m = 0 ; m < 10 ; m + + )
{
settings - > setArrayIndex ( m ) ;
2024-11-16 14:44:21 +00:00
prefs . cwMacroList < < settings - > value ( " macroText " , " " ) . toString ( ) ;
2023-01-21 11:18:26 -08:00
}
}
settings - > endArray ( ) ;
2022-09-30 17:05:42 +01:00
settings - > endGroup ( ) ;
2023-01-21 11:18:26 -08:00
2023-01-12 19:20:52 +00:00
# if defined (USB_CONTROLLER)
2022-05-17 08:53:24 +01:00
settings - > beginGroup ( " USB " ) ;
2023-01-30 12:01:29 +00:00
/* Load USB buttons*/
prefs . enableUSBControllers = settings - > value ( " EnableUSBControllers " , defPrefs . enableUSBControllers ) . toBool ( ) ;
2023-02-12 16:45:21 +00:00
2023-02-10 15:23:57 +00:00
/*Ensure that no operations on the usb commands/buttons/knobs take place*/
QMutexLocker locker ( & usbMutex ) ;
2023-01-30 16:15:43 +00:00
2023-03-17 23:35:40 +00:00
int numControllers = settings - > beginReadArray ( " Controllers " ) ;
if ( numControllers = = 0 ) {
2022-05-17 08:53:24 +01:00
settings - > endArray ( ) ;
2022-09-18 21:00:44 +01:00
}
else {
2023-04-02 20:07:13 +01:00
usbDevices . clear ( ) ;
2023-03-17 23:35:40 +00:00
for ( int nc = 0 ; nc < numControllers ; nc + + )
2022-09-18 21:00:44 +01:00
{
settings - > setArrayIndex ( nc ) ;
2023-04-02 20:07:13 +01:00
USBDEVICE tempPrefs ;
tempPrefs . path = settings - > value ( " Path " , " " ) . toString ( ) ;
2023-03-18 16:38:24 +00:00
tempPrefs . disabled = settings - > value ( " Disabled " , false ) . toBool ( ) ;
2023-03-17 23:35:40 +00:00
tempPrefs . sensitivity = settings - > value ( " Sensitivity " , 1 ) . toInt ( ) ;
2023-03-25 09:09:42 +00:00
tempPrefs . pages = settings - > value ( " Pages " , 1 ) . toInt ( ) ;
2023-03-17 23:35:40 +00:00
tempPrefs . brightness = ( quint8 ) settings - > value ( " Brightness " , 2 ) . toInt ( ) ;
tempPrefs . orientation = ( quint8 ) settings - > value ( " Orientation " , 2 ) . toInt ( ) ;
tempPrefs . speed = ( quint8 ) settings - > value ( " Speed " , 2 ) . toInt ( ) ;
tempPrefs . timeout = ( quint8 ) settings - > value ( " Timeout " , 30 ) . toInt ( ) ;
2024-06-23 11:59:41 +01:00
tempPrefs . color = colorFromString ( settings - > value ( " Color " , QColor ( Qt : : white ) . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
2023-05-15 10:53:52 +01:00
tempPrefs . lcd = ( funcs ) settings - > value ( " LCD " , 0 ) . toInt ( ) ;
2023-03-17 23:35:40 +00:00
2023-04-02 20:07:13 +01:00
if ( ! tempPrefs . path . isEmpty ( ) ) {
usbDevices . insert ( tempPrefs . path , tempPrefs ) ;
2023-03-17 23:35:40 +00:00
}
2022-09-18 21:00:44 +01:00
}
settings - > endArray ( ) ;
}
int numButtons = settings - > beginReadArray ( " Buttons " ) ;
2023-03-17 23:35:40 +00:00
if ( numButtons = = 0 ) {
2022-09-18 21:00:44 +01:00
settings - > endArray ( ) ;
2022-05-17 08:53:24 +01:00
}
2022-09-18 21:00:44 +01:00
else {
usbButtons . clear ( ) ;
for ( int nb = 0 ; nb < numButtons ; nb + + )
{
settings - > setArrayIndex ( nb ) ;
BUTTON butt ;
2023-03-25 09:09:42 +00:00
butt . path = settings - > value ( " Path " , " " ) . toString ( ) ;
butt . page = settings - > value ( " Page " , 1 ) . toInt ( ) ;
2023-04-02 20:07:13 +01:00
auto it = usbDevices . find ( butt . path ) ;
if ( it = = usbDevices . end ( ) )
{
qWarning ( logUsbControl ) < < " Cannot find existing device while creating button, aborting! " ;
continue ;
}
butt . parent = & it . value ( ) ;
2023-02-09 13:21:51 +00:00
butt . dev = ( usbDeviceType ) settings - > value ( " Dev " , 0 ) . toInt ( ) ;
2022-09-18 21:00:44 +01:00
butt . num = settings - > value ( " Num " , 0 ) . toInt ( ) ;
2022-10-23 18:54:18 +01:00
butt . name = settings - > value ( " Name " , " " ) . toString ( ) ;
2022-09-18 21:00:44 +01:00
butt . pos = QRect ( settings - > value ( " Left " , 0 ) . toInt ( ) ,
settings - > value ( " Top " , 0 ) . toInt ( ) ,
settings - > value ( " Width " , 0 ) . toInt ( ) ,
settings - > value ( " Height " , 0 ) . toInt ( ) ) ;
2024-06-23 11:59:41 +01:00
butt . textColour = colorFromString ( settings - > value ( " Colour " , QColor ( Qt : : white ) . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
butt . backgroundOn = colorFromString ( settings - > value ( " BackgroundOn " , QColor ( Qt : : lightGray ) . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
butt . backgroundOff = colorFromString ( settings - > value ( " BackgroundOff " , QColor ( Qt : : blue ) . name ( QColor : : HexArgb ) ) . toString ( ) ) ;
2023-03-25 09:09:42 +00:00
butt . toggle = settings - > value ( " Toggle " , false ) . toBool ( ) ;
2023-09-24 10:32:59 +01:00
// PET add Linux as it stops Qt6 building FIXME
2024-05-05 14:34:27 +01:00
# if (QT_VERSION > QT_VERSION_CHECK(6,0,0) && !defined(Q_OS_LINUX) && !defined(Q_OS_MACOS))
2023-03-28 19:07:54 +01:00
if ( settings - > value ( " Icon " , NULL ) ! = NULL ) {
2023-03-26 23:23:40 +01:00
butt . icon = new QImage ( settings - > value ( " Icon " , NULL ) . value < QImage > ( ) ) ;
2023-03-28 19:07:54 +01:00
butt . iconName = settings - > value ( " IconName " , " " ) . toString ( ) ;
2022-09-19 01:14:11 +01:00
}
2023-04-10 13:46:29 +01:00
# endif
2023-03-17 23:35:40 +00:00
butt . on = settings - > value ( " OnCommand " , " None " ) . toString ( ) ;
butt . off = settings - > value ( " OffCommand " , " None " ) . toString ( ) ;
2023-04-09 23:53:51 +01:00
butt . graphics = settings - > value ( " Graphics " , false ) . toBool ( ) ;
2023-04-15 21:13:43 +01:00
butt . led = settings - > value ( " Led " , 0 ) . toInt ( ) ;
2023-03-25 09:09:42 +00:00
if ( ! butt . path . isEmpty ( ) )
2023-03-17 23:35:40 +00:00
usbButtons . append ( butt ) ;
2022-09-18 21:00:44 +01:00
}
settings - > endArray ( ) ;
}
2023-02-09 13:21:51 +00:00
int numKnobs = settings - > beginReadArray ( " Knobs " ) ;
2023-03-17 23:35:40 +00:00
if ( numKnobs = = 0 ) {
2023-02-09 13:21:51 +00:00
settings - > endArray ( ) ;
}
else {
usbKnobs . clear ( ) ;
for ( int nk = 0 ; nk < numKnobs ; nk + + )
{
settings - > setArrayIndex ( nk ) ;
KNOB kb ;
2023-03-25 09:09:42 +00:00
kb . path = settings - > value ( " Path " , " " ) . toString ( ) ;
2023-04-02 20:07:13 +01:00
auto it = usbDevices . find ( kb . path ) ;
if ( it = = usbDevices . end ( ) )
{
qWarning ( logUsbControl ) < < " Cannot find existing device while creating knob, aborting! " ;
continue ;
}
kb . parent = & it . value ( ) ;
2023-03-25 09:09:42 +00:00
kb . page = settings - > value ( " Page " , 1 ) . toInt ( ) ;
2023-02-09 13:21:51 +00:00
kb . dev = ( usbDeviceType ) settings - > value ( " Dev " , 0 ) . toInt ( ) ;
kb . num = settings - > value ( " Num " , 0 ) . toInt ( ) ;
kb . name = settings - > value ( " Name " , " " ) . toString ( ) ;
kb . pos = QRect ( settings - > value ( " Left " , 0 ) . toInt ( ) ,
settings - > value ( " Top " , 0 ) . toInt ( ) ,
settings - > value ( " Width " , 0 ) . toInt ( ) ,
settings - > value ( " Height " , 0 ) . toInt ( ) ) ;
kb . textColour = QColor ( ( settings - > value ( " Colour " , " Green " ) . toString ( ) ) ) ;
2023-03-17 23:35:40 +00:00
kb . cmd = settings - > value ( " Command " , " None " ) . toString ( ) ;
2023-03-25 09:09:42 +00:00
if ( ! kb . path . isEmpty ( ) )
2023-03-17 23:35:40 +00:00
usbKnobs . append ( kb ) ;
2023-02-09 13:21:51 +00:00
}
settings - > endArray ( ) ;
}
2022-10-11 23:56:00 +01:00
settings - > endGroup ( ) ;
2023-03-17 23:35:40 +00:00
if ( prefs . enableUSBControllers ) {
// Setup USB Controller
setupUsbControllerDevice ( ) ;
2023-04-02 20:07:13 +01:00
emit initUsbController ( & usbMutex , & usbDevices , & usbButtons , & usbKnobs ) ;
2023-03-17 23:35:40 +00:00
}
2023-01-12 19:20:52 +00:00
# endif
2023-02-18 19:25:02 -08:00
setupui - > acceptPreferencesPtr ( & prefs ) ;
2023-05-28 22:11:59 +01:00
setupui - > acceptColorPresetPtr ( colorPreset ) ;
2023-02-18 19:25:02 -08:00
setupui - > acceptUdpPreferencesPtr ( & udpPrefs ) ;
2023-02-21 22:54:15 -08:00
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = false ;
2021-12-30 00:48:39 +00:00
}
2021-02-16 16:16:46 +00:00
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedIfPrefs ( quint64 items )
2023-02-19 18:29:22 -08:00
{
prefIfItem pif ;
if ( items & ( int ) if_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) if_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating If pref in wfmain " < < ( int ) i ;
pif = ( prefIfItem ) i ;
extChangedIfPref ( pif ) ;
}
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedColPrefs ( quint64 items )
{
prefColItem col ;
if ( items & ( int ) col_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) col_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Color pref in wfmain " < < ( int ) i ;
col = ( prefColItem ) i ;
extChangedColPref ( col ) ;
}
}
}
void wfmain : : extChangedRaPrefs ( quint64 items )
2023-02-19 18:29:22 -08:00
{
prefRaItem pra ;
if ( items & ( int ) ra_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) ra_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Ra pref in wfmain " < < ( int ) i ;
pra = ( prefRaItem ) i ;
extChangedRaPref ( pra ) ;
}
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedRsPrefs ( quint64 items )
{
prefRsItem prs ;
if ( items & ( int ) rs_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) rs_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Rs pref in wfmain " < < ( int ) i ;
prs = ( prefRsItem ) i ;
2024-02-05 08:36:23 -08:00
extChangedRsPref ( prs ) ;
2023-05-27 20:26:53 +01:00
}
}
}
void wfmain : : extChangedCtPrefs ( quint64 items )
2023-02-19 18:29:22 -08:00
{
prefCtItem pct ;
if ( items & ( int ) ct_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) ct_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Ct pref in wfmain " < < ( int ) i ;
pct = ( prefCtItem ) i ;
extChangedCtPref ( pct ) ;
}
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedLanPrefs ( quint64 items )
2023-02-19 18:29:22 -08:00
{
prefLanItem plan ;
if ( items & ( int ) l_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) l_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Lan pref in wfmain " < < ( int ) i ;
plan = ( prefLanItem ) i ;
extChangedLanPref ( plan ) ;
}
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedClusterPrefs ( quint64 items )
2023-02-19 18:29:22 -08:00
{
prefClusterItem pcl ;
if ( items & ( int ) cl_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) cl_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Cluster pref in wfmain " < < ( int ) i ;
pcl = ( prefClusterItem ) i ;
extChangedClusterPref ( pcl ) ;
}
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedUdpPrefs ( quint64 items )
2023-02-19 18:29:22 -08:00
{
2023-06-08 21:58:22 +01:00
prefUDPItem upi ;
2023-02-19 18:29:22 -08:00
if ( items & ( int ) u_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) u_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating UDP preference in wfmain: " < < i ;
2023-06-08 21:58:22 +01:00
upi = ( prefUDPItem ) i ;
2023-02-19 18:29:22 -08:00
extChangedUdpPref ( upi ) ;
}
}
}
2023-06-08 21:58:22 +01:00
void wfmain : : extChangedServerPrefs ( quint64 items )
{
prefServerItem svi ;
if ( items & ( int ) u_all )
{
items = 0xffffffff ;
}
for ( int i = 1 ; i < ( int ) u_all ; i = i < < 1 )
{
if ( items & i )
{
qDebug ( logSystem ( ) ) < < " Updating Server preference in wfmain: " < < i ;
svi = ( prefServerItem ) i ;
extChangedServerPref ( svi ) ;
}
}
}
2023-02-19 18:29:22 -08:00
void wfmain : : extChangedIfPref ( prefIfItem i )
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-02-19 18:29:22 -08:00
switch ( i )
{
case if_useFullScreen :
changeFullScreenMode ( prefs . useFullScreen ) ;
break ;
case if_useSystemTheme :
useSystemTheme ( prefs . useSystemTheme ) ;
break ;
case if_drawPeaks :
// depreciated;
break ;
case if_underlayMode :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2025-12-15 09:30:32 +00:00
//receiver->setUnderlayMode(prefs.underlayMode);
2024-01-27 22:13:47 +00:00
}
2023-02-19 18:29:22 -08:00
break ;
case if_underlayBufferSize :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2024-03-30 20:40:27 +00:00
receiver - > resizePlasmaBuffer ( prefs . underlayBufferSize ) ;
2024-01-27 22:13:47 +00:00
}
2023-02-19 18:29:22 -08:00
break ;
case if_wfAntiAlias :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2024-03-30 20:40:27 +00:00
receiver - > wfAntiAliased ( prefs . wfAntiAlias ) ;
2024-01-27 22:13:47 +00:00
}
2023-02-19 18:29:22 -08:00
break ;
case if_wfInterpolate :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2024-03-30 20:40:27 +00:00
receiver - > wfInterpolate ( prefs . wfInterpolate ) ;
2024-01-27 22:13:47 +00:00
}
2023-02-19 18:29:22 -08:00
break ;
case if_wftheme :
// Not in settings widget
break ;
case if_plotFloor :
// Not in settings widget
break ;
case if_plotCeiling :
// Not in settings widget
break ;
case if_stylesheetPath :
// Not in settings widget
break ;
case if_wflength :
// Not in settings widget
break ;
case if_confirmExit :
// Not in settings widget
break ;
case if_confirmPowerOff :
// Not in settings widget
break ;
2024-11-05 18:46:21 +00:00
case if_meter1Type :
changeMeterType ( prefs . meter1Type , 1 ) ;
break ;
2023-02-19 18:29:22 -08:00
case if_meter2Type :
2024-02-05 13:42:00 -08:00
changeMeterType ( prefs . meter2Type , 2 ) ;
break ;
case if_meter3Type :
changeMeterType ( prefs . meter3Type , 3 ) ;
2023-02-19 18:29:22 -08:00
break ;
case if_clickDragTuningEnable :
// There's nothing to do here since the code
// already uses the preference variable as state.
break ;
2024-02-06 11:06:50 -08:00
case if_compMeterReverse :
ui - > meter2Widget - > setCompReverse ( prefs . compMeterReverse ) ;
ui - > meter3Widget - > setCompReverse ( prefs . compMeterReverse ) ;
break ;
2023-05-28 22:11:59 +01:00
case if_rigCreatorEnable :
ui - > rigCreatorBtn - > setEnabled ( prefs . rigCreatorEnable ) ;
break ;
2023-02-19 18:29:22 -08:00
case if_currentColorPresetNumber :
2023-05-28 22:11:59 +01:00
{
colorPrefsType p = colorPreset [ prefs . currentColorPresetNumber ] ;
useColorPreset ( & p ) ;
2023-02-19 18:29:22 -08:00
// TODO.....
break ;
2023-05-28 22:11:59 +01:00
}
2023-09-19 23:04:48 +01:00
case if_frequencyUnits :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > setUnit ( ( FctlUnit ) prefs . frequencyUnits ) ;
2024-01-27 22:13:47 +00:00
}
2023-09-19 23:04:48 +01:00
break ;
2024-12-27 13:26:26 +00:00
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
case if_region :
bandbtns - > setRegion ( prefs . region ) ;
// Allow to fallthrough so that band indicators are updated correctly on region change.
2024-06-12 17:11:01 +01:00
case if_showBands :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-06-12 17:11:01 +01:00
{
receiver - > setBandIndicators ( prefs . showBands , prefs . region , & rigCaps - > bands ) ;
}
break ;
2024-12-27 13:26:26 +00:00
# if defined __GNUC__
# pragma GCC diagnostic pop
# endif
2024-07-23 09:18:27 +01:00
case if_separators :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-07-23 09:18:27 +01:00
{
receiver - > setSeparators ( prefs . groupSeparator , prefs . decimalSeparator ) ;
}
break ;
2023-02-19 18:29:22 -08:00
default :
2023-02-19 22:11:48 -08:00
qWarning ( logSystem ( ) ) < < " Did not understand if pref update in wfmain for item " < < ( int ) i ;
2023-02-19 18:29:22 -08:00
break ;
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedColPref ( prefColItem i )
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
colorPrefsType * cp = & colorPreset [ prefs . currentColorPresetNumber ] ;
// These are all updated by the widget itself
2023-05-27 20:26:53 +01:00
switch ( i )
{
2024-12-30 19:22:26 +00:00
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
2024-10-17 22:46:12 +01:00
// Any updated scope colors will cause the scope colorPreset to be changed.
2024-12-30 19:22:26 +00:00
case col_buttonOff :
case col_buttonOn :
ui - > scopeDualBtn - > setStyleSheet ( QString ( " QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;} " )
. arg ( cp - > buttonOff . name ( QColor : : HexArgb ) , cp - > buttonOn . name ( QColor : : HexArgb ) ) ) ;
ui - > dualWatchBtn - > setStyleSheet ( QString ( " QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;} " )
. arg ( cp - > buttonOff . name ( QColor : : HexArgb ) , cp - > buttonOn . name ( QColor : : HexArgb ) ) ) ;
2025-01-03 20:25:30 +00:00
ui - > splitBtn - > setStyleSheet ( QString ( " QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;} " )
2025-01-01 13:40:58 +00:00
. arg ( cp - > buttonOff . name ( QColor : : HexArgb ) , cp - > buttonOn . name ( QColor : : HexArgb ) ) ) ;
2025-01-03 20:25:30 +00:00
// ui->mainSubTrackingBtn->setStyleSheet(QString("QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;}")
// .arg(cp->buttonOff.name(QColor::HexArgb),cp->buttonOn.name(QColor::HexArgb)));
2023-05-27 20:26:53 +01:00
case col_grid :
2023-05-28 22:11:59 +01:00
case col_axis :
case col_text :
case col_plotBackground :
case col_spectrumLine :
case col_spectrumFill :
2024-04-14 21:56:34 -07:00
case col_useSpectrumFillGradient :
case col_spectrumFillTop :
case col_spectrumFillBot :
2023-05-28 22:11:59 +01:00
case col_underlayLine :
case col_underlayFill :
2024-04-14 21:56:34 -07:00
case col_underlayFillTop :
case col_underlayFillBot :
case col_useUnderlayFillGradient :
2023-05-28 22:11:59 +01:00
case col_tuningLine :
case col_passband :
case col_pbtIndicator :
2023-06-01 17:57:44 +01:00
case col_waterfallBack :
case col_waterfallGrid :
case col_waterfallAxis :
case col_waterfallText :
case col_clusterSpots :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > colorPreset ( cp ) ;
2024-01-27 22:13:47 +00:00
}
2023-05-28 22:11:59 +01:00
break ;
2024-10-17 22:46:12 +01:00
// Any updated meter colors, will cause the meter to be updated.
2023-05-28 22:11:59 +01:00
case col_meterLevel :
case col_meterAverage :
case col_meterPeakLevel :
case col_meterHighScale :
case col_meterScale :
case col_meterText :
ui - > meterSPoWidget - > setColors ( cp - > meterLevel , cp - > meterPeakScale , cp - > meterPeakLevel , cp - > meterAverage , cp - > meterLowerLine , cp - > meterLowText ) ;
ui - > meter2Widget - > setColors ( cp - > meterLevel , cp - > meterPeakScale , cp - > meterPeakLevel , cp - > meterAverage , cp - > meterLowerLine , cp - > meterLowText ) ;
2024-02-05 13:42:00 -08:00
ui - > meter3Widget - > setColors ( cp - > meterLevel , cp - > meterPeakScale , cp - > meterPeakLevel , cp - > meterAverage , cp - > meterLowerLine , cp - > meterLowText ) ;
2023-05-28 22:11:59 +01:00
break ;
2024-12-30 19:22:26 +00:00
# if defined __GNUC__
# pragma GCC diagnostic pop
# endif
2023-05-27 20:26:53 +01:00
default :
qWarning ( logSystem ( ) ) < < " Cannot update wfmain col pref " < < ( int ) i ;
}
}
2023-02-19 18:29:22 -08:00
void wfmain : : extChangedRaPref ( prefRaItem i )
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-02-19 22:11:48 -08:00
// Radio Access Prefs
switch ( i )
{
case ra_radioCIVAddr :
if ( prefs . radioCIVAddr = = 0 ) {
showStatusBarText ( " Setting radio CI-V address to: 'auto'. Make sure CI-V Transceive is enabled on the radio. " ) ;
} else {
2025-08-09 10:41:29 +01:00
showStatusBarText ( QString ( " Setting radio CI-V address to: 0x%1. Press Save Settings to retain. " ) . arg ( prefs . radioCIVAddr , 2 , 16 ) ) ;
2023-02-19 22:11:48 -08:00
}
break ;
case ra_CIVisRadioModel :
break ;
2024-12-30 14:19:52 +00:00
case ra_pttType :
// Not used as cannot be connected to radio when this is updated.
2023-02-19 22:11:48 -08:00
break ;
case ra_polling_ms :
if ( prefs . polling_ms = = 0 )
{
// Automatic
qInfo ( logSystem ( ) ) < < " User set radio polling interval to automatic. " ;
calculateTimingParameters ( ) ;
} else {
// Manual
changePollTiming ( prefs . polling_ms ) ;
}
break ;
case ra_serialPortRadio :
{
2023-09-22 19:06:09 +01:00
prefs . serialPortRadio = prefs . serialPortRadio ;
showStatusBarText ( QString ( " Changed serial port to %1. Press Save Settings to retain. " ) . arg ( prefs . serialPortRadio ) ) ;
2023-02-19 22:11:48 -08:00
break ;
}
case ra_serialPortBaud :
prefs . serialPortBaud = prefs . serialPortBaud ;
serverConfig . baudRate = prefs . serialPortBaud ;
showStatusBarText ( QString ( " Changed baud rate to %1 bps. Press Save Settings to retain. " ) . arg ( prefs . serialPortBaud ) ) ;
break ;
case ra_virtualSerialPort :
break ;
case ra_localAFgain :
// Not handled here.
break ;
case ra_audioSystem :
2023-05-28 22:11:59 +01:00
// Not handled here
2023-02-19 22:11:48 -08:00
break ;
2025-01-11 13:43:40 +00:00
case ra_manufacturer :
setManufacturer ( prefs . manufacturer ) ;
break ;
2023-02-19 22:11:48 -08:00
default :
qWarning ( logSystem ( ) ) < < " Cannot update wfmain ra pref " < < ( int ) i ;
}
2023-02-19 18:29:22 -08:00
}
2025-01-11 13:43:40 +00:00
void wfmain : : setManufacturer ( manufacturersType_t man )
{
this - > rigList . clear ( ) ;
2025-01-14 13:35:14 +00:00
qInfo ( ) < < " Searching for radios with Manufacturer = " < < man ;
2025-01-11 13:43:40 +00:00
# ifndef Q_OS_LINUX
QString systemRigLocation = QCoreApplication : : applicationDirPath ( ) ;
# else
QString systemRigLocation = PREFIX ;
# endif
# ifdef Q_OS_LINUX
systemRigLocation + = " /share/wfview/rigs " ;
# else
systemRigLocation + = " /rigs " ;
# endif
QDir systemRigDir ( systemRigLocation ) ;
if ( ! systemRigDir . exists ( ) ) {
qWarning ( ) < < " ********* Rig directory does not exist ******** " ;
} else {
QStringList rigs = systemRigDir . entryList ( QStringList ( ) < < " *.rig " < < " *.RIG " , QDir : : Files ) ;
for ( QString & rig : rigs ) {
QSettings * rigSettings = new QSettings ( systemRigDir . absoluteFilePath ( rig ) , QSettings : : Format : : IniFormat ) ;
# if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
rigSettings - > setIniCodec ( " UTF-8 " ) ;
# endif
if ( ! rigSettings - > childGroups ( ) . contains ( " Rig " ) )
{
qWarning ( ) < < rig < < " Does not seem to be a rig description file " ;
delete rigSettings ;
continue ;
}
float ver = rigSettings - > value ( " Version " , " 0.0 " ) . toString ( ) . toFloat ( ) ;
rigSettings - > beginGroup ( " Rig " ) ;
2025-01-14 13:35:14 +00:00
manufacturersType_t manuf = rigSettings - > value ( " Manufacturer " , manufIcom ) . value < manufacturersType_t > ( ) ;
if ( manuf = = man ) {
2025-05-16 20:02:31 +01:00
quint16 civ = rigSettings - > value ( " CIVAddress " , 0 ) . toInt ( ) ;
2025-01-14 13:35:14 +00:00
QString model = rigSettings - > value ( " Model " , " " ) . toString ( ) ;
QString path = systemRigDir . absoluteFilePath ( rig ) ;
2025-05-10 12:35:35 +01:00
qDebug ( ) < < QString ( " Found Rig %0 with CI-V address of 0x%1 and version %2 " ) . arg ( model ) . arg ( civ , 4 , 16 , QChar ( ' 0 ' ) ) . arg ( ver , 0 , ' f ' , 2 ) ;
2025-01-14 13:35:14 +00:00
// Any user modified rig files will override system provided ones.
this - > rigList . insert ( civ , rigInfo ( civ , model , path , ver ) ) ;
}
2025-01-11 13:43:40 +00:00
rigSettings - > endGroup ( ) ;
delete rigSettings ;
}
}
QString userRigLocation = QStandardPaths : : writableLocation ( QStandardPaths : : AppDataLocation ) + " /rigs " ;
QDir userRigDir ( userRigLocation ) ;
if ( userRigDir . exists ( ) ) {
QStringList rigs = userRigDir . entryList ( QStringList ( ) < < " *.rig " < < " *.RIG " , QDir : : Files ) ;
for ( QString & rig : rigs ) {
QSettings * rigSettings = new QSettings ( userRigDir . absoluteFilePath ( rig ) , QSettings : : Format : : IniFormat ) ;
# if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
rigSettings - > setIniCodec ( " UTF-8 " ) ;
# endif
if ( ! rigSettings - > childGroups ( ) . contains ( " Rig " ) )
{
qWarning ( ) < < rig < < " Does not seem to be a rig description file " ;
delete rigSettings ;
continue ;
}
float ver = rigSettings - > value ( " Version " , " 0.0 " ) . toString ( ) . toFloat ( ) ;
rigSettings - > beginGroup ( " Rig " ) ;
2025-01-14 13:35:14 +00:00
manufacturersType_t manuf = rigSettings - > value ( " Manufacturer " , manufIcom ) . value < manufacturersType_t > ( ) ;
if ( manuf = = man ) {
2025-05-16 20:02:31 +01:00
quint16 civ = rigSettings - > value ( " CIVAddress " , 0 ) . toInt ( ) ;
2025-01-14 13:35:14 +00:00
QString model = rigSettings - > value ( " Model " , " " ) . toString ( ) ;
QString path = userRigDir . absoluteFilePath ( rig ) ;
2025-01-11 13:43:40 +00:00
2025-01-14 13:35:14 +00:00
auto it = this - > rigList . find ( civ ) ;
2025-01-11 13:43:40 +00:00
2025-01-14 13:35:14 +00:00
if ( it ! = this - > rigList . end ( ) )
{
if ( ver > = it . value ( ) . version ) {
2025-05-10 12:35:35 +01:00
qInfo ( ) < < QString ( " Found User Rig %0 with CI-V address of 0x%1 and newer or same version than system one (%2>=%3) " ) . arg ( model ) . arg ( civ , 4 , 16 , QChar ( ' 0 ' ) ) . arg ( ver , 0 , ' f ' , 2 ) . arg ( it . value ( ) . version , 0 , ' f ' , 2 ) ;
2025-01-14 13:35:14 +00:00
this - > rigList . insert ( civ , rigInfo ( civ , model , path , ver ) ) ;
}
} else {
2025-05-10 12:35:35 +01:00
qInfo ( ) < < QString ( " Found New User Rig %0 with CI-V address of 0x%1 version %2 " ) . arg ( model ) . arg ( civ , 4 , 16 , QChar ( ' 0 ' ) ) . arg ( ver , 0 , ' f ' , 2 ) ;
2025-01-11 13:43:40 +00:00
this - > rigList . insert ( civ , rigInfo ( civ , model , path , ver ) ) ;
}
2025-01-14 13:35:14 +00:00
// Any user modified rig files will override system provided ones.
2025-01-11 13:43:40 +00:00
}
rigSettings - > endGroup ( ) ;
delete rigSettings ;
}
}
}
2023-05-27 20:26:53 +01:00
void wfmain : : extChangedRsPref ( prefRsItem i )
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-05-27 20:26:53 +01:00
// Radio Settings prefs
switch ( i )
{
case rs_dataOffMod :
2025-01-24 12:37:52 +00:00
queue - > add ( priorityImmediate , queueItem ( funcDATAOffMod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 0 ] ) , false , currentReceiver ) ) ;
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 0 ] . type ) . cmd , true , currentReceiver ) ) ;
2023-05-27 20:26:53 +01:00
break ;
case rs_data1Mod :
2025-01-24 12:37:52 +00:00
queue - > add ( priorityImmediate , queueItem ( funcDATA1Mod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 1 ] ) , false , currentReceiver ) ) ;
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 1 ] . type ) . cmd , true , currentReceiver ) ) ;
2023-05-27 20:26:53 +01:00
break ;
case rs_data2Mod :
2025-01-24 12:37:52 +00:00
queue - > add ( priorityImmediate , queueItem ( funcDATA2Mod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 2 ] ) , false , currentReceiver ) ) ;
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 2 ] . type ) . cmd , true , currentReceiver ) ) ;
2023-05-27 20:26:53 +01:00
break ;
case rs_data3Mod :
2025-01-24 12:37:52 +00:00
queue - > add ( priorityImmediate , queueItem ( funcDATA3Mod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 3 ] ) , false , currentReceiver ) ) ;
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 3 ] . type ) . cmd , true , currentReceiver ) ) ;
2023-05-27 20:26:53 +01:00
break ;
2023-06-08 08:20:50 +01:00
case rs_setClock :
setRadioTimeDatePrep ( ) ;
2023-09-30 11:08:20 +01:00
break ;
2023-06-08 08:20:50 +01:00
case rs_pttOn :
if ( ! prefs . enablePTT )
{
showStatusBarText ( " PTT is disabled, not sending command. Change under Settings tab. " ) ;
return ;
}
showStatusBarText ( " Sending PTT ON command. Use Control-R to receive. " ) ;
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( true ) , false , uchar ( 0 ) ) ) ;
2023-06-08 08:20:50 +01:00
pttTimer - > start ( ) ;
break ;
case rs_pttOff :
showStatusBarText ( " Sending PTT OFF command " ) ;
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( false ) , false , uchar ( 0 ) ) ) ;
2023-06-08 08:20:50 +01:00
pttTimer - > stop ( ) ;
break ;
case rs_satOps :
sat - > show ( ) ;
break ;
case rs_adjRef :
cal - > show ( ) ;
break ;
2023-05-27 20:26:53 +01:00
case rs_clockUseUtc :
2025-01-11 12:32:31 +00:00
case rs_setRadioTime :
2023-05-27 20:26:53 +01:00
break ;
default :
qWarning ( logSystem ( ) ) < < " Cannot update wfmain rs pref " < < ( int ) i ;
}
}
2023-02-19 18:29:22 -08:00
void wfmain : : extChangedCtPref ( prefCtItem i )
{
2024-12-31 18:38:43 +00:00
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-02-19 22:11:48 -08:00
switch ( i )
{
case ct_enablePTT :
break ;
case ct_niceTS :
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > setTuningFloorZeros ( prefs . niceTS ) ;
2024-01-27 22:13:47 +00:00
}
2023-02-19 22:11:48 -08:00
break ;
case ct_automaticSidebandSwitching :
finputbtns - > setAutomaticSidebandSwitching ( prefs . automaticSidebandSwitching ) ;
break ;
case ct_enableUSBControllers :
2023-06-08 08:20:50 +01:00
# if defined (USB_CONTROLLER)
2026-01-02 18:59:51 +00:00
if ( usbControllerThread ! = nullptr ) {
2023-06-08 08:20:50 +01:00
usbControllerThread - > quit ( ) ;
usbControllerThread - > wait ( ) ;
2026-01-02 18:59:51 +00:00
usbControllerThread = nullptr ;
usbWindow = nullptr ;
2023-06-08 08:20:50 +01:00
}
if ( prefs . enableUSBControllers ) {
// Setup USB Controller
setupUsbControllerDevice ( ) ;
emit initUsbController ( & usbMutex , & usbDevices , & usbButtons , & usbKnobs ) ;
}
# endif
break ;
case ct_USBControllersSetup :
2026-01-02 18:59:51 +00:00
if ( usbWindow ! = nullptr ) {
2023-06-08 08:20:50 +01:00
if ( usbWindow - > isVisible ( ) ) {
usbWindow - > hide ( ) ;
}
else {
qInfo ( logUsbControl ( ) ) < < " Showing USB Controller window " ;
usbWindow - > show ( ) ;
usbWindow - > raise ( ) ;
}
}
2023-02-19 22:11:48 -08:00
break ;
2023-06-08 08:20:50 +01:00
case ct_USBControllersReset :
{
int ret = QMessageBox : : warning ( this , tr ( " wfview " ) ,
tr ( " Are you sure you wish to reset the USB controllers? " ) ,
QMessageBox : : Ok | QMessageBox : : Cancel ,
QMessageBox : : Cancel ) ;
if ( ret = = QMessageBox : : Ok ) {
qInfo ( logUsbControl ( ) ) < < " Resetting USB controllers to default values " ;
2023-11-26 17:00:35 +00:00
# if defined(USB_CONTROLLER)
2023-06-08 08:20:50 +01:00
usbButtons . clear ( ) ;
usbKnobs . clear ( ) ;
usbDevices . clear ( ) ;
2023-11-26 17:00:35 +00:00
# endif
2023-06-08 08:20:50 +01:00
if ( prefs . enableUSBControllers )
extChangedCtPref ( ct_enableUSBControllers ) ;
}
2023-02-19 22:11:48 -08:00
break ;
2023-06-08 08:20:50 +01:00
}
2023-02-19 22:11:48 -08:00
default :
qWarning ( logGui ( ) ) < < " No UI element matches setting " < < ( int ) i ;
break ;
}
2023-02-19 18:29:22 -08:00
}
void wfmain : : extChangedLanPref ( prefLanItem i )
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-02-19 23:12:36 -08:00
switch ( i )
{
case l_enableLAN :
ui - > connectBtn - > setEnabled ( true ) ; // always set, not sure why.
break ;
case l_enableRigCtlD :
2024-12-29 14:59:52 +00:00
if ( connStatus = = connConnected )
enableRigCtl ( prefs . enableRigCtlD ) ;
2023-02-19 23:12:36 -08:00
break ;
case l_rigCtlPort :
// no action
break ;
case l_tcpPort :
// no action
break ;
case l_waterfallFormat :
// no action
break ;
default :
qWarning ( logSystem ( ) ) < < " Did not find matching preference in wfmain for LAN ui update: " < < ( int ) i ;
}
2023-02-19 18:29:22 -08:00
}
void wfmain : : extChangedClusterPref ( prefClusterItem i )
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-02-20 13:45:33 -08:00
switch ( i )
{
case cl_clusterUdpEnable :
emit setClusterEnableUdp ( prefs . clusterUdpEnable ) ;
break ;
case cl_clusterTcpEnable :
emit setClusterEnableTcp ( prefs . clusterTcpEnable ) ;
break ;
case cl_clusterUdpPort :
emit setClusterUdpPort ( prefs . clusterUdpPort ) ;
break ;
case cl_clusterTcpServerName :
emit setClusterServerName ( prefs . clusterTcpServerName ) ;
break ;
case cl_clusterTcpUserName :
emit setClusterUserName ( prefs . clusterTcpUserName ) ;
break ;
case cl_clusterTcpPassword :
emit setClusterPassword ( prefs . clusterTcpPassword ) ;
break ;
case cl_clusterTcpPort :
emit setClusterTcpPort ( prefs . clusterTcpPort ) ;
break ;
case cl_clusterTimeout :
// Used?
emit setClusterTimeout ( prefs . clusterTimeout ) ;
break ;
case cl_clusterSkimmerSpotsEnable :
emit setClusterSkimmerSpots ( prefs . clusterSkimmerSpotsEnable ) ;
break ;
2023-06-11 10:33:16 +01:00
case cl_clusterTcpConnect :
emit setClusterEnableTcp ( false ) ;
emit setClusterServerName ( prefs . clusterTcpServerName ) ;
emit setClusterUserName ( prefs . clusterTcpUserName ) ;
emit setClusterPassword ( prefs . clusterTcpPassword ) ;
emit setClusterTcpPort ( prefs . clusterTcpPort ) ;
emit setClusterTimeout ( prefs . clusterTimeout ) ;
emit setClusterSkimmerSpots ( prefs . clusterSkimmerSpotsEnable ) ;
emit setClusterEnableTcp ( true ) ;
break ;
case cl_clusterTcpDisconnect :
emit setClusterEnableTcp ( false ) ;
break ;
2023-02-20 13:45:33 -08:00
default :
qWarning ( logSystem ( ) ) < < " Did not find matching preference element in wfmain for cluster preference " < < ( int ) i ;
break ;
}
2023-02-19 18:29:22 -08:00
}
2023-06-08 21:58:22 +01:00
void wfmain : : extChangedUdpPref ( prefUDPItem i )
2023-02-19 18:29:22 -08:00
{
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = true ;
2023-02-20 20:45:55 -08:00
switch ( i )
{
case u_ipAddress :
break ;
case u_controlLANPort :
break ;
case u_serialLANPort :
// Not used in the UI.
break ;
case u_audioLANPort :
// Not used in the UI.
break ;
2025-06-04 00:29:12 +01:00
case u_scopeLANPort :
// Not used in the UI.
break ;
2023-02-20 20:45:55 -08:00
case u_username :
break ;
case u_password :
break ;
case u_clientName :
// Not used in the UI.
break ;
case u_halfDuplex :
break ;
2023-05-28 22:11:59 +01:00
case u_sampleRate :
break ;
case u_rxCodec :
break ;
case u_txCodec :
break ;
case u_rxLatency :
// Should be updated immediately
emit sendChangeLatency ( prefs . rxSetup . latency ) ;
break ;
case u_txLatency :
break ;
case u_audioInput :
break ;
case u_audioOutput :
break ;
2025-01-20 02:30:14 +00:00
case u_connectionType :
break ;
2025-01-24 12:37:52 +00:00
case u_adminLogin :
break ;
2023-02-20 20:45:55 -08:00
default :
qWarning ( logGui ( ) ) < < " Did not find matching pref element in wfmain for UDP pref item " < < ( int ) i ;
break ;
}
2021-12-30 00:48:39 +00:00
}
2021-02-16 16:16:46 +00:00
2023-06-08 21:58:22 +01:00
void wfmain : : extChangedServerPref ( prefServerItem i )
{
prefs . settingsChanged = true ;
switch ( i )
{
case s_enabled :
setServerToPrefs ( ) ;
break ;
2025-01-05 15:39:20 +00:00
case s_disableui :
break ;
2023-06-08 21:58:22 +01:00
case s_lan :
break ;
case s_controlPort :
break ;
case s_civPort :
break ;
case s_audioPort :
break ;
case s_audioOutput :
break ;
case s_audioInput :
break ;
case s_resampleQuality :
break ;
case s_baudRate :
break ;
case s_users :
2025-02-03 20:20:40 +00:00
//qInfo() << "Server users updated :" << serverConfig.users.count() << "total users";
2023-06-08 21:58:22 +01:00
break ;
case s_rigs :
break ;
default :
qWarning ( logGui ( ) ) < < " Did not find matching pref element in wfmain for Server pref item " < < ( int ) i ;
break ;
}
}
2018-11-24 00:10:05 -08:00
void wfmain : : saveSettings ( )
{
2021-05-20 19:24:40 +01:00
qInfo ( logSystem ( ) ) < < " Saving settings to " < < settings - > fileName ( ) ;
2018-11-24 00:10:05 -08:00
// Basic things to load:
2023-05-28 22:11:59 +01:00
prefs . settingsChanged = false ;
2023-01-17 21:09:54 -08:00
2023-01-17 21:13:16 -08:00
QString versionstr = QString ( WFVIEW_VERSION ) ;
QString majorVersion = " -1 " ;
QString minorVersion = " -1 " ;
if ( versionstr . contains ( " . " ) & & ( versionstr . split ( " . " ) . length ( ) = = 2 ) )
{
majorVersion = versionstr . split ( " . " ) . at ( 0 ) ;
minorVersion = versionstr . split ( " . " ) . at ( 1 ) ;
}
2023-01-17 21:09:54 -08:00
2022-11-26 20:53:12 -08:00
settings - > beginGroup ( " Program " ) ;
2023-01-17 21:09:54 -08:00
settings - > setValue ( " version " , versionstr ) ;
2023-01-17 21:13:16 -08:00
settings - > setValue ( " majorVersion " , int ( majorVersion . toInt ( ) ) ) ;
settings - > setValue ( " minorVersion " , int ( minorVersion . toInt ( ) ) ) ;
2023-01-17 21:09:54 -08:00
settings - > setValue ( " gitShort " , QString ( GITSHORT ) ) ;
2024-04-14 15:59:16 -07:00
settings - > setValue ( " hasRunSetup " , prefs . hasRunSetup ) ;
2022-11-26 20:53:12 -08:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
// UI: (full screen, dark theme, draw peaks, colors, etc)
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Interface " ) ;
settings - > setValue ( " UseFullScreen " , prefs . useFullScreen ) ;
settings - > setValue ( " UseSystemTheme " , prefs . useSystemTheme ) ;
2023-04-02 21:09:37 +01:00
settings - > setValue ( " WFEnable " , prefs . wfEnable ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " DrawPeaks " , prefs . drawPeaks ) ;
2022-08-17 18:41:35 -07:00
settings - > setValue ( " underlayMode " , prefs . underlayMode ) ;
2022-08-17 18:46:00 -07:00
settings - > setValue ( " underlayBufferSize " , prefs . underlayBufferSize ) ;
2021-07-14 22:44:05 -07:00
settings - > setValue ( " WFAntiAlias " , prefs . wfAntiAlias ) ;
settings - > setValue ( " WFInterpolate " , prefs . wfInterpolate ) ;
2023-09-26 10:32:56 +01:00
settings - > setValue ( " MainWFTheme " , prefs . mainWfTheme ) ;
settings - > setValue ( " SubWFTheme " , prefs . subWfTheme ) ;
settings - > setValue ( " MainPlotFloor " , prefs . mainPlotFloor ) ;
settings - > setValue ( " SubPlotFloor " , prefs . subPlotFloor ) ;
settings - > setValue ( " MainPlotCeiling " , prefs . mainPlotCeiling ) ;
settings - > setValue ( " SubPlotCeiling " , prefs . subPlotCeiling ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " StylesheetPath " , prefs . stylesheetPath ) ;
2023-06-01 17:57:44 +01:00
//settings->setValue("splitter", ui->splitter->saveState());
2021-05-20 19:24:40 +01:00
settings - > setValue ( " windowGeometry " , saveGeometry ( ) ) ;
2025-05-03 01:07:14 +01:00
2026-01-02 18:59:51 +00:00
if ( bandbtns ! = nullptr )
2025-05-03 01:07:14 +01:00
settings - > setValue ( " BandWindowGeometry " , bandbtns - > getGeometry ( ) ) ;
2026-01-02 18:59:51 +00:00
if ( finputbtns ! = nullptr )
2025-05-03 01:07:14 +01:00
settings - > setValue ( " FreqWindowGeometry " , finputbtns - > getGeometry ( ) ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " windowState " , saveState ( ) ) ;
2023-09-26 10:32:56 +01:00
settings - > setValue ( " MainWFLength " , prefs . mainWflength ) ;
settings - > setValue ( " SubWFLength " , prefs . subWflength ) ;
2021-07-11 17:30:02 +01:00
settings - > setValue ( " ConfirmExit " , prefs . confirmExit ) ;
2021-07-20 14:45:44 +01:00
settings - > setValue ( " ConfirmPowerOff " , prefs . confirmPowerOff ) ;
2024-05-04 23:40:34 +01:00
settings - > setValue ( " ConfirmSettingsChanged " , prefs . confirmSettingsChanged ) ;
2024-11-12 13:42:14 +00:00
settings - > setValue ( " ConfirmMmories " , prefs . confirmMemories ) ;
2024-11-05 18:46:21 +00:00
settings - > setValue ( " Meter1Type " , ( int ) prefs . meter1Type ) ;
2021-08-27 18:06:09 +01:00
settings - > setValue ( " Meter2Type " , ( int ) prefs . meter2Type ) ;
2024-02-05 13:42:00 -08:00
settings - > setValue ( " Meter3Type " , ( int ) prefs . meter3Type ) ;
2024-02-06 11:06:50 -08:00
settings - > setValue ( " compMeterReverse " , prefs . compMeterReverse ) ;
2022-10-11 13:17:23 +01:00
settings - > setValue ( " ClickDragTuning " , prefs . clickDragTuningEnable ) ;
2025-01-11 12:32:31 +00:00
settings - > setValue ( " UseUTC " , prefs . useUTC ) ;
settings - > setValue ( " SetRadioTime " , prefs . setRadioTime ) ;
2023-05-28 22:11:59 +01:00
settings - > setValue ( " RigCreator " , prefs . rigCreatorEnable ) ;
2023-09-19 23:04:48 +01:00
settings - > setValue ( " FrequencyUnits " , prefs . frequencyUnits ) ;
2024-06-12 17:11:01 +01:00
settings - > setValue ( " Region " , prefs . region ) ;
settings - > setValue ( " ShowBands " , prefs . showBands ) ;
2024-07-23 09:18:27 +01:00
settings - > setValue ( " GroupSeparator " , prefs . groupSeparator ) ;
settings - > setValue ( " DecimalSeparator " , prefs . decimalSeparator ) ;
2025-01-18 12:29:34 +00:00
settings - > setValue ( " ForceVfoMode " , prefs . forceVfoMode ) ;
2025-05-06 18:29:08 +01:00
settings - > setValue ( " AutoPowerOn " , prefs . autoPowerOn ) ;
2025-01-18 12:29:34 +00:00
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
// Radio and Comms: C-IV addr, port to use
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Radio " ) ;
2025-01-14 13:35:14 +00:00
settings - > setValue ( " Manufacturer " , prefs . manufacturer ) ;
2025-09-07 11:28:41 +01:00
2021-05-20 19:24:40 +01:00
settings - > setValue ( " RigCIVuInt " , prefs . radioCIVAddr ) ;
2021-11-06 23:59:03 -07:00
settings - > setValue ( " CIVisRadioModel " , prefs . CIVisRadioModel ) ;
2024-12-30 14:19:52 +00:00
settings - > setValue ( " PTTType " , prefs . pttType ) ;
2022-11-26 21:43:47 -08:00
settings - > setValue ( " polling_ms " , prefs . polling_ms ) ; // 0 = automatic
2025-01-06 12:51:56 +00:00
if ( ! prefs . serialPortRadio . isEmpty ( ) )
settings - > setValue ( " SerialPortRadio " , prefs . serialPortRadio ) ;
if ( prefs . serialPortBaud ! = 0 )
settings - > setValue ( " SerialPortBaud " , prefs . serialPortBaud ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " VirtualSerialPort " , prefs . virtualSerialPort ) ;
2021-07-05 16:45:19 -07:00
settings - > setValue ( " localAFgain " , prefs . localAFgain ) ;
2022-05-12 01:46:20 +01:00
settings - > setValue ( " AudioSystem " , prefs . audioSystem ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
// Misc. user settings (enable PTT, draw peaks, etc)
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Controls " ) ;
settings - > setValue ( " EnablePTT " , prefs . enablePTT ) ;
settings - > setValue ( " NiceTS " , prefs . niceTS ) ;
2023-01-18 23:17:28 -08:00
settings - > setValue ( " automaticSidebandSwitching " , prefs . automaticSidebandSwitching ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
settings - > beginGroup ( " LAN " ) ;
settings - > setValue ( " EnableLAN " , prefs . enableLAN ) ;
settings - > setValue ( " EnableRigCtlD " , prefs . enableRigCtlD ) ;
2022-04-08 14:40:05 +01:00
settings - > setValue ( " TcpServerPort " , prefs . tcpPort ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " RigCtlPort " , prefs . rigCtlPort ) ;
2023-07-06 10:36:11 +01:00
settings - > setValue ( " TCPServerPort " , prefs . tcpPort ) ;
settings - > setValue ( " TCIServerPort " , prefs . tciPort ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " IPAddress " , udpPrefs . ipAddress ) ;
settings - > setValue ( " ControlLANPort " , udpPrefs . controlLANPort ) ;
settings - > setValue ( " SerialLANPort " , udpPrefs . serialLANPort ) ;
settings - > setValue ( " AudioLANPort " , udpPrefs . audioLANPort ) ;
2025-06-04 00:29:12 +01:00
settings - > setValue ( " ScopeLANPort " , udpPrefs . scopeLANPort ) ;
2025-01-24 12:37:52 +00:00
settings - > setValue ( " AdminLogin " , udpPrefs . adminLogin ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " Username " , udpPrefs . username ) ;
settings - > setValue ( " Password " , udpPrefs . password ) ;
2023-05-28 22:11:59 +01:00
settings - > setValue ( " AudioRXLatency " , prefs . rxSetup . latency ) ;
settings - > setValue ( " AudioTXLatency " , prefs . txSetup . latency ) ;
settings - > setValue ( " AudioRXSampleRate " , prefs . rxSetup . sampleRate ) ;
settings - > setValue ( " AudioRXCodec " , prefs . rxSetup . codec ) ;
settings - > setValue ( " AudioTXSampleRate " , prefs . txSetup . sampleRate ) ;
settings - > setValue ( " AudioTXCodec " , prefs . txSetup . codec ) ;
2025-01-06 12:51:56 +00:00
if ( ! prefs . rxSetup . name . isEmpty ( ) )
settings - > setValue ( " AudioOutput " , prefs . rxSetup . name ) ;
if ( ! prefs . txSetup . name . isEmpty ( ) )
settings - > setValue ( " AudioInput " , prefs . txSetup . name ) ;
2023-05-28 22:11:59 +01:00
settings - > setValue ( " ResampleQuality " , prefs . rxSetup . resampleQuality ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " ClientName " , udpPrefs . clientName ) ;
2022-04-18 20:29:50 +01:00
settings - > setValue ( " WaterfallFormat " , prefs . waterfallFormat ) ;
2023-01-27 01:41:35 +00:00
settings - > setValue ( " HalfDuplex " , udpPrefs . halfDuplex ) ;
2025-01-17 00:43:57 +00:00
settings - > setValue ( " ConnectionType " , udpPrefs . connectionType ) ;
2022-04-18 20:29:50 +01:00
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2021-02-03 19:36:35 +00:00
2018-11-24 00:10:05 -08:00
// Memory channels
2021-05-20 19:24:40 +01:00
settings - > beginGroup ( " Memory " ) ;
settings - > beginWriteArray ( " Channel " , ( int ) mem . getNumPresets ( ) ) ;
2018-11-24 00:10:05 -08:00
preset_kind temp ;
2022-05-17 08:53:24 +01:00
for ( int i = 0 ; i < ( int ) mem . getNumPresets ( ) ; i + + )
2018-11-24 00:10:05 -08:00
{
temp = mem . getPreset ( ( int ) i ) ;
2021-05-20 19:24:40 +01:00
settings - > setArrayIndex ( i ) ;
settings - > setValue ( " chan " , i ) ;
settings - > setValue ( " freq " , temp . frequency ) ;
settings - > setValue ( " mode " , temp . mode ) ;
settings - > setValue ( " isSet " , temp . isSet ) ;
2018-11-24 00:10:05 -08:00
}
2021-05-20 19:24:40 +01:00
settings - > endArray ( ) ;
settings - > endGroup ( ) ;
2018-11-24 00:10:05 -08:00
2022-08-22 16:49:35 -07:00
// Color presets:
settings - > beginGroup ( " ColorPresets " ) ;
settings - > setValue ( " currentColorPresetNumber " , prefs . currentColorPresetNumber ) ;
settings - > beginWriteArray ( " ColorPreset " , numColorPresetsTotal ) ;
colorPrefsType * p ;
for ( int pn = 0 ; pn < numColorPresetsTotal ; pn + + )
{
p = & ( colorPreset [ pn ] ) ;
settings - > setArrayIndex ( pn ) ;
settings - > setValue ( " presetNum " , p - > presetNum ) ;
settings - > setValue ( " presetName " , * ( p - > presetName ) ) ;
settings - > setValue ( " gridColor " , p - > gridColor . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " axisColor " , p - > axisColor . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " textColor " , p - > textColor . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " spectrumLine " , p - > spectrumLine . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " spectrumFill " , p - > spectrumFill . name ( QColor : : HexArgb ) ) ;
2024-04-14 21:56:34 -07:00
settings - > setValue ( " useSpectrumFillGradient " , p - > useSpectrumFillGradient ) ;
settings - > setValue ( " spectrumFillTop " , p - > spectrumFillTop . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " spectrumFillBot " , p - > spectrumFillBot . name ( QColor : : HexArgb ) ) ;
2022-08-22 16:49:35 -07:00
settings - > setValue ( " underlayLine " , p - > underlayLine . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " underlayFill " , p - > underlayFill . name ( QColor : : HexArgb ) ) ;
2024-04-14 21:56:34 -07:00
settings - > setValue ( " useUnderlayFillGradient " , p - > useUnderlayFillGradient ) ;
settings - > setValue ( " underlayFillTop " , p - > underlayFillTop . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " underlayFillBot " , p - > underlayFillBot . name ( QColor : : HexArgb ) ) ;
2022-08-22 16:49:35 -07:00
settings - > setValue ( " plotBackground " , p - > plotBackground . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " tuningLine " , p - > tuningLine . name ( QColor : : HexArgb ) ) ;
2022-09-26 11:59:16 +01:00
settings - > setValue ( " passband " , p - > passband . name ( QColor : : HexArgb ) ) ;
2023-01-19 16:16:47 +00:00
settings - > setValue ( " pbt " , p - > pbt . name ( QColor : : HexArgb ) ) ;
2022-08-22 16:49:35 -07:00
settings - > setValue ( " wfBackground " , p - > wfBackground . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " wfGrid " , p - > wfGrid . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " wfAxis " , p - > wfAxis . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " wfText " , p - > wfText . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " meterLevel " , p - > meterLevel . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " meterAverage " , p - > meterAverage . name ( QColor : : HexArgb ) ) ;
2022-08-22 21:22:01 -07:00
settings - > setValue ( " meterPeakScale " , p - > meterPeakScale . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " meterPeakLevel " , p - > meterPeakLevel . name ( QColor : : HexArgb ) ) ;
2022-08-22 16:49:35 -07:00
settings - > setValue ( " meterLowerLine " , p - > meterLowerLine . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " meterLowText " , p - > meterLowText . name ( QColor : : HexArgb ) ) ;
2022-10-09 14:23:07 +01:00
settings - > setValue ( " clusterSpots " , p - > clusterSpots . name ( QColor : : HexArgb ) ) ;
2024-12-30 19:22:26 +00:00
settings - > setValue ( " buttonOff " , p - > buttonOff . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " buttonOn " , p - > buttonOn . name ( QColor : : HexArgb ) ) ;
2022-08-22 16:49:35 -07:00
}
settings - > endArray ( ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
settings - > beginGroup ( " Server " ) ;
settings - > setValue ( " ServerEnabled " , serverConfig . enabled ) ;
2025-01-05 15:39:20 +00:00
settings - > setValue ( " DisableUI " , serverConfig . disableUI ) ;
2021-05-20 19:24:40 +01:00
settings - > setValue ( " ServerControlPort " , serverConfig . controlPort ) ;
settings - > setValue ( " ServerCivPort " , serverConfig . civPort ) ;
settings - > setValue ( " ServerAudioPort " , serverConfig . audioPort ) ;
2025-01-06 12:51:56 +00:00
if ( ! serverConfig . rigs . first ( ) - > txAudioSetup . name . isEmpty ( ) )
settings - > setValue ( " ServerAudioOutput " , serverConfig . rigs . first ( ) - > txAudioSetup . name ) ;
if ( ! serverConfig . rigs . first ( ) - > rxAudioSetup . name . isEmpty ( ) )
settings - > setValue ( " ServerAudioInput " , serverConfig . rigs . first ( ) - > rxAudioSetup . name ) ;
2021-12-30 00:48:39 +00:00
2022-01-23 15:06:31 +00:00
/* Remove old format users*/
int numUsers = settings - > value ( " ServerNumUsers " , 0 ) . toInt ( ) ;
if ( numUsers > 0 ) {
settings - > remove ( " ServerNumUsers " ) ;
for ( int f = 0 ; f < numUsers ; f + + )
{
settings - > remove ( " ServerUsername_ " + QString : : number ( f ) ) ;
settings - > remove ( " ServerPassword_ " + QString : : number ( f ) ) ;
settings - > remove ( " ServerUserType_ " + QString : : number ( f ) ) ;
}
}
settings - > beginWriteArray ( " Users " ) ;
2021-12-30 00:48:39 +00:00
2021-02-16 16:16:46 +00:00
for ( int f = 0 ; f < serverConfig . users . count ( ) ; f + + )
{
2022-01-23 15:06:31 +00:00
settings - > setArrayIndex ( f ) ;
settings - > setValue ( " Username " , serverConfig . users [ f ] . username ) ;
settings - > setValue ( " Password " , serverConfig . users [ f ] . password ) ;
settings - > setValue ( " UserType " , serverConfig . users [ f ] . userType ) ;
2021-02-16 16:16:46 +00:00
}
2022-01-23 15:06:31 +00:00
settings - > endArray ( ) ;
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2021-02-16 16:16:46 +00:00
2022-09-30 17:05:42 +01:00
settings - > beginGroup ( " Cluster " ) ;
settings - > setValue ( " UdpEnabled " , prefs . clusterUdpEnable ) ;
settings - > setValue ( " TcpEnabled " , prefs . clusterTcpEnable ) ;
settings - > setValue ( " UdpPort " , prefs . clusterUdpPort ) ;
2021-02-16 16:16:46 +00:00
2022-09-30 17:05:42 +01:00
settings - > beginWriteArray ( " Servers " ) ;
2023-06-11 10:33:16 +01:00
for ( int f = 0 ; f < prefs . clusters . count ( ) ; f + + )
2022-09-30 17:05:42 +01:00
{
settings - > setArrayIndex ( f ) ;
2023-06-11 10:33:16 +01:00
settings - > setValue ( " ServerName " , prefs . clusters [ f ] . server ) ;
settings - > setValue ( " UserName " , prefs . clusters [ f ] . userName ) ;
settings - > setValue ( " Port " , prefs . clusters [ f ] . port ) ;
settings - > setValue ( " Password " , prefs . clusters [ f ] . password ) ;
settings - > setValue ( " Timeout " , prefs . clusters [ f ] . timeout ) ;
settings - > setValue ( " Default " , prefs . clusters [ f ] . isdefault ) ;
if ( prefs . clusters [ f ] . isdefault = = true ) {
prefs . clusterTcpServerName = prefs . clusters [ f ] . server ;
prefs . clusterTcpUserName = prefs . clusters [ f ] . userName ;
prefs . clusterTcpPassword = prefs . clusters [ f ] . password ;
prefs . clusterTcpPort = prefs . clusters [ f ] . port ;
prefs . clusterTimeout = prefs . clusters [ f ] . timeout ;
}
2022-09-30 17:05:42 +01:00
}
settings - > endArray ( ) ;
2023-01-21 11:18:26 -08:00
settings - > endGroup ( ) ;
2021-12-30 00:48:39 +00:00
2023-01-21 11:18:26 -08:00
settings - > beginGroup ( " Keyer " ) ;
2024-11-16 14:44:21 +00:00
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2024-11-16 14:44:21 +00:00
prefs . cwCutNumbers = cw - > getCutNumbers ( ) ;
prefs . cwSendImmediate = cw - > getSendImmediate ( ) ;
prefs . cwSidetoneEnabled = cw - > getSidetoneEnable ( ) ;
prefs . cwSidetoneLevel = cw - > getSidetoneLevel ( ) ;
prefs . cwMacroList = cw - > getMacroText ( ) ;
}
settings - > setValue ( " CutNumbers " , prefs . cwCutNumbers ) ;
settings - > setValue ( " SendImmediate " , prefs . cwSendImmediate ) ;
settings - > setValue ( " SidetoneEnabled " , prefs . cwSidetoneEnabled ) ;
settings - > setValue ( " SidetoneLevel " , prefs . cwSidetoneLevel ) ;
if ( prefs . cwMacroList . length ( ) = = 10 )
2023-01-21 11:18:26 -08:00
{
settings - > beginWriteArray ( " macros " ) ;
for ( int m = 0 ; m < 10 ; m + + )
{
settings - > setArrayIndex ( m ) ;
2024-11-16 14:44:21 +00:00
settings - > setValue ( " macroText " , prefs . cwMacroList . at ( m ) ) ;
2023-01-21 11:18:26 -08:00
}
settings - > endArray ( ) ;
} else {
2024-11-16 14:44:21 +00:00
qDebug ( logSystem ( ) ) < < " Error, CW macro list is wrong length: " < < prefs . cwMacroList . length ( ) ;
2023-01-21 11:18:26 -08:00
}
2021-05-20 19:24:40 +01:00
settings - > endGroup ( ) ;
2021-02-16 16:16:46 +00:00
2023-01-12 19:20:52 +00:00
# if defined(USB_CONTROLLER)
2022-05-17 08:53:24 +01:00
settings - > beginGroup ( " USB " ) ;
2023-03-17 23:35:40 +00:00
2023-01-30 12:01:29 +00:00
settings - > setValue ( " EnableUSBControllers " , prefs . enableUSBControllers ) ;
2022-09-18 21:00:44 +01:00
2023-02-10 15:23:57 +00:00
QMutexLocker locker ( & usbMutex ) ;
2023-03-17 23:35:40 +00:00
// Store USB Controller
2023-03-25 09:09:42 +00:00
settings - > remove ( " Controllers " ) ;
2023-03-17 23:35:40 +00:00
settings - > beginWriteArray ( " Controllers " ) ;
int nc = 0 ;
2025-02-16 14:34:34 +00:00
for ( auto it = usbDevices . begin ( ) ; it ! = usbDevices . end ( ) ; it + + )
2023-03-17 23:35:40 +00:00
{
2023-04-02 20:07:13 +01:00
auto dev = & it . value ( ) ;
2023-03-17 23:35:40 +00:00
settings - > setArrayIndex ( nc ) ;
2023-04-02 20:07:13 +01:00
settings - > setValue ( " Model " , dev - > product ) ;
settings - > setValue ( " Path " , dev - > path ) ;
settings - > setValue ( " Disabled " , dev - > disabled ) ;
settings - > setValue ( " Sensitivity " , dev - > sensitivity ) ;
settings - > setValue ( " Brightness " , dev - > brightness ) ;
settings - > setValue ( " Orientation " , dev - > orientation ) ;
settings - > setValue ( " Speed " , dev - > speed ) ;
settings - > setValue ( " Timeout " , dev - > timeout ) ;
settings - > setValue ( " Pages " , dev - > pages ) ;
settings - > setValue ( " Color " , dev - > color . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " LCD " , dev - > lcd ) ;
2023-03-17 23:35:40 +00:00
+ + nc ;
}
settings - > endArray ( ) ;
2023-03-25 09:09:42 +00:00
settings - > remove ( " Buttons " ) ;
2022-09-18 21:00:44 +01:00
settings - > beginWriteArray ( " Buttons " ) ;
for ( int nb = 0 ; nb < usbButtons . count ( ) ; nb + + )
{
settings - > setArrayIndex ( nb ) ;
2023-03-25 09:09:42 +00:00
settings - > setValue ( " Page " , usbButtons [ nb ] . page ) ;
2022-09-18 21:00:44 +01:00
settings - > setValue ( " Dev " , usbButtons [ nb ] . dev ) ;
settings - > setValue ( " Num " , usbButtons [ nb ] . num ) ;
2023-03-25 09:09:42 +00:00
settings - > setValue ( " Path " , usbButtons [ nb ] . path ) ;
2022-10-23 18:54:18 +01:00
settings - > setValue ( " Name " , usbButtons [ nb ] . name ) ;
2022-09-18 21:00:44 +01:00
settings - > setValue ( " Left " , usbButtons [ nb ] . pos . left ( ) ) ;
settings - > setValue ( " Top " , usbButtons [ nb ] . pos . top ( ) ) ;
settings - > setValue ( " Width " , usbButtons [ nb ] . pos . width ( ) ) ;
settings - > setValue ( " Height " , usbButtons [ nb ] . pos . height ( ) ) ;
2023-03-25 09:09:42 +00:00
settings - > setValue ( " Colour " , usbButtons [ nb ] . textColour . name ( QColor : : HexArgb ) ) ;
2023-03-26 23:23:40 +01:00
settings - > setValue ( " BackgroundOn " , usbButtons [ nb ] . backgroundOn . name ( QColor : : HexArgb ) ) ;
settings - > setValue ( " BackgroundOff " , usbButtons [ nb ] . backgroundOff . name ( QColor : : HexArgb ) ) ;
2026-01-02 18:59:51 +00:00
if ( usbButtons [ nb ] . icon ! = nullptr ) {
2023-03-26 23:23:40 +01:00
settings - > setValue ( " Icon " , * usbButtons [ nb ] . icon ) ;
2023-03-28 19:07:54 +01:00
settings - > setValue ( " IconName " , usbButtons [ nb ] . iconName ) ;
}
2023-03-25 09:09:42 +00:00
settings - > setValue ( " Toggle " , usbButtons [ nb ] . toggle ) ;
2026-01-02 18:59:51 +00:00
if ( usbButtons [ nb ] . onCommand ! = nullptr )
2022-09-19 01:14:11 +01:00
settings - > setValue ( " OnCommand " , usbButtons [ nb ] . onCommand - > text ) ;
2026-01-02 18:59:51 +00:00
if ( usbButtons [ nb ] . offCommand ! = nullptr )
2022-09-19 01:14:11 +01:00
settings - > setValue ( " OffCommand " , usbButtons [ nb ] . offCommand - > text ) ;
2023-04-09 23:53:51 +01:00
settings - > setValue ( " Graphics " , usbButtons [ nb ] . graphics ) ;
2023-04-15 21:13:43 +01:00
if ( usbButtons [ nb ] . led ) {
2023-04-15 20:13:20 +01:00
settings - > setValue ( " Led " , usbButtons [ nb ] . led ) ;
}
2022-05-17 08:53:24 +01:00
}
settings - > endArray ( ) ;
2023-03-25 09:09:42 +00:00
settings - > remove ( " Knobs " ) ;
2023-02-09 13:21:51 +00:00
settings - > beginWriteArray ( " Knobs " ) ;
for ( int nk = 0 ; nk < usbKnobs . count ( ) ; nk + + )
{
settings - > setArrayIndex ( nk ) ;
2023-03-25 09:09:42 +00:00
settings - > setValue ( " Page " , usbKnobs [ nk ] . page ) ;
2023-02-09 13:21:51 +00:00
settings - > setValue ( " Dev " , usbKnobs [ nk ] . dev ) ;
settings - > setValue ( " Num " , usbKnobs [ nk ] . num ) ;
2023-03-25 09:09:42 +00:00
settings - > setValue ( " Path " , usbKnobs [ nk ] . path ) ;
2023-02-09 13:21:51 +00:00
settings - > setValue ( " Left " , usbKnobs [ nk ] . pos . left ( ) ) ;
settings - > setValue ( " Top " , usbKnobs [ nk ] . pos . top ( ) ) ;
settings - > setValue ( " Width " , usbKnobs [ nk ] . pos . width ( ) ) ;
settings - > setValue ( " Height " , usbKnobs [ nk ] . pos . height ( ) ) ;
settings - > setValue ( " Colour " , usbKnobs [ nk ] . textColour . name ( ) ) ;
2026-01-02 18:59:51 +00:00
if ( usbKnobs [ nk ] . command ! = nullptr )
2023-02-09 13:21:51 +00:00
settings - > setValue ( " Command " , usbKnobs [ nk ] . command - > text ) ;
}
settings - > endArray ( ) ;
2022-05-17 08:53:24 +01:00
settings - > endGroup ( ) ;
2023-01-12 19:20:52 +00:00
# endif
2018-11-24 22:21:36 -08:00
2021-05-20 19:24:40 +01:00
settings - > sync ( ) ; // Automatic, not needed (supposedly)
2018-11-24 00:10:05 -08:00
}
2021-02-21 23:58:23 -08:00
void wfmain : : setTuningSteps ( )
{
// TODO: interact with preferences, tuning step drop down box, and current operating mode
// Units are MHz:
2021-02-22 10:24:29 +00:00
tsPlusControl = 0.010f ;
tsPlus = 0.001f ;
tsPlusShift = 0.0001f ;
tsPage = 1.0f ;
tsPageShift = 0.5f ; // TODO, unbind this keystroke from the dial
2021-03-22 00:11:43 -07:00
tsWfScroll = 0.0001f ; // modified by tuning step selector
tsKnobMHz = 0.0001f ; // modified by tuning step selector
// Units are in Hz:
tsPlusControlHz = 10000 ;
tsPlusHz = 1000 ;
tsPlusShiftHz = 100 ;
tsPageHz = 1000000 ;
tsPageShiftHz = 500000 ; // TODO, unbind this keystroke from the dial
tsWfScrollHz = 100 ; // modified by tuning step selector
tsKnobHz = 100 ; // modified by tuning step selector
2021-03-04 00:02:53 -08:00
}
void wfmain : : on_tuningStepCombo_currentIndexChanged ( int index )
{
2021-03-22 00:11:43 -07:00
tsWfScroll = ( float ) ui - > tuningStepCombo - > itemData ( index ) . toUInt ( ) / 1000000.0 ;
tsKnobMHz = ( float ) ui - > tuningStepCombo - > itemData ( index ) . toUInt ( ) / 1000000.0 ;
tsWfScrollHz = ui - > tuningStepCombo - > itemData ( index ) . toUInt ( ) ;
tsKnobHz = ui - > tuningStepCombo - > itemData ( index ) . toUInt ( ) ;
2024-03-25 12:42:08 +00:00
for ( auto & s : rigCaps - > steps ) {
2023-04-28 13:44:12 +01:00
if ( tsWfScrollHz = = s . hz )
{
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > setStepSize ( s . hz ) ;
2024-01-27 22:13:47 +00:00
}
2023-05-12 00:24:01 +01:00
queue - > add ( priorityImmediate , queueItem ( funcTuningStep , QVariant : : fromValue < uchar > ( s . num ) , false ) ) ;
2023-04-28 13:44:12 +01:00
}
}
2021-03-22 00:11:43 -07:00
}
quint64 wfmain : : roundFrequency ( quint64 frequency , unsigned int tsHz )
{
quint64 rounded = 0 ;
2023-02-19 22:11:48 -08:00
if ( prefs . niceTS )
2021-03-22 00:11:43 -07:00
{
rounded = ( ( frequency % tsHz ) > tsHz / 2 ) ? frequency + tsHz - frequency % tsHz : frequency - frequency % tsHz ;
return rounded ;
} else {
return frequency ;
}
2021-02-21 23:58:23 -08:00
}
2021-03-22 00:11:43 -07:00
quint64 wfmain : : roundFrequencyWithStep ( quint64 frequency , int steps , unsigned int tsHz )
2021-02-21 23:58:23 -08:00
{
2021-03-22 00:11:43 -07:00
quint64 rounded = 0 ;
2025-01-14 13:35:14 +00:00
// Avoid divide by zero (should never happen but an invalid step in the rig file could cause a crash.)
if ( tsHz < 1 )
tsHz = 1 ;
2021-03-22 00:11:43 -07:00
if ( steps > 0 )
{
frequency = frequency + ( quint64 ) ( steps * tsHz ) ;
} else {
2021-06-19 12:39:11 -07:00
frequency = frequency - std : : min ( ( quint64 ) ( abs ( steps ) * tsHz ) , frequency ) ;
2021-03-22 00:11:43 -07:00
}
2023-02-19 22:11:48 -08:00
if ( prefs . niceTS )
2021-03-22 00:11:43 -07:00
{
rounded = ( ( frequency % tsHz ) > tsHz / 2 ) ? frequency + tsHz - frequency % tsHz : frequency - frequency % tsHz ;
return rounded ;
} else {
return frequency ;
}
2021-02-21 23:58:23 -08:00
}
2025-01-24 12:37:52 +00:00
funcType wfmain : : getInputTypeCommand ( inputTypes input )
2023-05-12 00:24:01 +01:00
{
funcs func ;
switch ( input )
{
2023-05-15 10:53:52 +01:00
case inputMICACCA :
case inputMICACCB :
case inputMICACCAACCB :
case inputMICUSB :
2023-05-12 00:24:01 +01:00
case inputMic :
func = funcMicGain ;
break ;
2023-05-15 10:53:52 +01:00
case inputACCAACCB :
2023-05-12 00:24:01 +01:00
case inputACCA :
2025-01-01 13:40:58 +00:00
case inputACCUSB :
2023-05-15 10:53:52 +01:00
func = funcACCAModLevel ;
2023-05-12 00:24:01 +01:00
break ;
case inputACCB :
2023-05-15 10:53:52 +01:00
func = funcACCBModLevel ;
2023-05-12 00:24:01 +01:00
break ;
case inputUSB :
func = funcUSBModLevel ;
break ;
case inputLAN :
func = funcLANModLevel ;
break ;
2023-05-15 10:53:52 +01:00
case inputSPDIF :
func = funcSPDIFModLevel ;
break ;
2023-05-12 00:24:01 +01:00
default :
func = funcNone ;
break ;
}
2023-10-30 19:14:35 +00:00
//qInfo(logSystem()) << "Input type command for" << input << "is" << funcString[func];
2025-01-24 12:37:52 +00:00
funcType type ;
auto f = rigCaps - > commands . find ( func ) ;
if ( f ! = rigCaps - > commands . end ( ) )
{
type = f . value ( ) ;
}
return type ;
2023-05-12 00:24:01 +01:00
}
2021-01-30 00:44:36 -08:00
void wfmain : : getInitialRigState ( )
2018-06-23 00:31:41 -07:00
{
2023-09-27 12:28:43 +01:00
2018-11-24 00:10:05 -08:00
// Initial list of queries to the radio.
// These are made when the program starts up
// and are used to adjust the UI to match the radio settings
2021-02-12 22:42:34 -08:00
// the polling interval is set at 200ms. Faster is possible but slower
2022-03-23 15:45:51 +00:00
// computers will glitch occasionally.
2018-06-23 00:31:41 -07:00
2023-05-12 00:24:01 +01:00
queue - > del ( funcTransceiverId ) ; // This command is no longer required
2018-06-23 00:31:41 -07:00
2025-02-14 13:14:59 -08:00
if ( rigCaps - > commands . contains ( funcAutoInformation ) & & ( ! rigCaps - > hasSpectrum | | prefs . enableLAN ) ) {
2025-01-17 00:43:57 +00:00
queue - > add ( priorityImmediate , queueItem ( funcAutoInformation , QVariant : : fromValue ( uchar ( 2 ) ) , false , 0 ) ) ;
2025-02-14 13:14:59 -08:00
// Enable metering data in the AutoInformation stream:
queue - > add ( priorityImmediate , queueItem ( funcALCMeter , QVariant : : fromValue ( uchar ( 1 ) ) , false , 0 ) ) ;
queue - > add ( priorityImmediate , queueItem ( funcCompMeter , QVariant : : fromValue ( uchar ( 1 ) ) , false , 0 ) ) ;
queue - > add ( priorityImmediate , queueItem ( funcIdMeter , QVariant : : fromValue ( uchar ( 1 ) ) , false , 0 ) ) ;
2025-02-14 13:31:13 -08:00
queue - > add ( priorityImmediate , queueItem ( funcVdMeter , QVariant : : fromValue ( uchar ( 1 ) ) , false , 0 ) ) ;
2025-02-14 13:14:59 -08:00
queue - > add ( priorityImmediate , queueItem ( funcSWRMeter , QVariant : : fromValue ( uchar ( 1 ) ) , false , 0 ) ) ;
}
2025-01-06 21:05:28 +00:00
2025-01-18 12:29:34 +00:00
if ( prefs . forceVfoMode ) {
2025-01-21 10:05:52 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSelectVFO , QVariant : : fromValue < vfo_t > ( vfoA ) ) ) ;
//if (rigCaps->commands.contains(funcSatelliteMode))
// queue->add(priorityImmediate,funcSatelliteMode,false,0); // are we in satellite mode?.
2024-11-15 12:48:07 +00:00
2025-01-21 10:05:52 +00:00
//if (rigCaps->commands.contains(funcVFOModeSelect))
// queue->add(priorityImmediate,funcVFOModeSelect); // Make sure we are in VFO mode.
2024-11-02 13:43:59 +00:00
2025-01-21 10:05:52 +00:00
//if (rigCaps->commands.contains(funcScopeMainSub))
// queue->add(priorityImmediate,queueItem(funcScopeMainSub,QVariant::fromValue(uchar(0)),false,0)); // Set main scope
2025-01-01 13:40:58 +00:00
2025-01-18 12:29:34 +00:00
}
2025-01-01 13:40:58 +00:00
//if (rigCaps->commands.contains(funcVFOBandMS))
// queue->add(priorityImmediate,queueItem(funcVFOBandMS,QVariant::fromValue(uchar(0)),false,0));
2024-12-31 18:38:43 +00:00
2024-03-25 12:42:08 +00:00
if ( rigCaps - > hasSpectrum )
2021-05-15 15:34:22 -07:00
{
2025-11-16 10:44:13 +00:00
// Send commands to start scope immediately
2025-12-15 09:30:32 +00:00
//if (receivers.size()>0 && receivers[0]->isScopeEnabled()) {
2025-11-16 10:44:13 +00:00
queue - > add ( priorityHigh , queueItem ( funcScopeOnOff , QVariant : : fromValue ( quint8 ( 1 ) ) , true ) ) ;
2025-11-16 18:20:51 +00:00
queue - > add ( priorityHigh , queueItem ( funcScopeDataOutput , QVariant : : fromValue ( quint8 ( 1 ) ) , false ) ) ;
2025-12-15 09:30:32 +00:00
//}
2023-09-27 12:28:43 +01:00
// Find the scope ref limits
2024-11-13 09:34:20 +00:00
auto mr = rigCaps - > commands . find ( funcScopeRef ) ;
2024-03-25 12:42:08 +00:00
if ( mr ! = rigCaps - > commands . end ( ) )
2023-09-27 12:28:43 +01:00
{
2024-11-13 09:34:20 +00:00
for ( uchar f = 0 ; f < receivers . size ( ) ; f + + ) {
2025-01-06 21:05:28 +00:00
queue - > add ( priorityMediumHigh , funcScopeRef , false , f ) ;
2024-11-13 09:34:20 +00:00
}
2023-09-27 12:28:43 +01:00
}
2021-05-15 15:34:22 -07:00
}
2021-12-01 10:13:21 +00:00
2023-07-23 00:26:56 +01:00
quint64 start = UINT64_MAX ;
quint64 end = 0 ;
2024-03-25 12:42:08 +00:00
for ( auto & band : rigCaps - > bands )
2023-07-23 00:26:56 +01:00
{
2024-06-12 17:11:01 +01:00
if ( band . region = = " " | | band . region = = prefs . region ) {
if ( start > band . lowFreq )
start = band . lowFreq ;
if ( end < band . highFreq )
end = band . highFreq ;
}
2023-07-23 00:26:56 +01:00
}
2024-06-12 17:11:01 +01:00
2025-12-20 11:22:55 +00:00
for ( const auto & receiver : std : : as_const ( receivers ) )
2024-01-27 22:13:47 +00:00
{
2024-03-31 12:46:32 +01:00
//qInfo(logSystem()) << "Display Settings start:" << start << "end:" << end;
2024-06-12 17:11:01 +01:00
receiver - > displaySettings ( 0 , start , end , 1 , ( FctlUnit ) prefs . frequencyUnits , & rigCaps - > bands ) ;
receiver - > setBandIndicators ( prefs . showBands , prefs . region , & rigCaps - > bands ) ;
2024-01-27 22:13:47 +00:00
}
2024-11-02 13:43:59 +00:00
2025-01-18 12:29:34 +00:00
if ( rigCaps - > commands . contains ( funcRitFreq ) )
2025-01-17 00:43:57 +00:00
{
2025-01-18 12:29:34 +00:00
funcType func = rigCaps - > commands . find ( funcRitFreq ) . value ( ) ;
2025-01-17 00:43:57 +00:00
ui - > ritTuneDial - > setRange ( func . minVal , func . maxVal ) ;
}
2025-01-14 13:35:14 +00:00
if ( rigCaps - > commands . contains ( funcTime ) & & prefs . setRadioTime ) {
2025-01-11 12:32:31 +00:00
setRadioTimeDatePrep ( ) ;
}
2025-01-17 00:43:57 +00:00
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr )
2025-02-09 09:37:16 +00:00
{
cw - > receiveEnabled ( rigCaps - > commands . contains ( funcCWDecode ) ) ;
}
2018-06-23 00:31:41 -07:00
2025-01-20 02:30:14 +00:00
if ( rigCaps - > commands . contains ( funcVOIP ) )
{
2025-01-23 20:04:17 +00:00
queue - > add ( priorityHigh , queueItem ( funcVOIP , QVariant : : fromValue < uchar > ( prefs . rxSetup . codec = = 0x80 ? 2 : 1 ) , false , 0 ) ) ;
2025-01-20 02:30:14 +00:00
}
2025-01-30 11:47:05 +00:00
// Put Kenwood into Shift&Width mode for filter control.
queue - > add ( priorityHigh , queueItem ( funcFilterControlSSB , QVariant : : fromValue < bool > ( true ) , false , 0 ) ) ;
queue - > add ( priorityHigh , queueItem ( funcFilterControlData , QVariant : : fromValue < bool > ( true ) , false , 0 ) ) ;
2025-02-14 13:14:59 -08:00
2025-01-20 02:30:14 +00:00
}
2018-11-07 15:54:03 -08:00
void wfmain : : showStatusBarText ( QString text )
{
ui - > statusBar - > showMessage ( text , 5000 ) ;
}
2018-06-23 00:31:41 -07:00
2023-02-19 18:29:22 -08:00
void wfmain : : useSystemTheme ( bool checked )
2018-06-22 16:31:52 -07:00
{
2021-02-18 22:38:50 -08:00
setAppTheme ( ! checked ) ;
prefs . useSystemTheme = checked ;
}
void wfmain : : setAppTheme ( bool isCustom )
{
if ( isCustom )
2018-06-22 16:31:52 -07:00
{
2021-03-13 10:20:48 +00:00
# ifndef Q_OS_LINUX
2021-02-24 22:55:29 +00:00
QFile f ( " : " + prefs . stylesheetPath ) ; // built-in resource
# else
2021-08-02 08:06:19 +02:00
QFile f ( PREFIX " /share/wfview/ " + prefs . stylesheetPath ) ;
2021-02-24 22:55:29 +00:00
# endif
2018-06-22 16:31:52 -07:00
if ( ! f . exists ( ) )
{
printf ( " Unable to set stylesheet, file not found \n " ) ;
2021-08-02 08:06:19 +02:00
printf ( " Tried to load: [%s] \n " , f . fileName ( ) . toStdString ( ) . c_str ( ) ) ;
2018-06-22 16:31:52 -07:00
}
else
{
2025-11-12 19:43:33 +00:00
if ( f . open ( QFile : : ReadOnly | QFile : : Text ) ) {
QTextStream ts ( & f ) ;
qApp - > setStyleSheet ( ts . readAll ( ) ) ;
}
2018-06-22 16:31:52 -07:00
}
} else {
qApp - > setStyleSheet ( " " ) ;
}
}
2022-08-23 10:35:59 -07:00
void wfmain : : setDefaultColors ( int presetNumber )
2018-11-24 22:21:36 -08:00
{
2022-08-23 10:35:59 -07:00
// These are the default color schemes
if ( presetNumber > numColorPresetsTotal - 1 )
return ;
2018-11-24 22:21:36 -08:00
2022-08-23 10:35:59 -07:00
colorPrefsType * p = & colorPreset [ presetNumber ] ;
2018-11-24 22:21:36 -08:00
2022-08-23 10:35:59 -07:00
// Begin every parameter with these safe defaults first:
2026-01-02 18:59:51 +00:00
if ( p - > presetName = = nullptr )
2018-06-22 16:31:52 -07:00
{
2022-08-23 10:35:59 -07:00
p - > presetName = new QString ( ) ;
}
p - > presetName - > clear ( ) ;
p - > presetName - > append ( QString ( " %1 " ) . arg ( presetNumber ) ) ;
p - > presetNum = presetNumber ;
p - > gridColor = QColor ( 0 , 0 , 0 , 255 ) ;
p - > axisColor = QColor ( Qt : : white ) ;
p - > textColor = QColor ( Qt : : white ) ;
p - > spectrumLine = QColor ( Qt : : yellow ) ;
p - > spectrumFill = QColor ( " transparent " ) ;
p - > underlayLine = QColor ( 20 + 200 / 4.0 * 1 , 70 * ( 1.6 - 1 / 4.0 ) , 150 , 150 ) . lighter ( 200 ) ;
p - > underlayFill = QColor ( 20 + 200 / 4.0 * 1 , 70 * ( 1.6 - 1 / 4.0 ) , 150 , 150 ) ;
p - > plotBackground = QColor ( Qt : : black ) ;
p - > tuningLine = QColor ( Qt : : blue ) ;
2022-09-26 11:59:16 +01:00
p - > passband = QColor ( Qt : : blue ) ;
2024-01-21 20:36:52 +00:00
p - > pbt = QColor ( 0x32 , 0xff , 0x00 , 0x00 ) ;
p - > meterLevel = QColor ( 0x14 , 0x8c , 0xd2 ) . darker ( ) ;
p - > meterAverage = QColor ( 0x2f , 0xb7 , 0xcd ) ;
p - > meterPeakLevel = QColor ( 0x3c , 0xa0 , 0xdb ) . lighter ( ) ;
2022-08-23 10:35:59 -07:00
p - > meterPeakScale = QColor ( Qt : : red ) ;
2024-01-21 20:36:52 +00:00
p - > meterLowerLine = QColor ( 0xed , 0xf0 , 0xf1 ) ;
p - > meterLowText = QColor ( 0xef , 0xf0 , 0xf1 ) ;
2021-04-26 23:40:08 -07:00
2022-08-23 10:35:59 -07:00
p - > wfBackground = QColor ( Qt : : black ) ;
p - > wfAxis = QColor ( Qt : : white ) ;
p - > wfGrid = QColor ( Qt : : white ) ;
p - > wfText = QColor ( Qt : : white ) ;
2018-06-23 00:31:41 -07:00
2022-10-09 14:23:07 +01:00
p - > clusterSpots = QColor ( Qt : : red ) ;
2024-12-30 19:22:26 +00:00
p - > buttonOff = QColor ( " transparent " ) ;
p - > buttonOn = QColor ( 0x50 , 0x50 , 0x50 ) ;
2022-08-23 10:35:59 -07:00
//qInfo(logSystem()) << "default color preset [" << pn << "] set to pn.presetNum index [" << p->presetNum << "]" << ", with name " << *(p->presetName);
2021-04-26 23:40:08 -07:00
2022-08-23 10:35:59 -07:00
switch ( presetNumber )
{
case 0 :
{
// Dark
p - > presetName - > clear ( ) ;
p - > presetName - > append ( " Dark " ) ;
p - > plotBackground = QColor ( 0 , 0 , 0 , 255 ) ;
p - > axisColor = QColor ( Qt : : white ) ;
p - > textColor = QColor ( 255 , 255 , 255 , 255 ) ;
p - > gridColor = QColor ( 0 , 0 , 0 , 255 ) ;
p - > spectrumFill = QColor ( " transparent " ) ;
p - > spectrumLine = QColor ( Qt : : yellow ) ;
2024-01-21 20:36:52 +00:00
p - > underlayLine = QColor ( 0x96 , 0x33 , 0xff , 0xff ) ;
2022-08-23 10:35:59 -07:00
p - > underlayFill = QColor ( 20 + 200 / 4.0 * 1 , 70 * ( 1.6 - 1 / 4.0 ) , 150 , 150 ) ;
2024-01-21 20:36:52 +00:00
p - > tuningLine = QColor ( 0xff , 0x55 , 0xff , 0xff ) ;
2024-03-05 21:01:13 +00:00
p - > passband = QColor ( 0x32 , 0xff , 0xff , 0x80 ) ;
2024-01-21 20:36:52 +00:00
p - > pbt = QColor ( 0x32 , 0xff , 0x00 , 0x00 ) ;
2022-08-23 10:35:59 -07:00
2024-01-21 20:36:52 +00:00
p - > meterLevel = QColor ( 0x14 , 0x8c , 0xd2 ) . darker ( ) ;
p - > meterAverage = QColor ( 0x3f , 0xb7 , 0xcd ) ;
2022-08-23 10:35:59 -07:00
p - > meterPeakScale = QColor ( Qt : : red ) ;
2024-01-21 20:36:52 +00:00
p - > meterPeakLevel = QColor ( 0x3c , 0xa0 , 0xdb ) . lighter ( ) ;
p - > meterLowerLine = QColor ( 0xef , 0xf0 , 0xf1 ) ;
p - > meterLowText = QColor ( 0xef , 0xf0 , 0xf1 ) ;
2022-08-23 10:35:59 -07:00
p - > wfBackground = QColor ( Qt : : black ) ;
p - > wfAxis = QColor ( Qt : : white ) ;
p - > wfGrid = QColor ( " transparent " ) ;
p - > wfText = QColor ( Qt : : white ) ;
2022-10-09 14:23:07 +01:00
p - > clusterSpots = QColor ( Qt : : red ) ;
2024-12-30 19:22:26 +00:00
p - > buttonOff = QColor ( " transparent " ) ;
p - > buttonOn = QColor ( 0x50 , 0x50 , 0x50 ) ;
2022-08-23 10:35:59 -07:00
break ;
}
case 1 :
{
// Bright
p - > presetName - > clear ( ) ;
p - > presetName - > append ( " Bright " ) ;
p - > plotBackground = QColor ( Qt : : white ) ;
p - > axisColor = QColor ( 200 , 200 , 200 , 255 ) ;
p - > gridColor = QColor ( 255 , 255 , 255 , 0 ) ;
p - > textColor = QColor ( Qt : : black ) ;
p - > spectrumFill = QColor ( " transparent " ) ;
p - > spectrumLine = QColor ( Qt : : black ) ;
p - > underlayLine = QColor ( Qt : : blue ) ;
p - > tuningLine = QColor ( Qt : : darkBlue ) ;
2024-01-21 20:36:52 +00:00
p - > passband = QColor ( 0x64 , 0x00 , 0x00 , 0x80 ) ;
p - > pbt = QColor ( 0x32 , 0xff , 0x00 , 0x00 ) ;
2022-08-23 10:35:59 -07:00
2024-01-21 20:36:52 +00:00
p - > meterAverage = QColor ( 0x3f , 0xb7 , 0xcd ) ;
p - > meterPeakLevel = QColor ( 0x3c , 0xa0 , 0xdb ) ;
2022-08-23 10:35:59 -07:00
p - > meterPeakScale = QColor ( Qt : : darkRed ) ;
p - > meterLowerLine = QColor ( Qt : : black ) ;
p - > meterLowText = QColor ( Qt : : black ) ;
p - > wfBackground = QColor ( Qt : : white ) ;
p - > wfAxis = QColor ( 200 , 200 , 200 , 255 ) ;
p - > wfGrid = QColor ( " transparent " ) ;
p - > wfText = QColor ( Qt : : black ) ;
2022-10-09 14:23:07 +01:00
p - > clusterSpots = QColor ( Qt : : red ) ;
2024-12-30 19:22:26 +00:00
p - > buttonOff = QColor ( " transparent " ) ;
p - > buttonOn = QColor ( 0x50 , 0x50 , 0x50 ) ;
2022-08-23 10:35:59 -07:00
break ;
}
2021-04-26 23:40:08 -07:00
2022-08-23 10:35:59 -07:00
case 2 :
case 3 :
case 4 :
default :
break ;
2021-04-26 23:40:08 -07:00
2018-06-22 16:31:52 -07:00
}
2023-06-08 08:20:50 +01:00
//ui->colorPresetCombo->setItemText(presetNumber, *(p->presetName));
2018-06-19 23:45:56 -07:00
}
2021-02-20 20:41:19 -08:00
void wfmain : : initPeriodicCommands ( )
{
2023-05-15 10:53:52 +01:00
// This function places periodic polling commands into the queue.
// Can be run multiple times as it will remove all existing entries.
2021-02-20 20:41:19 -08:00
2023-06-11 10:33:16 +01:00
qInfo ( logSystem ( ) ) < < " Start periodic commands (and delete unsupported) " ;
2023-05-15 10:53:52 +01:00
queue - > clear ( ) ;
2023-06-08 21:58:22 +01:00
2024-03-25 12:42:08 +00:00
foreach ( auto cap , rigCaps - > periodic ) {
2024-08-13 12:47:31 +01:00
if ( cap . receiver = = char ( - 1 ) ) {
2024-03-30 20:40:27 +00:00
for ( uchar v = 0 ; v < rigCaps - > numReceiver ; v + + )
2024-02-09 17:08:04 +00:00
{
2024-03-30 20:40:27 +00:00
qDebug ( logSystem ( ) ) < < " Inserting command " < < funcString [ cap . func ] < < " priority " < < cap . priority < < " on Receiver " < < QString : : number ( v ) ;
2024-02-09 17:08:04 +00:00
queue - > add ( queuePriority ( cap . prioVal ) , cap . func , true , v ) ;
}
}
else {
2024-03-30 20:40:27 +00:00
qDebug ( logSystem ( ) ) < < " Inserting command " < < funcString [ cap . func ] < < " priority " < < cap . priority < < " on Receiver " < < QString : : number ( cap . receiver ) ;
queue - > add ( queuePriority ( cap . prioVal ) , cap . func , true , cap . receiver ) ;
2024-02-09 17:08:04 +00:00
}
}
2024-11-05 18:46:21 +00:00
// Set the second meter here as I suspect we need to be connected for it to work?
if ( ! rigCaps - > commands . contains ( funcMeterType ) )
{
prefs . meter1Type = meterS ; // Just in case we have previously connected to a radio with meter type options.
}
changeMeterType ( prefs . meter1Type , 1 ) ;
changeMeterType ( prefs . meter2Type , 2 ) ;
changeMeterType ( prefs . meter3Type , 3 ) ;
ui - > meter2Widget - > blockMeterType ( prefs . meter3Type ) ;
ui - > meter3Widget - > blockMeterType ( prefs . meter2Type ) ;
ui - > meter2Widget - > setCompReverse ( prefs . compMeterReverse ) ;
ui - > meter3Widget - > setCompReverse ( prefs . compMeterReverse ) ;
/*
meter * marray [ 3 ] ;
marray [ 0 ] = ui - > meterSPoWidget ;
marray [ 1 ] = ui - > meter2Widget ;
marray [ 2 ] = ui - > meter3Widget ;
for ( int m = 0 ; m < 3 ; m + + ) {
2024-02-05 13:42:00 -08:00
funcs meterCmd = meter_tToMeterCommand ( marray [ m ] - > getMeterType ( ) ) ;
if ( meterCmd ! = funcNone ) {
qDebug ( ) < < " Adding meter command per current UI meters. " ;
queue - > add ( priorityHighest , queueItem ( meterCmd , true ) ) ;
}
}
2024-11-05 18:46:21 +00:00
*/
2024-02-07 13:20:10 +00:00
2023-01-24 10:37:26 -08:00
}
2018-11-07 15:54:03 -08:00
void wfmain : : receivePTTstatus ( bool pttOn )
{
2021-02-14 20:45:48 -08:00
// This is the only place where amTransmitting and the transmit button text should be changed:
2021-03-01 16:26:59 +00:00
if ( pttOn & & ! amTransmitting )
{
2022-12-28 22:45:42 +00:00
2023-01-29 10:39:24 -08:00
pttLed - > setState ( QLedLabel : : State : : StateError ) ;
pttLed - > setToolTip ( " Transmitting " ) ;
2024-02-05 09:22:58 -08:00
changePrimaryMeter ( true ) ;
2023-01-29 10:39:24 -08:00
if ( splitModeEnabled )
{
pttLed - > setState ( QLedLabel : : State : : StateSplitErrorOk ) ;
pttLed - > setToolTip ( " TX Split " ) ;
} else {
pttLed - > setState ( QLedLabel : : State : : StateError ) ;
pttLed - > setToolTip ( " Transmitting " ) ;
}
2021-03-01 16:26:59 +00:00
}
else if ( ! pttOn & & amTransmitting )
{
pttLed - > setState ( QLedLabel : : State : : StateOk ) ;
2023-01-29 10:39:24 -08:00
pttLed - > setToolTip ( " Receiving " ) ;
2024-02-05 09:22:58 -08:00
changePrimaryMeter ( false ) ;
2024-07-26 18:51:23 +01:00
// Send updated BSR? Currently a work-in-progress M0VSE
//receivers[currentReceiver]->updateBSR(&rigCaps->bands);
2021-03-01 16:26:59 +00:00
}
2021-02-14 20:45:48 -08:00
amTransmitting = pttOn ;
2023-01-25 00:15:20 -08:00
rpt - > handleTransmitStatus ( pttOn ) ;
2021-02-14 20:45:48 -08:00
changeTxBtn ( ) ;
}
void wfmain : : changeTxBtn ( )
{
if ( amTransmitting )
{
ui - > transmitBtn - > setText ( " Receive " ) ;
2024-02-05 09:22:58 -08:00
2021-02-14 20:45:48 -08:00
} else {
ui - > transmitBtn - > setText ( " Transmit " ) ;
}
2018-06-19 12:58:52 -07:00
}
2024-02-05 09:22:58 -08:00
void wfmain : : changePrimaryMeter ( bool transmitOn ) {
// Change the Primary UI Meter and alter the queue
// This function is only called from one place:
2025-02-17 10:29:05 -08:00
// When we receive a *new* PTT status.
2024-02-05 09:22:58 -08:00
funcs newCmd ;
funcs oldCmd ;
2025-02-17 10:29:05 -08:00
double lowVal = 0.0 ;
double highVal = 255.0 ;
double lineVal = 200 ;
2024-02-05 09:22:58 -08:00
if ( transmitOn ) {
oldCmd = meter_tToMeterCommand ( meterS ) ;
newCmd = meter_tToMeterCommand ( meterPower ) ;
ui - > meterSPoWidget - > setMeterType ( meterPower ) ;
2025-02-17 10:29:05 -08:00
ui - > meterSPoWidget - > setMeterShortString ( meterString [ ( int ) meterPower ] ) ;
2025-02-20 17:10:52 +00:00
if ( rigCaps - > meters [ meterPower ] . size ( ) )
getMeterExtremities ( meterPower , lowVal , highVal , lineVal ) ;
2025-02-17 10:29:05 -08:00
ui - > meterSPoWidget - > setMeterExtremities ( lowVal , highVal , lineVal ) ;
2024-02-05 09:22:58 -08:00
} else {
oldCmd = meter_tToMeterCommand ( meterPower ) ;
newCmd = meter_tToMeterCommand ( meterS ) ;
ui - > meterSPoWidget - > setMeterType ( meterS ) ;
2025-02-17 10:29:05 -08:00
ui - > meterSPoWidget - > setMeterShortString ( meterString [ ( int ) meterS ] ) ;
2025-02-20 17:10:52 +00:00
if ( rigCaps - > meters [ meterS ] . size ( ) )
getMeterExtremities ( meterS , lowVal , highVal , lineVal ) ;
2025-02-17 10:29:05 -08:00
ui - > meterSPoWidget - > setMeterExtremities ( lowVal , highVal , lineVal ) ;
2024-02-05 09:22:58 -08:00
}
2025-01-10 18:45:11 +00:00
queue - > del ( oldCmd , 0 ) ;
2025-01-14 13:35:14 +00:00
if ( rigCaps - > commands . contains ( newCmd ) ) {
queue - > add ( priorityHighest , queueItem ( newCmd , true , 0 ) ) ;
}
2025-02-17 10:29:05 -08:00
ui - > meterSPoWidget - > clearMeterOnPTTtoggle ( ) ;
ui - > meter2Widget - > clearMeterOnPTTtoggle ( ) ;
ui - > meter3Widget - > clearMeterOnPTTtoggle ( ) ;
2024-02-05 09:22:58 -08:00
}
2023-02-19 18:29:22 -08:00
void wfmain : : changeFullScreenMode ( bool checked )
2018-06-19 12:58:52 -07:00
{
if ( checked )
2018-11-27 22:02:37 -08:00
{
2018-06-19 12:58:52 -07:00
this - > showFullScreen ( ) ;
2018-11-27 22:02:37 -08:00
onFullscreen = true ;
} else {
2018-06-19 12:58:52 -07:00
this - > showNormal ( ) ;
2018-11-27 22:02:37 -08:00
onFullscreen = false ;
}
2018-11-26 23:10:23 -08:00
prefs . useFullScreen = checked ;
2018-06-19 12:58:52 -07:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : changeMode ( rigMode_t mode , quint8 rx )
2021-02-16 22:32:05 -08:00
{
bool dataOn = false ;
2024-08-13 13:19:50 +01:00
if ( ( ( quint8 ) mode > > 4 ) = = 0x08 )
2021-02-16 22:32:05 -08:00
{
dataOn = true ;
2023-05-15 13:51:04 +01:00
mode = ( rigMode_t ) ( ( int ) mode & 0x0f ) ;
2021-02-16 22:32:05 -08:00
}
2024-07-13 23:46:29 +01:00
changeMode ( mode , dataOn , rx ) ;
2021-02-16 22:32:05 -08:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : changeMode ( rigMode_t mode , quint8 data , quint8 rx )
2021-02-16 22:32:05 -08:00
{
2024-03-25 12:42:08 +00:00
for ( modeInfo & mi : rigCaps - > modes )
2023-04-24 11:06:33 +01:00
{
if ( mi . mk = = mode )
{
2025-12-15 09:30:32 +00:00
if ( receivers . size ( ) > rx & & mi . mk ! = receivers [ rx ] - > getMode ( ) . mk )
2023-04-24 11:06:33 +01:00
{
2024-07-13 19:19:27 +01:00
modeInfo m ;
m = modeInfo ( mi ) ;
m . data = data ;
m . VFO = selVFO_t : : activeVFO ;
2025-12-15 09:30:32 +00:00
m . filter = receivers [ rx ] - > getFilter ( ) ;
2024-12-08 13:55:48 +00:00
qDebug ( logRig ( ) ) < < " changeMode: " < < mode < < " data " < < data < < " rx " < < rx ;
2025-01-09 00:35:26 +00:00
vfoCommandType t = queue - > getVfoCommand ( vfoA , rx , true ) ;
queue - > add ( priorityImmediate , queueItem ( t . modeFunc , QVariant : : fromValue < modeInfo > ( m ) , false , t . receiver ) ) ;
2023-04-24 11:06:33 +01:00
}
2024-07-13 19:19:27 +01:00
2023-04-24 11:06:33 +01:00
break ;
}
}
2018-06-19 12:58:52 -07:00
}
2018-06-22 16:31:52 -07:00
2018-06-25 00:34:33 -07:00
void wfmain : : on_freqDial_valueChanged ( int value )
{
2022-09-17 12:05:32 -07:00
int fullSweep = ui - > freqDial - > maximum ( ) - ui - > freqDial - > minimum ( ) ;
2021-03-22 00:11:43 -07:00
freqt f ;
f . Hz = 0 ;
f . MHzDouble = 0 ;
2018-07-03 17:20:03 -07:00
volatile int delta = 0 ;
2021-02-21 23:58:23 -08:00
if ( freqLock )
{
ui - > freqDial - > blockSignals ( true ) ;
ui - > freqDial - > setValue ( oldFreqDialVal ) ;
ui - > freqDial - > blockSignals ( false ) ;
return ;
}
2018-07-03 17:20:03 -07:00
2022-09-17 12:05:32 -07:00
delta = ( value - oldFreqDialVal ) ;
if ( delta > fullSweep / 2 )
2018-07-03 17:20:03 -07:00
{
2022-09-17 12:05:32 -07:00
// counter-clockwise past the zero mark
// ie, from +3000 to 3990, old=3000, new = 3990, new-old = 990
// desired delta here would actually be -10
delta = delta - fullSweep ;
} else if ( delta < - fullSweep / 2 )
2018-07-03 17:20:03 -07:00
{
2022-09-17 12:05:32 -07:00
// clock-wise past the zero mark
// ie, from +3990 to 3000, old=3990, new = 3000, new-old = -990
// desired delta here would actually be +10
delta = fullSweep + delta ;
2018-07-03 17:20:03 -07:00
}
2022-09-17 12:05:32 -07:00
// The step size is 10, which forces the knob to not skip a step crossing zero.
2023-09-26 19:13:31 -07:00
if ( abs ( delta ) < ui - > freqDial - > singleStep ( ) ) {
// Took a small step. Let's just round it up:
if ( delta > 0 )
delta = 1 ;
else
delta = - 1 ;
} else {
delta = delta / ui - > freqDial - > singleStep ( ) ;
}
2018-07-03 17:20:03 -07:00
2021-03-22 00:11:43 -07:00
// With the number of steps and direction of steps established,
2022-03-23 15:45:51 +00:00
// we can now adjust the frequency:
2024-04-26 15:37:12 +01:00
2024-04-28 10:28:29 +01:00
f . Hz = roundFrequencyWithStep ( receivers [ currentReceiver ] - > getFrequency ( ) . Hz , delta , tsKnobHz ) ;
f . MHzDouble = f . Hz / ( double ) 1E6 ;
if ( f . Hz > 0 )
2024-04-26 15:37:12 +01:00
{
2024-04-28 10:28:29 +01:00
oldFreqDialVal = value ;
receivers [ currentReceiver ] - > setFrequency ( f ) ;
2025-02-09 20:44:29 +00:00
queue - > addUnique ( priorityImmediate , queueItem ( queue - > getVfoCommand ( vfoA , currentReceiver , true ) . freqFunc ,
2025-01-09 00:35:26 +00:00
QVariant : : fromValue < freqt > ( f ) , false , uchar ( currentReceiver ) ) ) ;
2024-04-28 10:28:29 +01:00
} else {
ui - > freqDial - > blockSignals ( true ) ;
ui - > freqDial - > setValue ( oldFreqDialVal ) ;
ui - > freqDial - > blockSignals ( false ) ;
return ;
2021-05-01 23:02:27 -07:00
}
2018-06-25 00:34:33 -07:00
}
2018-11-16 14:08:21 -08:00
void wfmain : : on_aboutBtn_clicked ( )
{
2021-07-08 00:31:59 -07:00
abtBox - > show ( ) ;
2018-11-16 14:08:21 -08:00
}
2023-02-11 18:39:02 -08:00
void wfmain : : gotoMemoryPreset ( int presetNumber )
2018-11-16 14:08:21 -08:00
{
2023-02-11 18:39:02 -08:00
preset_kind temp = mem . getPreset ( presetNumber ) ;
if ( ! temp . isSet )
2018-11-24 00:10:05 -08:00
{
2023-02-11 18:39:02 -08:00
qWarning ( logGui ( ) ) < < " Recalled Preset # " < < presetNumber < < " is not set. " ;
2018-11-24 00:10:05 -08:00
}
2023-07-17 11:09:14 +01:00
//setFilterVal = ui->modeFilterCombo->currentIndex()+1; // TODO, add to memory
2023-02-11 18:39:02 -08:00
setModeVal = temp . mode ;
freqt memFreq ;
2023-05-27 00:26:01 +01:00
modeInfo m ;
2023-02-11 18:39:02 -08:00
m . mk = temp . mode ;
2023-07-17 11:09:14 +01:00
//m.filter = ui->modeFilterCombo->currentIndex()+1;
2024-08-13 13:19:50 +01:00
m . reg = ( quint8 ) m . mk ; // fallback, works only for some modes
2023-02-11 18:39:02 -08:00
memFreq . Hz = temp . frequency * 1E6 ;
memFreq . MHzDouble = memFreq . Hz / 1.0E6 ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > setFrequency ( memFreq ) ;
2023-02-11 18:39:02 -08:00
qDebug ( logGui ( ) ) < < " Recalling preset number " < < presetNumber < < " as frequency " < < temp . frequency < < " MHz " ;
2018-11-16 14:08:21 -08:00
}
2023-02-11 18:39:02 -08:00
void wfmain : : saveMemoryPreset ( int presetNumber )
2018-11-16 14:08:21 -08:00
{
2023-05-27 00:26:01 +01:00
// int, double, rigMode_t
2023-02-11 18:39:02 -08:00
double frequency ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
if ( receivers [ 0 ] - > getFrequency ( ) . Hz = = 0 )
2024-01-29 10:43:41 +00:00
{
2024-03-30 20:40:27 +00:00
frequency = receivers [ 0 ] - > getFrequency ( ) . MHzDouble ;
2024-01-29 10:43:41 +00:00
} else {
2024-03-30 20:40:27 +00:00
frequency = receivers [ 0 ] - > getFrequency ( ) . Hz / 1.0E6 ;
2024-01-29 10:43:41 +00:00
}
rigMode_t mode = currentMode ;
qDebug ( logGui ( ) ) < < " Saving preset number " < < presetNumber < < " to frequency " < < frequency < < " MHz " ;
mem . setPreset ( presetNumber , frequency , mode ) ;
2018-11-24 00:10:05 -08:00
}
2018-11-16 14:08:21 -08:00
}
2025-01-14 13:35:14 +00:00
\
2018-11-16 22:19:44 -08:00
void wfmain : : on_rfGainSlider_valueChanged ( int value )
{
2025-01-14 13:35:14 +00:00
queue - > addUnique ( priorityImmediate , queueItem ( funcRfGain , QVariant : : fromValue < ushort > ( value ) , false , currentReceiver ) ) ;
2018-11-16 22:19:44 -08:00
}
void wfmain : : on_afGainSlider_valueChanged ( int value )
{
2025-06-03 20:22:51 +01:00
if ( prefs . enableLAN )
2021-07-05 16:45:19 -07:00
{
2025-01-20 02:30:14 +00:00
// Remember current setting.
2024-08-13 13:19:50 +01:00
prefs . rxSetup . localAFgain = ( quint8 ) ( value ) ;
prefs . localAFgain = ( quint8 ) ( value ) ;
2021-07-05 16:45:19 -07:00
}
2025-01-20 02:30:14 +00:00
2025-09-07 11:28:41 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcAfGain , QVariant : : fromValue < ushort > ( value ) , false , currentReceiver ) ) ;
2018-11-16 22:19:44 -08:00
}
2023-05-15 10:53:52 +01:00
void wfmain : : on_monitorSlider_valueChanged ( int value )
{
2025-09-07 11:28:41 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcMonitorGain , QVariant : : fromValue < ushort > ( value ) , false , currentReceiver ) ) ;
2023-05-15 10:53:52 +01:00
}
2023-09-24 21:00:21 +01:00
void wfmain : : on_monitorLabel_linkActivated ( const QString & )
2023-05-15 10:53:52 +01:00
{
2023-09-24 21:00:21 +01:00
cacheItem ca = queue - > getCache ( funcMonitor ) ;
bool mon = ca . value . toBool ( ) ;
queue - > add ( priorityImmediate , queueItem ( funcMonitor , QVariant : : fromValue < bool > ( ! mon ) ) ) ;
2023-05-15 10:53:52 +01:00
}
2021-11-05 10:09:31 -07:00
2018-11-16 22:19:44 -08:00
void wfmain : : on_tuneNowBtn_clicked ( )
{
2025-01-11 12:40:02 +00:00
if ( ! prefs . enablePTT )
{
showStatusBarText ( " PTT is disabled, not sending command. Change under Settings tab. " ) ;
return ;
}
2023-05-24 19:50:01 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcTunerStatus , QVariant : : fromValue < uchar > ( 2U ) ) ) ;
2018-12-20 11:22:52 -08:00
showStatusBarText ( " Starting ATU tuning cycle... " ) ;
2024-02-10 12:02:02 -08:00
ATUCheckTimer . setSingleShot ( true ) ;
ATUCheckTimer . start ( 5000 ) ;
2018-11-16 23:13:59 -08:00
}
2018-11-16 22:19:44 -08:00
2018-11-16 23:13:59 -08:00
void wfmain : : on_tuneEnableChk_clicked ( bool checked )
{
2023-05-15 10:53:52 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcTunerStatus , QVariant : : fromValue < uchar > ( checked ) ) ) ;
2023-05-24 19:50:01 +01:00
showStatusBarText ( QString ( " Turning %0 ATU " ) . arg ( checked ? " on " : " off " ) ) ;
2024-02-10 12:02:02 -08:00
ATUCheckTimer . setSingleShot ( true ) ;
ATUCheckTimer . start ( 5000 ) ;
2018-11-16 22:19:44 -08:00
}
2018-11-19 23:42:34 -08:00
2023-06-08 08:20:50 +01:00
bool wfmain : : on_exitBtn_clicked ( )
2018-11-24 00:10:05 -08:00
{
2023-06-08 08:20:50 +01:00
bool ret = false ;
2024-05-04 23:40:34 +01:00
if ( prefs . settingsChanged & & prefs . confirmSettingsChanged )
2019-01-23 17:19:35 -08:00
{
2024-05-04 23:40:34 +01:00
QCheckBox * cb = new QCheckBox ( " Don't ask me again " ) ;
2024-05-04 23:52:34 +01:00
cb - > setToolTip ( " Don't ask me to confirm saving settings again " ) ;
2024-05-04 23:40:34 +01:00
QMessageBox msgbox ;
msgbox . setText ( " Settings have changed since last save, exit anyway? \n " ) ;
msgbox . setIcon ( QMessageBox : : Icon : : Question ) ;
QAbstractButton * yesButton = msgbox . addButton ( QMessageBox : : Yes ) ;
QAbstractButton * saveButton = msgbox . addButton ( QMessageBox : : Save ) ;
msgbox . addButton ( QMessageBox : : No ) ;
msgbox . setDefaultButton ( QMessageBox : : Yes ) ;
msgbox . setCheckBox ( cb ) ;
2024-10-27 09:50:03 +00:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,7,0))
QObject : : connect ( cb , & QCheckBox : : checkStateChanged , this , [ this ] ( Qt : : CheckState state ) {
2024-10-26 10:33:32 +01:00
if ( state = = Qt : : CheckState : : Checked )
# else
2024-10-27 13:06:03 +00:00
QObject : : connect ( cb , & QCheckBox : : stateChanged , this , [ this ] ( int state ) {
2024-10-26 10:33:32 +01:00
if ( static_cast < Qt : : CheckState > ( state ) = = Qt : : CheckState : : Checked )
# endif
{
2024-05-04 23:40:34 +01:00
prefs . confirmSettingsChanged = false ;
} else {
prefs . confirmSettingsChanged = true ;
}
settings - > beginGroup ( " Interface " ) ;
settings - > setValue ( " ConfirmSettingsChanged " , this - > prefs . confirmSettingsChanged ) ;
settings - > endGroup ( ) ;
settings - > sync ( ) ;
} ) ;
msgbox . exec ( ) ;
delete cb ;
if ( msgbox . clickedButton ( ) = = yesButton ) {
QApplication : : exit ( ) ;
} else if ( msgbox . clickedButton ( ) = = saveButton ) {
2023-06-08 08:20:50 +01:00
saveSettings ( ) ;
2024-05-04 23:40:34 +01:00
} else {
2023-06-08 08:20:50 +01:00
return true ;
}
2024-05-04 23:40:34 +01:00
2019-01-23 17:19:35 -08:00
}
2018-11-24 00:10:05 -08:00
2023-06-08 08:20:50 +01:00
// Are you sure?
if ( ! prefs . confirmExit ) {
QApplication : : exit ( ) ;
2024-05-04 23:40:34 +01:00
} else {
2024-05-30 09:44:40 -07:00
QCheckBox * cb = new QCheckBox ( tr ( " Don't ask me again " ) ) ;
cb - > setToolTip ( tr ( " Don't ask me to confirm exit again " ) ) ;
2024-05-04 23:40:34 +01:00
QMessageBox msgbox ;
2024-05-30 09:44:40 -07:00
msgbox . setText ( tr ( " Are you sure you wish to exit? \n " ) ) ;
2024-05-04 23:40:34 +01:00
msgbox . setIcon ( QMessageBox : : Icon : : Question ) ;
QAbstractButton * yesButton = msgbox . addButton ( QMessageBox : : Yes ) ;
msgbox . addButton ( QMessageBox : : No ) ;
msgbox . setDefaultButton ( QMessageBox : : Yes ) ;
msgbox . setCheckBox ( cb ) ;
2024-10-27 09:50:03 +00:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,7,0))
QObject : : connect ( cb , & QCheckBox : : checkStateChanged , this , [ this ] ( Qt : : CheckState state ) {
2024-10-26 10:33:32 +01:00
if ( state = = Qt : : CheckState : : Checked )
# else
2024-10-27 09:50:03 +00:00
QObject : : connect ( cb , & QCheckBox : : stateChanged , this , [ this ] ( int state ) {
2024-10-26 10:33:32 +01:00
if ( static_cast < Qt : : CheckState > ( state ) = = Qt : : CheckState : : Checked )
# endif
{
2024-05-04 23:40:34 +01:00
prefs . confirmExit = false ;
} else {
prefs . confirmExit = true ;
}
settings - > beginGroup ( " Interface " ) ;
settings - > setValue ( " ConfirmExit " , this - > prefs . confirmExit ) ;
settings - > endGroup ( ) ;
settings - > sync ( ) ;
} ) ;
2022-12-28 22:45:42 +00:00
2024-05-04 23:40:34 +01:00
msgbox . exec ( ) ;
delete cb ;
if ( msgbox . clickedButton ( ) = = yesButton ) {
QApplication : : exit ( ) ;
2023-06-08 08:20:50 +01:00
} else {
2024-05-04 23:40:34 +01:00
ret = true ;
2023-06-08 08:20:50 +01:00
}
}
return ret ;
2019-01-23 17:19:35 -08:00
}
void wfmain : : handlePttLimit ( )
{
// transmission time exceeded!
showStatusBarText ( " Transmit timeout at 3 minutes. Sending PTT OFF command now. " ) ;
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( false ) , false , uchar ( 0 ) ) ) ;
2018-11-24 00:10:05 -08:00
}
2018-11-26 23:10:23 -08:00
void wfmain : : on_saveSettingsBtn_clicked ( )
{
saveSettings ( ) ; // save memory, UI, and radio settings
}
2024-08-13 13:19:50 +01:00
void wfmain : : receiveATUStatus ( quint8 atustatus )
2018-12-19 12:31:44 -08:00
{
2021-05-15 18:53:16 +01:00
// qInfo(logSystem()) << "Received ATU status update: " << (unsigned int) atustatus;
2018-12-19 12:31:44 -08:00
switch ( atustatus )
{
case 0x00 :
// ATU not active
ui - > tuneEnableChk - > blockSignals ( true ) ;
ui - > tuneEnableChk - > setChecked ( false ) ;
ui - > tuneEnableChk - > blockSignals ( false ) ;
2024-02-10 12:02:02 -08:00
if ( ATUCheckTimer . isActive ( ) )
showStatusBarText ( " ATU not enabled. " ) ;
2018-12-19 12:31:44 -08:00
break ;
case 0x01 :
// ATU enabled
ui - > tuneEnableChk - > blockSignals ( true ) ;
ui - > tuneEnableChk - > setChecked ( true ) ;
ui - > tuneEnableChk - > blockSignals ( false ) ;
2024-02-10 12:02:02 -08:00
if ( ATUCheckTimer . isActive ( ) )
showStatusBarText ( " ATU enabled. " ) ;
2018-12-19 12:31:44 -08:00
break ;
case 0x02 :
// ATU tuning in-progress.
// Add command queue to check again and update status bar
2021-05-15 18:53:16 +01:00
// qInfo(logSystem()) << "Received ATU status update that *tuning* is taking place";
2018-12-20 11:22:52 -08:00
showStatusBarText ( " ATU is Tuning... " ) ;
2024-02-10 12:02:02 -08:00
ATUCheckTimer . stop ( ) ;
ATUCheckTimer . start ( 5000 ) ;
2023-05-15 10:53:52 +01:00
queue - > add ( priorityHighest , funcTunerStatus ) ;
2018-12-19 12:31:44 -08:00
break ;
2018-12-20 10:56:54 -08:00
default :
2021-05-15 18:53:16 +01:00
qInfo ( logSystem ( ) ) < < " Did not understand ATU status: " < < ( unsigned int ) atustatus ;
2018-12-20 11:22:52 -08:00
break ;
2018-12-19 12:31:44 -08:00
}
}
2024-02-06 22:45:16 -08:00
void wfmain : : handleExtConnectBtn ( ) {
// from settings widget
on_connectBtn_clicked ( ) ;
}
2024-04-13 20:04:35 -07:00
void wfmain : : handleRevertSettingsBtn ( ) {
// from settings widget
int ret = QMessageBox : : warning ( this , tr ( " Revert settings " ) ,
tr ( " Are you sure you wish to reset all wfview settings? \n If so, wfview will exit and you will need to start the program again. " ) ,
QMessageBox : : Ok | QMessageBox : : Cancel ,
QMessageBox : : Cancel ) ;
if ( ret = = QMessageBox : : Ok ) {
qInfo ( logSystem ( ) ) < < " Per user request, resetting preferences. " ;
prefs = defPrefs ;
udpPrefs = udpDefPrefs ;
serverConfig . enabled = false ;
serverConfig . users . clear ( ) ;
saveSettings ( ) ;
qInfo ( logSystem ( ) ) < < " Closing wfview for full preference-reset. " ;
QApplication : : exit ( ) ;
}
}
2021-02-07 12:59:41 +00:00
void wfmain : : on_connectBtn_clicked ( )
{
2021-02-07 17:40:38 +00:00
this - > rigStatus - > setText ( " " ) ; // Clear status
2023-07-17 11:09:14 +01:00
if ( connStatus = = connDisconnected ) {
2023-01-05 20:00:31 +00:00
connectionHandler ( true ) ;
2021-02-07 12:59:41 +00:00
}
2023-01-05 20:00:31 +00:00
else
2021-02-07 12:59:41 +00:00
{
2023-01-05 20:00:31 +00:00
connectionHandler ( false ) ;
2021-02-07 12:59:41 +00:00
}
2023-01-05 20:00:31 +00:00
2022-09-17 22:43:40 +01:00
ui - > connectBtn - > clearFocus ( ) ;
2021-02-07 12:59:41 +00:00
}
2021-02-10 21:22:38 -08:00
void wfmain : : on_sqlSlider_valueChanged ( int value )
{
2024-04-28 11:40:11 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcSquelch , QVariant : : fromValue < ushort > ( value ) , false , currentReceiver ) ) ;
2021-02-10 21:22:38 -08:00
}
2021-02-13 23:42:51 -08:00
2021-02-14 20:45:48 -08:00
void wfmain : : on_transmitBtn_clicked ( )
{
if ( ! amTransmitting )
{
// Currently receiving
2023-02-19 22:11:48 -08:00
if ( ! prefs . enablePTT )
2021-02-14 20:45:48 -08:00
{
showStatusBarText ( " PTT is disabled, not sending command. Change under Settings tab. " ) ;
return ;
}
// Are we already PTT? Not a big deal, just send again anyway.
showStatusBarText ( " Sending PTT ON command. Use Control-R to receive. " ) ;
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( true ) , false , uchar ( 0 ) ) ) ;
2023-05-12 00:24:01 +01:00
2021-02-14 20:45:48 -08:00
// send PTT
// Start 3 minute timer
pttTimer - > start ( ) ;
2023-05-12 00:24:01 +01:00
2021-02-14 20:45:48 -08:00
} else {
// Currently transmitting
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( false ) , false , uchar ( 0 ) ) ) ;
2023-05-12 00:24:01 +01:00
2021-02-16 22:32:05 -08:00
pttTimer - > stop ( ) ;
2021-02-14 20:45:48 -08:00
}
}
2021-02-14 22:40:04 -08:00
2021-07-09 12:02:50 -07:00
void wfmain : : setRadioTimeDatePrep ( )
{
if ( ! waitingToSetTimeDate )
{
// 1: Find the current time and date
2021-12-23 20:05:34 -08:00
QDateTime now ;
2023-06-08 08:20:50 +01:00
if ( prefs . useUTC )
2021-12-23 20:05:34 -08:00
{
now = QDateTime : : currentDateTimeUtc ( ) ;
2025-01-11 13:43:40 +00:00
//now.setTime(QTime::currentTime());
2021-12-23 20:05:34 -08:00
} else {
now = QDateTime : : currentDateTime ( ) ;
2025-01-11 13:43:40 +00:00
//now.setTime(QTime::currentTime());
2021-12-23 20:05:34 -08:00
}
2021-07-09 12:02:50 -07:00
int second = now . time ( ) . second ( ) ;
// 2: Find how many mseconds until next minute
int msecdelay = QTime : : currentTime ( ) . msecsTo ( QTime : : currentTime ( ) . addSecs ( 60 - second ) ) ;
// 3: Compute time and date at one minute later
2022-03-23 15:45:51 +00:00
QDateTime setpoint = now . addMSecs ( msecdelay ) ; // at HMS or possibly HMS + some ms. Never under though.
2021-07-09 12:02:50 -07:00
// 4: Prepare data structs for the time at one minute later
2024-08-13 13:19:50 +01:00
timesetpoint . hours = ( quint8 ) setpoint . time ( ) . hour ( ) ;
timesetpoint . minutes = ( quint8 ) setpoint . time ( ) . minute ( ) ;
datesetpoint . day = ( quint8 ) setpoint . date ( ) . day ( ) ;
datesetpoint . month = ( quint8 ) setpoint . date ( ) . month ( ) ;
2021-07-09 12:02:50 -07:00
datesetpoint . year = ( uint16_t ) setpoint . date ( ) . year ( ) ;
unsigned int utcOffsetSeconds = ( unsigned int ) abs ( setpoint . offsetFromUtc ( ) ) ;
bool isMinus = setpoint . offsetFromUtc ( ) < 0 ;
utcsetting . hours = utcOffsetSeconds / 60 / 60 ;
utcsetting . minutes = ( utcOffsetSeconds - ( utcsetting . hours * 60 * 60 ) ) / 60 ;
utcsetting . isMinus = isMinus ;
timeSync - > setInterval ( msecdelay ) ;
timeSync - > setSingleShot ( true ) ;
// 5: start one-shot timer for the delta computed in #2.
timeSync - > start ( ) ;
waitingToSetTimeDate = true ;
showStatusBarText ( QString ( " Setting time, date, and UTC offset for radio in %1 seconds. " ) . arg ( msecdelay / 1000 ) ) ;
}
}
void wfmain : : setRadioTimeDateSend ( )
{
// Issue priority commands for UTC offset, date, and time
// UTC offset must come first, otherwise the radio may "help" and correct for any changes.
showStatusBarText ( QString ( " Setting time, date, and UTC offset for radio now. " ) ) ;
2023-05-12 00:24:01 +01:00
queue - > add ( priorityImmediate , queueItem ( funcUTCOffset , QVariant : : fromValue < timekind > ( utcsetting ) ) ) ;
2025-01-11 12:32:31 +00:00
queue - > add ( priorityHighest , queueItem ( funcTime , QVariant : : fromValue < timekind > ( timesetpoint ) ) ) ;
queue - > add ( priorityHighest , queueItem ( funcDate , QVariant : : fromValue < datekind > ( datesetpoint ) ) ) ;
2023-05-12 00:24:01 +01:00
2021-07-09 12:02:50 -07:00
waitingToSetTimeDate = false ;
}
2023-02-10 13:17:23 -08:00
void wfmain : : showAndRaiseWidget ( QWidget * w )
{
if ( ! w )
return ;
if ( w - > isMinimized ( ) )
{
w - > raise ( ) ;
w - > activateWindow ( ) ;
return ;
}
w - > show ( ) ;
w - > raise ( ) ;
w - > activateWindow ( ) ;
}
2021-02-15 17:15:28 -08:00
void wfmain : : changeSliderQuietly ( QSlider * slider , int value )
{
2023-05-15 10:53:52 +01:00
if ( slider - > value ( ) ! = value ) {
slider - > blockSignals ( true ) ;
slider - > setValue ( value ) ;
slider - > blockSignals ( false ) ;
}
2021-02-15 17:15:28 -08:00
}
2021-06-19 16:16:07 -07:00
void wfmain : : statusFromSliderRaw ( QString name , int rawValue )
{
showStatusBarText ( name + QString ( " : %1 " ) . arg ( rawValue ) ) ;
}
void wfmain : : statusFromSliderPercent ( QString name , int rawValue )
{
2021-06-26 10:13:35 +01:00
showStatusBarText ( name + QString ( " : %1% " ) . arg ( ( int ) ( 100 * rawValue / 255.0 ) ) ) ;
2021-06-19 16:16:07 -07:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : processModLevel ( inputTypes source , quint8 level )
2021-02-20 00:05:23 -08:00
{
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
2024-08-13 13:19:50 +01:00
quint8 data = receivers [ 0 ] - > getDataMode ( ) ;
2021-02-20 00:05:23 -08:00
2024-01-29 10:43:41 +00:00
if ( prefs . inputSource [ data ] . type = = source )
{
prefs . inputSource [ data ] . level = level ;
changeSliderQuietly ( ui - > micGainSlider , level ) ;
}
2021-02-20 00:05:23 -08:00
}
2021-02-15 17:15:28 -08:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : receiveModInput ( rigInput input , quint8 data )
2021-02-17 23:47:34 -08:00
{
2023-05-15 10:53:52 +01:00
// This will ONLY fire if the input type is different to the current one
2024-03-30 20:40:27 +00:00
if ( currentModSrc [ data ] . type ! = input . type & & receivers . size ( ) )
2021-02-20 00:05:23 -08:00
{
2023-09-30 11:08:20 +01:00
qInfo ( ) < < QString ( " Data: %0 Input: %1 current: %2 " ) . arg ( data ) . arg ( input . name ) . arg ( prefs . inputSource [ data ] . name ) ;
2025-01-24 12:37:52 +00:00
queue - > del ( getInputTypeCommand ( prefs . inputSource [ data ] . type ) . cmd , currentReceiver ) ;
2023-10-01 10:22:09 +01:00
prefs . inputSource [ data ] = input ;
2024-03-30 20:40:27 +00:00
if ( receivers [ 0 ] - > getDataMode ( ) = = data )
2023-09-30 11:08:20 +01:00
{
2025-01-24 12:37:52 +00:00
queue - > addUnique ( priorityHigh , getInputTypeCommand ( input . type ) . cmd , true , currentReceiver ) ;
2023-09-30 11:08:20 +01:00
changeModLabel ( input , false ) ;
}
switch ( data ) {
case 0 :
setupui - > updateRsPrefs ( ( int ) rs_dataOffMod ) ;
break ;
case 1 :
setupui - > updateRsPrefs ( ( int ) rs_data1Mod ) ;
break ;
case 2 :
setupui - > updateRsPrefs ( ( int ) rs_data2Mod ) ;
break ;
case 3 :
setupui - > updateRsPrefs ( ( int ) rs_data3Mod ) ;
break ;
}
currentModSrc [ data ] = rigInput ( input ) ;
2021-02-20 00:05:23 -08:00
}
2021-02-17 23:47:34 -08:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : receiveTuningStep ( quint8 step )
2023-04-28 13:44:12 +01:00
{
if ( step > 0 )
{
2024-03-25 12:42:08 +00:00
for ( auto & s : rigCaps - > steps )
2023-04-28 13:44:12 +01:00
{
2023-05-15 11:15:35 +01:00
if ( step = = s . num & & ui - > tuningStepCombo - > currentData ( ) . toUInt ( ) ! = s . hz ) {
2024-03-25 15:30:18 +00:00
qDebug ( logSystem ( ) ) < < QString ( " Received new Tuning Step %0 " ) . arg ( s . name ) ;
2023-05-09 12:11:38 +01:00
ui - > tuningStepCombo - > setCurrentIndex ( ui - > tuningStepCombo - > findData ( s . hz ) ) ;
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > setStepSize ( s . hz ) ;
2024-01-27 22:13:47 +00:00
}
2023-04-28 13:44:12 +01:00
break ;
}
}
}
}
2023-01-16 12:24:22 +00:00
2025-02-15 18:24:33 +00:00
void wfmain : : receiveMeter ( meter_t inMeter , double level )
2021-02-20 20:41:19 -08:00
{
2025-01-09 00:35:26 +00:00
2021-02-20 20:41:19 -08:00
switch ( inMeter )
{
2024-02-05 13:42:00 -08:00
// These first two meters, S and Power,
// are automatically assigned to the primary meter.
2021-02-20 20:41:19 -08:00
case meterS :
2025-01-09 00:35:26 +00:00
ui - > meterSPoWidget - > setMeterType ( meterS ) ;
ui - > meterSPoWidget - > setLevel ( level ) ;
ui - > meterSPoWidget - > repaint ( ) ;
2021-02-20 20:41:19 -08:00
break ;
case meterPower :
2021-07-16 17:45:07 -07:00
ui - > meterSPoWidget - > setMeterType ( meterPower ) ;
2021-07-19 16:56:04 -07:00
ui - > meterSPoWidget - > setLevel ( level ) ;
2021-07-16 17:45:07 -07:00
ui - > meterSPoWidget - > update ( ) ;
2021-02-20 20:41:19 -08:00
break ;
default :
2024-02-05 13:42:00 -08:00
meter * marray [ 2 ] ;
marray [ 0 ] = ui - > meter2Widget ;
marray [ 1 ] = ui - > meter3Widget ;
for ( int m = 0 ; m < 2 ; m + + ) {
if ( marray [ m ] - > getMeterType ( ) = = inMeter )
{
// The incoming meter data matches the UI meter
marray [ m ] - > setLevel ( level ) ;
} else if ( ( marray [ m ] - > getMeterType ( ) = = meterAudio ) & &
( inMeter = = meterTxMod ) & & amTransmitting ) {
marray [ m ] - > setLevel ( level ) ;
} else if ( ( marray [ m ] - > getMeterType ( ) = = meterAudio ) & &
( inMeter = = meterRxAudio ) & & ! amTransmitting ) {
marray [ m ] - > setLevel ( level ) ;
}
2021-07-17 23:39:40 -07:00
}
2024-02-05 13:42:00 -08:00
2021-02-20 20:41:19 -08:00
break ;
}
}
2023-03-28 21:58:46 +01:00
void wfmain : : receiveMonitor ( bool en )
{
2023-09-24 21:00:21 +01:00
if ( en )
2024-12-13 14:30:22 +00:00
ui - > monitorLabel - > setText ( QString ( " <b><a href= \" # \" style= \" color:%0; text-decoration:none; \" >Mon</a></b> " ) . arg ( colorPrefs - > textColor . name ( ) ) ) ;
2023-09-24 21:00:21 +01:00
else
2023-09-25 20:29:01 -07:00
ui - > monitorLabel - > setText ( QString ( " <a href= \" # \" style= \" color:%0; text-decoration:none; \" >Mon</a> " ) . arg ( colorPrefs - > textColor . name ( ) ) ) ;
2023-03-28 21:58:46 +01:00
}
2021-02-15 17:15:28 -08:00
2021-02-15 20:32:14 -08:00
void wfmain : : on_txPowerSlider_valueChanged ( int value )
{
2023-05-15 10:53:52 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcRFPower , QVariant : : fromValue < ushort > ( value ) , false ) ) ;
2021-02-15 20:32:14 -08:00
}
void wfmain : : on_micGainSlider_valueChanged ( int value )
{
2024-08-13 13:19:50 +01:00
processChangingCurrentModLevel ( ( quint8 ) value ) ;
2021-02-15 20:32:14 -08:00
}
2023-04-23 21:29:44 +01:00
2023-05-15 10:53:52 +01:00
void wfmain : : changeModLabelAndSlider ( rigInput source )
2021-02-20 00:15:47 -08:00
{
changeModLabel ( source , true ) ;
}
2023-05-15 10:53:52 +01:00
void wfmain : : changeModLabel ( rigInput input )
2021-02-20 00:15:47 -08:00
{
changeModLabel ( input , false ) ;
}
2023-05-15 10:53:52 +01:00
void wfmain : : changeModLabel ( rigInput input , bool updateLevel )
2021-02-20 00:05:23 -08:00
{
2021-02-20 00:15:47 -08:00
2025-01-24 12:37:52 +00:00
funcType f = getInputTypeCommand ( input . type ) ;
queue - > add ( priorityMedium , f . cmd , true , currentReceiver ) ;
ui - > micGainSlider - > setRange ( f . minVal , f . maxVal ) ;
2023-05-15 10:53:52 +01:00
ui - > modSliderLbl - > setText ( input . name ) ;
2021-02-20 00:15:47 -08:00
if ( updateLevel )
{
2023-05-15 10:53:52 +01:00
changeSliderQuietly ( ui - > micGainSlider , input . level ) ;
2021-02-20 00:15:47 -08:00
}
2021-02-20 00:05:23 -08:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : processChangingCurrentModLevel ( quint8 level )
2021-02-20 00:05:23 -08:00
{
// slider moved, so find the current mod and issue the level set command.
2023-05-12 00:24:01 +01:00
2025-01-24 12:37:52 +00:00
funcType f ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
2025-01-01 13:40:58 +00:00
quint8 d = receivers [ currentReceiver ] - > getDataMode ( ) ;
2024-01-29 10:43:41 +00:00
f = getInputTypeCommand ( prefs . inputSource [ d ] . type ) ;
2025-01-24 12:37:52 +00:00
qDebug ( logSystem ( ) ) < < " Updating mod level for " < < funcString [ f . cmd ] < < " setting to " < < level ;
queue - > addUnique ( priorityImmediate , queueItem ( f . cmd , QVariant : : fromValue < ushort > ( level ) , false , currentReceiver ) ) ;
2024-01-29 10:43:41 +00:00
}
2021-02-19 00:14:40 -08:00
}
2021-02-21 23:58:23 -08:00
void wfmain : : on_tuneLockChk_clicked ( bool checked )
{
freqLock = checked ;
2025-02-09 16:46:18 +00:00
for ( const auto & rx : receivers )
{
rx - > setFreqLock ( checked ) ;
}
2021-02-21 23:58:23 -08:00
}
2021-03-30 23:37:35 -07:00
void wfmain : : on_rptSetupBtn_clicked ( )
{
2023-01-27 21:42:57 -08:00
if ( rpt - > isMinimized ( ) )
{
rpt - > raise ( ) ;
rpt - > activateWindow ( ) ;
return ;
}
2021-03-30 23:37:35 -07:00
rpt - > show ( ) ;
2023-01-27 21:42:57 -08:00
rpt - > raise ( ) ;
rpt - > activateWindow ( ) ;
2021-03-30 23:37:35 -07:00
}
2021-04-07 23:35:24 -07:00
void wfmain : : on_attSelCombo_activated ( int index )
{
2024-04-28 10:28:29 +01:00
queue - > add ( priorityImmediate , queueItem ( funcAttenuator , QVariant : : fromValue < uchar > ( ui - > attSelCombo - > itemData ( index ) . toInt ( ) ) , false , currentReceiver ) ) ;
2023-05-12 00:24:01 +01:00
queue - > add ( priorityHigh , funcPreamp , false ) ;
2021-04-07 23:35:24 -07:00
}
2021-04-09 10:04:20 -07:00
void wfmain : : on_preampSelCombo_activated ( int index )
{
2024-04-28 10:28:29 +01:00
queue - > add ( priorityImmediate , queueItem ( funcPreamp , QVariant : : fromValue < uchar > ( ui - > preampSelCombo - > itemData ( index ) . toInt ( ) ) , false , currentReceiver ) ) ;
2023-05-12 00:24:01 +01:00
queue - > add ( priorityHigh , funcAttenuator , false ) ;
2021-04-09 10:04:20 -07:00
}
2021-04-09 15:57:16 -07:00
void wfmain : : on_antennaSelCombo_activated ( int index )
{
2023-05-15 14:58:16 +01:00
antennaInfo ant ;
2024-08-13 13:19:50 +01:00
ant . antenna = ( quint8 ) ui - > antennaSelCombo - > itemData ( index ) . toInt ( ) ;
2023-05-15 14:58:16 +01:00
ant . rx = ui - > rxAntennaCheck - > isChecked ( ) ;
2024-04-28 10:28:29 +01:00
queue - > add ( priorityImmediate , queueItem ( funcAntenna , QVariant : : fromValue < antennaInfo > ( ant ) , false , currentReceiver ) ) ;
2021-04-09 15:57:16 -07:00
}
2021-07-16 17:08:55 +01:00
void wfmain : : on_rxAntennaCheck_clicked ( bool value )
{
2023-05-15 14:58:16 +01:00
antennaInfo ant ;
2024-08-13 13:19:50 +01:00
ant . antenna = ( quint8 ) ui - > antennaSelCombo - > currentData ( ) . toInt ( ) ;
2023-05-15 14:58:16 +01:00
ant . rx = value ;
2024-04-28 10:28:29 +01:00
queue - > add ( priorityImmediate , queueItem ( funcAntenna , QVariant : : fromValue < antennaInfo > ( ant ) , false , currentReceiver ) ) ;
2021-07-16 17:08:55 +01:00
}
2021-04-09 23:38:36 -07:00
2024-08-13 13:19:50 +01:00
void wfmain : : receivePreamp ( quint8 pre , uchar receiver )
2021-04-10 22:48:32 -07:00
{
2024-04-28 10:28:29 +01:00
if ( receiver = = currentReceiver ) {
2024-02-10 19:54:39 +00:00
ui - > preampSelCombo - > setCurrentIndex ( ui - > preampSelCombo - > findData ( pre ) ) ;
}
2021-04-10 22:48:32 -07:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : receiveAttenuator ( quint8 att , uchar receiver )
2021-04-10 22:48:32 -07:00
{
2024-04-28 10:28:29 +01:00
if ( receiver = = currentReceiver ) {
2024-02-10 19:54:39 +00:00
ui - > attSelCombo - > setCurrentIndex ( ui - > attSelCombo - > findData ( att ) ) ;
}
2021-04-10 22:48:32 -07:00
}
2021-07-16 19:33:15 +01:00
2021-06-08 09:18:40 -07:00
void wfmain : : calculateTimingParameters ( )
{
// Function for calculating polling parameters.
// Requires that we know the "baud rate" of the actual
// radio connection.
// baud on the serial port reflects the actual rig connection,
// even if a client-server connection is being used.
// Computed time for a 10 byte message, with a safety factor of 2.
if ( prefs . serialPortBaud = = 0 )
{
prefs . serialPortBaud = 9600 ;
qInfo ( logSystem ( ) ) < < " WARNING: baud rate received was zero. Assuming 9600 baud, performance may suffer. " ;
}
unsigned int usPerByte = 9600 * 1000 / prefs . serialPortBaud ;
unsigned int msMinTiming = usPerByte * 10 * 2 / 1000 ;
2021-06-18 12:41:56 -07:00
if ( msMinTiming < 25 )
msMinTiming = 25 ;
2021-06-08 09:18:40 -07:00
2026-01-02 18:59:51 +00:00
if ( rigCaps ! = nullptr & & rigCaps - > hasFDcomms )
2021-06-18 12:41:56 -07:00
{
2023-05-12 00:24:01 +01:00
queue - > interval ( msMinTiming ) ;
2021-06-18 12:41:56 -07:00
} else {
2023-05-12 00:24:01 +01:00
queue - > interval ( msMinTiming * 4 ) ;
2021-06-18 12:41:56 -07:00
}
2021-06-08 09:18:40 -07:00
2024-04-30 09:42:54 +01:00
qInfo ( logSystem ( ) ) < < " Delay command interval timing: " < < queue - > interval ( ) < < " ms " ;
2021-06-08 09:18:40 -07:00
// Normal:
2024-04-30 09:42:54 +01:00
delayedCmdIntervalLAN_ms = queue - > interval ( ) ;
delayedCmdIntervalSerial_ms = queue - > interval ( ) ;
2021-06-08 09:18:40 -07:00
// startup initial state:
2024-04-30 09:42:54 +01:00
delayedCmdStartupInterval_ms = queue - > interval ( ) * 3 ;
2021-06-08 09:18:40 -07:00
}
2021-05-21 16:30:52 +01:00
void wfmain : : receiveBaudRate ( quint32 baud )
{
qInfo ( ) < < " Received serial port baud rate from remote server: " < < baud ;
prefs . serialPortBaud = baud ;
2021-06-08 09:18:40 -07:00
calculateTimingParameters ( ) ;
2021-05-21 16:30:52 +01:00
}
2021-04-19 22:55:39 -07:00
void wfmain : : on_rigPowerOnBtn_clicked ( )
{
2021-04-23 23:11:54 -07:00
powerRigOn ( ) ;
2021-04-19 22:55:39 -07:00
}
void wfmain : : on_rigPowerOffBtn_clicked ( )
{
2021-07-20 14:45:44 +01:00
// Are you sure?
if ( ! prefs . confirmPowerOff ) {
powerRigOff ( ) ;
return ;
}
2024-05-30 09:44:40 -07:00
QCheckBox * cb = new QCheckBox ( tr ( " Don't ask me again " ) ) ;
2021-07-20 14:45:44 +01:00
QMessageBox msgbox ;
2024-05-30 09:44:40 -07:00
msgbox . setWindowTitle ( tr ( " Power " ) ) ;
msgbox . setText ( tr ( " Power down the radio? \n " ) ) ;
2021-07-20 14:45:44 +01:00
msgbox . setIcon ( QMessageBox : : Icon : : Question ) ;
QAbstractButton * yesButton = msgbox . addButton ( QMessageBox : : Yes ) ;
msgbox . addButton ( QMessageBox : : No ) ;
msgbox . setDefaultButton ( QMessageBox : : Yes ) ;
msgbox . setCheckBox ( cb ) ;
2024-10-27 09:50:03 +00:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,7,0))
QObject : : connect ( cb , & QCheckBox : : checkStateChanged , this , [ this ] ( Qt : : CheckState state ) {
2024-10-26 10:33:32 +01:00
if ( state = = Qt : : CheckState : : Checked )
# else
2024-10-27 09:50:03 +00:00
QObject : : connect ( cb , & QCheckBox : : stateChanged , this , [ this ] ( int state ) {
2024-10-26 10:33:32 +01:00
if ( static_cast < Qt : : CheckState > ( state ) = = Qt : : CheckState : : Checked )
# endif
{
2021-07-20 14:45:44 +01:00
prefs . confirmPowerOff = false ;
}
else {
prefs . confirmPowerOff = true ;
}
settings - > beginGroup ( " Interface " ) ;
settings - > setValue ( " ConfirmPowerOff " , this - > prefs . confirmPowerOff ) ;
settings - > endGroup ( ) ;
settings - > sync ( ) ;
} ) ;
msgbox . exec ( ) ;
if ( msgbox . clickedButton ( ) = = yesButton ) {
2021-04-23 23:11:54 -07:00
powerRigOff ( ) ;
}
}
void wfmain : : powerRigOn ( )
{
2024-04-30 09:42:54 +01:00
// Bypass the queue
2021-04-23 23:11:54 -07:00
emit sendPowerOn ( ) ;
2024-04-30 09:42:54 +01:00
// Need to allow time for the rig to power-on.
// If we have no rigCaps then usual rig detection should occur.
2026-01-02 18:59:51 +00:00
if ( rigCaps ! = nullptr ) {
2024-04-30 09:42:54 +01:00
calculateTimingParameters ( ) ; // Set queue interval
QTimer : : singleShot ( 5000 , this , SLOT ( initPeriodicCommands ( ) ) ) ;
QTimer : : singleShot ( 6500 , this , SLOT ( getInitialRigState ( ) ) ) ;
}
2021-04-23 23:11:54 -07:00
}
void wfmain : : powerRigOff ( )
{
2024-04-30 09:42:54 +01:00
// Clear the queue to stop sending lots of data.
queue - > clear ( ) ;
2021-04-23 23:11:54 -07:00
emit sendPowerOff ( ) ;
2024-05-20 14:35:36 +01:00
queue - > interval ( - 1 ) ; // Queue Disabled
2021-04-19 22:55:39 -07:00
}
2021-04-24 00:31:51 -07:00
void wfmain : : on_ritTuneDial_valueChanged ( int value )
{
2025-01-18 12:29:34 +00:00
queue - > add ( priorityImmediate , queueItem ( funcRitFreq , QVariant : : fromValue ( short ( value ) ) ) ) ;
2021-04-24 00:31:51 -07:00
}
void wfmain : : on_ritEnableChk_clicked ( bool checked )
{
2023-05-29 00:10:58 +01:00
queue - > add ( priorityImmediate , queueItem ( funcRitStatus , QVariant : : fromValue ( checked ) ) ) ;
2021-04-24 00:31:51 -07:00
}
2021-04-25 00:23:52 -07:00
void wfmain : : receiveRITStatus ( bool ritEnabled )
{
ui - > ritEnableChk - > blockSignals ( true ) ;
ui - > ritEnableChk - > setChecked ( ritEnabled ) ;
ui - > ritEnableChk - > blockSignals ( false ) ;
}
void wfmain : : receiveRITValue ( int ritValHz )
{
2021-04-26 18:24:28 -07:00
if ( ( ritValHz > - 500 ) & & ( ritValHz < 500 ) )
2021-04-25 00:23:52 -07:00
{
ui - > ritTuneDial - > blockSignals ( true ) ;
ui - > ritTuneDial - > setValue ( ritValHz ) ;
ui - > ritTuneDial - > blockSignals ( false ) ;
} else {
2021-05-15 18:53:16 +01:00
qInfo ( logSystem ( ) ) < < " Warning: out of range RIT value received: " < < ritValHz < < " Hz " ;
2021-04-25 00:23:52 -07:00
}
}
2021-04-26 18:24:28 -07:00
void wfmain : : showButton ( QPushButton * btn )
{
btn - > setHidden ( false ) ;
}
void wfmain : : hideButton ( QPushButton * btn )
{
btn - > setHidden ( true ) ;
}
2023-05-15 13:47:45 +01:00
funcs wfmain : : meter_tToMeterCommand ( meter_t m )
2021-07-17 23:39:40 -07:00
{
2023-05-12 00:24:01 +01:00
funcs c ;
2021-07-17 23:39:40 -07:00
switch ( m )
{
2023-05-12 00:24:01 +01:00
case meterNone :
c = funcNone ;
2021-07-17 23:39:40 -07:00
break ;
case meterS :
2025-01-10 18:45:11 +00:00
case meterSubS :
2023-05-12 00:24:01 +01:00
c = funcSMeter ;
2021-07-17 23:39:40 -07:00
break ;
2021-07-18 14:27:21 -07:00
case meterCenter :
2023-05-12 00:24:01 +01:00
c = funcCenterMeter ;
2021-07-18 14:27:21 -07:00
break ;
2021-07-17 23:39:40 -07:00
case meterPower :
2023-05-12 00:24:01 +01:00
c = funcPowerMeter ;
2021-07-17 23:39:40 -07:00
break ;
case meterSWR :
2023-05-12 00:24:01 +01:00
c = funcSWRMeter ;
2021-07-17 23:39:40 -07:00
break ;
case meterALC :
2023-05-12 00:24:01 +01:00
c = funcALCMeter ;
2021-07-17 23:39:40 -07:00
break ;
case meterComp :
2023-05-12 00:24:01 +01:00
c = funcCompMeter ;
2021-07-17 23:39:40 -07:00
break ;
case meterCurrent :
2023-05-12 00:24:01 +01:00
c = funcIdMeter ;
2021-07-17 23:39:40 -07:00
break ;
case meterVoltage :
2023-05-12 00:24:01 +01:00
c = funcVdMeter ;
2021-07-17 23:39:40 -07:00
break ;
2024-11-05 18:46:21 +00:00
case meterdBu :
case meterdBm :
case meterdBuEMF :
c = funcAbsoluteMeter ;
break ;
2021-07-17 23:39:40 -07:00
default :
2023-05-12 00:24:01 +01:00
c = funcNone ;
2021-07-17 23:39:40 -07:00
break ;
}
return c ;
}
2025-02-17 23:58:33 +00:00
void wfmain : : getMeterExtremities ( meter_t m , double & lowVal , double & highVal , double & redLineVal ) {
2025-02-17 10:29:05 -08:00
lowVal = UINT16_MAX ;
highVal = ( - 1 ) * UINT16_MAX ;
2025-02-20 17:10:52 +00:00
redLineVal = 200.0 ;
2025-02-17 23:58:33 +00:00
if ( m = = meterSubS )
{
m = meterS ;
}
2025-02-17 10:29:05 -08:00
if ( m = = meterNone )
{
return ;
2026-01-02 18:59:51 +00:00
} else if ( rigCaps ! = nullptr ) {
2025-02-17 10:29:05 -08:00
redLineVal = rigCaps - > meterLines [ m ] ;
for ( auto it = rigCaps - > meters [ m ] . keyValueBegin ( ) ; it ! = rigCaps - > meters [ m ] . keyValueEnd ( ) ; + + it ) {
if ( it - > second < lowVal )
lowVal = it - > second ;
if ( it - > second > highVal | | highVal = = 255.0 )
highVal = it - > second ;
}
qDebug ( logSystem ( ) ) < < " Meter extremities: " < < meterString [ m ] < < " values, low: " < < lowVal < < " , high: " < < highVal < < " , red line: " < < redLineVal ;
return ;
} else {
// Hopefully we come back here after connection and do this correctly.
qWarning ( logSystem ( ) ) < < " Cannot setup meter correctly without rigCaps. " ;
return ;
}
}
2024-02-05 13:42:00 -08:00
void wfmain : : changeMeterType ( meter_t m , int meterNum )
2021-07-17 23:39:40 -07:00
{
2024-02-05 13:42:00 -08:00
qDebug ( ) < < " Changing meter type. " ;
2023-05-15 13:47:45 +01:00
meter_t newMeterType ;
meter_t oldMeterType ;
2024-02-05 13:42:00 -08:00
meter * uiMeter = NULL ;
2024-11-05 18:46:21 +00:00
if ( meterNum = = 1 ) {
uiMeter = ui - > meterSPoWidget ;
} else if ( meterNum = = 2 ) {
2024-02-05 13:42:00 -08:00
uiMeter = ui - > meter2Widget ;
} else if ( meterNum = = 3 ) {
uiMeter = ui - > meter3Widget ;
} else {
qCritical ( ) < < " Error, invalid meter requested: meterNum == " < < meterNum ;
return ;
}
2023-05-27 00:26:01 +01:00
newMeterType = m ;
2024-02-05 13:42:00 -08:00
oldMeterType = uiMeter - > getMeterType ( ) ;
2023-05-27 00:26:01 +01:00
2024-02-05 13:42:00 -08:00
if ( newMeterType = = oldMeterType ) {
qDebug ( ) < < " Debug note: the old meter was the same as the new meter. " ;
}
2021-07-17 23:39:40 -07:00
2023-05-15 13:47:45 +01:00
funcs newCmd = meter_tToMeterCommand ( newMeterType ) ;
funcs oldCmd = meter_tToMeterCommand ( oldMeterType ) ;
2023-05-12 00:24:01 +01:00
2024-11-05 18:46:21 +00:00
//if (oldCmd != funcSMeter && oldCmd != funcNone)
2025-01-10 18:45:11 +00:00
queue - > del ( oldCmd , ( oldMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ;
2021-07-17 23:39:40 -07:00
2025-02-17 10:29:05 -08:00
double lowVal = 0.0 ;
2025-02-20 17:10:52 +00:00
double highVal = 2.0 ;
double lineVal = 1.0 ;
2025-02-17 10:29:05 -08:00
2025-02-20 19:12:29 +00:00
switch ( newMeterType )
{
case meterdBu :
lowVal = 0.0 ;
highVal = 80.0 ;
lineVal = 80.0 ;
break ;
case meterdBuEMF :
lowVal = 0.0 ;
highVal = 85.0 ;
lineVal = 85.0 ;
break ;
case meterdBm :
lowVal = - 100.0 ;
highVal = - 20.0 ;
lineVal = - 20.0 ;
break ;
default :
if ( rigCaps - > meters [ newMeterType ] . size ( ) )
getMeterExtremities ( newMeterType , lowVal , highVal , lineVal ) ;
break ;
}
2025-02-17 10:29:05 -08:00
2021-07-17 23:39:40 -07:00
if ( newMeterType = = meterNone )
{
2024-02-05 13:42:00 -08:00
uiMeter - > setMeterType ( newMeterType ) ;
2025-02-17 10:29:05 -08:00
uiMeter - > setMeterShortString ( " None " ) ;
2026-01-02 18:59:51 +00:00
} else if ( rigCaps ! = nullptr ) {
2024-02-05 13:42:00 -08:00
uiMeter - > show ( ) ;
uiMeter - > setMeterType ( newMeterType ) ;
2025-02-17 10:29:05 -08:00
uiMeter - > setMeterExtremities ( lowVal , highVal , lineVal ) ;
uiMeter - > setMeterShortString ( meterString [ ( int ) newMeterType ] ) ;
2025-02-15 18:24:33 +00:00
2022-08-23 22:24:05 -07:00
if ( ( newMeterType ! = meterRxAudio ) & & ( newMeterType ! = meterTxMod ) & & ( newMeterType ! = meterAudio ) )
2025-01-14 13:35:14 +00:00
{
if ( rigCaps - > commands . contains ( newCmd ) ) {
queue - > addUnique ( priorityHighest , queueItem ( newCmd , true , ( newMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ) ;
}
}
2024-11-05 18:46:21 +00:00
2024-11-06 09:27:15 +00:00
if ( meterNum = = 1 )
2024-11-05 18:46:21 +00:00
{
2024-11-06 09:27:15 +00:00
if ( rigCaps - > commands . contains ( funcMeterType ) )
{
if ( newMeterType = = meterS )
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 0 ) , false , ( newMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ) ;
2025-01-09 00:35:26 +00:00
if ( newMeterType = = meterSubS )
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 0 ) , false , ( newMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ) ;
2024-11-06 09:27:15 +00:00
else if ( newMeterType = = meterdBu )
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 1 ) , false , ( newMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ) ;
2024-11-06 09:27:15 +00:00
else if ( newMeterType = = meterdBuEMF )
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 2 ) , false , ( newMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ) ;
2024-11-06 09:27:15 +00:00
else if ( newMeterType = = meterdBm )
2025-01-10 18:45:11 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 3 ) , false , ( newMeterType = = meterSubS ) ? uchar ( 1 ) : uchar ( 0 ) ) ) ;
2024-11-06 09:27:15 +00:00
}
uiMeter - > enableCombo ( rigCaps - > commands . contains ( funcMeterType ) ) ;
2024-11-05 18:46:21 +00:00
}
2021-07-17 23:39:40 -07:00
}
}
2023-02-19 23:12:36 -08:00
void wfmain : : enableRigCtl ( bool enabled )
2021-08-04 20:49:32 +01:00
{
2023-02-19 23:12:36 -08:00
// migrated to this, keep
2026-01-02 18:59:51 +00:00
if ( rigCtl ! = nullptr )
2021-08-04 20:49:32 +01:00
{
rigCtl - > disconnect ( ) ;
delete rigCtl ;
2026-01-02 18:59:51 +00:00
rigCtl = nullptr ;
2021-08-04 20:49:32 +01:00
}
2023-02-19 23:12:36 -08:00
if ( enabled ) {
2021-08-04 20:49:32 +01:00
// Start rigctld
rigCtl = new rigCtlD ( this ) ;
rigCtl - > startServer ( prefs . rigCtlPort ) ;
2023-09-25 19:35:22 +01:00
}
2022-04-18 20:29:50 +01:00
}
2022-01-21 19:23:32 +00:00
void wfmain : : radioSelection ( QList < radio_cap_packet > radios )
{
selRad - > populate ( radios ) ;
2022-01-21 23:58:18 +00:00
}
void wfmain : : on_radioStatusBtn_clicked ( )
{
if ( selRad - > isVisible ( ) )
{
selRad - > hide ( ) ;
}
else
{
selRad - > show ( ) ;
}
2022-01-21 19:23:32 +00:00
}
2022-05-12 01:46:20 +01:00
void wfmain : : setAudioDevicesUI ( )
{
2022-12-28 16:57:05 +00:00
2022-05-12 01:46:20 +01:00
}
2022-08-17 16:21:33 -07:00
// --- DEBUG FUNCTION ---
2023-07-17 11:09:14 +01:00
void wfmain : : debugBtn_clicked ( )
2022-08-17 16:21:33 -07:00
{
qInfo ( logSystem ( ) ) < < " Debug button pressed. " ;
2023-05-15 10:53:52 +01:00
debugWindow * debug = new debugWindow ( ) ;
debug - > setAttribute ( Qt : : WA_DeleteOnClose ) ;
debug - > show ( ) ;
2022-08-17 16:21:33 -07:00
}
2022-08-19 09:41:13 -07:00
2022-08-21 21:19:08 -07:00
// ---------- color helper functions: ---------- //
2022-08-21 00:17:44 -07:00
void wfmain : : useColorPreset ( colorPrefsType * cp )
{
// Apply the given preset to the UI elements
// prototyped from setPlotTheme()
2026-01-02 18:59:51 +00:00
if ( cp = = nullptr )
2022-08-21 00:17:44 -07:00
return ;
2022-08-22 21:31:31 -07:00
//qInfo(logSystem()) << "Setting plots to color preset number " << cp->presetNum << ", with name " << *(cp->presetName);
2022-08-22 21:22:01 -07:00
ui - > meterSPoWidget - > setColors ( cp - > meterLevel , cp - > meterPeakScale , cp - > meterPeakLevel , cp - > meterAverage , cp - > meterLowerLine , cp - > meterLowText ) ;
ui - > meter2Widget - > setColors ( cp - > meterLevel , cp - > meterPeakScale , cp - > meterPeakLevel , cp - > meterAverage , cp - > meterLowerLine , cp - > meterLowText ) ;
2024-02-05 13:42:00 -08:00
ui - > meter3Widget - > setColors ( cp - > meterLevel , cp - > meterPeakScale , cp - > meterPeakLevel , cp - > meterAverage , cp - > meterLowerLine , cp - > meterLowText ) ;
2024-12-30 19:22:26 +00:00
ui - > scopeDualBtn - > setStyleSheet ( QString ( " QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;} " )
. arg ( cp - > buttonOff . name ( QColor : : HexArgb ) , cp - > buttonOn . name ( QColor : : HexArgb ) ) ) ;
ui - > dualWatchBtn - > setStyleSheet ( QString ( " QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;} " )
. arg ( cp - > buttonOff . name ( QColor : : HexArgb ) , cp - > buttonOn . name ( QColor : : HexArgb ) ) ) ;
2025-01-03 20:25:30 +00:00
ui - > splitBtn - > setStyleSheet ( QString ( " QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;} " )
2025-01-01 13:40:58 +00:00
. arg ( cp - > buttonOff . name ( QColor : : HexArgb ) , cp - > buttonOn . name ( QColor : : HexArgb ) ) ) ;
2025-01-03 20:25:30 +00:00
//ui->mainSubTrackingBtn->setStyleSheet(QString("QPushButton {background-color: %0;} QPushButton:checked {background-color: %1;border: 1px solid;}")
// .arg(cp->buttonOff.name(QColor::HexArgb),cp->buttonOn.name(QColor::HexArgb)));
2024-12-30 19:22:26 +00:00
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2024-03-30 20:40:27 +00:00
receiver - > colorPreset ( cp ) ;
2024-01-27 22:13:47 +00:00
}
2026-01-02 18:59:51 +00:00
if ( this - > colorPrefs ! = nullptr )
2023-09-24 21:00:21 +01:00
delete this - > colorPrefs ;
this - > colorPrefs = new colorPrefsType ( * cp ) ;
2024-10-17 22:46:12 +01:00
qInfo ( ) < < " Setting color Preset " < < cp - > presetNum < < " name " < < * ( cp - > presetName ) ;
2022-08-21 00:17:44 -07:00
}
2022-08-21 16:47:17 -07:00
void wfmain : : setDefaultColorPresets ( )
2022-08-21 00:17:44 -07:00
{
2022-08-21 16:47:17 -07:00
// Default wfview colors in each preset
// gets overridden after preferences are loaded
for ( int pn = 0 ; pn < numColorPresetsTotal ; pn + + )
{
2022-08-23 10:35:59 -07:00
setDefaultColors ( pn ) ;
2022-08-21 16:47:17 -07:00
}
2022-08-21 00:17:44 -07:00
}
2023-05-28 22:11:59 +01:00
void wfmain : : on_showLogBtn_clicked ( )
2022-08-21 16:47:17 -07:00
{
2023-05-28 22:11:59 +01:00
if ( logWindow - > isMinimized ( ) )
2022-08-21 16:47:17 -07:00
{
2023-05-28 22:11:59 +01:00
logWindow - > raise ( ) ;
logWindow - > activateWindow ( ) ;
2022-08-21 16:47:17 -07:00
return ;
}
2023-05-28 22:11:59 +01:00
logWindow - > show ( ) ;
logWindow - > raise ( ) ;
logWindow - > activateWindow ( ) ;
2022-08-21 00:17:44 -07:00
}
2023-05-28 22:11:59 +01:00
void wfmain : : initLogging ( )
2022-09-14 17:07:23 -07:00
{
2026-01-02 18:59:51 +00:00
return ;
2022-09-14 17:07:23 -07:00
// Set the logging file before doing anything else.
m_logFile . reset ( new QFile ( logFilename ) ) ;
// Open the file logging
m_logFile . data ( ) - > open ( QFile : : WriteOnly | QFile : : Truncate | QFile : : Text ) ;
2024-06-04 00:59:41 +01:00
logStream . reset ( new QTextStream ( m_logFile . data ( ) ) ) ;
2022-09-14 17:07:23 -07:00
// Set handler
qInstallMessageHandler ( messageHandler ) ;
2022-09-15 09:42:19 -07:00
connect ( logWindow , SIGNAL ( setDebugMode ( bool ) ) , this , SLOT ( setDebugLogging ( bool ) ) ) ;
2024-09-22 16:03:05 -07:00
connect ( logWindow , SIGNAL ( setInsaneLoggingMode ( bool ) ) , this , SLOT ( setInsaneDebugLogging ( bool ) ) ) ;
2024-12-29 14:59:52 +00:00
connect ( logWindow , SIGNAL ( setRigctlLoggingMode ( bool ) ) , this , SLOT ( setRigctlDebugLogging ( bool ) ) ) ;
2022-09-15 09:42:19 -07:00
2022-09-14 18:32:28 -07:00
// Interval timer for log window updates:
logCheckingTimer . setInterval ( 100 ) ;
2022-09-14 17:07:23 -07:00
connect ( & logCheckingTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( logCheck ( ) ) ) ;
logCheckingTimer . start ( ) ;
}
void wfmain : : logCheck ( )
{
// This is called by a timer to check for new log messages and copy
// the messages into the logWindow.
QMutexLocker locker ( & logTextMutex ) ;
int size = logStringBuffer . size ( ) ;
for ( int i = 0 ; i < size ; i + + )
{
handleLogText ( logStringBuffer . back ( ) ) ;
logStringBuffer . pop_back ( ) ;
}
}
2023-11-26 16:23:16 +00:00
void wfmain : : handleLogText ( QPair < QtMsgType , QString > logMessage )
2022-09-14 17:07:23 -07:00
{
// This function is just a pass-through
2023-11-26 16:23:16 +00:00
logWindow - > acceptLogText ( logMessage ) ;
2022-09-14 17:07:23 -07:00
}
2022-09-15 09:42:19 -07:00
void wfmain : : setDebugLogging ( bool debugModeOn )
{
this - > debugMode = debugModeOn ;
2022-09-15 09:53:50 -07:00
debugModeLogging = debugModeOn ;
2022-09-15 09:42:19 -07:00
}
2024-09-22 16:03:05 -07:00
void wfmain : : setInsaneDebugLogging ( bool insaneLoggingOn )
{
insaneDebugLogging = insaneLoggingOn ;
}
2024-12-29 14:59:52 +00:00
void wfmain : : setRigctlDebugLogging ( bool rigctlLoggingOn )
{
rigctlDebugLogging = rigctlLoggingOn ;
}
2022-09-14 17:07:23 -07:00
void wfmain : : messageHandler ( QtMsgType type , const QMessageLogContext & context , const QString & msg )
{
// Open stream file writes
2024-09-22 16:03:05 -07:00
// bool insaneDebugLogging = true;// global
2022-09-14 17:07:23 -07:00
if ( type = = QtDebugMsg & & ! debugModeLogging )
{
return ;
}
2024-02-06 09:40:33 -08:00
if ( ( type = = QtWarningMsg ) & & ( msg . contains ( " QPainter:: " ) ) ) {
// This is a message from QCP about a collapsed plot area.
// Ignore.
return ;
}
2024-02-12 10:06:08 -08:00
if ( ( type = = QtDebugMsg ) & & ( ! insaneDebugLogging ) & & ( qstrncmp ( context . category , " rigTraffic " , 10 ) = = 0 ) ) {
return ;
}
2024-12-29 14:59:52 +00:00
if ( ( type = = QtDebugMsg ) & & ( ! rigctlDebugLogging ) & & ( qstrncmp ( context . category , " rigctld " , 10 ) = = 0 ) ) {
return ;
}
2022-09-14 17:07:23 -07:00
QMutexLocker locker ( & logMutex ) ;
QString text ;
// Write the date of recording
2024-06-04 00:59:41 +01:00
* logStream < < QDateTime : : currentDateTime ( ) . toString ( " yyyy-MM-dd hh:mm:ss.zzz " ) ;
2022-09-14 17:07:23 -07:00
text . append ( QDateTime : : currentDateTime ( ) . toString ( " yyyy-MM-dd hh:mm:ss.zzz " ) ) ;
// By type determine to what level belongs message
switch ( type )
{
case QtDebugMsg :
2024-06-04 00:59:41 +01:00
* logStream < < " DBG " ;
2022-09-14 17:07:23 -07:00
text . append ( " DBG " ) ;
break ;
case QtInfoMsg :
2024-06-04 00:59:41 +01:00
* logStream < < " INF " ;
2022-09-14 17:07:23 -07:00
text . append ( " INF " ) ;
break ;
case QtWarningMsg :
2024-06-04 00:59:41 +01:00
* logStream < < " WRN " ;
2022-09-14 17:07:23 -07:00
text . append ( " WRN " ) ;
break ;
case QtCriticalMsg :
2024-06-04 00:59:41 +01:00
* logStream < < " CRT " ;
2022-09-14 17:07:23 -07:00
text . append ( " CRT " ) ;
break ;
case QtFatalMsg :
2024-06-04 00:59:41 +01:00
* logStream < < " FTL " ;
2022-09-14 17:07:23 -07:00
text . append ( " FLT " ) ;
break ;
}
// Write to the output category of the message and the message itself
2024-06-04 00:59:41 +01:00
* logStream < < context . category < < " : " < < msg < < " \n " ;
logStream - > flush ( ) ; // Clear the buffered data
2022-09-14 17:07:23 -07:00
text . append ( context . category ) ;
text . append ( " : " ) ;
text . append ( msg ) ;
logTextMutex . lock ( ) ;
2023-11-26 16:23:16 +00:00
logStringBuffer . push_front ( QPair < QtMsgType , QString > ( type , text ) ) ;
2022-09-14 17:07:23 -07:00
logTextMutex . unlock ( ) ;
}
2022-09-18 17:42:41 +01:00
2022-09-30 17:05:42 +01:00
void wfmain : : receiveClusterOutput ( QString text ) {
2023-02-20 20:45:55 -08:00
setupui - > insertClusterOutputText ( text ) ;
2022-09-29 17:17:51 +01:00
}
2022-11-26 21:43:47 -08:00
void wfmain : : changePollTiming ( int timing_ms , bool setUI )
{
2023-05-12 00:24:01 +01:00
queue - > interval ( timing_ms ) ;
2022-11-26 21:43:47 -08:00
qInfo ( logSystem ( ) ) < < " User changed radio polling interval to " < < timing_ms < < " ms. " ;
showStatusBarText ( " User changed radio polling interval to " + QString ( " %1 " ) . arg ( timing_ms ) + " ms. " ) ;
prefs . polling_ms = timing_ms ;
2025-01-06 21:05:28 +00:00
delayedCmdIntervalLAN_ms = timing_ms ;
delayedCmdIntervalSerial_ms = timing_ms ;
2023-02-19 22:11:48 -08:00
( void ) setUI ;
2022-10-11 16:42:34 +01:00
}
2023-01-05 20:00:31 +00:00
2023-09-25 19:35:22 +01:00
void wfmain : : connectionHandler ( bool connect )
2023-01-05 20:00:31 +00:00
{
2023-07-16 10:08:28 +01:00
queue - > clear ( ) ;
2023-05-28 22:11:59 +01:00
emit sendCloseComm ( ) ;
2024-03-25 12:42:08 +00:00
2023-05-28 22:11:59 +01:00
rigName - > setText ( " NONE " ) ;
2023-07-17 11:09:14 +01:00
connStatus = connDisconnected ;
emit connectionStatus ( connect ) ; // Signal any other parts that need to know if we are connecting/connected.
2023-05-28 22:11:59 +01:00
2024-12-29 14:59:52 +00:00
2023-07-17 11:09:14 +01:00
if ( connect ) {
2023-05-28 22:11:59 +01:00
openRig ( ) ;
} else {
2023-01-05 20:00:31 +00:00
ui - > connectBtn - > setText ( " Connect to Radio " ) ;
2026-01-02 18:59:51 +00:00
//enableRigCtl(false);
2023-09-24 10:32:59 +01:00
removeRig ( ) ;
2025-11-15 20:08:52 +00:00
// Stop time sync timer if running.
if ( timeSync - > isActive ( ) )
timeSync - > stop ( ) ;
2023-01-05 20:00:31 +00:00
}
2023-05-01 21:56:52 +01:00
// Whatever happened, make sure we delete the memories window.
2026-01-02 18:59:51 +00:00
if ( memWindow ! = nullptr ) {
2024-02-05 12:06:50 -08:00
memWindow - > close ( ) ;
2023-05-01 21:56:52 +01:00
delete memWindow ;
2026-01-02 18:59:51 +00:00
memWindow = nullptr ;
2023-05-01 21:56:52 +01:00
}
2023-05-28 22:11:59 +01:00
2023-05-01 21:56:52 +01:00
2023-01-05 20:00:31 +00:00
}
2023-01-20 23:23:47 -08:00
2024-03-24 23:17:39 +00:00
void wfmain : : connectionTimeout ( )
{
qWarning ( logSystem ( ) ) < < " No response received to connection request " ;
connectionHandler ( false ) ;
connectionHandler ( true ) ;
}
2023-01-20 23:23:47 -08:00
void wfmain : : on_cwButton_clicked ( )
{
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2024-11-16 14:44:21 +00:00
if ( cw - > isMinimized ( ) )
{
cw - > raise ( ) ;
cw - > activateWindow ( ) ;
return ;
}
cw - > show ( ) ;
2023-01-20 23:23:47 -08:00
cw - > raise ( ) ;
cw - > activateWindow ( ) ;
}
}
2023-01-30 16:15:43 +00:00
2023-05-01 21:56:52 +01:00
void wfmain : : on_memoriesBtn_clicked ( )
{
2026-01-02 18:59:51 +00:00
if ( rigCaps ! = nullptr ) {
2024-11-12 13:42:14 +00:00
2026-01-02 18:59:51 +00:00
if ( memWindow = = nullptr ) {
2023-05-09 17:03:03 +01:00
// Add slowload option for background loading.
2024-04-29 10:12:31 +01:00
memWindow = new memories ( isRadioAdmin , false ) ;
2023-05-15 10:53:52 +01:00
this - > memWindow - > connect ( this , SIGNAL ( haveMemory ( memoryType ) ) , memWindow , SLOT ( receiveMemory ( memoryType ) ) ) ;
2025-08-10 18:17:31 +01:00
this - > memWindow - > connect ( this , SIGNAL ( haveMemoryName ( memoryTagType ) ) , memWindow , SLOT ( receiveMemoryName ( memoryTagType ) ) ) ;
2025-09-07 11:28:41 +01:00
this - > memWindow - > connect ( this , SIGNAL ( haveMemorySplit ( memorySplitType ) ) , memWindow , SLOT ( receiveMemorySplit ( memorySplitType ) ) ) ;
2024-11-18 09:03:14 +00:00
for ( const auto & r : receivers ) {
connect ( memWindow , SIGNAL ( memoryMode ( bool ) ) , r , SLOT ( memoryMode ( bool ) ) ) ;
}
2025-05-04 14:56:27 +01:00
memWindow - > setRegion ( prefs . region ) ;
2023-05-01 21:56:52 +01:00
memWindow - > populate ( ) ; // Call populate to get the initial memories
}
2024-11-12 13:42:14 +00:00
// Are you sure?
if ( prefs . confirmMemories ) {
memWindow - > show ( ) ;
} else {
QCheckBox * cb = new QCheckBox ( tr ( " Don't ask me again " ) ) ;
cb - > setToolTip ( tr ( " Don't ask me to confirm memories again " ) ) ;
QMessageBox msgbox ;
msgbox . setText ( tr ( " Memories are considered an experimental feature, \n Please make sure you have a full backup of your radio before making changes. \n Are you sure you want to continue? \n " ) ) ;
msgbox . setIcon ( QMessageBox : : Icon : : Question ) ;
QAbstractButton * yesButton = msgbox . addButton ( QMessageBox : : Yes ) ;
msgbox . addButton ( QMessageBox : : No ) ;
msgbox . setDefaultButton ( QMessageBox : : Yes ) ;
msgbox . setCheckBox ( cb ) ;
# if (QT_VERSION >= QT_VERSION_CHECK(6,7,0))
QObject : : connect ( cb , & QCheckBox : : checkStateChanged , this , [ this ] ( Qt : : CheckState state ) {
if ( state = = Qt : : CheckState : : Checked )
# else
QObject : : connect ( cb , & QCheckBox : : stateChanged , this , [ this ] ( int state ) {
if ( static_cast < Qt : : CheckState > ( state ) = = Qt : : CheckState : : Checked )
# endif
{
prefs . confirmMemories = true ;
} else {
prefs . confirmMemories = false ;
}
settings - > beginGroup ( " Interface " ) ;
settings - > setValue ( " ConfirmMemories " , this - > prefs . confirmMemories ) ;
settings - > endGroup ( ) ;
settings - > sync ( ) ;
} ) ;
msgbox . exec ( ) ;
delete cb ;
if ( msgbox . clickedButton ( ) = = yesButton ) {
memWindow - > show ( ) ;
}
}
2023-05-01 21:56:52 +01:00
} else {
2026-01-02 18:59:51 +00:00
if ( memWindow ! = nullptr )
2023-05-01 21:56:52 +01:00
{
delete memWindow ;
2026-01-02 18:59:51 +00:00
memWindow = nullptr ;
2023-05-01 21:56:52 +01:00
}
}
}
2023-04-19 14:51:23 +01:00
void wfmain : : on_rigCreatorBtn_clicked ( )
{
2025-12-20 11:22:55 +00:00
//rigCreator* create = new rigCreator();
//create->setAttribute(Qt::WA_DeleteOnClose);
//create->show();
2023-02-12 16:45:21 +00:00
}
2023-05-15 10:53:52 +01:00
void wfmain : : receiveValue ( cacheItem val ) {
2024-03-30 20:40:27 +00:00
uchar vfo = 0 ;
2024-12-29 14:59:52 +00:00
// Sometimes we can receive data before the rigCaps have been determined, so return if this happens:
2026-01-02 18:59:51 +00:00
if ( rigCaps = = nullptr )
2024-12-29 14:59:52 +00:00
{
qWarning ( logSystem ( ) ) < < " Data received before we have rigCaps(), aborting " ;
return ;
}
else if ( val . receiver > = receivers . size ( ) )
2024-01-29 10:43:41 +00:00
{
2026-01-02 18:59:51 +00:00
//qWarning(logSystem()) << "Data received for Radio/VFO that doesn't exist!" << val.receiver << "(" << funcString[val.command] << ")";
2024-01-29 10:43:41 +00:00
return ;
}
2024-11-15 12:48:07 +00:00
2023-05-15 10:53:52 +01:00
switch ( val . command )
{
2023-09-23 19:23:00 +01:00
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
2023-06-11 10:33:16 +01:00
case funcUnselectedFreq :
2024-11-15 12:48:07 +00:00
vfo = 1 ;
case funcFreqGet :
case funcFreqTR :
2024-11-13 09:34:20 +00:00
case funcFreq :
2023-05-15 10:53:52 +01:00
case funcSelectedFreq :
2024-03-30 20:40:27 +00:00
receivers [ val . receiver ] - > setFrequency ( val . value . value < freqt > ( ) , vfo ) ;
2024-11-13 09:34:20 +00:00
if ( val . receiver = = 0 | | vfo = = 0 )
2024-03-30 20:40:27 +00:00
rpt - > handleUpdateCurrentMainFrequency ( val . value . value < freqt > ( ) ) ;
break ;
2023-05-15 10:53:52 +01:00
case funcModeGet :
2023-09-25 19:35:22 +01:00
case funcModeTR :
2025-01-09 00:35:26 +00:00
// These commands don't include filter, so queue an immediate request for filter
2025-01-23 10:39:35 +00:00
queue - > addUnique ( priorityImmediate , funcDataModeWithFilter , false , 0 ) ;
2025-01-21 10:05:52 +00:00
case funcDataModeWithFilter :
2025-01-09 00:35:26 +00:00
case funcUnselectedMode :
if ( val . command = = funcUnselectedMode )
vfo = 1 ;
2025-01-14 13:35:14 +00:00
case funcDataMode :
2024-02-10 19:54:39 +00:00
case funcSelectedMode :
2024-11-13 09:34:20 +00:00
case funcMode :
2025-01-21 10:05:52 +00:00
{
modeInfo m = val . value . value < modeInfo > ( ) ;
receivers [ val . receiver ] - > receiveMode ( m , vfo ) ;
2024-12-30 11:07:10 +00:00
// We are ONLY interested in VFOA
if ( val . receiver = = currentReceiver & & vfo = = 0 ) {
2025-01-21 10:05:52 +00:00
finputbtns - > updateCurrentMode ( m . mk ) ;
finputbtns - > updateFilterSelection ( m . filter ) ;
rpt - > handleUpdateCurrentMainMode ( m ) ;
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2025-01-21 10:05:52 +00:00
cw - > handleCurrentModeUpdate ( m . mk ) ;
2024-11-16 14:44:21 +00:00
}
2024-11-13 09:34:20 +00:00
}
2025-01-24 12:37:52 +00:00
//qDebug() << funcString[val.command] << "receiver:" << val.receiver << "vfo:" << vfo << "mk:" << m.mk << "name:" << m.name << "data:" << m.data << "filter:" << m.filter;
2025-01-21 10:05:52 +00:00
2023-05-15 10:53:52 +01:00
break ;
2025-01-21 10:05:52 +00:00
}
2025-01-23 10:39:35 +00:00
case funcTXFreq :
// Not sure if we want to do anything with this? M0VSE
break ;
case funcVFODualWatch :
if ( receivers . size ( ) > 1 ) // How can it not be?
{
ui - > dualWatchBtn - > blockSignals ( true ) ;
ui - > dualWatchBtn - > setChecked ( val . value . value < bool > ( ) ) ;
ui - > dualWatchBtn - > blockSignals ( false ) ;
}
break ;
2024-02-10 19:54:39 +00:00
# if defined __GNUC__
# pragma GCC diagnostic pop
# endif
2023-10-30 19:14:35 +00:00
case funcVFOBandMS :
2025-01-21 10:05:52 +00:00
{
// This indicates whether main or sub is currently "active"
2025-01-23 10:39:35 +00:00
// Swap recievers if necessary.
uchar r = val . value . value < uchar > ( ) ;
if ( currentReceiver ! = r )
2025-01-21 10:05:52 +00:00
{
// VFO has swapped, make sure scope follows if we only have a single scope.
2025-01-23 10:39:35 +00:00
// Th radio doesn't do this, but I don't see why we would want it without a scope?
if ( ! rigCaps - > hasCommand29 & & rigCaps - > commands . contains ( funcScopeMainSub ) )
2025-01-21 10:05:52 +00:00
queue - > add ( priorityImmediate , queueItem ( funcScopeMainSub , val . value , false , 0 ) ) ;
2025-01-23 10:39:35 +00:00
for ( const auto & rx : receivers )
2025-01-21 10:05:52 +00:00
{
2025-01-23 10:39:35 +00:00
rx - > selected ( rx - > getReceiver ( ) = = r ) ;
rx - > setVisible ( rx - > isSelected ( ) | | ui - > scopeDualBtn - > isChecked ( ) ) ;
rx - > updateInfo ( ) ;
2025-01-21 10:05:52 +00:00
}
2025-01-23 10:39:35 +00:00
currentReceiver = r ;
2025-01-21 10:05:52 +00:00
}
2023-10-30 19:14:35 +00:00
break ;
2025-01-21 10:05:52 +00:00
}
2024-11-15 12:48:07 +00:00
case funcSatelliteMode :
// If satellite mode is enabled, disable mode/freq query commands.
for ( auto r : receivers ) {
if ( val . value . value < bool > ( ) ) {
queue - > del ( funcUnselectedMode , r - > getReceiver ( ) ) ;
queue - > del ( funcUnselectedFreq , r - > getReceiver ( ) ) ;
}
2025-12-15 09:30:32 +00:00
//r->setSatMode(val.value.value<bool>());
2024-11-15 12:48:07 +00:00
}
2024-12-31 20:03:38 +00:00
//qInfo(logRig()) << "Is radio currently in satellite mode?" << val.value.value<bool>();
2024-11-15 12:48:07 +00:00
break ;
2023-05-15 10:53:52 +01:00
case funcSatelliteMemory :
case funcMemoryContents :
emit haveMemory ( val . value . value < memoryType > ( ) ) ;
break ;
2025-08-10 18:17:31 +01:00
case funcMemoryTag :
2025-09-07 11:28:41 +01:00
case funcMemoryTagB :
2025-08-10 18:17:31 +01:00
emit haveMemoryName ( val . value . value < memoryTagType > ( ) ) ;
break ;
2025-09-07 11:28:41 +01:00
case funcSplitMemory :
emit haveMemorySplit ( val . value . value < memorySplitType > ( ) ) ;
break ;
2023-05-15 10:53:52 +01:00
case funcMemoryClear :
case funcMemoryKeyer :
case funcMemoryToVFO :
case funcMemoryWrite :
break ;
case funcScanning :
break ;
case funcReadFreqOffset :
break ;
case funcSplitStatus :
2025-01-03 20:25:30 +00:00
ui - > splitBtn - > setChecked ( val . value . value < duplexMode_t > ( ) = = dmSplitOn ? true : false ) ;
2023-05-24 19:50:01 +01:00
rpt - > receiveDuplexMode ( val . value . value < duplexMode_t > ( ) ) ;
2025-12-15 09:30:32 +00:00
//receivers[val.receiver]->setSplit(val.value.value<duplexMode_t>()==dmSplitOn?true:false);
2023-05-15 10:53:52 +01:00
break ;
2024-12-15 11:53:14 +00:00
case funcQuickSplit :
rpt - > receiveQuickSplit ( val . value . value < bool > ( ) ) ;
break ;
2023-05-15 10:53:52 +01:00
case funcTuningStep :
receiveTuningStep ( val . value . value < uchar > ( ) ) ;
break ;
case funcAttenuator :
2024-03-30 20:40:27 +00:00
receiveAttenuator ( val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcAntenna :
2024-12-08 13:55:48 +00:00
if ( val . receiver = = currentReceiver ) {
2025-01-14 13:35:14 +00:00
ui - > antennaSelCombo - > setCurrentIndex ( ui - > antennaSelCombo - > findData ( val . value . value < antennaInfo > ( ) . antenna ) ) ;
2024-12-08 13:55:48 +00:00
ui - > rxAntennaCheck - > setChecked ( val . value . value < antennaInfo > ( ) . rx ) ;
}
2023-05-15 10:53:52 +01:00
break ;
case funcPBTOuter :
2024-11-15 12:48:07 +00:00
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setPbtOuter ( val . value . value < uchar > ( ) , false ) ;
2024-02-10 12:11:10 +00:00
break ;
2023-06-05 09:27:37 +01:00
case funcPBTInner :
{
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setPbtInner ( val . value . value < uchar > ( ) , false ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-06-05 09:27:37 +01:00
}
2023-05-15 10:53:52 +01:00
case funcIFShift :
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setIfShift ( val . value . value < uchar > ( ) , false ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
/*
connect ( this - > rig , & rigCommander : : haveDashRatio ,
2024-08-13 13:19:50 +01:00
[ = ] ( const quint8 & ratio ) { cw - > handleDashRatio ( ratio ) ; } ) ;
2023-05-24 19:50:01 +01:00
connect ( this - > rig , & rigCommander : : haveCWBreakMode ,
2024-08-13 13:19:50 +01:00
[ = ] ( const quint8 & bm ) { cw - > handleBreakInMode ( bm ) ; } ) ;
2023-05-24 19:50:01 +01:00
*/
2023-05-15 10:53:52 +01:00
case funcCwPitch :
2024-01-27 22:13:47 +00:00
// There is only a single CW Pitch setting, so send to all scopes
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2024-12-14 23:36:16 +00:00
receiver - > receiveCwPitch ( val . value . value < quint16 > ( ) ) ;
2024-01-27 22:13:47 +00:00
}
2024-02-10 19:54:39 +00:00
// Also send to CW window
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2024-12-14 23:36:16 +00:00
cw - > handlePitch ( val . value . value < quint16 > ( ) ) ;
2024-11-16 14:44:21 +00:00
}
2023-05-15 10:53:52 +01:00
break ;
2024-12-14 23:36:16 +00:00
2023-05-15 10:53:52 +01:00
case funcMicGain :
processModLevel ( inputMic , val . value . value < uchar > ( ) ) ;
break ;
case funcKeySpeed :
// Only used by CW window
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2024-11-16 14:44:21 +00:00
cw - > handleKeySpeed ( val . value . value < uchar > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
case funcNotchFilter :
break ;
2023-09-30 11:08:20 +01:00
case funcAfGain :
2025-01-14 13:35:14 +00:00
if ( val . receiver = = currentReceiver )
changeSliderQuietly ( ui - > afGainSlider , val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-09-30 11:08:20 +01:00
case funcMonitorGain :
changeSliderQuietly ( ui - > monitorSlider , val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-09-30 11:08:20 +01:00
case funcRfGain :
2025-01-14 13:35:14 +00:00
if ( val . receiver = = currentReceiver )
changeSliderQuietly ( ui - > rfGainSlider , val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-09-30 11:08:20 +01:00
case funcSquelch :
2024-04-28 11:40:11 +01:00
if ( val . receiver = = currentReceiver ) {
changeSliderQuietly ( ui - > sqlSlider , val . value . value < uchar > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
2023-09-30 11:08:20 +01:00
case funcRFPower :
2024-02-05 12:21:48 -08:00
changeSliderQuietly ( ui - > txPowerSlider , val . value . value < uchar > ( ) ) ;
break ;
2023-09-30 11:08:20 +01:00
case funcCompressorLevel :
case funcNBLevel :
case funcNRLevel :
case funcAPFLevel :
2023-05-15 10:53:52 +01:00
case funcDriveGain :
case funcVoxGain :
case funcAntiVoxGain :
2023-09-30 11:08:20 +01:00
break ;
case funcBreakInDelay :
break ;
case funcDigiSelShift :
2023-05-15 10:53:52 +01:00
break ;
// 0x15 Meters
case funcSMeterSqlStatus :
break ;
case funcSMeter :
2025-02-15 18:24:33 +00:00
if ( val . receiver ) {
receiveMeter ( meter_t : : meterSubS , val . value . value < double > ( ) ) ;
}
else {
receiveMeter ( meter_t : : meterS , val . value . value < double > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
2024-11-05 18:46:21 +00:00
case funcAbsoluteMeter :
{
meterkind m = val . value . value < meterkind > ( ) ;
2025-02-20 19:12:29 +00:00
if ( ui - > meterSPoWidget - > getMeterType ( ) ! = m . type ) {
changeMeterType ( m . type , 1 ) ;
}
ui - > meterSPoWidget - > setLevel ( m . value ) ;
2024-11-05 18:46:21 +00:00
break ;
}
2024-11-05 23:37:24 +00:00
case funcMeterType :
{
meter_t m = val . value . value < meter_t > ( ) ;
if ( ui - > meterSPoWidget - > getMeterType ( ) ! = m )
changeMeterType ( m , 1 ) ;
break ;
}
2023-05-15 10:53:52 +01:00
case funcVariousSql :
break ;
case funcOverflowStatus :
2024-04-28 11:40:11 +01:00
receivers [ val . receiver ] - > overflow ( val . value . value < bool > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcCenterMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterCenter , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcPowerMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterPower , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcSWRMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterSWR , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcALCMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterALC , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcCompMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterComp , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcVdMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterVoltage , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcIdMeter :
2025-02-15 18:24:33 +00:00
receiveMeter ( meter_t : : meterCurrent , val . value . value < double > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
// 0x16 enable/disable functions:
case funcPreamp :
2024-03-30 20:40:27 +00:00
receivePreamp ( val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
2025-01-05 15:39:20 +00:00
case funcAGC :
case funcAGCTimeConstant :
2023-05-15 10:53:52 +01:00
break ;
case funcNoiseBlanker :
2024-07-13 13:59:37 +01:00
if ( val . receiver = = currentReceiver ) {
2025-01-14 13:35:14 +00:00
ui - > nbEnableChk - > blockSignals ( true ) ;
if ( ui - > nbEnableChk - > isTristate ( ) )
ui - > nbEnableChk - > setCheckState ( Qt : : CheckState ( val . value . value < uchar > ( ) ) ) ;
else
ui - > nbEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
ui - > nbEnableChk - > blockSignals ( false ) ;
2024-07-13 13:59:37 +01:00
}
2023-05-15 10:53:52 +01:00
break ;
case funcAudioPeakFilter :
break ;
2025-03-02 09:17:52 +00:00
case funcFilterShape :
2025-12-15 09:30:32 +00:00
if ( rigCaps - > manufacturer = = manufIcom | | receivers [ val . receiver ] - > getFilter ( ) = = val . value . value < uchar > ( ) / 10 )
2025-03-02 09:17:52 +00:00
{
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setFilterShape ( val . value . value < uchar > ( ) % 10 , false ) ;
2025-03-02 09:17:52 +00:00
}
break ;
case funcRoofingFilter :
2025-12-15 09:30:32 +00:00
if ( rigCaps - > manufacturer = = manufIcom | | receivers [ val . receiver ] - > getFilter ( ) = = val . value . value < uchar > ( ) / 10 )
2025-03-02 09:17:52 +00:00
{
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setRoofing ( val . value . value < uchar > ( ) % 10 , false ) ;
2025-03-02 09:17:52 +00:00
}
break ;
2023-05-15 10:53:52 +01:00
case funcNoiseReduction :
2024-07-13 13:59:37 +01:00
if ( val . receiver = = currentReceiver ) {
2025-01-14 13:35:14 +00:00
ui - > nrEnableChk - > blockSignals ( true ) ;
if ( ui - > nrEnableChk - > isTristate ( ) )
ui - > nrEnableChk - > setCheckState ( Qt : : CheckState ( val . value . value < uchar > ( ) ) ) ;
else
ui - > nrEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
ui - > nrEnableChk - > blockSignals ( false ) ;
2024-07-13 13:59:37 +01:00
}
2023-05-15 10:53:52 +01:00
break ;
case funcAutoNotch :
break ;
case funcRepeaterTone :
2023-05-24 19:50:01 +01:00
rpt - > handleRptAccessMode ( rptAccessTxRx_t ( ( val . value . value < bool > ( ) ) ? ratrTONEon : ratrTONEoff ) ) ;
2023-09-23 19:23:00 +01:00
break ;
2023-05-15 10:53:52 +01:00
case funcRepeaterTSQL :
2023-05-24 19:50:01 +01:00
rpt - > handleRptAccessMode ( rptAccessTxRx_t ( ( val . value . value < bool > ( ) ) ? ratrTSQLon : ratrTSQLoff ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcRepeaterDTCS :
2023-05-24 19:50:01 +01:00
break ;
2023-05-15 10:53:52 +01:00
case funcRepeaterCSQL :
break ;
case funcCompressor :
2024-07-13 13:59:37 +01:00
if ( val . receiver = = currentReceiver ) {
ui - > compEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
case funcMonitor :
receiveMonitor ( val . value . value < bool > ( ) ) ;
break ;
case funcVox :
2024-07-13 13:59:37 +01:00
ui - > voxEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcManualNotch :
break ;
case funcDigiSel :
2024-07-23 09:18:27 +01:00
ui - > digiselEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
2024-11-12 13:42:14 +00:00
ui - > preampSelCombo - > setEnabled ( ! val . value . value < bool > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcTwinPeakFilter :
break ;
case funcDialLock :
break ;
case funcRXAntenna :
ui - > rxAntennaCheck - > setChecked ( val . value . value < bool > ( ) ) ;
break ;
2023-05-27 20:26:53 +01:00
case funcManualNotchWidth :
2023-05-15 10:53:52 +01:00
break ;
2023-05-27 20:26:53 +01:00
case funcSSBTXBandwidth :
2023-05-15 10:53:52 +01:00
break ;
case funcMainSubTracking :
2025-01-21 10:05:52 +00:00
2025-01-03 20:25:30 +00:00
//ui->mainSubTrackingBtn->setChecked(val.value.value<bool>());
//for (const auto& receiver:receivers)
//{
// receiver->setTracking(val.value.value<bool>());
//}
2023-05-15 10:53:52 +01:00
break ;
case funcToneSquelchType :
break ;
case funcIPPlus :
2024-07-13 13:59:37 +01:00
if ( val . receiver = = currentReceiver ) {
ui - > ipPlusEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
case funcBreakIn :
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2024-11-16 14:44:21 +00:00
cw - > handleBreakInMode ( val . value . value < uchar > ( ) ) ;
}
2023-05-24 19:50:01 +01:00
break ;
2023-05-15 10:53:52 +01:00
// 0x17 is CW send and 0x18 is power control (no reply)
// 0x19 it automatically added.
case funcTransceiverId :
break ;
// 0x1a
case funcBandStackReg :
2023-05-26 18:38:40 +01:00
{
bandStackType bsr = val . value . value < bandStackType > ( ) ;
2025-01-09 00:35:26 +00:00
qDebug ( logRig ( ) ) < < __func__ < < " BSR received into " < < val . receiver < < " Freq: " < < bsr . freq . Hz < < " , mode: " < < bsr . mode < < " , filter: " < < bsr . filter < < " , data mode: " < < bsr . data ;
2023-05-26 18:38:40 +01:00
2025-01-09 00:35:26 +00:00
queue - > add ( priorityImmediate , queueItem ( queue - > getVfoCommand ( vfoA , val . receiver , true ) . freqFunc ,
QVariant : : fromValue < freqt > ( bsr . freq ) , false , uchar ( val . receiver ) ) ) ;
2023-05-26 18:38:40 +01:00
2024-03-25 12:42:08 +00:00
for ( auto & md : rigCaps - > modes )
2023-05-26 18:38:40 +01:00
{
2025-01-09 00:35:26 +00:00
if ( md . reg = = bsr . mode ) {
modeInfo m ( md ) ;
m . filter = bsr . filter ;
m . data = bsr . data ;
qDebug ( logRig ( ) ) < < __func__ < < " Setting Mode/Data for new mode " < < m . name < < " data " < < m . data < < " filter " < < m . filter < < " reg " < < m . reg ;
queue - > add ( priorityImmediate , queueItem ( queue - > getVfoCommand ( vfoA , val . receiver , true ) . modeFunc ,
QVariant : : fromValue < modeInfo > ( m ) , false , uchar ( val . receiver ) ) ) ;
break ;
}
2023-05-26 18:38:40 +01:00
}
2023-05-15 10:53:52 +01:00
break ;
2023-05-26 18:38:40 +01:00
}
2023-05-15 10:53:52 +01:00
case funcFilterWidth :
2024-03-30 20:40:27 +00:00
receivers [ val . receiver ] - > receivePassband ( val . value . value < ushort > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-10-01 10:22:09 +01:00
2023-05-15 10:53:52 +01:00
case funcAFMute :
break ;
// 0x1a 0x05 various registers!
case funcREFAdjust :
break ;
case funcREFAdjustFine :
//break;
case funcACCAModLevel :
processModLevel ( inputACCA , val . value . value < uchar > ( ) ) ;
break ;
case funcACCBModLevel :
processModLevel ( inputACCB , val . value . value < uchar > ( ) ) ;
break ;
case funcUSBModLevel :
processModLevel ( inputUSB , val . value . value < uchar > ( ) ) ;
break ;
case funcSPDIFModLevel :
processModLevel ( inputSPDIF , val . value . value < uchar > ( ) ) ;
break ;
case funcLANModLevel :
processModLevel ( inputLAN , val . value . value < uchar > ( ) ) ;
break ;
case funcDATAOffMod :
receiveModInput ( val . value . value < rigInput > ( ) , 0 ) ;
break ;
case funcDATA1Mod :
receiveModInput ( val . value . value < rigInput > ( ) , 1 ) ;
break ;
case funcDATA2Mod :
receiveModInput ( val . value . value < rigInput > ( ) , 2 ) ;
break ;
case funcDATA3Mod :
receiveModInput ( val . value . value < rigInput > ( ) , 3 ) ;
break ;
case funcDashRatio :
2026-01-02 18:59:51 +00:00
if ( cw ! = nullptr ) {
2024-11-16 14:44:21 +00:00
cw - > handleDashRatio ( val . value . value < uchar > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
2025-01-05 15:39:20 +00:00
case funcTXFreqMon :
break ;
2023-05-15 10:53:52 +01:00
// 0x1b register
case funcToneFreq :
2023-05-24 19:50:01 +01:00
rpt - > handleTone ( val . value . value < toneInfo > ( ) . tone ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcTSQLFreq :
2023-05-24 19:50:01 +01:00
rpt - > handleTSQL ( val . value . value < toneInfo > ( ) . tone ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcDTCSCode :
2023-05-24 19:50:01 +01:00
{
toneInfo t = val . value . value < toneInfo > ( ) ;
rpt - > handleDTCS ( t . tone , t . rinv , t . tinv ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
}
2023-05-15 10:53:52 +01:00
case funcCSQLCode :
break ;
2025-01-05 15:39:20 +00:00
// 0x1c register
2023-05-15 10:53:52 +01:00
case funcRitStatus :
2023-05-29 00:10:58 +01:00
receiveRITStatus ( val . value . value < bool > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcTransceiverStatus :
receivePTTstatus ( val . value . value < bool > ( ) ) ;
break ;
case funcTunerStatus :
2023-05-29 00:10:58 +01:00
receiveATUStatus ( val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
// 0x21 RIT:
2025-01-18 12:29:34 +00:00
case funcRitFreq :
2025-01-17 00:43:57 +00:00
ui - > ritTuneDial - > blockSignals ( true ) ;
ui - > ritTuneDial - > setValue ( val . value . value < short > ( ) ) ;
ui - > ritTuneDial - > blockSignals ( false ) ;
2023-05-15 10:53:52 +01:00
break ;
2025-01-05 15:39:20 +00:00
case funcRitTXStatus :
// Not sure what this is used for?
break ;
2023-05-15 10:53:52 +01:00
// 0x27
2024-11-13 09:34:20 +00:00
case funcScopeWaveData :
2025-12-08 19:56:35 +00:00
QMetaObject : : invokeMethod (
receivers [ val . receiver ] ,
" updateScope " ,
Qt : : QueuedConnection ,
Q_ARG ( scopeData , val . value . value < scopeData > ( ) )
) ;
//receivers[val.receiver]->updateScope(val.value.value<scopeData>());
2023-05-15 10:53:52 +01:00
break ;
case funcScopeOnOff :
// confirming scope is on
break ;
case funcScopeDataOutput :
// confirming output enabled/disabled of wf data.
break ;
case funcScopeMainSub :
2023-06-01 17:57:44 +01:00
{
2025-01-23 10:39:35 +00:00
// Has the primary scope changed?
2023-05-15 10:53:52 +01:00
break ;
2023-06-01 17:57:44 +01:00
}
2023-05-15 10:53:52 +01:00
case funcScopeSingleDual :
2023-06-01 17:57:44 +01:00
{
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
2024-01-27 22:13:47 +00:00
{
2024-01-29 18:40:29 +00:00
if ( QThread : : currentThread ( ) ! = QCoreApplication : : instance ( ) - > thread ( ) )
{
qCritical ( logSystem ( ) ) < < " Thread is NOT the main UI thread, cannot hide/unhide VFO " ;
2024-01-27 22:13:47 +00:00
} else {
2024-01-29 18:40:29 +00:00
// This tells us whether we are receiving single or dual scopes
2025-01-23 10:39:35 +00:00
ui - > scopeDualBtn - > blockSignals ( true ) ;
2024-01-29 18:40:29 +00:00
ui - > scopeDualBtn - > setChecked ( val . value . value < bool > ( ) ) ;
2025-01-23 10:39:35 +00:00
ui - > scopeDualBtn - > blockSignals ( false ) ;
2025-12-20 11:22:55 +00:00
for ( const auto & rx : std : : as_const ( receivers ) ) {
2025-01-23 10:39:35 +00:00
if ( ! rx - > isSelected ( ) ) {
rx - > setVisible ( val . value . value < bool > ( ) ) ;
2024-04-28 10:28:29 +01:00
}
}
2023-06-01 17:57:44 +01:00
}
}
2023-05-15 10:53:52 +01:00
break ;
2023-06-01 17:57:44 +01:00
}
2024-11-13 09:34:20 +00:00
case funcScopeMode :
2025-05-16 20:02:31 +01:00
//qDebug() << "Got new scope mode for receiver" << val.receiver << "mode" << val.value.value<uchar>();
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setScopeMode ( val . value . value < uchar > ( ) , false ) ;
2023-06-05 09:27:37 +01:00
break ;
2024-11-13 09:34:20 +00:00
case funcScopeSpan :
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setScopeSpan ( val . value . value < centerSpanData > ( ) , false ) ;
2023-05-15 10:53:52 +01:00
break ;
2024-11-13 09:34:20 +00:00
case funcScopeEdge :
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setScopeEdge ( val . value . value < uchar > ( ) , false ) ;
2023-05-15 10:53:52 +01:00
break ;
2024-11-13 09:34:20 +00:00
case funcScopeHold :
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setHold ( val . value . value < bool > ( ) , false ) ;
2023-05-15 10:53:52 +01:00
break ;
2024-11-13 09:34:20 +00:00
case funcScopeRef :
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setRef ( val . value . value < int > ( ) , false ) ;
2023-09-27 12:28:43 +01:00
break ;
2024-11-13 09:34:20 +00:00
case funcScopeSpeed :
2025-12-20 11:22:55 +00:00
receivers [ val . receiver ] - > setSpeed ( val . value . value < uchar > ( ) , false ) ;
2023-06-11 10:33:16 +01:00
break ;
2023-05-15 10:53:52 +01:00
case funcScopeDuringTX :
case funcScopeCenterType :
2024-11-13 09:34:20 +00:00
case funcScopeVBW :
2023-05-24 19:50:01 +01:00
case funcScopeFixedEdgeFreq :
2024-11-13 09:34:20 +00:00
case funcScopeRBW :
2023-05-15 10:53:52 +01:00
break ;
// 0x28
case funcVoiceTX :
break ;
//0x29 - Prefix certain commands with this to get/set certain values without changing current VFO
// If we use it for get commands, need to parse the \x29\x<VFO> first.
case funcMainSubPrefix :
break ;
2024-12-29 14:59:52 +00:00
case funcPowerControl :
// We could indicate the rig being powered-on somehow?
break ;
2025-01-17 00:43:57 +00:00
case funcCWDecode :
cw - > receive ( val . value . value < QString > ( ) ) ;
2023-05-15 10:53:52 +01:00
default :
2025-01-06 01:07:52 +00:00
//qWarning(logSystem()) << "Unhandled command received from rigcommander()" << funcString[val.command] << "Contact support!";
2023-05-15 10:53:52 +01:00
break ;
}
}
2023-05-27 00:26:01 +01:00
void wfmain : : on_showBandsBtn_clicked ( )
{
showAndRaiseWidget ( bandbtns ) ;
}
void wfmain : : on_showFreqBtn_clicked ( )
{
showAndRaiseWidget ( finputbtns ) ;
}
void wfmain : : on_showSettingsBtn_clicked ( )
{
showAndRaiseWidget ( setupui ) ;
}
2023-06-08 21:58:22 +01:00
void wfmain : : on_scopeMainSubBtn_clicked ( )
{
2024-11-15 12:48:07 +00:00
if ( rigCaps - > commands . contains ( funcVFOBandMS ) ) {
2025-01-09 00:35:26 +00:00
queue - > add ( priorityImmediate , queueItem ( funcVFOBandMS , QVariant : : fromValue < uchar > ( currentReceiver = = 0 ) , false , 0 ) ) ;
2024-11-15 12:48:07 +00:00
}
2025-01-09 00:35:26 +00:00
}
2023-06-08 21:58:22 +01:00
2023-06-11 10:33:16 +01:00
void wfmain : : on_scopeDualBtn_toggled ( bool en )
{
2025-01-23 10:39:35 +00:00
if ( rigCaps - > commands . contains ( funcScopeSingleDual ) )
{
queue - > add ( priorityImmediate , queueItem ( funcScopeSingleDual , QVariant : : fromValue ( en ) , false , 0 ) ) ;
queue - > add ( priorityImmediate , funcScopeMainSub , false , 0 ) ;
} else {
// As the IC9700 doesn't have a single/dual command, pretend it does!
for ( const auto & rx : receivers ) {
if ( rx - > getReceiver ( ) ! = currentReceiver ) {
rx - > selected ( false ) ;
rx - > setVisible ( en ) ;
}
}
}
2023-06-11 10:33:16 +01:00
}
void wfmain : : on_dualWatchBtn_toggled ( bool en )
2023-06-08 21:58:22 +01:00
{
2025-01-09 00:35:26 +00:00
queue - > add ( priorityImmediate , queueItem ( funcVFODualWatch , QVariant : : fromValue ( en ) , false , 0 ) ) ;
2025-01-10 21:36:05 +00:00
if ( ! rigCaps - > hasCommand29 )
queue - > add ( priorityImmediate , funcScopeMainSub , false , 0 ) ;
2025-01-01 13:40:58 +00:00
}
void wfmain : : on_swapMainSubBtn_clicked ( )
{
queue - > add ( priorityImmediate , funcVFOSwapMS ) ;
2025-01-09 00:35:26 +00:00
for ( const auto & receiver : receivers )
2025-01-10 13:38:40 +00:00
{
2025-01-09 00:35:26 +00:00
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoA , receiver - > getReceiver ( ) , true ) . freqFunc , false , receiver - > getReceiver ( ) ) ;
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoA , receiver - > getReceiver ( ) , true ) . modeFunc , false , receiver - > getReceiver ( ) ) ;
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoB , receiver - > getReceiver ( ) , true ) . freqFunc , false , receiver - > getReceiver ( ) ) ;
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoB , receiver - > getReceiver ( ) , true ) . modeFunc , false , receiver - > getReceiver ( ) ) ;
2025-01-01 13:40:58 +00:00
}
}
2025-01-03 20:25:30 +00:00
/*
2025-01-01 13:40:58 +00:00
void wfmain : : on_mainSubTrackingBtn_toggled ( bool en )
{
queue - > add ( priorityImmediate , queueItem ( funcMainSubTracking , QVariant : : fromValue ( en ) , false ) ) ;
}
2025-01-03 20:25:30 +00:00
*/
void wfmain : : on_splitBtn_toggled ( bool en )
{
queue - > add ( priorityImmediate , queueItem ( funcSplitStatus , QVariant : : fromValue ( en ) , false ) ) ;
}
2025-01-01 13:40:58 +00:00
void wfmain : : on_mainEqualsSubBtn_clicked ( )
{
queue - > add ( priorityImmediate , funcVFOEqualMS ) ;
2025-01-09 00:35:26 +00:00
for ( const auto & receiver : receivers )
{
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoA , receiver - > getReceiver ( ) , true ) . modeFunc , false , receiver - > getReceiver ( ) ) ;
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoA , receiver - > getReceiver ( ) , true ) . freqFunc , false , receiver - > getReceiver ( ) ) ;
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoB , receiver - > getReceiver ( ) , true ) . modeFunc , false , receiver - > getReceiver ( ) ) ;
queue - > add ( priorityImmediate , queue - > getVfoCommand ( vfoB , receiver - > getReceiver ( ) , true ) . freqFunc , false , receiver - > getReceiver ( ) ) ;
2025-01-01 13:40:58 +00:00
}
2023-06-08 21:58:22 +01:00
}
2023-10-01 10:22:09 +01:00
void wfmain : : dataModeChanged ( modeInfo m )
{
// As the data mode may have changed, we need to make sure that we invalidate the input selection.
// Also request the current input from the rig.
2024-03-25 15:30:18 +00:00
//qInfo(logSystem()) << "*** DATA MODE HAS CHANGED ***";
2025-01-06 12:51:56 +00:00
if ( m . data ! = 0xff ) {
currentModSrc [ m . data ] = rigInput ( ) ;
2023-10-01 10:22:09 +01:00
2025-01-06 12:51:56 +00:00
// Request the current inputSource.
switch ( m . data )
{
case 0 :
queue - > add ( priorityImmediate , funcDATAOffMod , false , false ) ;
break ;
case 1 :
queue - > add ( priorityImmediate , funcDATA1Mod , false , false ) ;
break ;
case 2 :
queue - > add ( priorityImmediate , funcDATA2Mod , false , false ) ;
break ;
case 3 :
queue - > add ( priorityImmediate , funcDATA3Mod , false , false ) ;
break ;
}
2023-10-01 10:22:09 +01:00
}
}
2024-03-30 20:40:27 +00:00
void wfmain : : receiveScopeSettings ( uchar receiver , int theme , quint16 len , int floor , int ceiling )
2023-07-16 10:08:28 +01:00
{
2024-03-30 20:40:27 +00:00
if ( receiver ) {
2023-09-26 10:32:56 +01:00
prefs . subWfTheme = theme ;
prefs . subWflength = len ;
prefs . subPlotFloor = floor ;
prefs . subPlotCeiling = ceiling ;
}
else
{
prefs . mainWfTheme = theme ;
prefs . mainWflength = len ;
prefs . mainPlotFloor = floor ;
prefs . mainPlotCeiling = ceiling ;
}
2023-07-16 10:08:28 +01:00
}
2023-07-23 00:26:56 +01:00
2023-09-19 23:04:48 +01:00
void wfmain : : receiveElapsed ( bool sub , qint64 us )
{
if ( sub )
subElapsed = us ;
else
mainElapsed = us ;
}
2024-03-25 12:42:08 +00:00
void wfmain : : receiveRigCaps ( rigCapabilities * caps )
{
this - > rigCaps = caps ;
// Convenient place to stop the connection timer as rigCaps has changed.
ConnectionTimer . stop ( ) ;
//bandbtns->acceptRigCaps(rigCaps);
2026-01-02 18:59:51 +00:00
if ( caps = = nullptr )
2024-03-25 12:42:08 +00:00
{
// Note: This line makes it difficult to accept a different radio connecting.
return ;
} else {
2025-01-02 10:09:42 +00:00
// Enable all controls
enableControls ( true ) ;
2025-01-01 13:40:58 +00:00
2025-05-20 12:47:01 +01:00
if ( prefs . manufacturer = = manufIcom )
showStatusBarText ( QString ( " Found radio of name %0 and model ID %1. " ) . arg ( rigCaps - > modelName ) . arg ( rigCaps - > modelID , 2 , 16 , QChar ( ' 0 ' ) ) ) ;
else
showStatusBarText ( QString ( " Found radio of name %0 and model ID %1. " ) . arg ( rigCaps - > modelName ) . arg ( rigCaps - > modelID ) ) ;
2024-03-25 12:42:08 +00:00
qDebug ( logSystem ( ) ) < < " Rig name: " < < rigCaps - > modelName ;
qDebug ( logSystem ( ) ) < < " Has LAN capabilities: " < < rigCaps - > hasLan ;
qDebug ( logSystem ( ) ) < < " Rig ID received into wfmain: spectLenMax: " < < rigCaps - > spectLenMax ;
qDebug ( logSystem ( ) ) < < " Rig ID received into wfmain: spectAmpMax: " < < rigCaps - > spectAmpMax ;
qDebug ( logSystem ( ) ) < < " Rig ID received into wfmain: spectSeqMax: " < < rigCaps - > spectSeqMax ;
qDebug ( logSystem ( ) ) < < " Rig ID received into wfmain: hasSpectrum: " < < rigCaps - > hasSpectrum ;
configureVFOs ( ) ; // Now we have a rig connection, need to configure the VFOs
rigName - > setText ( rigCaps - > modelName ) ;
if ( serverConfig . enabled ) {
serverConfig . rigs . first ( ) - > modelName = rigCaps - > modelName ;
serverConfig . rigs . first ( ) - > rigName = rigCaps - > modelName ;
2025-01-05 15:39:20 +00:00
serverConfig . rigs . first ( ) - > civAddr = rigCaps - > modelID ;
2024-03-25 12:42:08 +00:00
serverConfig . rigs . first ( ) - > baudRate = rigCaps - > baudRate ;
}
setWindowTitle ( rigCaps - > modelName ) ;
if ( rigCaps - > hasSpectrum )
{
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers )
2024-03-25 12:42:08 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > prepareScope ( rigCaps - > spectAmpMax , rigCaps - > spectLenMax ) ;
2024-03-25 12:42:08 +00:00
}
}
2024-11-07 19:39:36 +00:00
ui - > transmitBtn - > setEnabled ( rigCaps - > hasTransmit ) ;
2024-11-12 13:42:14 +00:00
ui - > micGainSlider - > setEnabled ( rigCaps - > hasTransmit ) ;
ui - > txPowerSlider - > setEnabled ( rigCaps - > hasTransmit ) ;
2024-11-16 14:44:21 +00:00
if ( rigCaps - > commands . contains ( funcSendCW ) ) {
// We have a send CW function, so enable the window.
2025-07-21 08:30:30 +09:00
cw = new cwSender ( this , rig ) ;
2024-11-16 14:44:21 +00:00
cw - > setCutNumbers ( prefs . cwCutNumbers ) ;
cw - > setSendImmediate ( prefs . cwSendImmediate ) ;
cw - > setSidetoneEnable ( prefs . cwSidetoneEnabled ) ;
cw - > setSidetoneLevel ( prefs . cwSidetoneLevel ) ;
cw - > setMacroText ( prefs . cwMacroList ) ;
}
2024-11-07 19:39:36 +00:00
ui - > cwButton - > setEnabled ( rigCaps - > commands . contains ( funcSendCW ) ) ;
ui - > memoriesBtn - > setEnabled ( rigCaps - > commands . contains ( funcMemoryContents ) ) ;
2024-11-12 13:42:14 +00:00
ui - > monitorSlider - > setEnabled ( rigCaps - > commands . contains ( funcMonitorGain ) ) ;
ui - > rfGainSlider - > setEnabled ( rigCaps - > commands . contains ( funcRfGain ) ) ;
2024-11-07 19:39:36 +00:00
2024-11-16 14:44:21 +00:00
// Only show settingsgroup if rig has sub
2025-09-07 11:28:41 +01:00
ui - > scopeSettingsGroup - > setVisible ( rigCaps - > commands . contains ( funcVFODualWatch ) | | rigCaps - > commands . contains ( funcVFOBandMS ) ) ;
2024-11-16 14:44:21 +00:00
ui - > scopeDualBtn - > setVisible ( rigCaps - > commands . contains ( funcVFODualWatch ) ) ;
2025-01-01 13:40:58 +00:00
ui - > mainEqualsSubBtn - > setVisible ( rigCaps - > commands . contains ( funcVFOEqualMS ) ) ;
ui - > swapMainSubBtn - > setVisible ( rigCaps - > commands . contains ( funcVFOSwapMS ) ) ;
2025-01-03 20:25:30 +00:00
//ui->mainSubTrackingBtn->setVisible(rigCaps->commands.contains(funcMainSubTracking));
// Only show this split button on IC7610/IC785x
ui - > splitBtn - > setVisible ( rigCaps - > commands . contains ( funcSplitStatus ) & & rigCaps - > commands . contains ( funcVFOEqualMS ) ) ;
2024-11-16 14:44:21 +00:00
ui - > antennaGroup - > setVisible ( rigCaps - > commands . contains ( funcAntenna ) ) ;
ui - > preampAttGroup - > setVisible ( rigCaps - > commands . contains ( funcPreamp ) ) ;
2025-01-01 13:40:58 +00:00
//ui->dualWatchBtn->setVisible(rigCaps->hasCommand29);
2024-11-16 14:44:21 +00:00
2025-01-14 13:35:14 +00:00
ui - > nbEnableChk - > setTristate ( false ) ;
ui - > nrEnableChk - > setTristate ( false ) ;
ui - > nbEnableChk - > setChecked ( false ) ;
ui - > nrEnableChk - > setChecked ( false ) ;
if ( rigCaps - > commands . contains ( funcNoiseBlanker ) ) {
qInfo ( ) < < " nb max val " < < rigCaps - > commands . find ( funcNoiseBlanker ) - > maxVal ;
if ( rigCaps - > commands . find ( funcNoiseBlanker ) - > maxVal > 1 )
ui - > nbEnableChk - > setTristate ( true ) ;
}
2024-11-16 14:44:21 +00:00
ui - > nbEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcNoiseBlanker ) ) ;
2025-01-14 13:35:14 +00:00
if ( rigCaps - > commands . contains ( funcNoiseReduction ) ) {
qInfo ( ) < < " nr max val " < < rigCaps - > commands . find ( funcNoiseReduction ) - > maxVal ;
if ( rigCaps - > commands . find ( funcNoiseReduction ) - > maxVal > 1 )
ui - > nrEnableChk - > setTristate ( true ) ;
}
if ( rigCaps - > commands . contains ( funcRFPower ) ) {
auto f = rigCaps - > commands . find ( funcRFPower ) ;
ui - > txPowerSlider - > setRange ( f - > minVal , f - > maxVal ) ;
}
if ( rigCaps - > commands . contains ( funcMonitorGain ) ) {
auto f = rigCaps - > commands . find ( funcMonitorGain ) ;
ui - > monitorSlider - > setRange ( f - > minVal , f - > maxVal ) ;
}
2025-05-16 20:02:31 +01:00
if ( rigCaps - > commands . contains ( funcSquelch ) ) {
auto f = rigCaps - > commands . find ( funcSquelch ) ;
ui - > sqlSlider - > setRange ( f - > minVal , f - > maxVal ) ;
}
2024-11-16 14:44:21 +00:00
ui - > nrEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcNoiseReduction ) ) ;
2025-01-14 13:35:14 +00:00
2024-11-16 14:44:21 +00:00
ui - > ipPlusEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcIPPlus ) ) ;
ui - > compEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcCompressor ) ) ;
ui - > voxEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcVox ) ) ;
ui - > digiselEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcDigiSel ) ) ;
2024-12-30 23:13:36 +00:00
for ( const auto & receiver : receivers ) {
2024-11-18 09:03:14 +00:00
if ( receiver - > getReceiver ( ) = = 0 ) {
// Report scope redraw time to Select Radio window (only scope 0)
connect ( receiver , SIGNAL ( spectrumTime ( double ) ) , selRad , SLOT ( spectrumTime ( double ) ) ) ;
connect ( receiver , SIGNAL ( waterfallTime ( double ) ) , selRad , SLOT ( waterfallTime ( double ) ) ) ;
2025-05-18 23:46:24 +01:00
connect ( receiver , SIGNAL ( spectrumTime ( double ) ) , rig , SLOT ( spectrumTime ( double ) ) ) ;
connect ( receiver , SIGNAL ( waterfallTime ( double ) ) , rig , SLOT ( waterfallTime ( double ) ) ) ;
2024-11-18 09:03:14 +00:00
}
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcDATA1Mod ) )
{
setupui - > updateModSourceList ( 1 , rigCaps - > inputs ) ;
}
if ( rigCaps - > commands . contains ( funcDATA2Mod ) )
{
setupui - > updateModSourceList ( 2 , rigCaps - > inputs ) ;
}
if ( rigCaps - > commands . contains ( funcDATA3Mod ) )
{
setupui - > updateModSourceList ( 3 , rigCaps - > inputs ) ;
2025-01-14 13:35:14 +00:00
}
2025-12-15 09:30:32 +00:00
2025-01-14 13:35:14 +00:00
setupui - > enableModSource ( 0 , rigCaps - > commands . contains ( funcDATAOffMod ) ) ;
setupui - > enableModSource ( 1 , rigCaps - > commands . contains ( funcDATA1Mod ) ) ;
setupui - > enableModSource ( 2 , rigCaps - > commands . contains ( funcDATA2Mod ) ) ;
setupui - > enableModSource ( 3 , rigCaps - > commands . contains ( funcDATA3Mod ) ) ;
// Disable unsupported mod sources
for ( const auto & r : rigCaps - > inputs )
{
setupui - > enableModSourceItem ( 0 , r , rigCaps - > commands . contains ( funcDATAOffMod ) ) ;
setupui - > enableModSourceItem ( 1 , r , ( rigCaps - > commands . contains ( funcDATA1Mod ) & & r . reg > - 1 ) ? true : false ) ;
setupui - > enableModSourceItem ( 2 , r , ( rigCaps - > commands . contains ( funcDATA2Mod ) & & r . reg > - 1 ) ? true : false ) ;
setupui - > enableModSourceItem ( 3 , r , ( rigCaps - > commands . contains ( funcDATA3Mod ) & & r . reg > - 1 ) ? true : false ) ;
2024-03-25 12:42:08 +00:00
}
if ( rigCaps - > hasSpectrum )
{
2024-03-30 20:40:27 +00:00
receiver - > setRange ( prefs . mainPlotFloor , prefs . mainPlotCeiling ) ;
2024-03-25 12:42:08 +00:00
}
}
// Set the tuning step combo box up:
ui - > tuningStepCombo - > blockSignals ( true ) ;
ui - > tuningStepCombo - > clear ( ) ;
for ( auto & s : rigCaps - > steps )
{
ui - > tuningStepCombo - > addItem ( s . name , s . hz ) ;
}
ui - > tuningStepCombo - > setCurrentIndex ( 2 ) ;
ui - > tuningStepCombo - > blockSignals ( false ) ;
setupui - > updateModSourceList ( 0 , rigCaps - > inputs ) ;
ui - > attSelCombo - > clear ( ) ;
if ( rigCaps - > commands . contains ( funcAttenuator ) )
{
ui - > attSelCombo - > setDisabled ( false ) ;
for ( auto & att : rigCaps - > attenuators )
{
2025-01-17 00:43:57 +00:00
ui - > attSelCombo - > addItem ( att . name , att . num ) ;
2024-03-25 12:42:08 +00:00
}
} else {
ui - > attSelCombo - > setDisabled ( true ) ;
}
ui - > preampSelCombo - > clear ( ) ;
if ( rigCaps - > commands . contains ( funcPreamp ) )
{
ui - > preampSelCombo - > setDisabled ( false ) ;
for ( auto & pre : rigCaps - > preamps )
{
ui - > preampSelCombo - > addItem ( pre . name , pre . num ) ;
}
} else {
ui - > preampSelCombo - > setDisabled ( true ) ;
}
ui - > antennaSelCombo - > clear ( ) ;
if ( rigCaps - > commands . contains ( funcAntenna ) )
{
ui - > antennaSelCombo - > setDisabled ( false ) ;
for ( auto & ant : rigCaps - > antennas )
{
ui - > antennaSelCombo - > addItem ( ant . name , ant . num ) ;
}
} else {
ui - > antennaSelCombo - > setDisabled ( true ) ;
}
ui - > rxAntennaCheck - > setEnabled ( rigCaps - > commands . contains ( funcRXAntenna ) ) ;
ui - > rxAntennaCheck - > setChecked ( false ) ;
ui - > tuneEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcTunerStatus ) ) ;
ui - > tuneNowBtn - > setEnabled ( rigCaps - > commands . contains ( funcTunerStatus ) ) ;
ui - > memoriesBtn - > setEnabled ( rigCaps - > commands . contains ( funcMemoryContents ) ) ;
ui - > connectBtn - > setText ( " Disconnect from Radio " ) ; // We must be connected now.
connStatus = connConnected ;
2024-12-29 14:59:52 +00:00
2024-12-30 14:19:52 +00:00
// Now we know that we are connected, enable rigctld
2024-12-29 14:59:52 +00:00
enableRigCtl ( prefs . enableRigCtlD ) ;
2025-06-03 20:22:51 +01:00
if ( prefs . enableLAN )
2024-03-25 12:42:08 +00:00
{
ui - > afGainSlider - > setValue ( prefs . localAFgain ) ;
2024-12-13 14:30:22 +00:00
queue - > receiveValue ( funcAfGain , quint8 ( prefs . localAFgain ) , currentReceiver ) ;
2024-12-30 12:56:35 +00:00
} else {
// If not network connected, select the requested PTT type.
2024-12-30 14:19:52 +00:00
emit setPTTType ( prefs . pttType ) ;
2024-03-25 12:42:08 +00:00
}
// Adding these here because clearly at this point we have valid
// rig comms. In the future, we should establish comms and then
// do all the initial grabs. For now, this hack of adding them here and there:
// recalculate command timing now that we know the rig better:
if ( prefs . polling_ms ! = 0 )
{
changePollTiming ( prefs . polling_ms , true ) ;
} else {
calculateTimingParameters ( ) ;
}
}
initPeriodicCommands ( ) ;
getInitialRigState ( ) ;
}
2023-05-28 22:11:59 +01:00
2024-04-29 10:12:31 +01:00
void wfmain : : radioInUse ( quint8 radio , bool admin , quint8 busy , QString user , QString ip )
{
Q_UNUSED ( busy )
Q_UNUSED ( radio )
2024-04-30 09:42:54 +01:00
Q_UNUSED ( user )
2024-08-13 12:47:31 +01:00
Q_UNUSED ( ip )
2024-04-30 09:42:54 +01:00
qDebug ( logSystem ( ) ) < < " Is this user an admin? " < < ( ( admin ) ? " yes " : " no " ) ;
2024-04-29 10:12:31 +01:00
isRadioAdmin = admin ;
}
2024-12-08 13:55:48 +00:00
void wfmain : : receiveScopeImage ( uchar receiver )
{
# if defined (USB_CONTROLLER)
// Send to USB Controllers if requested
if ( receiver = = 0 ) {
2025-02-16 14:34:34 +00:00
for ( auto it = usbDevices . begin ( ) ; it ! = usbDevices . end ( ) ; it + + )
2024-12-08 13:55:48 +00:00
{
2025-02-16 14:34:34 +00:00
auto dev = & it . value ( ) ;
if ( dev - > connected & & dev - > type . model = = usbDeviceType : : StreamDeckPlus & & dev - > lcd = = funcLCDWaterfall )
2024-12-08 13:55:48 +00:00
{
lcdImage = receivers [ receiver ] - > getWaterfallImage ( ) ;
2025-02-16 14:34:34 +00:00
emit sendControllerRequest ( dev , usbFeatureType : : featureLCD , 0 , " " , & lcdImage ) ;
2024-12-08 13:55:48 +00:00
}
2025-02-16 14:34:34 +00:00
else if ( dev - > connected & & dev - > type . model = = usbDeviceType : : StreamDeckPlus & & dev - > lcd = = funcLCDSpectrum )
2024-12-08 13:55:48 +00:00
{
lcdImage = receivers [ receiver ] - > getSpectrumImage ( ) ;
2025-02-16 14:34:34 +00:00
emit sendControllerRequest ( dev , usbFeatureType : : featureLCD , 0 , " " , & lcdImage ) ;
2024-12-08 13:55:48 +00:00
}
}
}
# endif
}
2024-07-13 13:59:37 +01:00
// Assorted checkboxes
2025-01-14 13:35:14 +00:00
// lambda slots, these cuts-down on number of dedicated slot functions
void wfmain : : setupLambdaSlots ( )
2024-07-13 13:59:37 +01:00
{
2025-01-14 13:35:14 +00:00
// As checkState is deprecated, use checkStateChanged if available
# if (QT_VERSION < QT_VERSION_CHECK(6,7,0))
2025-01-23 23:01:55 +00:00
# define CHKFUNC &QCheckBox::stateChanged, this, [=](int checked)
2025-01-14 13:35:14 +00:00
# else
# define CHKFUNC &QCheckBox::checkStateChanged, this, [=](Qt::CheckState checked)
# endif
2024-07-13 13:59:37 +01:00
2025-01-14 13:35:14 +00:00
connect ( ui - > nrEnableChk , CHKFUNC {
queue - > addUnique ( priorityImmediate , queueItem ( funcNoiseReduction ,
QVariant : : fromValue < uchar > ( ui - > nrEnableChk - > isTristate ( ) ? checked : bool ( checked ) ) , false , currentReceiver ) ) ;
} ) ;
connect ( ui - > nbEnableChk , CHKFUNC {
queue - > addUnique ( priorityImmediate , queueItem ( funcNoiseBlanker ,
QVariant : : fromValue < uchar > ( ui - > nbEnableChk - > isTristate ( ) ? checked : bool ( checked ) ) , false , currentReceiver ) ) ;
} ) ;
connect ( ui - > ipPlusEnableChk , CHKFUNC {
queue - > addUnique ( priorityImmediate , queueItem ( funcIPPlus , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
} ) ;
connect ( ui - > compEnableChk , CHKFUNC {
queue - > addUnique ( priorityImmediate , queueItem ( funcCompressor , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
} ) ;
connect ( ui - > voxEnableChk , CHKFUNC {
queue - > addUnique ( priorityImmediate , queueItem ( funcVox , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
} ) ;
connect ( ui - > digiselEnableChk , CHKFUNC {
queue - > addUnique ( priorityImmediate , queueItem ( funcDigiSel , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
} ) ;
// Slider tooltip
connect ( ui - > txPowerSlider , & QSlider : : sliderMoved ,
[ & ] ( int value ) {
QToolTip : : showText ( QCursor : : pos ( ) , QString ( " %1 " ) . arg ( value * 100 / 255 ) , nullptr ) ;
} ) ;
// Meter widgets
connect ( ui - > meterSPoWidget , & meter : : configureMeterSignal , this ,
[ = ] ( const meter_t & meterTypeRequested ) {
// Change the preferences and update settings widget to reflect new meter selection:
prefs . meter1Type = meterTypeRequested ;
setupui - > updateIfPref ( if_meter1Type ) ;
// Change the meter locally:
qInfo ( ) < < " New meter type " < < meterTypeRequested ;
changeMeterType ( meterTypeRequested , 1 ) ;
} ) ;
connect ( ui - > meter2Widget , & meter : : configureMeterSignal , this ,
[ = ] ( const meter_t & meterTypeRequested ) {
// Change the preferences and update settings widget to reflect new meter selection:
prefs . meter2Type = meterTypeRequested ;
setupui - > updateIfPref ( if_meter2Type ) ;
// Change the meter locally:
changeMeterType ( meterTypeRequested , 2 ) ;
// Block duplicate meter selection in the other meter:
ui - > meter3Widget - > blockMeterType ( meterTypeRequested ) ;
} ) ;
connect ( ui - > meter3Widget , & meter : : configureMeterSignal , this ,
[ = ] ( const meter_t & meterTypeRequested ) {
// Change the preferences and update settings widget to reflect new meter selection:
prefs . meter3Type = meterTypeRequested ;
setupui - > updateIfPref ( if_meter3Type ) ;
// Change the meter locally:
changeMeterType ( meterTypeRequested , 3 ) ;
// Block duplicate meter selection in the other meter:
ui - > meter2Widget - > blockMeterType ( meterTypeRequested ) ;
} ) ;
2024-07-13 13:59:37 +01:00
2024-07-23 09:18:27 +01:00
}
2025-01-14 13:35:14 +00:00
2025-01-02 10:09:42 +00:00
void wfmain : : enableControls ( bool en )
{
// This should contain all of the controls within the main window (other than power buttons)
// So should be updated if any are added/removed/renamed.
ui - > freqDial - > setEnabled ( en ) ;
ui - > tuningStepCombo - > setEnabled ( en ) ;
ui - > tuneLockChk - > setEnabled ( en ) ;
ui - > ritEnableChk - > setEnabled ( en ) ;
ui - > ritTuneDial - > setEnabled ( en ) ;
ui - > afGainSlider - > setEnabled ( en ) ;
ui - > micGainSlider - > setEnabled ( en ) ;
ui - > monitorSlider - > setEnabled ( en ) ;
ui - > rfGainSlider - > setEnabled ( en ) ;
ui - > sqlSlider - > setEnabled ( en ) ;
ui - > txPowerSlider - > setEnabled ( en ) ;
ui - > OtherControlsGrp - > setEnabled ( en ) ;
ui - > cwButton - > setEnabled ( en ) ;
ui - > memoriesBtn - > setEnabled ( en ) ;
ui - > rptSetupBtn - > setEnabled ( en ) ;
ui - > transmitBtn - > setEnabled ( en ) ;
ui - > tuneEnableChk - > setEnabled ( en ) ;
ui - > tuneNowBtn - > setEnabled ( en ) ;
ui - > scopeSettingsGroup - > setEnabled ( en ) ;
ui - > preampAttGroup - > setEnabled ( en ) ;
ui - > antennaGroup - > setEnabled ( en ) ;
2025-01-10 17:41:04 +00:00
ui - > meterSPoWidget - > setEnabled ( en ) ;
ui - > meter2Widget - > setEnabled ( en ) ;
ui - > meter3Widget - > setEnabled ( en ) ;
ui - > showBandsBtn - > setEnabled ( en ) ;
ui - > showFreqBtn - > setEnabled ( en ) ;
2025-01-02 10:09:42 +00:00
}
2025-01-06 16:25:12 +00:00
void wfmain : : updatedQueueInterval ( qint64 interval )
2025-01-06 12:51:56 +00:00
{
if ( interval = = - 1 )
enableControls ( false ) ;
2026-01-02 18:59:51 +00:00
else if ( rigCaps ! = nullptr )
2025-01-06 12:51:56 +00:00
enableControls ( true ) ;
}
2024-07-13 13:59:37 +01:00
2025-02-15 18:24:33 +00:00
2023-05-28 22:11:59 +01:00
/* USB Hotplug support added at the end of the file for convenience */
# ifdef USB_HOTPLUG
# ifdef Q_OS_WINDOWS
bool wfmain : : nativeEvent ( const QByteArray & eventType , void * message , qintptr * result )
{
Q_UNUSED ( eventType ) ;
Q_UNUSED ( result ) ;
if ( QDateTime : : currentMSecsSinceEpoch ( ) > lastUsbNotify + 10 )
{
static bool created = false ;
MSG * msg = static_cast < MSG * > ( message ) ;
switch ( msg - > message )
{
case WM_PAINT :
{
if ( ! created ) {
GUID InterfaceClassGuid = { 0x745a17a0 , 0x74d3 , 0x11d0 , { 0xb6 , 0xfe , 0x00 , 0xa0 , 0xc9 , 0x0f , 0x57 , 0xda } } ;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter ;
ZeroMemory ( & NotificationFilter , sizeof ( NotificationFilter ) ) ;
NotificationFilter . dbcc_size = sizeof ( DEV_BROADCAST_DEVICEINTERFACE ) ;
NotificationFilter . dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE ;
NotificationFilter . dbcc_classguid = InterfaceClassGuid ;
HWND hw = ( HWND ) this - > effectiveWinId ( ) ; //Main window handle
RegisterDeviceNotification ( hw , & NotificationFilter , DEVICE_NOTIFY_ALL_INTERFACE_CLASSES ) ;
created = true ;
}
break ;
}
case WM_DEVICECHANGE :
{
switch ( msg - > wParam ) {
case DBT_DEVICEARRIVAL :
case DBT_DEVICEREMOVECOMPLETE :
emit usbHotplug ( ) ;
lastUsbNotify = QDateTime : : currentMSecsSinceEpoch ( ) ;
break ;
case DBT_DEVNODES_CHANGED :
break ;
default :
break ;
}
return true ;
break ;
}
default :
break ;
}
}
return false ; // Process native events as normal
}
# elif defined(Q_OS_LINUX)
void wfmain : : uDevEvent ( )
{
udev_device * dev = udev_monitor_receive_device ( uDevMonitor ) ;
if ( dev )
{
const char * action = udev_device_get_action ( dev ) ;
if ( action & & strcmp ( action , " add " ) = = 0 & & QDateTime : : currentMSecsSinceEpoch ( ) > lastUsbNotify + 10 )
{
emit usbHotplug ( ) ;
lastUsbNotify = QDateTime : : currentMSecsSinceEpoch ( ) ;
}
udev_device_unref ( dev ) ;
}
}
# endif
# endif