2018-06-19 12:58:52 -07:00
# include "wfmain.h"
# 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 ;
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 " ) ) ) ;
2022-09-14 17:07:23 -07:00
this - > debugMode = debugMode ;
debugModeLogging = debugMode ;
2018-06-19 12:58:52 -07:00
ui - > setupUi ( this ) ;
2020-01-04 17:12:35 -08:00
setWindowTitle ( QString ( " wfview " ) ) ;
2019-02-08 16:19:36 -08:00
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 ( ) ;
2023-01-20 22:11:30 -08:00
cw = new cwSender ( ) ;
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 ( ) ;
2021-02-13 10:02:45 -08:00
2024-03-24 23:17:39 +00:00
2021-03-01 19:53:12 +00:00
qRegisterMetaType < udpPreferences > ( ) ; // Needs to be registered early.
2021-05-28 21:01:29 -07:00
qRegisterMetaType < rigCapabilities > ( ) ;
2023-05-15 13:47:45 +01:00
qRegisterMetaType < duplexMode_t > ( ) ;
qRegisterMetaType < rptAccessTxRx_t > ( ) ;
qRegisterMetaType < rptrAccessData > ( ) ;
2024-02-12 10:06:08 -08:00
qRegisterMetaType < toneInfo > ( ) ;
2021-05-28 21:01:29 -07:00
qRegisterMetaType < rigInput > ( ) ;
2023-04-28 00:31:41 +01:00
qRegisterMetaType < inputTypes > ( ) ;
2023-05-15 13:47:45 +01:00
qRegisterMetaType < meter_t > ( ) ;
2024-11-07 17:13:42 +00:00
qRegisterMetaType < meterkind > ( ) ;
2023-05-15 13:47:45 +01:00
qRegisterMetaType < spectrumMode_t > ( ) ;
2021-05-28 21:01:29 -07:00
qRegisterMetaType < freqt > ( ) ;
2023-01-27 12:44:23 -08:00
qRegisterMetaType < vfo_t > ( ) ;
2023-05-15 13:47:45 +01:00
qRegisterMetaType < modeInfo > ( ) ;
2023-05-15 13:51:04 +01:00
qRegisterMetaType < rigMode_t > ( ) ;
2021-05-28 21:01:29 -07:00
qRegisterMetaType < audioPacket > ( ) ;
2023-05-15 12:50:05 +01:00
qRegisterMetaType < audioSetup > ( ) ;
qRegisterMetaType < SERVERCONFIG > ( ) ;
qRegisterMetaType < timekind > ( ) ;
qRegisterMetaType < datekind > ( ) ;
2022-01-21 19:23:32 +00:00
qRegisterMetaType < QList < radio_cap_packet > > ( ) ;
2022-04-22 11:11:21 +01:00
qRegisterMetaType < QVector < BUTTON > * > ( ) ;
2023-02-09 13:21:51 +00:00
qRegisterMetaType < QVector < KNOB > * > ( ) ;
2022-04-25 17:40:41 +01:00
qRegisterMetaType < QVector < COMMAND > * > ( ) ;
2022-04-27 12:56:54 +01:00
qRegisterMetaType < const COMMAND * > ( ) ;
2023-03-17 23:35:40 +00:00
qRegisterMetaType < const USBDEVICE * > ( ) ;
2022-10-05 11:03:15 +01:00
qRegisterMetaType < QList < radio_cap_packet > > ( ) ;
qRegisterMetaType < QList < spotData > > ( ) ;
2022-01-22 15:12:36 +00:00
qRegisterMetaType < networkStatus > ( ) ;
2022-08-23 22:24:05 -07:00
qRegisterMetaType < networkAudioLevels > ( ) ;
2023-01-01 16:17:48 +00:00
qRegisterMetaType < codecType > ( ) ;
2023-01-05 19:37:53 +00:00
qRegisterMetaType < errorType > ( ) ;
2023-03-25 09:09:42 +00:00
qRegisterMetaType < usbFeatureType > ( ) ;
2024-03-30 20:40:27 +00:00
//qRegisterMetaType<cmds>();
2023-05-15 14:26:59 +01:00
qRegisterMetaType < funcs > ( ) ;
2023-04-27 19:56:25 +01:00
qRegisterMetaType < rigTypedef > ( ) ;
2023-05-01 21:56:52 +01:00
qRegisterMetaType < memoryType > ( ) ;
2023-05-15 10:53:52 +01:00
qRegisterMetaType < antennaInfo > ( ) ;
qRegisterMetaType < scopeData > ( ) ;
2023-05-15 14:32:46 +01:00
qRegisterMetaType < queueItem > ( ) ;
qRegisterMetaType < cacheItem > ( ) ;
2023-05-25 23:43:45 +01:00
qRegisterMetaType < spectrumBounds > ( ) ;
qRegisterMetaType < centerSpanData > ( ) ;
2023-05-26 18:38:40 +01:00
qRegisterMetaType < bandStackType > ( ) ;
2021-02-10 21:22:38 -08:00
2023-06-08 08:20:50 +01:00
this - > setObjectName ( " wfmain " ) ;
2023-05-12 00:24:01 +01:00
queue = cachingQueue : : getInstance ( this ) ;
2023-05-15 10:53:52 +01:00
connect ( queue , SIGNAL ( sendValue ( cacheItem ) ) , this , SLOT ( receiveValue ( cacheItem ) ) ) ;
2024-04-30 09:42:54 +01:00
connect ( queue , SIGNAL ( sendMessage ( QString ) ) , this , SLOT ( showStatusBarText ( QString ) ) ) ;
2024-09-30 12:09:29 +01:00
connect ( queue , SIGNAL ( finished ( ) ) , queue , SLOT ( deleteLater ( ) ) ) ;
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
# ifndef Q_OS_LINUX
2023-04-28 19:17:14 +01:00
QString systemRigLocation = QCoreApplication : : applicationDirPath ( ) ;
2023-09-22 19:06:09 +01:00
# else
QString systemRigLocation = PREFIX ;
# endif
2023-04-28 19:09:47 +01:00
2023-04-27 19:56:25 +01:00
# ifdef Q_OS_LINUX
2023-09-22 19:06:09 +01:00
systemRigLocation + = " /share/wfview/rigs " ;
2023-04-27 19:56:25 +01:00
# else
2023-04-28 19:17:14 +01:00
systemRigLocation + = " /rigs " ;
2023-04-27 19:56:25 +01:00
# endif
2023-04-28 19:17:14 +01:00
QDir systemRigDir ( systemRigLocation ) ;
2023-04-27 16:39:51 +01:00
2023-04-28 19:17:14 +01:00
if ( ! systemRigDir . exists ( ) ) {
2023-04-23 21:29:44 +01:00
qWarning ( ) < < " ********* Rig directory does not exist ******** " ;
} else {
2023-04-28 19:17:14 +01:00
QStringList rigs = systemRigDir . entryList ( QStringList ( ) < < " *.rig " < < " *.RIG " , QDir : : Files ) ;
2023-12-17 19:41:22 +00:00
for ( QString & rig : rigs ) {
2023-04-28 19:17:14 +01:00
QSettings * rigSettings = new QSettings ( systemRigDir . absoluteFilePath ( rig ) , QSettings : : Format : : IniFormat ) ;
2024-02-11 09:29:30 +00:00
# if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
2024-02-11 17:26:33 +00:00
rigSettings - > setIniCodec ( " UTF-8 " ) ;
2024-02-11 09:29:30 +00:00
# endif
2023-04-23 21:29:44 +01:00
if ( ! rigSettings - > childGroups ( ) . contains ( " Rig " ) )
{
qWarning ( ) < < rig < < " Does not seem to be a rig description file " ;
delete rigSettings ;
continue ;
}
rigSettings - > beginGroup ( " Rig " ) ;
qDebug ( ) < < QString ( " Found Rig %0 with CI-V address of %1 " ) . arg ( rigSettings - > value ( " Model " , " " ) . toString ( ) , rigSettings - > value ( " CIVAddress " , 0 ) . toString ( ) ) ;
2023-04-27 16:39:51 +01:00
// Any user modified rig files will override system provided ones.
2023-04-28 19:17:14 +01:00
this - > rigList . insert ( rigSettings - > value ( " CIVAddress " , 0 ) . toInt ( ) , systemRigDir . absoluteFilePath ( rig ) ) ;
2023-04-23 21:29:44 +01:00
rigSettings - > endGroup ( ) ;
delete rigSettings ;
}
}
2023-04-28 19:17:14 +01:00
QString userRigLocation = QStandardPaths : : writableLocation ( QStandardPaths : : AppDataLocation ) + " /rigs " ;
QDir userRigDir ( userRigLocation ) ;
if ( userRigDir . exists ( ) ) {
QStringList rigs = userRigDir . entryList ( QStringList ( ) < < " *.rig " < < " *.RIG " , QDir : : Files ) ;
2023-12-17 19:41:22 +00:00
for ( QString & rig : rigs ) {
2023-04-28 19:17:14 +01:00
QSettings * rigSettings = new QSettings ( userRigDir . absoluteFilePath ( rig ) , QSettings : : Format : : IniFormat ) ;
2023-04-27 16:39:51 +01:00
if ( ! rigSettings - > childGroups ( ) . contains ( " Rig " ) )
{
qWarning ( ) < < rig < < " Does not seem to be a rig description file " ;
delete rigSettings ;
continue ;
}
rigSettings - > beginGroup ( " Rig " ) ;
qDebug ( ) < < QString ( " Found User Rig %0 with CI-V address of %1 " ) . arg ( rigSettings - > value ( " Model " , " " ) . toString ( ) , rigSettings - > value ( " CIVAddress " , 0 ) . toString ( ) ) ;
// Any user modified rig files will override system provided ones.
2023-04-28 19:17:14 +01:00
this - > rigList . insert ( rigSettings - > value ( " CIVAddress " , 0 ) . toInt ( ) , userRigDir . absoluteFilePath ( rig ) ) ;
2023-04-27 16:39:51 +01:00
rigSettings - > endGroup ( ) ;
delete rigSettings ;
}
}
2024-04-29 09:01:52 +01:00
// Setup the connectiontimer as we may need it soon!
2024-03-24 23:17:39 +00:00
ConnectionTimer . setSingleShot ( true ) ;
connect ( & ConnectionTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( connectionTimeout ( ) ) ) ;
2024-03-25 12:42:08 +00:00
// Make sure we know about any changes to rigCaps
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
2022-05-12 01:46:20 +01:00
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 ) ;
finputbtns - > setAutomaticSidebandSwitching ( prefs . automaticSidebandSwitching ) ;
2019-01-28 15:46:14 -08:00
2022-04-08 15:51:59 +01:00
qDebug ( logSystem ( ) ) < < " Running setInititalTiming() " ;
2021-05-28 21:27:06 -07: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
2023-04-11 20:25:29 +01:00
connect ( ui - > txPowerSlider , & QSlider : : sliderMoved ,
[ & ] ( int value ) {
QToolTip : : showText ( QCursor : : pos ( ) , QString ( " %1 " ) . arg ( value * 100 / 255 ) , nullptr ) ;
} ) ;
2024-11-05 18:46:21 +00:00
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 ) ;
} ) ;
2024-06-23 11:59:41 +01:00
connect ( ui - > meter2Widget , & meter : : configureMeterSignal , this ,
2024-02-05 21:03:08 -08:00
[ = ] ( 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 ) ;
} ) ;
2024-06-23 11:59:41 +01:00
connect ( ui - > meter3Widget , & meter : : configureMeterSignal , this ,
2024-02-05 21:03:08 -08:00
[ = ] ( 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 ) ;
} ) ;
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
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 ( )
{
2023-09-26 19:13:31 -07:00
if ( rigThread ! = Q_NULLPTR ) {
rigThread - > quit ( ) ;
rigThread - > wait ( ) ;
}
2023-09-19 23:04:48 +01:00
2021-05-28 20:51:19 -07:00
if ( serverThread ! = Q_NULLPTR ) {
serverThread - > quit ( ) ;
serverThread - > wait ( ) ;
}
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 ;
}
2022-09-29 17:17:51 +01:00
if ( clusterThread ! = Q_NULLPTR ) {
clusterThread - > quit ( ) ;
clusterThread - > wait ( ) ;
}
2023-09-19 23:04:48 +01:00
if ( tciThread ! = Q_NULLPTR ) {
tciThread - > quit ( ) ;
tciThread - > wait ( ) ;
}
2021-05-28 20:51:19 -07:00
if ( rigCtl ! = Q_NULLPTR ) {
delete rigCtl ;
}
2022-05-12 01:46:20 +01:00
2023-09-24 21:00:21 +01:00
if ( colorPrefs ! = Q_NULLPTR ) {
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)
2022-04-22 11:11:21 +01:00
if ( usbControllerThread ! = Q_NULLPTR ) {
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
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
{
2021-06-14 20:22:15 -07:00
usingLAN = true ;
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 ) ;
2023-05-28 22:11:59 +01:00
emit sendCommSetup ( 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
}
2021-06-14 20:22:15 -07:00
usingLAN = false ;
2023-04-23 21:29:44 +01:00
emit sendCommSetup ( 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 ) ;
2021-05-20 19:24:40 +01:00
}
2024-05-20 14:35:36 +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 ( )
{
if ( rigThread = = Q_NULLPTR )
{
2024-05-05 13:47:20 +01:00
rig = new icomCommander ( ) ;
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-02 13:43:59 +00:00
( 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-08-13 13:19:50 +01:00
connect ( this , SIGNAL ( sendCommSetup ( rigTypedef , quint8 , udpPreferences , audioSetup , audioSetup , QString , quint16 ) ) , rig , SLOT ( commSetup ( rigTypedef , quint8 , udpPreferences , audioSetup , audioSetup , QString , quint16 ) ) ) ;
connect ( this , SIGNAL ( sendCommSetup ( rigTypedef , quint8 , QString , quint32 , QString , quint16 , quint8 ) ) , rig , SLOT ( commSetup ( rigTypedef , quint8 , QString , quint32 , QString , quint16 , quint8 ) ) ) ;
2021-12-30 01:52:23 -08:00
connect ( this , SIGNAL ( setRTSforPTT ( bool ) ) , rig , SLOT ( setRTSforPTT ( bool ) ) ) ;
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 ) ) ) ;
connect ( this , SIGNAL ( getRigCIV ( ) ) , rig , SLOT ( findRigs ( ) ) ) ;
2024-08-13 13:19:50 +01:00
connect ( this , SIGNAL ( setRigID ( quint8 ) ) , rig , SLOT ( setRigID ( quint8 ) ) ) ;
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 ) {
qInfo ( logUdpServer ( ) ) < < " **** Connecting rig instance to server " ;
connect ( rig , SIGNAL ( haveAudioData ( audioPacket ) ) , udp , SLOT ( receiveAudioData ( audioPacket ) ) ) ;
// Need to add a signal/slot for audio from the client to rig.
//connect(udp, SIGNAL(haveAudioData(audioPacket)), rig, SLOT(receiveAudioData(audioPacket)));
connect ( rig , SIGNAL ( haveDataForServer ( QByteArray ) ) , udp , SLOT ( dataForServer ( QByteArray ) ) ) ;
connect ( udp , SIGNAL ( haveDataFromServer ( QByteArray ) ) , rig , SLOT ( dataFromServer ( QByteArray ) ) ) ;
}
2023-10-30 19:14:35 +00:00
2024-08-13 13:19:50 +01:00
connect ( this , SIGNAL ( setCIVAddr ( quint8 ) ) , rig , SLOT ( setCIVAddr ( quint8 ) ) ) ;
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 ( ) ) ) ;
// Repeater, duplex, and split:
//connect(rpt, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode()));
//connect(rpt, SIGNAL(setDuplexMode(duplexMode_t)), rig, SLOT(setDuplexMode(duplexMode_t)));
//connect(rig, SIGNAL(haveDuplexMode(duplexMode_t)), rpt, SLOT(receiveDuplexMode(duplexMode_t)));
//connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset()));
connect ( rig , SIGNAL ( haveRptOffsetFrequency ( freqt ) ) , rpt , SLOT ( handleRptOffsetFrequency ( freqt ) ) ) ;
// Memories
//connect(this, SIGNAL(setMemoryMode()), rig, SLOT(setMemoryMode()));
//connect(this, SIGNAL(setSatelliteMode(bool)), rig, SLOT(setSatelliteMode(bool)));
//connect(this, SIGNAL(getMemory(quint32)), rig, SLOT(getMemory(quint32)));
//connect(this, SIGNAL(getSatMemory(quint32)), rig, SLOT(getSatMemory(quint32)));
//connect(this, SIGNAL(setMemory(memoryType)), rig, SLOT(setMemory(memoryType)));
//connect(this, SIGNAL(clearMemory(quint32)), rig, SLOT(clearMemory(quint32)));
2024-03-25 12:42:08 +00:00
//connect(this, SIGNAL(rigCaps->ry(quint32)), rig, SLOT(rigCaps->ry(quint32)));
2023-10-30 19:14:35 +00:00
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 ) ; } ) ;
2024-08-13 13:19:50 +01:00
connect ( this , SIGNAL ( setAfGain ( quint8 ) ) , rig , SLOT ( setAfGain ( quint8 ) ) ) ;
2023-10-30 19:14:35 +00:00
2022-01-29 22:50:58 +00:00
// Create link for server so it can have easy access to rig.
if ( serverConfig . rigs . first ( ) ! = Q_NULLPTR ) {
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 ( ) ;
2021-05-28 20:51:19 -07:00
if ( rigThread ! = Q_NULLPTR )
2021-05-05 14:11:00 +01:00
{
2023-09-24 10:32:59 +01:00
rigThread - > quit ( ) ;
rigThread - > wait ( ) ;
2021-08-04 20:49:32 +01:00
rig = Q_NULLPTR ;
2023-09-24 10:32:59 +01:00
rigThread = Q_NULLPTR ;
2021-05-05 14:11:00 +01: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!! ";
2021-06-14 20:22:15 -07:00
if ( ! usingLAN )
{
// usingLAN gets set when we emit the sendCommSetup signal.
// 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
2023-05-15 10:53:52 +01:00
queue - > addUnique ( priorityHighest , 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.
2021-05-15 18:53:16 +01:00
qInfo ( logSystem ( ) ) < < " Skipping automatic CIV, using user-supplied value of " < < prefs . radioCIVAddr ;
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 )
{
qInfo ( logSystem ( ) ) < < " Skipping Rig ID query, using user-supplied model from CI-V address: " < < prefs . radioCIVAddr ;
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 ) ;
2023-05-15 10:53:52 +01:00
queue - > addUnique ( priorityHighest , 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
}
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
2023-01-05 19:37:53 +00:00
QMessageBox : : critical ( this , err . device , err . message , QMessageBox : : Ok ) ;
}
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
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 ) ;
//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 (
2023-06-05 09:27:37 +01:00
ui - > txPowerSlider , & QSlider : : valueChanged , this ,
[ = ] ( const int & newValue ) { statusFromSliderPercent ( " Tx Power " , newValue ) ; }
) ;
2021-06-19 16:16:07 -07:00
connect (
2023-05-12 00:24:01 +01:00
ui - > rfGainSlider , & QSlider : : valueChanged , this ,
2021-06-19 16:16:07 -07:00
[ = ] ( const int & newValue ) { statusFromSliderPercent ( " RF Gain " , newValue ) ; }
) ;
connect (
2023-05-12 00:24:01 +01:00
ui - > afGainSlider , & QSlider : : valueChanged , this ,
2021-06-19 16:16:07 -07:00
[ = ] ( const int & newValue ) { statusFromSliderPercent ( " AF Gain " , newValue ) ; }
) ;
connect (
2023-05-12 00:24:01 +01:00
ui - > micGainSlider , & QSlider : : valueChanged , this ,
2021-06-19 16:16:07 -07:00
[ = ] ( const int & newValue ) { statusFromSliderPercent ( " TX Audio Gain " , newValue ) ; }
) ;
connect (
2023-05-12 00:24:01 +01:00
ui - > sqlSlider , & QSlider : : valueChanged , this ,
2021-06-19 16:16:07 -07:00
[ = ] ( const int & newValue ) { statusFromSliderPercent ( " Squelch " , newValue ) ; }
) ;
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-20 16:54:07 +01:00
//connect(setupui, SIGNAL(changedAudioInputCombo(int)), this, SLOT(changedAudioInput(int)));
//connect(setupui, SIGNAL(changedAudioOutputCombo(int)), this, SLOT(changedAudioOutput(int)));
//connect(setupui, SIGNAL(changedServerRXAudioInputCombo(int)), this, SLOT(changedServerRXAudioInput(int)));
//connect(setupui, SIGNAL(changedServerTXAudioOutputCombo(int)), this, SLOT(changedServerTXAudioOutput(int)));
2023-02-21 22:54:15 -08:00
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);
2021-12-30 11:17:54 +00:00
if ( serverThread ! = Q_NULLPTR ) {
serverThread - > quit ( ) ;
serverThread - > wait ( ) ;
serverThread = Q_NULLPTR ;
udp = Q_NULLPTR ;
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
2022-04-20 13:35:23 +01:00
udp = new udpServer ( & serverConfig ) ;
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
2021-05-28 21:27:06 -07:00
udp - > moveToThread ( serverThread ) ;
2022-05-05 18:09:16 +01:00
if ( serverConfig . lan ) {
2022-01-22 15:12:36 +00:00
connect ( udp , 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
}
2024-05-20 14:35:36 +01:00
connect ( this , SIGNAL ( initServer ( ) ) , udp , SLOT ( init ( ) ) ) ;
connect ( serverThread , SIGNAL ( finished ( ) ) , udp , SLOT ( deleteLater ( ) ) ) ;
2021-05-28 21:27:06 -07:00
serverThread - > start ( ) ;
emit initServer ( ) ;
2024-03-25 12:42:08 +00:00
//connect(this, SIGNAL(sendRigCaps(rigCapabilities)), udp, SLOT(receiveRigCaps(rigCapabilities)));
2021-05-28 21:27:06 -07:00
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 ( ) ) {
foreach ( spectrumScope * 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
}
2024-03-30 20:40:27 +00:00
for ( uchar i = 0 ; i < rigCaps - > numReceiver ; i + + )
2024-01-27 22:13:47 +00:00
{
2024-04-21 17:50:42 +01:00
spectrumScope * receiver = new spectrumScope ( rigCaps - > hasSpectrum , i , rigCaps - > numVFO , this ) ;
2024-07-23 09:18:27 +01:00
receiver - > setSeparators ( prefs . groupSeparator , prefs . decimalSeparator ) ;
2024-03-30 20:40:27 +00:00
receiver - > setUnderlayMode ( prefs . underlayMode ) ;
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 ) ;
receiver - > wfTheme ( i = = 0 ? prefs . mainWfTheme : prefs . subWfTheme ) ;
receiver - > setClickDragTuning ( prefs . clickDragTuningEnable ) ;
receiver - > setTuningFloorZeros ( prefs . niceTS ) ;
receiver - > resizePlasmaBuffer ( prefs . underlayBufferSize ) ;
receiver - > setUnit ( ( FctlUnit ) prefs . frequencyUnits ) ;
receiver - > colorPreset ( this - > colorPrefs ) ;
receiver - > setIdentity ( i = = 0 ? " Main Band " : " Sub Band " ) ;
ui - > vfoLayout - > addWidget ( receiver ) ;
2024-01-27 22:13:47 +00:00
2024-03-30 20:40:27 +00:00
// Hide any secondary receivers until we need them!
2024-01-27 22:13:47 +00:00
if ( i > 0 ) {
2024-03-30 20:40:27 +00:00
receiver - > setVisible ( false ) ;
2024-04-28 10:28:29 +01:00
} else {
receiver - > setVisible ( true ) ;
2024-04-28 11:09:50 +01:00
//receiver->selected(true);
2024-01-27 22:13:47 +00:00
}
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
2024-03-30 20:40:27 +00:00
connect ( cluster , SIGNAL ( sendSpots ( uchar , QList < spotData > ) ) , receiver , SLOT ( receiveSpots ( uchar , QList < 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
2024-11-02 13:43:59 +00:00
connect ( receiver , & spectrumScope : : bandChanged , receiver , [ = ] ( const uchar & rx , const bandType & b ) {
if ( rx = = currentReceiver & & rigCaps - > commands . contains ( funcAntenna ) ) {
ui - > antennaSelCombo - > setEnabled ( b . ants ) ;
if ( b . ants ) {
queue - > addUnique ( priorityMediumHigh , queueItem ( funcAntenna , false , true , i ) ) ;
} else {
queue - > del ( funcAntenna , i ) ;
}
}
} ) ;
2024-03-30 20:40:27 +00:00
connect ( receiver , SIGNAL ( showStatusBarText ( QString ) ) , this , SLOT ( showStatusBarText ( QString ) ) ) ;
receivers . append ( receiver ) ;
2024-04-28 11:09:50 +01:00
queue - > add ( priorityImmediate , queueItem ( funcScopeMainSub , false ) ) ; // Get current scope
2024-01-27 22:13:47 +00:00
2024-04-13 10:35:17 -07:00
//ui->scopeSpacer->changeSize(0,0,QSizePolicy::Minimum);
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
2021-05-28 20:51:19 -07:00
void wfmain : : setupKeyShortcuts ( )
{
keyF1 = new QShortcut ( this ) ;
keyF1 - > setKey ( Qt : : Key_F1 ) ;
connect ( keyF1 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF1 ( ) ) ) ;
2021-04-20 12:29:10 +01:00
2021-05-28 20:51:19 -07:00
keyF2 = new QShortcut ( this ) ;
keyF2 - > setKey ( Qt : : Key_F2 ) ;
connect ( keyF2 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF2 ( ) ) ) ;
2021-04-20 12:29:10 +01:00
2021-05-28 20:51:19 -07:00
keyF3 = new QShortcut ( this ) ;
keyF3 - > setKey ( Qt : : Key_F3 ) ;
connect ( keyF3 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF3 ( ) ) ) ;
2021-02-07 12:59:41 +00:00
2021-05-28 20:51:19 -07:00
keyF4 = new QShortcut ( this ) ;
keyF4 - > setKey ( Qt : : Key_F4 ) ;
connect ( keyF4 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF4 ( ) ) ) ;
2021-02-07 12:59:41 +00:00
2021-05-28 20:51:19 -07:00
keyF5 = new QShortcut ( this ) ;
keyF5 - > setKey ( Qt : : Key_F5 ) ;
connect ( keyF5 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF5 ( ) ) ) ;
2021-02-07 12:59:41 +00:00
2021-05-28 20:51:19 -07:00
keyF6 = new QShortcut ( this ) ;
keyF6 - > setKey ( Qt : : Key_F6 ) ;
connect ( keyF6 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF6 ( ) ) ) ;
2021-05-21 16:30:52 +01:00
2021-05-28 20:51:19 -07:00
keyF7 = new QShortcut ( this ) ;
keyF7 - > setKey ( Qt : : Key_F7 ) ;
connect ( keyF7 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF7 ( ) ) ) ;
2021-05-21 16:30:52 +01:00
2021-05-28 20:51:19 -07:00
keyF8 = new QShortcut ( this ) ;
keyF8 - > setKey ( Qt : : Key_F8 ) ;
connect ( keyF8 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF8 ( ) ) ) ;
2021-02-07 12:59:41 +00:00
2021-05-28 20:51:19 -07:00
keyF9 = new QShortcut ( this ) ;
keyF9 - > setKey ( Qt : : Key_F9 ) ;
connect ( keyF9 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF9 ( ) ) ) ;
2021-05-21 11:35:13 -07:00
2021-05-28 20:51:19 -07:00
keyF10 = new QShortcut ( this ) ;
keyF10 - > setKey ( Qt : : Key_F10 ) ;
connect ( keyF10 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF10 ( ) ) ) ;
2021-05-21 11:35:13 -07:00
2021-05-28 20:51:19 -07:00
keyF11 = new QShortcut ( this ) ;
keyF11 - > setKey ( Qt : : Key_F11 ) ;
connect ( keyF11 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF11 ( ) ) ) ;
2021-02-02 01:05:59 -08:00
2021-05-28 20:51:19 -07:00
keyF12 = new QShortcut ( this ) ;
keyF12 - > setKey ( Qt : : Key_F12 ) ;
connect ( keyF12 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF12 ( ) ) ) ;
2021-01-29 22:09:09 -08:00
2021-05-28 20:51:19 -07:00
keyControlT = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlT - > setKey ( Qt : : CTRL | Qt : : Key_T ) ;
2021-05-28 20:51:19 -07:00
connect ( keyControlT , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlT ( ) ) ) ;
2021-02-07 12:59:41 +00:00
2021-05-28 20:51:19 -07:00
keyControlR = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlR - > setKey ( Qt : : CTRL | Qt : : Key_R ) ;
2021-05-28 20:51:19 -07:00
connect ( keyControlR , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlR ( ) ) ) ;
2021-01-29 22:09:09 -08:00
2024-02-05 08:39:41 -08:00
keyControlR = new QShortcut ( this ) ;
keyControlR - > setKey ( Qt : : CTRL | Qt : : Key_P ) ;
connect ( keyControlR , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlP ( ) ) ) ;
2021-05-28 20:51:19 -07:00
keyControlI = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlI - > setKey ( Qt : : CTRL | Qt : : Key_I ) ;
2021-05-28 20:51:19 -07:00
connect ( keyControlI , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlI ( ) ) ) ;
2021-01-29 22:09:09 -08:00
2021-05-28 20:51:19 -07:00
keyControlU = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlU - > setKey ( Qt : : CTRL | Qt : : Key_U ) ;
2021-05-28 20:51:19 -07:00
connect ( keyControlU , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlU ( ) ) ) ;
2021-02-07 01:03:02 -08:00
2021-05-28 20:51:19 -07:00
keyStar = new QShortcut ( this ) ;
keyStar - > setKey ( Qt : : Key_Asterisk ) ;
connect ( keyStar , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutStar ( ) ) ) ;
2021-02-07 01:03:02 -08:00
2021-05-28 20:51:19 -07:00
keySlash = new QShortcut ( this ) ;
keySlash - > setKey ( Qt : : Key_Slash ) ;
connect ( keySlash , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutSlash ( ) ) ) ;
2021-02-11 09:09:45 -08:00
2021-05-28 20:51:19 -07:00
keyMinus = new QShortcut ( this ) ;
keyMinus - > setKey ( Qt : : Key_Minus ) ;
connect ( keyMinus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutMinus ( ) ) ) ;
2021-05-21 13:01:21 -07:00
2021-05-28 20:51:19 -07:00
keyPlus = new QShortcut ( this ) ;
keyPlus - > setKey ( Qt : : Key_Plus ) ;
connect ( keyPlus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutPlus ( ) ) ) ;
2021-05-21 13:01:21 -07:00
2021-05-28 20:51:19 -07:00
keyShiftMinus = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyShiftMinus - > setKey ( Qt : : SHIFT | Qt : : Key_Minus ) ;
2021-05-28 20:51:19 -07:00
connect ( keyShiftMinus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutShiftMinus ( ) ) ) ;
2021-05-21 23:46:15 -07:00
2021-05-28 20:51:19 -07:00
keyShiftPlus = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyShiftPlus - > setKey ( Qt : : SHIFT | Qt : : Key_Plus ) ;
2021-05-28 20:51:19 -07:00
connect ( keyShiftPlus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutShiftPlus ( ) ) ) ;
2021-05-21 13:01:21 -07:00
2021-05-28 20:51:19 -07:00
keyControlMinus = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlMinus - > setKey ( Qt : : CTRL | Qt : : Key_Minus ) ;
2021-05-28 20:51:19 -07:00
connect ( keyControlMinus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlMinus ( ) ) ) ;
2021-05-21 13:01:21 -07:00
2021-05-28 20:51:19 -07:00
keyControlPlus = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlPlus - > setKey ( Qt : : CTRL | Qt : : Key_Plus ) ;
2021-05-28 20:51:19 -07:00
connect ( keyControlPlus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlPlus ( ) ) ) ;
2021-05-21 13:01:21 -07:00
2021-05-28 20:51:19 -07:00
keyQuit = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyQuit - > setKey ( Qt : : CTRL | Qt : : Key_Q ) ;
2021-05-28 20:51:19 -07:00
connect ( keyQuit , SIGNAL ( activated ( ) ) , this , SLOT ( on_exitBtn_clicked ( ) ) ) ;
2021-02-02 01:05:59 -08:00
2021-05-28 20:51:19 -07:00
keyPageUp = new QShortcut ( this ) ;
keyPageUp - > setKey ( Qt : : Key_PageUp ) ;
connect ( keyPageUp , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutPageUp ( ) ) ) ;
2021-01-29 22:09:09 -08:00
2021-05-28 20:51:19 -07:00
keyPageDown = new QShortcut ( this ) ;
keyPageDown - > setKey ( Qt : : Key_PageDown ) ;
connect ( keyPageDown , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutPageDown ( ) ) ) ;
2021-02-02 01:05:59 -08:00
2021-05-28 20:51:19 -07:00
keyF = new QShortcut ( this ) ;
keyF - > setKey ( Qt : : Key_F ) ;
connect ( keyF , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF ( ) ) ) ;
2021-01-29 22:09:09 -08:00
2021-05-28 20:51:19 -07:00
keyM = new QShortcut ( this ) ;
keyM - > setKey ( Qt : : Key_M ) ;
connect ( keyM , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutM ( ) ) ) ;
2021-06-17 23:14:28 -07:00
2023-01-22 23:41:31 -08:00
// Alternate for plus:
keyK = new QShortcut ( this ) ;
keyK - > setKey ( Qt : : Key_K ) ;
2024-03-25 12:42:08 +00:00
connect ( keyK , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
this - > shortcutPlus ( ) ;
} ) ;
// Alternate for minus:
keyJ = new QShortcut ( this ) ;
keyJ - > setKey ( Qt : : Key_J ) ;
2024-03-25 12:42:08 +00:00
connect ( keyJ , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
this - > shortcutMinus ( ) ;
} ) ;
keyShiftK = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyShiftK - > setKey ( Qt : : SHIFT | Qt : : Key_K ) ;
2024-03-25 12:42:08 +00:00
connect ( keyShiftK , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
this - > shortcutShiftPlus ( ) ;
} ) ;
keyShiftJ = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyShiftJ - > setKey ( Qt : : SHIFT | Qt : : Key_J ) ;
2024-03-25 12:42:08 +00:00
connect ( keyShiftJ , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
this - > shortcutShiftMinus ( ) ;
} ) ;
keyControlK = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlK - > setKey ( Qt : : CTRL | Qt : : Key_K ) ;
2024-03-25 12:42:08 +00:00
connect ( keyControlK , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
this - > shortcutControlPlus ( ) ;
} ) ;
keyControlJ = new QShortcut ( this ) ;
2023-04-13 14:02:43 +01:00
keyControlJ - > setKey ( Qt : : CTRL | Qt : : Key_J ) ;
2024-03-25 12:42:08 +00:00
connect ( keyControlJ , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
this - > shortcutControlMinus ( ) ;
} ) ;
// Move the tuning knob by the tuning step selected:
// H = Down
keyH = new QShortcut ( this ) ;
keyH - > setKey ( Qt : : Key_H ) ;
2024-03-25 12:42:08 +00:00
connect ( keyH , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
2024-01-29 18:18:45 +00:00
freqt f ;
2024-03-30 20:40:27 +00:00
f . Hz = roundFrequencyWithStep ( receivers . first ( ) - > getFrequency ( ) . Hz , - 1 , tsKnobHz ) ;
2024-01-29 18:18:45 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) ) ) ;
2024-01-29 18:18:45 +00:00
}
2023-01-22 23:41:31 -08:00
} ) ;
// L = Up
keyL = new QShortcut ( this ) ;
keyL - > setKey ( Qt : : Key_L ) ;
2024-03-25 12:42:08 +00:00
connect ( keyL , & QShortcut : : activated , this ,
2023-01-22 23:41:31 -08:00
[ = ] ( ) {
if ( freqLock ) return ;
freqt f ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
f . Hz = roundFrequencyWithStep ( receivers . first ( ) - > getFrequency ( ) . Hz , 1 , tsKnobHz ) ;
2024-01-29 18:18:45 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) ) ) ;
2024-01-29 18:18:45 +00:00
}
2023-01-22 23:41:31 -08:00
} ) ;
2021-06-17 23:14:28 -07:00
keyDebug = new QShortcut ( this ) ;
2022-12-29 15:26:41 +00:00
# if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
2023-04-13 14:02:43 +01:00
keyDebug - > setKey ( Qt : : CTRL | Qt : : SHIFT | Qt : : Key_D ) ;
2022-08-22 23:09:09 +01:00
# else
2023-04-13 14:02:43 +01:00
keyDebug - > setKey ( Qt : : CTRL | Qt : : Key_D ) ;
2023-01-22 23:41:31 -08:00
# endif
2023-07-17 11:09:14 +01:00
connect ( keyDebug , SIGNAL ( activated ( ) ) , this , SLOT ( debugBtn_clicked ( ) ) ) ;
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
if ( usbWindow = = Q_NULLPTR ) {
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 ) ) ) ;
2024-08-13 13:19:50 +01:00
connect ( this , SIGNAL ( sendLevel ( funcs , quint8 ) ) , usbControllerDev , SLOT ( receiveLevel ( funcs , quint8 ) ) ) ;
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 ;
}
2023-05-15 10:53:52 +01:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( status ) , false ) ) ;
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 )
shortcutShiftPlus ( ) ;
else if ( level = = 1 & & ! up )
shortcutShiftMinus ( ) ;
else if ( level > 1 & & level < 5 & & up )
for ( int i = 1 ; i < level ; i + + )
shortcutPlus ( ) ;
else if ( level > 1 & & level < 5 & & ! up )
for ( int i = 1 ; i < level ; i + + )
shortcutMinus ( ) ;
else if ( level > 4 & & up )
for ( int i = 4 ; i < level ; i + + )
shortcutControlPlus ( ) ;
else if ( level > 4 & & ! up )
for ( int i = 4 ; i < level ; i + + )
shortcutControlMinus ( ) ;
}
2022-04-27 12:56:54 +01:00
void wfmain : : buttonControl ( const COMMAND * cmd )
2021-08-19 10:21:09 +01:00
{
2023-03-21 13:17:35 +00:00
qDebug ( logUsbControl ( ) ) < < QString ( " executing command: %0 (%1) suffix:%2 value:%3 " ) . arg ( cmd - > text ) . arg ( cmd - > command ) . arg ( cmd - > suffix ) . arg ( cmd - > value ) ;
2024-08-13 13:19:50 +01:00
quint8 rx = 0 ;
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-07-13 19:19:27 +01:00
case funcSubMode :
rx = 1 ;
case funcMainMode :
2023-05-15 10:53:52 +01:00
case funcModeSet :
2024-07-15 16:59:47 +01:00
if ( cmd - > value = = 1 ) {
2024-03-25 12:42:08 +00:00
for ( size_t i = 0 ; i < rigCaps - > modes . size ( ) ; i + + ) {
2024-07-13 19:19:27 +01:00
if ( rigCaps - > modes [ i ] . mk = = receivers [ rx ] - > currentMode ( ) . mk )
2023-05-15 10:53:52 +01:00
{
2024-03-25 12:42:08 +00:00
if ( i + 1 < rigCaps - > modes . size ( ) ) {
changeMode ( rigCaps - > modes [ i + 1 ] . mk ) ;
2023-05-15 10:53:52 +01:00
}
else {
2024-03-25 12:42:08 +00:00
changeMode ( rigCaps - > modes [ 0 ] . mk ) ;
2023-05-15 10:53:52 +01:00
}
2023-01-29 19:26:21 +00:00
}
2023-05-15 10:53:52 +01:00
}
2024-07-15 16:59:47 +01:00
} else if ( cmd - > value = = - 1 ) {
2024-03-25 12:42:08 +00:00
for ( size_t i = 0 ; i < rigCaps - > modes . size ( ) ; i + + ) {
2024-07-13 19:19:27 +01:00
if ( rigCaps - > modes [ i ] . mk = = receivers [ rx ] - > currentMode ( ) . mk )
2023-05-15 10:53:52 +01:00
{
if ( i > 0 ) {
2024-03-25 12:42:08 +00:00
changeMode ( rigCaps - > modes [ i - 1 ] . mk ) ;
2023-05-15 10:53:52 +01:00
}
else {
2024-03-25 12:42:08 +00:00
changeMode ( rigCaps - > modes [ rigCaps - > modes . size ( ) - 1 ] . mk ) ;
2023-05-15 10:53:52 +01:00
}
2023-01-29 19:26:21 +00:00
}
}
2023-05-15 10:53:52 +01:00
} else {
changeMode ( cmd - > mode ) ;
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-07-13 19:19:27 +01:00
case funcScopeSubSpan :
rx = 1 ;
2023-05-24 19:50:01 +01:00
case funcScopeMainSpan :
2024-07-13 19:19:27 +01:00
if ( receivers . size ( ) > rx ) {
receivers [ rx ] - > changeSpan ( cmd - > value ) ;
2023-01-30 00:31:33 +00:00
}
break ;
2024-03-30 20:40:27 +00:00
case funcSubFreq :
2024-07-13 19:19:27 +01:00
case funcUnselectedFreq :
rx = 1 ;
2024-03-30 20:40:27 +00:00
case funcMainFreq :
2024-01-27 22:13:47 +00:00
case funcSelectedFreq :
2023-03-17 23:35:40 +00:00
{
freqt f ;
2024-07-13 19:19:27 +01:00
if ( receivers . size ( ) > rx ) {
f . Hz = roundFrequencyWithStep ( receivers [ rx ] - > getFrequency ( ) . Hz , cmd - > value , tsWfScrollHz ) ;
2024-06-23 11:59:41 +01:00
} else {
f . Hz = 0 ;
2023-03-17 23:35:40 +00:00
}
2024-06-23 11:59:41 +01:00
f . MHzDouble = f . Hz / double ( 1E6 ) ;
2023-03-17 23:35:40 +00:00
f . VFO = ( selVFO_t ) cmd - > suffix ;
2024-07-13 19:19:27 +01:00
queue - > add ( priorityImmediate , queueItem ( ( funcs ) cmd - > command , QVariant : : fromValue < freqt > ( f ) , false , rx ) ) ;
2023-03-17 23:35:40 +00:00
break ;
}
2024-07-26 18:51:23 +01:00
case funcTransceiverStatus :
{
if ( cmd - > value = = - 1 )
{
// toggle PTT
on_transmitBtn_clicked ( ) ;
break ;
}
// We want to fall through if it is not a toggle.
}
2023-01-29 19:26:21 +00:00
default :
2023-03-28 19:07:54 +01:00
qInfo ( logUsbControl ( ) ) < < " Command " < < cmd - > command < < " Suffix " < < cmd - > suffix ;
2024-07-13 19:19:27 +01:00
queue - > add ( priorityImmediate , queueItem ( ( funcs ) cmd - > command , QVariant : : fromValue < uchar > ( cmd - > suffix ) , false , rx ) ) ;
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 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
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 ;
2021-12-30 01:52:23 -08:00
defPrefs . forceRTSasPTT = false ;
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-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 ;
2024-02-05 13:42:00 -08: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
2021-03-01 19:53:12 +00:00
udpDefPrefs . ipAddress = QString ( " " ) ;
udpDefPrefs . controlLANPort = 50001 ;
udpDefPrefs . serialLANPort = 50002 ;
udpDefPrefs . audioLANPort = 50003 ;
udpDefPrefs . username = QString ( " " ) ;
udpDefPrefs . password = QString ( " " ) ;
2021-03-27 16:07:17 +00:00
udpDefPrefs . clientName = QHostInfo : : localHostName ( ) ;
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 ( ) ;
2023-02-21 22:54:15 -08:00
setupui - > acceptServerConfig ( & serverConfig ) ;
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 ( ) ;
2024-07-23 09:18:27 +01:00
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.
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-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
prefs . rigCreatorEnable = settings - > value ( " RigCreator " , false ) . toBool ( ) ;
2024-06-12 17:11:01 +01:00
prefs . region = settings - > value ( " Region " , defPrefs . region ) . toString ( ) ;
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 ( ) ) ;
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 " ) ;
2024-08-13 13:19:50 +01:00
prefs . radioCIVAddr = ( quint8 ) settings - > value ( " RigCIVuInt " , defPrefs . radioCIVAddr ) . toInt ( ) ;
2021-11-06 23:59:03 -07:00
prefs . CIVisRadioModel = ( bool ) settings - > value ( " CIVisRadioModel " , defPrefs . CIVisRadioModel ) . toBool ( ) ;
2021-12-30 01:52:23 -08:00
prefs . forceRTSasPTT = ( bool ) settings - > value ( " ForceRTSasPTT " , defPrefs . forceRTSasPTT ) . toBool ( ) ;
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-08-04 20:49:32 +01:00
// Call the function to start rigctld if enabled.
2023-02-19 23:12:36 -08:00
enableRigCtl ( prefs . enableRigCtlD ) ;
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 ( ) ;
udpPrefs . username = settings - > value ( " Username " , udpDefPrefs . username ) . toString ( ) ;
udpPrefs . password = settings - > value ( " Password " , udpDefPrefs . password ) . toString ( ) ;
2023-05-28 22:11:59 +01:00
prefs . rxSetup . isinput = false ;
prefs . txSetup . isinput = true ;
prefs . rxSetup . latency = settings - > value ( " AudioRXLatency " , " 150 " ) . toInt ( ) ;
prefs . txSetup . latency = settings - > value ( " AudioTXLatency " , " 150 " ) . toInt ( ) ;
prefs . rxSetup . sampleRate = settings - > value ( " AudioRXSampleRate " , " 48000 " ) . toInt ( ) ;
prefs . txSetup . sampleRate = prefs . rxSetup . sampleRate ;
prefs . rxSetup . codec = settings - > value ( " AudioRXCodec " , " 4 " ) . toInt ( ) ;
prefs . txSetup . codec = settings - > value ( " AudioTXCodec " , " 4 " ) . toInt ( ) ;
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 ;
prefs . rxSetup . resampleQuality = settings - > value ( " ResampleQuality " , " 4 " ) . toInt ( ) ;
prefs . txSetup . resampleQuality = prefs . rxSetup . resampleQuality ;
2021-02-04 10:27:30 +00:00
2023-09-19 23:04:48 +01:00
if ( prefs . tciPort > 0 & & tci = = Q_NULLPTR ) {
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 ;
}
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 " ) ;
serverConfig . enabled = settings - > value ( " ServerEnabled " , false ) . toBool ( ) ;
serverConfig . controlPort = settings - > value ( " ServerControlPort " , 50001 ) . toInt ( ) ;
serverConfig . civPort = settings - > value ( " ServerCivPort " , 50002 ) . toInt ( ) ;
serverConfig . audioPort = settings - > value ( " ServerAudioPort " , 50003 ) . toInt ( ) ;
2022-01-23 15:06:31 +00:00
2023-02-21 22:54:15 -08:00
setupui - > updateServerConfigs ( ( int ) ( s_enabled |
s_controlPort |
s_civPort |
s_audioPort ) ) ;
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 ;
2022-01-29 22:50:58 +00:00
rigTemp - > baudRate = prefs . serialPortBaud ;
rigTemp - > civAddr = prefs . radioCIVAddr ;
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
2022-09-25 11:15:45 +01:00
rigTemp - > rxAudioSetup . name = settings - > value ( " ServerAudioInput " , " Default Input Device " ) . toString ( ) ;
rigTemp - > txAudioSetup . name = settings - > value ( " ServerAudioOutput " , " Default Output Device " ) . 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.
setupui - > updateServerConfig ( s_users ) ;
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
2022-09-30 17:05:42 +01:00
prefs . clusterUdpEnable = settings - > value ( " UdpEnabled " , false ) . toBool ( ) ;
prefs . clusterTcpEnable = settings - > value ( " TcpEnabled " , false ) . toBool ( ) ;
prefs . clusterUdpPort = settings - > value ( " UdpPort " , 12060 ) . toInt ( ) ;
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 " ) ;
2023-02-14 20:27:32 +00:00
cw - > setCutNumbers ( settings - > value ( " CutNumbers " , false ) . toBool ( ) ) ;
cw - > setSendImmediate ( settings - > value ( " SendImmediate " , false ) . toBool ( ) ) ;
2023-02-17 16:49:19 +00:00
cw - > setSidetoneEnable ( settings - > value ( " SidetoneEnabled " , true ) . toBool ( ) ) ;
cw - > setSidetoneLevel ( settings - > value ( " SidetoneLevel " , 100 ) . toInt ( ) ) ;
2023-01-21 11:18:26 -08:00
int numMemories = settings - > beginReadArray ( " macros " ) ;
if ( numMemories = = 10 )
{
QStringList macroList ;
for ( int m = 0 ; m < 10 ; m + + )
{
settings - > setArrayIndex ( m ) ;
macroList < < settings - > value ( " macroText " , " " ) . toString ( ) ;
}
cw - > setMacroText ( macroList ) ;
}
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 - > updateIfPrefs ( ( int ) if_all ) ;
2023-05-28 22:11:59 +01:00
setupui - > updateColPrefs ( ( int ) col_all ) ;
2023-02-18 19:25:02 -08:00
setupui - > updateRaPrefs ( ( int ) ra_all ) ;
2023-05-28 22:11:59 +01:00
setupui - > updateRsPrefs ( ( int ) rs_all ) ; // Most of these come from the rig anyway
2023-02-18 19:25:02 -08:00
setupui - > updateCtPrefs ( ( int ) ct_all ) ;
setupui - > updateClusterPrefs ( ( int ) cl_all ) ;
2023-02-18 21:14:41 -08:00
setupui - > updateLanPrefs ( ( int ) l_all ) ;
2023-02-18 19:25:02 -08:00
setupui - > acceptUdpPreferencesPtr ( & udpPrefs ) ;
setupui - > updateUdpPrefs ( ( int ) u_all ) ;
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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
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-03-30 20:40:27 +00:00
foreach ( 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-06-12 17:11:01 +01:00
case if_region :
case if_showBands :
foreach ( auto receiver , receivers )
{
receiver - > setBandIndicators ( prefs . showBands , prefs . region , & rigCaps - > bands ) ;
}
break ;
2024-07-23 09:18:27 +01:00
case if_separators :
foreach ( auto receiver , receivers )
{
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-10-17 22:46:12 +01:00
// Any updated scope colors will cause the scope colorPreset to be changed.
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-03-30 20:40:27 +00:00
foreach ( 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 ;
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 {
showStatusBarText ( QString ( " Setting radio CI-V address to: 0x%1. Press Save Settings to retain. " ) . arg ( prefs . radioCIVAddr , 2 , 16 ) ) ;
}
break ;
case ra_CIVisRadioModel :
break ;
case ra_forceRTSasPTT :
emit setRTSforPTT ( prefs . forceRTSasPTT ) ;
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 ;
default :
qWarning ( logSystem ( ) ) < < " Cannot update wfmain ra pref " < < ( int ) i ;
}
2023-02-19 18:29:22 -08:00
}
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 :
2023-09-30 11:08:20 +01:00
queue - > add ( priorityImmediate , queueItem ( funcDATAOffMod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 0 ] ) , false , false ) ) ;
2024-01-27 22:13:47 +00:00
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 0 ] . type ) , true ) ) ;
2023-05-27 20:26:53 +01:00
break ;
case rs_data1Mod :
2023-09-30 11:08:20 +01:00
queue - > add ( priorityImmediate , queueItem ( funcDATA1Mod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 1 ] ) , false , false ) ) ;
2024-01-27 22:13:47 +00:00
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 1 ] . type ) , true ) ) ;
2023-05-27 20:26:53 +01:00
break ;
case rs_data2Mod :
2023-09-30 11:08:20 +01:00
queue - > add ( priorityImmediate , queueItem ( funcDATA2Mod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 2 ] ) , false , false ) ) ;
2024-01-27 22:13:47 +00:00
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 2 ] . type ) , true ) ) ;
2023-05-27 20:26:53 +01:00
break ;
case rs_data3Mod :
2023-09-30 11:08:20 +01:00
queue - > add ( priorityImmediate , queueItem ( funcDATA3Mod , QVariant : : fromValue < rigInput > ( prefs . inputSource [ 3 ] ) , false , false ) ) ;
2024-01-27 22:13:47 +00:00
queue - > addUnique ( priorityHigh , queueItem ( getInputTypeCommand ( prefs . inputSource [ 3 ] . type ) , true ) ) ;
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. " ) ;
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( true ) , false ) ) ;
pttTimer - > start ( ) ;
break ;
case rs_pttOff :
showStatusBarText ( " Sending PTT OFF command " ) ;
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( false ) , false ) ) ;
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 :
break ;
default :
qWarning ( logSystem ( ) ) < < " Cannot update wfmain rs pref " < < ( int ) i ;
}
}
2023-02-19 18:29:22 -08:00
void wfmain : : extChangedCtPref ( prefCtItem i )
{
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-03-30 20:40:27 +00:00
foreach ( 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)
if ( usbControllerThread ! = Q_NULLPTR ) {
usbControllerThread - > quit ( ) ;
usbControllerThread - > wait ( ) ;
usbControllerThread = Q_NULLPTR ;
usbWindow = Q_NULLPTR ;
}
if ( prefs . enableUSBControllers ) {
// Setup USB Controller
setupUsbControllerDevice ( ) ;
emit initUsbController ( & usbMutex , & usbDevices , & usbButtons , & usbKnobs ) ;
}
# endif
break ;
case ct_USBControllersSetup :
if ( usbWindow ! = Q_NULLPTR ) {
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 :
enableRigCtl ( prefs . enableRigCtlD ) ;
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 ;
case u_username :
break ;
case u_password :
break ;
case u_clientName :
// Not used in the UI.
break ;
case u_waterfallFormat :
// 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 ;
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 ;
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 :
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 ( ) ) ;
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-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 ) ;
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 ) ;
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 " ) ;
settings - > setValue ( " RigCIVuInt " , prefs . radioCIVAddr ) ;
2021-11-06 23:59:03 -07:00
settings - > setValue ( " CIVisRadioModel " , prefs . CIVisRadioModel ) ;
2021-12-30 01:52:23 -08:00
settings - > setValue ( " ForceRTSasPTT " , prefs . forceRTSasPTT ) ;
2022-11-26 21:43:47 -08:00
settings - > setValue ( " polling_ms " , prefs . polling_ms ) ; // 0 = automatic
2021-05-20 19:24:40 +01:00
settings - > setValue ( " SerialPortRadio " , prefs . serialPortRadio ) ;
settings - > setValue ( " SerialPortBaud " , prefs . serialPortBaud ) ;
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 ) ;
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 ) ;
settings - > setValue ( " AudioOutput " , prefs . rxSetup . name ) ;
settings - > setValue ( " AudioInput " , prefs . txSetup . name ) ;
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 ) ;
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 ) ) ;
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 ) ;
settings - > setValue ( " ServerControlPort " , serverConfig . controlPort ) ;
settings - > setValue ( " ServerCivPort " , serverConfig . civPort ) ;
settings - > setValue ( " ServerAudioPort " , serverConfig . audioPort ) ;
2022-04-20 13:35:23 +01:00
settings - > setValue ( " ServerAudioOutput " , serverConfig . rigs . first ( ) - > txAudioSetup . name ) ;
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 " ) ;
2023-02-14 20:27:32 +00:00
settings - > setValue ( " CutNumbers " , cw - > getCutNumbers ( ) ) ;
settings - > setValue ( " SendImmediate " , cw - > getSendImmediate ( ) ) ;
2023-02-17 13:58:02 +00:00
settings - > setValue ( " SidetoneEnabled " , cw - > getSidetoneEnable ( ) ) ;
settings - > setValue ( " SidetoneLevel " , cw - > getSidetoneLevel ( ) ) ;
2023-01-21 11:18:26 -08:00
QStringList macroList = cw - > getMacroText ( ) ;
if ( macroList . length ( ) = = 10 )
{
settings - > beginWriteArray ( " macros " ) ;
for ( int m = 0 ; m < 10 ; m + + )
{
settings - > setArrayIndex ( m ) ;
settings - > setValue ( " macroText " , macroList . at ( m ) ) ;
}
settings - > endArray ( ) ;
} else {
qDebug ( logSystem ( ) ) < < " Error, CW macro list is wrong length: " < < macroList . length ( ) ;
}
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 ;
2023-04-02 20:07:13 +01:00
auto it = usbDevices . begin ( ) ;
while ( it ! = usbDevices . end ( ) )
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 ) ;
+ + it ;
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 ) ) ;
2023-03-28 19:07:54 +01:00
if ( usbButtons [ nb ] . icon ! = Q_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 ) ;
2022-09-18 21:00:44 +01:00
if ( usbButtons [ nb ] . onCommand ! = Q_NULLPTR )
2022-09-19 01:14:11 +01:00
settings - > setValue ( " OnCommand " , usbButtons [ nb ] . onCommand - > text ) ;
2022-09-18 21:00:44 +01:00
if ( usbButtons [ nb ] . offCommand ! = Q_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 ( ) ) ;
if ( usbKnobs [ nk ] . command ! = Q_NULLPTR )
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-05-30 23:26:36 -07:00
2018-11-27 22:02:37 -08:00
// Key shortcuts (hotkeys)
void wfmain : : shortcutF11 ( )
{
if ( onFullscreen )
{
this - > showNormal ( ) ;
onFullscreen = false ;
2023-02-19 18:29:22 -08:00
prefs . useFullScreen = false ;
2018-11-27 22:02:37 -08:00
} else {
this - > showFullScreen ( ) ;
onFullscreen = true ;
2023-02-19 18:29:22 -08:00
prefs . useFullScreen = true ;
2018-11-27 22:02:37 -08:00
}
2023-02-19 18:29:22 -08:00
setupui - > updateIfPref ( if_useFullScreen ) ;
2018-11-27 22:02:37 -08:00
}
void wfmain : : shortcutF1 ( )
{
2023-06-11 22:31:32 +01:00
2018-11-27 22:02:37 -08:00
}
void wfmain : : shortcutF2 ( )
{
2023-02-11 18:51:32 -08:00
showAndRaiseWidget ( bandbtns ) ;
2018-11-27 22:02:37 -08:00
}
void wfmain : : shortcutF3 ( )
{
2023-02-11 18:51:32 -08:00
showAndRaiseWidget ( finputbtns ) ;
2018-11-27 22:02:37 -08:00
}
void wfmain : : shortcutF4 ( )
{
2023-06-11 22:31:32 +01:00
2018-11-27 22:02:37 -08:00
}
2019-01-28 15:36:17 -08:00
// Mode switch keys:
2018-11-27 22:02:37 -08:00
void wfmain : : shortcutF5 ( )
{
2019-01-28 15:36:17 -08:00
// LSB
2024-07-13 23:46:29 +01:00
changeMode ( modeLSB , false , currentReceiver ) ;
2019-01-28 15:36:17 -08:00
}
void wfmain : : shortcutF6 ( )
{
// USB
2024-07-13 23:46:29 +01:00
changeMode ( modeUSB , false , currentReceiver ) ;
2019-01-28 15:36:17 -08:00
}
void wfmain : : shortcutF7 ( )
{
// AM
2024-07-13 23:46:29 +01:00
changeMode ( modeAM , false , currentReceiver ) ;
2019-01-28 15:36:17 -08:00
}
void wfmain : : shortcutF8 ( )
{
// CW
2024-07-13 23:46:29 +01:00
changeMode ( modeCW , false , currentReceiver ) ;
2019-01-28 15:36:17 -08:00
}
void wfmain : : shortcutF9 ( )
{
// USB-D
2024-07-13 23:46:29 +01:00
changeMode ( modeUSB , true , currentReceiver ) ;
2019-01-28 15:36:17 -08:00
}
void wfmain : : shortcutF10 ( )
{
2021-02-16 22:32:05 -08:00
// FM
2024-07-13 23:46:29 +01:00
changeMode ( modeFM , false , currentReceiver ) ;
2018-11-27 22:02:37 -08:00
}
2019-02-01 12:21:54 -08:00
void wfmain : : shortcutF12 ( )
{
2021-07-09 23:59:32 -07:00
// Speak current frequency and mode from the radio
2019-02-01 12:21:54 -08:00
showStatusBarText ( " Sending speech command to radio. " ) ;
2023-05-24 19:50:01 +01:00
queue - > add ( priorityImmediate , queueItem ( funcSpeech , QVariant : : fromValue ( uchar ( 0U ) ) ) ) ;
2019-02-01 12:21:54 -08:00
}
void wfmain : : shortcutControlT ( )
{
// Transmit
2024-02-05 14:12:45 -08:00
qDebug ( logSystem ( ) ) < < " Activated Control-T shortcut " ;
2020-03-11 20:58:31 -07:00
showStatusBarText ( QString ( " Transmitting. Press Control-R to receive. " ) ) ;
2023-06-08 08:20:50 +01:00
extChangedRsPrefs ( rs_pttOn ) ;
2019-02-01 12:21:54 -08:00
}
void wfmain : : shortcutControlR ( )
{
// Receive
2023-06-08 08:20:50 +01:00
extChangedRsPrefs ( rs_pttOff ) ;
2019-02-01 12:21:54 -08:00
}
2024-02-05 08:39:41 -08:00
void wfmain : : shortcutControlP ( )
{
// Toggle PTT
if ( amTransmitting ) {
extChangedRsPrefs ( rs_pttOff ) ;
} else {
extChangedRsPrefs ( rs_pttOn ) ;
showStatusBarText ( QString ( " Transmitting. Press Control-P again to receive. " ) ) ;
}
}
2019-02-01 12:21:54 -08:00
void wfmain : : shortcutControlI ( )
{
// Enable ATU
ui - > tuneEnableChk - > click ( ) ;
}
void wfmain : : shortcutControlU ( )
{
// Run ATU tuning cycle
ui - > tuneNowBtn - > click ( ) ;
}
2018-11-27 22:02:37 -08:00
void wfmain : : shortcutStar ( )
{
// Jump to frequency tab from Asterisk key on keypad
2023-02-11 18:51:32 -08:00
showAndRaiseWidget ( finputbtns ) ;
2018-11-27 22:02:37 -08:00
}
2019-01-28 15:46:14 -08:00
void wfmain : : shortcutSlash ( )
{
// Cycle through available modes
2023-07-17 11:09:14 +01:00
//ui->modeSelectCombo->setCurrentIndex( (ui->modeSelectCombo->currentIndex()+1) % ui->modeSelectCombo->count() );
//on_modeSelectCombo_activated( ui->modeSelectCombo->currentIndex() );
2019-01-28 15:46:14 -08:00
}
2018-11-27 22:02:37 -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-03-30 20:40:27 +00:00
foreach ( 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 ;
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
}
2019-02-03 21:51:30 -08:00
void wfmain : : shortcutMinus ( )
{
2021-06-05 00:23:16 +01:00
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 , - 1 , tsPlusHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2019-02-03 21:51:30 -08:00
}
void wfmain : : shortcutPlus ( )
{
2021-06-05 00:23:16 +01:00
if ( freqLock ) return ;
2021-02-21 23:58:23 -08:00
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 , 1 , tsPlusHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2019-02-03 21:51:30 -08:00
}
2021-06-05 00:23:16 +01:00
void wfmain : : shortcutStepMinus ( )
{
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 , - 1 , ui - > tuningStepCombo - > currentData ( ) . toInt ( ) ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2021-06-05 00:23:16 +01:00
}
void wfmain : : shortcutStepPlus ( )
{
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 , 1 , ui - > tuningStepCombo - > currentData ( ) . toInt ( ) ) ;
2021-06-05 00:23:16 +01:00
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2021-06-05 00:23:16 +01:00
}
2019-02-04 10:32:16 -08:00
void wfmain : : shortcutShiftMinus ( )
{
2021-02-21 23:58:23 -08:00
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 , - 1 , tsPlusShiftHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2019-02-04 10:32:16 -08:00
}
void wfmain : : shortcutShiftPlus ( )
{
2021-02-21 23:58:23 -08:00
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 , 1 , tsPlusShiftHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2019-02-04 10:32:16 -08:00
}
2019-02-05 16:11:25 -08:00
void wfmain : : shortcutControlMinus ( )
{
2021-02-21 23:58:23 -08:00
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 , - 1 , tsPlusControlHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2019-02-05 16:11:25 -08:00
}
2019-02-04 10:32:16 -08:00
2019-02-05 16:11:25 -08:00
void wfmain : : shortcutControlPlus ( )
{
2021-02-21 23:58:23 -08:00
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 , 1 , tsPlusControlHz ) ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2019-02-05 16:11:25 -08:00
}
2019-02-04 10:32:16 -08:00
2020-03-17 15:15:01 -07:00
void wfmain : : shortcutPageUp ( )
{
2021-02-21 23:58:23 -08:00
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 = receivers [ 0 ] - > getFrequency ( ) . Hz + tsPageHz ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2020-03-17 15:15:01 -07:00
}
void wfmain : : shortcutPageDown ( )
{
2021-02-21 23:58:23 -08:00
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 = receivers [ 0 ] - > getFrequency ( ) . Hz - tsPageHz ;
2024-01-29 10:43:41 +00:00
f . MHzDouble = f . Hz / ( double ) 1E6 ;
2024-03-30 20:40:27 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( f ) , false ) ) ;
2024-01-29 10:43:41 +00:00
}
2020-03-17 15:15:01 -07:00
}
2019-02-07 10:15:10 -08:00
void wfmain : : shortcutF ( )
{
showStatusBarText ( " Sending speech command (frequency) to radio. " ) ;
emit sayFrequency ( ) ;
}
void wfmain : : shortcutM ( )
{
showStatusBarText ( " Sending speech command (mode) to radio. " ) ;
emit sayMode ( ) ;
}
2023-05-12 00:24:01 +01:00
funcs wfmain : : getInputTypeCommand ( inputTypes input )
{
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 :
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];
2023-05-12 00:24:01 +01:00
return func ;
}
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
2024-11-02 13:43:59 +00:00
if ( rigCaps - > commands . contains ( funcVFOModeSelect ) )
queue - > add ( priorityImmediate , funcVFOModeSelect ) ; // Make sure we are in VFO mode.
2024-03-25 12:42:08 +00:00
if ( rigCaps - > hasSpectrum )
2021-05-15 15:34:22 -07:00
{
2023-06-05 09:27:37 +01:00
queue - > add ( priorityImmediate , queueItem ( funcScopeOnOff , QVariant : : fromValue ( quint8 ( 1 ) ) , false ) ) ;
2023-07-20 23:31:57 +01:00
queue - > add ( priorityImmediate , queueItem ( funcScopeDataOutput , QVariant : : fromValue ( quint8 ( 1 ) ) , false ) ) ;
2023-09-27 12:28:43 +01:00
// Find the scope ref limits
2024-03-25 12:42:08 +00:00
auto mr = rigCaps - > commands . find ( funcScopeMainRef ) ;
if ( mr ! = rigCaps - > commands . end ( ) )
2023-09-27 12:28:43 +01:00
{
2024-03-30 20:40:27 +00:00
receivers [ 0 ] - > setRefLimits ( mr . value ( ) . minVal , mr . value ( ) . maxVal ) ;
2023-09-27 12:28:43 +01:00
queue - > add ( priorityImmediate , ( funcScopeMainRef ) , false , false ) ;
}
2024-03-25 12:42:08 +00:00
auto sr = rigCaps - > commands . find ( funcScopeSubRef ) ;
if ( sr ! = rigCaps - > commands . end ( ) )
2023-09-27 12:28:43 +01:00
{
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > setRefLimits ( sr . value ( ) . minVal , sr . value ( ) . maxVal ) ;
2023-09-27 12:28:43 +01:00
queue - > add ( priorityImmediate , ( funcScopeSubRef ) , false , true ) ;
}
2021-05-15 15:34:22 -07:00
}
2021-12-01 10:13:21 +00:00
2023-09-27 12:28:43 +01:00
2023-07-23 00:26:56 +01:00
// Only show settingsgroup if rig has sub
2024-03-25 12:42:08 +00:00
ui - > scopeSettingsGroup - > setVisible ( rigCaps - > commands . contains ( funcScopeSubWaveData ) ) ;
2023-07-23 00:26:56 +01:00
2024-03-25 12:42:08 +00:00
ui - > scopeDualBtn - > setVisible ( rigCaps - > commands . contains ( funcScopeSingleDual ) ) ;
ui - > antennaGroup - > setVisible ( rigCaps - > commands . contains ( funcAntenna ) ) ;
ui - > preampAttGroup - > setVisible ( rigCaps - > commands . contains ( funcPreamp ) ) ;
2024-07-13 13:59:37 +01:00
ui - > nbEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcNoiseBlanker ) ) ;
ui - > nrEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcNoiseReduction ) ) ;
ui - > ipPlusEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcIPPlus ) ) ;
ui - > compEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcCompressor ) ) ;
ui - > voxEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcVox ) ) ;
2024-07-23 09:18:27 +01:00
ui - > digiselEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcDigiSel ) ) ;
2024-07-13 13:59:37 +01: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
2024-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers )
2024-01-27 22:13:47 +00:00
{
2024-03-30 20:40:27 +00:00
receiver - > enableScope ( this - > rigCaps - > commands . contains ( funcScopeMainMode ) ) ;
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
2018-06-23 00:31:41 -07: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
{
f . open ( QFile : : ReadOnly | QFile : : Text ) ;
QTextStream ts ( & f ) ;
qApp - > setStyleSheet ( ts . readAll ( ) ) ;
}
} 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:
if ( p - > presetName = = Q_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 ) ;
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 ) ;
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 ) ;
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 )
{
2023-08-07 22:11:14 +01:00
emit sendLevel ( funcTransceiverStatus , pttOn ) ;
2023-04-15 20:13:20 +01:00
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:
// When we receive a new PTT status.
// It is not called by UI changes, since we receive
// PTT status regularly and quite frequently.
funcs newCmd ;
funcs oldCmd ;
if ( transmitOn ) {
oldCmd = meter_tToMeterCommand ( meterS ) ;
newCmd = meter_tToMeterCommand ( meterPower ) ;
ui - > meterSPoWidget - > setMeterType ( meterPower ) ;
} else {
oldCmd = meter_tToMeterCommand ( meterPower ) ;
newCmd = meter_tToMeterCommand ( meterS ) ;
ui - > meterSPoWidget - > setMeterType ( meterS ) ;
}
2024-04-28 10:28:29 +01:00
queue - > del ( oldCmd , currentReceiver ) ;
queue - > add ( priorityHighest , queueItem ( newCmd , true , currentReceiver ) ) ;
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 )
{
2024-07-13 19:19:27 +01:00
if ( receivers . size ( ) > rx & & mi . mk ! = receivers [ rx ] - > currentMode ( ) . 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 ;
m . filter = receivers [ rx ] - > currentFilter ( ) ;
if ( rigCaps - > commands . contains ( funcMainMode ) )
queue - > add ( priorityImmediate , queueItem ( ( rx = = 0 ? funcMainMode : funcSubMode ) , QVariant : : fromValue < modeInfo > ( m ) , false , rx ) ) ;
else
queue - > add ( priorityImmediate , queueItem ( funcDataModeWithFilter , QVariant : : fromValue < modeInfo > ( m ) , false , rx ) ) ;
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 ) ;
queue - > addUnique ( priorityImmediate , queueItem ( ( currentReceiver = = 0 ) ? funcMainFreq : funcSubFreq , QVariant : : fromValue < freqt > ( f ) , false , currentReceiver ) ) ;
} 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
}
2018-11-16 22:19:44 -08:00
void wfmain : : on_rfGainSlider_valueChanged ( int value )
{
2023-06-05 09:27:37 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcRfGain , QVariant : : fromValue < ushort > ( value ) , false , false ) ) ;
2018-11-16 22:19:44 -08:00
}
void wfmain : : on_afGainSlider_valueChanged ( int value )
{
2021-07-05 16:45:19 -07:00
if ( usingLAN )
{
2024-08-13 13:19:50 +01:00
prefs . rxSetup . localAFgain = ( quint8 ) ( value ) ;
prefs . localAFgain = ( quint8 ) ( value ) ;
2023-05-15 10:53:52 +01:00
emit setAfGain ( value ) ;
2023-08-07 22:11:14 +01:00
emit sendLevel ( funcAfGain , value ) ;
2023-05-12 00:24:01 +01:00
} else {
2023-05-15 10:53:52 +01:00
queue - > addUnique ( priorityImmediate , queueItem ( funcAfGain , QVariant : : fromValue < ushort > ( value ) , false ) ) ;
2021-07-05 16:45:19 -07:00
}
2018-11-16 22:19:44 -08:00
}
2023-05-15 10:53:52 +01:00
void wfmain : : on_monitorSlider_valueChanged ( int value )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcMonitorGain , QVariant : : fromValue < ushort > ( value ) , false ) ) ;
}
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 ( )
{
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. " ) ;
2024-04-30 09:42:54 +01:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( false ) , false ) ) ;
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. " ) ;
2023-05-12 00:24:01 +01:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( true ) , false ) ) ;
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
2023-05-12 00:24:01 +01:00
queue - > add ( priorityImmediate , queueItem ( funcTransceiverStatus , QVariant : : fromValue < bool > ( false ) , false ) ) ;
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 ( ) ;
now . setTime ( QTime : : currentTime ( ) ) ;
} else {
now = QDateTime : : currentDateTime ( ) ;
now . setTime ( QTime : : currentTime ( ) ) ;
}
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 ) ) ) ;
queue - > add ( priorityImmediate , queueItem ( funcTime , QVariant : : fromValue < timekind > ( timesetpoint ) ) ) ;
queue - > add ( priorityImmediate , queueItem ( funcDate , QVariant : : fromValue < datekind > ( datesetpoint ) ) ) ;
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 ) ;
emit sendLevel ( funcLANModLevel , 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 ) ;
queue - > del ( getInputTypeCommand ( prefs . inputSource [ data ] . type ) , false ) ;
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
{
2023-10-30 19:14:35 +00:00
queue - > addUnique ( priorityHigh , getInputTypeCommand ( input . type ) , true , false ) ;
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
}
2022-10-28 20:04:14 +01:00
void wfmain : : receivePassband ( quint16 pass )
2022-09-26 01:44:49 +01:00
{
2023-05-15 10:53:52 +01:00
double pb = ( double ) ( pass / 1000000.0 ) ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) & & receivers [ 0 ] - > getPassbandWidth ( ) ! = pb ) {
receivers [ 0 ] - > setPassbandWidth ( pb ) ;
2023-07-17 11:09:14 +01:00
2024-03-25 15:30:18 +00:00
qDebug ( logSystem ( ) ) < < QString ( " Received new IF Filter/Passband %0 Hz " ) . arg ( pass ) ;
2023-05-15 10:53:52 +01:00
showStatusBarText ( QString ( " IF filter width %0 Hz (%1 MHz) " ) . arg ( pass ) . arg ( passbandWidth ) ) ;
2023-01-13 21:04:10 +00:00
}
2022-09-26 01:44:49 +01:00
}
2024-08-13 13:19:50 +01:00
void wfmain : : receiveCwPitch ( quint8 pitch ) {
2023-01-18 18:52:05 +00:00
if ( currentModeInfo . mk = = modeCW | | currentModeInfo . mk = = modeCW_R ) {
2023-05-15 10:53:52 +01:00
quint16 p = round ( ( ( ( 600.0 / 255.0 ) * pitch ) + 300 ) / 5.0 ) * 5.0 ;
if ( p ! = cwPitch )
{
passbandCenterFrequency = p / 2000000.0 ;
2024-03-25 15:30:18 +00:00
qDebug ( logSystem ( ) ) < < QString ( " Received new CW Pitch %0 Hz was %1 (center freq %2 MHz) " ) . arg ( p ) . arg ( cwPitch ) . arg ( passbandCenterFrequency ) ;
2023-05-15 10:53:52 +01:00
cwPitch = p ;
2023-08-07 22:11:14 +01:00
emit sendLevel ( funcCwPitch , pitch ) ;
2023-05-15 10:53:52 +01:00
}
2023-01-18 18:52:05 +00: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-03-30 20:40:27 +00:00
foreach ( 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
2024-08-13 13:19:50 +01:00
void wfmain : : receiveMeter ( meter_t inMeter , quint8 level , quint8 receiver )
2021-02-20 20:41:19 -08:00
{
2024-04-28 10:28:29 +01:00
// Do nothing with s-meter from non-current receiver
if ( receiver ! = currentReceiver & & inMeter = = meterS ) {
2024-02-10 10:37:35 +00:00
return ;
2024-04-28 10:28:29 +01: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 :
2021-07-16 17:45:07 -07:00
ui - > meterSPoWidget - > setMeterType ( meterS ) ;
2021-07-19 16:56:04 -07:00
ui - > meterSPoWidget - > setLevel ( level ) ;
2021-07-16 17:45:07 -07:00
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 )
2023-09-25 20:29:01 -07: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-08-07 22:11:14 +01:00
emit sendLevel ( funcMonitor , en ) ;
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
2023-05-15 10:53:52 +01:00
queue - > add ( priorityMedium , getInputTypeCommand ( input . type ) , true ) ;
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
funcs f = funcNone ;
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) ) {
2024-08-13 13:19:50 +01:00
quint8 d = receivers [ 0 ] - > getDataMode ( ) ;
2024-01-29 10:43:41 +00:00
f = getInputTypeCommand ( prefs . inputSource [ d ] . type ) ;
queue - > addUnique ( priorityImmediate , queueItem ( f , QVariant : : fromValue < ushort > ( level ) , false ) ) ;
2023-05-12 00:24:01 +01:00
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 ;
}
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
}
2024-08-13 13:19:50 +01:00
void wfmain : : receiveAntennaSel ( quint8 ant , bool rx , uchar receiver )
2021-07-16 19:33:15 +01:00
{
2024-04-28 10:28:29 +01:00
if ( receiver = = currentReceiver ) {
2024-02-10 19:54:39 +00:00
ui - > antennaSelCombo - > setCurrentIndex ( ant ) ;
ui - > rxAntennaCheck - > setChecked ( rx ) ;
}
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
2024-03-25 12:42:08 +00:00
if ( rigCaps ! = Q_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.
if ( rigCaps ! = Q_NULLPTR ) {
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 )
{
2023-05-29 00:10:58 +01: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 :
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 ;
}
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)
queue - > del ( oldCmd , currentReceiver ) ;
2021-07-17 23:39:40 -07:00
if ( newMeterType = = meterNone )
{
2024-02-05 13:42:00 -08:00
uiMeter - > setMeterType ( newMeterType ) ;
2024-11-05 18:46:21 +00:00
} else if ( rigCaps ! = Q_NULLPTR ) {
2024-02-05 13:42:00 -08:00
uiMeter - > show ( ) ;
uiMeter - > setMeterType ( newMeterType ) ;
2024-11-05 18:46:21 +00:00
2022-08-23 22:24:05 -07:00
if ( ( newMeterType ! = meterRxAudio ) & & ( newMeterType ! = meterTxMod ) & & ( newMeterType ! = meterAudio ) )
2024-11-05 18:46:21 +00:00
queue - > addUnique ( priorityHighest , queueItem ( newCmd , true , currentReceiver ) ) ;
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 )
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 0 ) , false , currentReceiver ) ) ;
else if ( newMeterType = = meterdBu )
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 1 ) , false , currentReceiver ) ) ;
else if ( newMeterType = = meterdBuEMF )
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 2 ) , false , currentReceiver ) ) ;
else if ( newMeterType = = meterdBm )
queue - > add ( priorityImmediate , queueItem ( funcMeterType , QVariant : : fromValue < uchar > ( 3 ) , false , currentReceiver ) ) ;
}
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
2021-08-04 20:49:32 +01:00
if ( rigCtl ! = Q_NULLPTR )
{
rigCtl - > disconnect ( ) ;
delete rigCtl ;
rigCtl = Q_NULLPTR ;
}
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()
if ( cp = = Q_NULLPTR )
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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
receiver - > colorPreset ( cp ) ;
2024-01-27 22:13:47 +00:00
}
2023-09-24 21:00:21 +01:00
if ( this - > colorPrefs ! = Q_NULLPTR )
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
{
// 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 ) ) ) ;
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 ;
}
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 ;
}
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 ;
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
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 " ) ;
2023-09-24 10:32:59 +01:00
removeRig ( ) ;
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.
if ( memWindow ! = Q_NULLPTR ) {
2024-02-05 12:06:50 -08:00
memWindow - > close ( ) ;
2023-05-01 21:56:52 +01:00
delete memWindow ;
memWindow = Q_NULLPTR ;
}
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 ( )
{
if ( cw - > isMinimized ( ) )
{
cw - > raise ( ) ;
cw - > activateWindow ( ) ;
return ;
}
cw - > show ( ) ;
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 ( )
{
2024-03-25 12:42:08 +00:00
if ( rigCaps ! = Q_NULLPTR ) {
2023-05-01 21:56:52 +01:00
if ( memWindow = = Q_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 ) ) ) ;
2023-05-01 21:56:52 +01:00
memWindow - > populate ( ) ; // Call populate to get the initial memories
}
memWindow - > show ( ) ;
} else {
if ( memWindow ! = Q_NULLPTR )
{
delete memWindow ;
memWindow = Q_NULLPTR ;
}
}
}
2023-04-19 14:51:23 +01:00
void wfmain : : on_rigCreatorBtn_clicked ( )
{
2023-05-09 17:03:03 +01:00
rigCreator * create = new rigCreator ( ) ;
create - > setAttribute ( Qt : : WA_DeleteOnClose ) ;
create - > show ( ) ;
2023-02-12 16:45:21 +00:00
}
2024-03-30 20:40:27 +00:00
void wfmain : : displayReceiver ( uchar rx , bool active , bool swtch )
{
if ( rigCaps ! = Q_NULLPTR & & rx < rigCaps - > numReceiver )
{
for ( uchar i = 0 ; i < rigCaps - > numReceiver ; i + + )
{
if ( i = = rx & & ! receivers [ i ] - > isVisible ( ) )
receivers [ rx ] - > setVisible ( true ) ;
else if ( i ! = rx & & swtch & & receivers [ i ] - > isVisible ( ) )
receivers [ rx ] - > setVisible ( false ) ;
if ( i = = rx & & active & & ! receivers [ i ] - > isSelected ( ) )
receivers [ rx ] - > selected ( true ) ;
else if ( i ! = rx & & active )
receivers [ rx ] - > selected ( false ) ;
}
}
}
2023-05-15 10:53:52 +01:00
void wfmain : : receiveValue ( cacheItem val ) {
2024-03-30 20:40:27 +00:00
uchar vfo = 0 ;
if ( val . receiver > = receivers . size ( ) )
2024-01-29 10:43:41 +00:00
{
2024-03-30 20:40:27 +00:00
qCritical ( logSystem ( ) ) < < " Data received for VFO that doesn't exist! " < < val . receiver ;
2024-01-29 10:43:41 +00:00
return ;
}
2023-05-15 10:53:52 +01:00
switch ( val . command )
{
2024-02-10 19:54:39 +00:00
case funcFreqGet :
case funcFreqTR :
2024-03-30 20:40:27 +00:00
// If current receiver (0) isn't selected, then send this to other VFO
2024-04-28 10:28:29 +01:00
receivers [ currentReceiver ] - > setFrequency ( val . value . value < freqt > ( ) , vfo ) ;
2024-02-10 19:54:39 +00:00
break ;
2023-09-23 19:23:00 +01:00
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
2024-02-10 19:54:39 +00:00
2024-03-30 20:40:27 +00:00
case funcSubFreq :
if ( receivers . size ( ) > 1 )
val . receiver = 1 ;
receivers [ val . receiver ] - > setFrequency ( val . value . value < freqt > ( ) , vfo ) ;
break ;
2023-06-11 10:33:16 +01:00
case funcUnselectedFreq :
2024-03-30 20:40:27 +00:00
vfo = 1 ;
2023-05-15 10:53:52 +01:00
case funcSelectedFreq :
2024-03-30 20:40:27 +00:00
case funcMainFreq :
receivers [ val . receiver ] - > setFrequency ( val . value . value < freqt > ( ) , vfo ) ;
if ( ! vfo )
rpt - > handleUpdateCurrentMainFrequency ( val . value . value < freqt > ( ) ) ;
break ;
2023-05-15 10:53:52 +01:00
case funcReadTXFreq :
break ;
case funcVFODualWatch :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
{
bool en = val . value . value < bool > ( ) ;
ui - > dualWatchBtn - > setChecked ( en ) ;
if ( QThread : : currentThread ( ) ! = QCoreApplication : : instance ( ) - > thread ( ) )
{
qCritical ( logSystem ( ) ) < < " Thread is NOT the main UI thread, cannot hide/unhide VFO " ;
} else {
// This tells us whether we are receiving single or dual scopes
if ( ! ui - > scopeDualBtn - > isVisible ( ) )
{
if ( en & & ! receivers [ 1 ] - > isVisible ( ) )
{
receivers [ 1 ] - > setVisible ( true ) ;
}
else if ( ! en & & receivers [ 1 ] - > isVisible ( ) )
{
receivers [ 1 ] - > setVisible ( false ) ;
}
}
}
}
2023-05-15 10:53:52 +01:00
break ;
case funcModeGet :
2023-09-25 19:35:22 +01:00
case funcModeTR :
2024-02-10 19:54:39 +00:00
// If current VFO (0) isn't selected, then send this to other VFO
2024-04-28 10:28:29 +01:00
val . receiver = currentReceiver ;
2024-02-10 19:54:39 +00:00
case funcSelectedMode :
2024-03-30 20:40:27 +00:00
case funcMainMode :
receivers [ val . receiver ] - > receiveMode ( val . value . value < modeInfo > ( ) , vfo ) ;
2024-07-23 09:18:27 +01:00
2024-02-10 19:54:39 +00:00
finputbtns - > updateCurrentMode ( val . value . value < modeInfo > ( ) . mk ) ;
finputbtns - > updateFilterSelection ( val . value . value < modeInfo > ( ) . filter ) ;
rpt - > handleUpdateCurrentMainMode ( val . value . value < modeInfo > ( ) ) ;
cw - > handleCurrentModeUpdate ( val . value . value < modeInfo > ( ) . mk ) ;
2023-06-05 21:08:01 +01:00
break ;
2023-05-15 10:53:52 +01:00
case funcUnselectedMode :
2024-03-30 20:40:27 +00:00
vfo = 1 ;
case funcSubMode :
if ( receivers . size ( ) > 1 )
val . receiver = 1 ;
receivers [ val . receiver ] - > receiveMode ( val . value . value < modeInfo > ( ) , vfo ) ;
2023-05-15 10:53:52 +01:00
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 :
break ;
2023-05-15 10:53:52 +01:00
case funcSatelliteMemory :
case funcMemoryContents :
emit haveMemory ( val . value . value < memoryType > ( ) ) ;
break ;
case funcMemoryClear :
case funcMemoryKeyer :
case funcMemoryToVFO :
case funcMemoryWrite :
break ;
case funcScanning :
break ;
case funcReadFreqOffset :
break ;
case funcSplitStatus :
2023-05-24 19:50:01 +01:00
rpt - > receiveDuplexMode ( val . value . value < duplexMode_t > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
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-03-30 20:40:27 +00:00
receiveAntennaSel ( val . value . value < antennaInfo > ( ) . antenna , val . value . value < antennaInfo > ( ) . rx , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcPBTOuter :
2024-03-30 20:40:27 +00:00
receivers [ val . receiver ] - > setPBTOuter ( val . value . value < uchar > ( ) ) ;
2024-02-10 12:11:10 +00:00
break ;
2023-06-05 09:27:37 +01:00
case funcPBTInner :
{
2024-03-30 20:40:27 +00:00
receivers [ val . receiver ] - > setPBTInner ( val . value . value < uchar > ( ) ) ;
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 :
2024-10-17 22:46:12 +01:00
receivers [ val . receiver ] - > setIFShift ( val . value . value < uchar > ( ) ) ;
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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
receiver - > receiveCwPitch ( val . value . value < uchar > ( ) ) ;
2024-01-27 22:13:47 +00:00
}
2024-02-10 19:54:39 +00:00
// Also send to CW window
2023-05-24 19:50:01 +01:00
cw - > handlePitch ( val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcMicGain :
processModLevel ( inputMic , val . value . value < uchar > ( ) ) ;
break ;
case funcKeySpeed :
// Only used by CW window
2023-05-24 19:50:01 +01: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 :
changeSliderQuietly ( ui - > afGainSlider , val . value . value < uchar > ( ) ) ;
emit sendLevel ( val . command , 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 > ( ) ) ;
emit sendLevel ( val . command , val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-09-30 11:08:20 +01:00
case funcRfGain :
changeSliderQuietly ( ui - > rfGainSlider , val . value . value < uchar > ( ) ) ;
emit sendLevel ( val . command , 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 > ( ) ) ;
emit sendLevel ( val . command , 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 > ( ) ) ;
emit sendLevel ( val . command , 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
emit sendLevel ( val . command , val . value . value < uchar > ( ) ) ;
break ;
case funcBreakInDelay :
break ;
case funcDigiSelShift :
2023-05-15 10:53:52 +01:00
break ;
// 0x15 Meters
case funcSMeterSqlStatus :
break ;
case funcSMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterS , val . value . value < uchar > ( ) , val . receiver ) ;
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 > ( ) ;
ui - > meterSPoWidget - > setMeterType ( m . type ) ;
ui - > meterSPoWidget - > setLevel ( m . value ) ;
ui - > meterSPoWidget - > repaint ( ) ;
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 :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterCenter , val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcPowerMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterPower , val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcSWRMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterSWR , val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcALCMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterALC , val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcCompMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterComp , val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcVdMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterVoltage , val . value . value < uchar > ( ) , val . receiver ) ;
2023-05-15 10:53:52 +01:00
break ;
case funcIdMeter :
2024-03-30 20:40:27 +00:00
receiveMeter ( meter_t : : meterCurrent , val . value . value < uchar > ( ) , val . receiver ) ;
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 ;
case funcAGCTime :
break ;
case funcNoiseBlanker :
2024-07-13 13:59:37 +01:00
if ( val . receiver = = currentReceiver ) {
ui - > nbEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
emit sendLevel ( funcNoiseBlanker , val . value . value < bool > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
case funcAudioPeakFilter :
break ;
case funcNoiseReduction :
2024-07-13 13:59:37 +01:00
if ( val . receiver = = currentReceiver ) {
ui - > nrEnableChk - > setChecked ( val . value . value < bool > ( ) ) ;
emit sendLevel ( funcNoiseReduction , val . value . value < bool > ( ) ) ;
}
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 > ( ) ) ;
emit sendLevel ( funcCompressor , 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 > ( ) ) ;
emit sendLevel ( funcVox , 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 > ( ) ) ;
emit sendLevel ( funcDigiSel , 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 ;
case funcDSPIFFilter :
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 :
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 > ( ) ) ;
emit sendLevel ( funcIPPlus , val . value . value < bool > ( ) ) ;
}
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
case funcBreakIn :
cw - > handleBreakInMode ( val . value . value < uchar > ( ) ) ;
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 > ( ) ;
2024-07-24 20:16:15 +01:00
qDebug ( logRig ( ) ) < < __func__ < < " BSR received into main: Freq: " < < bsr . freq . Hz < < " , mode: " < < bsr . mode < < " , filter: " < < bsr . filter < < " , data mode: " < < bsr . data ;
2023-05-26 18:38:40 +01:00
2024-07-24 19:56:12 +01:00
queue - > add ( priorityImmediate , queueItem ( funcMainFreq , QVariant : : fromValue < freqt > ( bsr . freq ) , false , 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
{
if ( md . reg = = bsr . mode ) {
2024-07-24 20:16:15 +01:00
modeInfo m ( md ) ;
2024-07-23 09:18:27 +01:00
m . filter = bsr . filter ;
m . data = bsr . data ;
2024-07-24 20:16:15 +01:00
qDebug ( logRig ( ) ) < < __func__ < < " Setting Mode/Data for new mode " < < m . name < < " data " < < m . data < < " filter " < < m . filter < < " reg " < < m . reg ;
2024-07-24 19:56:12 +01:00
queue - > add ( priorityImmediate , queueItem ( funcMainMode , QVariant : : fromValue < modeInfo > ( m ) , false , val . receiver ) ) ;
2023-05-26 18:38:40 +01:00
break ;
}
}
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 ;
case funcDataModeWithFilter :
2024-03-30 20:40:27 +00:00
receivers [ val . receiver ] - > receiveMode ( val . value . value < modeInfo > ( ) ) ;
2024-01-27 22:13:47 +00:00
2023-10-01 10:22:09 +01:00
// Set the inputSource to invalid to ensure it gets updated
2024-03-30 20:40:27 +00:00
prefs . inputSource [ receivers [ 0 ] - > getDataMode ( ) ] = rigInput ( ) ;
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 :
2023-05-24 19:50:01 +01:00
cw - > handleDashRatio ( val . value . value < uchar > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
// 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 ;
// 0x1c register
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:
case funcRITFreq :
2023-05-29 00:10:58 +01:00
receiveRITValue ( val . value . value < short > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
// 0x27
2023-05-24 19:50:01 +01:00
case funcScopeMainWaveData :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > updateScope ( val . value . value < scopeData > ( ) ) ;
2023-06-01 17:57:44 +01:00
break ;
case funcScopeSubWaveData :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > 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
{
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
2024-04-28 10:28:29 +01:00
currentReceiver = val . value . value < uchar > ( ) ;
for ( uchar rx = 0 ; rx < receivers . size ( ) ; rx + + ) {
//if (!receivers[rx]->isVisible() && (rx == currentReceiver || ui->scopeDualBtn->isChecked())) {
// receivers[rx]->setVisible(true);
//} else if (rx != currentReceiver && !ui->scopeDualBtn->isChecked() && receivers[rx]->isVisible()) {
// receivers[rx]->setVisible(false);
//}
if ( rx = = currentReceiver & & ! receivers [ rx ] - > isSelected ( ) ) {
receivers [ rx ] - > selected ( true ) ;
} else if ( rx ! = currentReceiver & & receivers [ rx ] - > isSelected ( ) ) {
receivers [ rx ] - > selected ( false ) ;
}
2024-04-28 11:09:50 +01:00
if ( ! receivers [ rx ] - > isVisible ( ) & & ( rx = = currentReceiver | | ui - > scopeDualBtn - > isChecked ( ) ) ) {
receivers [ rx ] - > setVisible ( true ) ;
} else if ( rx ! = currentReceiver & & ! ui - > scopeDualBtn - > isChecked ( ) & & receivers [ rx ] - > isVisible ( ) ) {
receivers [ rx ] - > setVisible ( false ) ;
}
2024-04-28 10:28:29 +01:00
}
/*
2024-03-30 20:40:27 +00:00
// This tells us whether we are receiving main or sub data
if ( ! subScope & & ! receivers [ 0 ] - > isVisible ( ) ) {
receivers [ 1 ] - > setVisible ( false ) ;
receivers [ 0 ] - > setVisible ( true ) ;
} else if ( subScope & & ! receivers [ 1 ] - > isVisible ( ) ) {
receivers [ 0 ] - > setVisible ( false ) ;
receivers [ 1 ] - > setVisible ( true ) ;
2024-01-29 18:40:29 +00:00
}
if ( ui - > scopeDualBtn - > isChecked ( ) ) {
2024-03-30 20:40:27 +00:00
receivers [ 0 ] - > selected ( ! subScope ) ;
receivers [ 1 ] - > selected ( subScope ) ;
2024-04-28 10:28:29 +01:00
2024-01-29 18:40:29 +00:00
} else {
2024-03-30 20:40:27 +00:00
receivers [ 0 ] - > selected ( true ) ;
receivers [ 1 ] - > selected ( false ) ;
2024-04-28 10:28:29 +01:00
currentReceiver = 0 ;
2024-01-29 18:40:29 +00:00
}
2024-04-28 10:28:29 +01:00
*/
2024-01-27 22:13:47 +00:00
}
2023-06-08 21:58:22 +01:00
}
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
ui - > scopeDualBtn - > setChecked ( val . value . value < bool > ( ) ) ;
2024-04-28 10:28:29 +01:00
for ( uchar rx = 0 ; rx < receivers . size ( ) ; rx + + ) {
2024-04-28 11:09:50 +01:00
if ( ! receivers [ rx ] - > isVisible ( ) & & ( rx = = currentReceiver | | ui - > scopeDualBtn - > isChecked ( ) ) ) {
2024-04-28 10:28:29 +01:00
receivers [ rx ] - > setVisible ( true ) ;
2024-04-28 11:09:50 +01:00
} else if ( rx ! = currentReceiver & & ! ui - > scopeDualBtn - > isChecked ( ) & & receivers [ rx ] - > isVisible ( ) ) {
2024-04-28 10:28:29 +01:00
receivers [ rx ] - > setVisible ( false ) ;
}
}
/*
2024-01-29 18:40:29 +00:00
if ( val . value . value < bool > ( ) ) {
2024-03-30 20:40:27 +00:00
if ( ! receivers [ 1 ] - > isVisible ( ) )
2024-01-29 18:40:29 +00:00
{
2024-03-30 20:40:27 +00:00
receivers [ 1 ] - > setVisible ( true ) ;
2024-01-29 18:40:29 +00:00
}
2024-03-30 20:40:27 +00:00
else if ( ! receivers [ 0 ] - > isVisible ( ) )
2024-01-29 18:40:29 +00:00
{
2024-03-30 20:40:27 +00:00
receivers [ 0 ] - > setVisible ( true ) ;
2024-01-29 18:40:29 +00:00
}
} else {
2024-03-30 20:40:27 +00:00
if ( receivers [ 0 ] - > isVisible ( ) )
2024-01-29 18:40:29 +00:00
{
2024-03-30 20:40:27 +00:00
receivers [ 1 ] - > setVisible ( false ) ;
2024-01-29 18:40:29 +00:00
}
2024-03-30 20:40:27 +00:00
else if ( receivers [ 1 ] - > isVisible ( ) )
2024-01-29 18:40:29 +00:00
{
2024-03-30 20:40:27 +00:00
receivers [ 0 ] - > setVisible ( false ) ;
2024-01-29 18:40:29 +00:00
}
2024-01-27 22:13:47 +00:00
}
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
}
2023-05-24 19:50:01 +01:00
case funcScopeMainMode :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > selectScopeMode ( val . value . value < spectrumMode_t > ( ) ) ;
2023-06-05 09:27:37 +01:00
break ;
case funcScopeSubMode :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > selectScopeMode ( val . value . value < spectrumMode_t > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
case funcScopeMainSpan :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > selectSpan ( val . value . value < centerSpanData > ( ) ) ;
2023-06-05 09:27:37 +01:00
break ;
case funcScopeSubSpan :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > selectSpan ( val . value . value < centerSpanData > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
case funcScopeMainEdge :
2023-05-15 10:53:52 +01:00
// read edge mode center in edge mode
// [1] 0x16
// [2] 0x01, 0x02, 0x03: Edge 1,2,3
break ;
2023-05-24 19:50:01 +01:00
case funcScopeMainHold :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > setHold ( val . value . value < bool > ( ) ) ;
2023-06-11 10:33:16 +01:00
break ;
case funcScopeSubHold :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > setHold ( val . value . value < bool > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
case funcScopeMainRef :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > setRef ( val . value . value < int > ( ) ) ;
2023-09-27 12:28:43 +01:00
break ;
case funcScopeSubRef :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > setRef ( val . value . value < int > ( ) ) ;
2023-05-15 10:53:52 +01:00
break ;
2023-05-24 19:50:01 +01:00
case funcScopeMainSpeed :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) )
receivers [ 0 ] - > setSpeed ( val . value . value < uchar > ( ) ) ;
2023-06-11 10:33:16 +01:00
break ;
case funcScopeSubSpeed :
2024-03-30 20:40:27 +00:00
if ( receivers . size ( ) > 1 )
receivers [ 1 ] - > setSpeed ( val . value . value < uchar > ( ) ) ;
2023-06-11 10:33:16 +01:00
break ;
2023-05-15 10:53:52 +01:00
case funcScopeDuringTX :
case funcScopeCenterType :
2023-05-24 19:50:01 +01:00
case funcScopeMainVBW :
case funcScopeFixedEdgeFreq :
case funcScopeMainRBW :
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 ;
default :
qWarning ( logSystem ( ) ) < < " Unhandled command received from rigcommander() " < < funcString [ val . command ] < < " Contact support! " ;
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-04-28 10:28:29 +01:00
if ( currentReceiver < receivers . size ( ) - 1 ) {
currentReceiver + + ;
} else {
currentReceiver = 0 ;
}
queue - > add ( priorityImmediate , queueItem ( funcScopeMainSub , QVariant : : fromValue ( currentReceiver ) , false ) ) ;
2024-04-28 11:09:50 +01:00
// As the current receiver has changed, queue commands to get the current preamp/filter/ant/rx amp
queue - > add ( priorityImmediate , queueItem ( funcPreamp , false , currentReceiver ) ) ;
queue - > add ( priorityImmediate , queueItem ( funcAttenuator , false , currentReceiver ) ) ;
queue - > add ( priorityImmediate , queueItem ( funcAntenna , false , currentReceiver ) ) ;
2024-04-28 11:40:11 +01:00
queue - > add ( priorityImmediate , queueItem ( funcSquelch , false , currentReceiver ) ) ;
2023-06-08 21:58:22 +01:00
}
2023-06-11 10:33:16 +01:00
void wfmain : : on_scopeDualBtn_toggled ( bool en )
{
2024-01-29 14:44:30 +00:00
queue - > add ( priorityImmediate , queueItem ( funcScopeSingleDual , QVariant : : fromValue ( en ) , false ) ) ;
2023-06-11 10:33:16 +01:00
if ( en )
2024-01-29 14:44:30 +00:00
queue - > add ( priorityImmediate , queueItem ( funcScopeMainSub , QVariant : : fromValue ( false ) , false ) ) ; // Set main scope
2023-06-11 10:33:16 +01:00
}
void wfmain : : on_dualWatchBtn_toggled ( bool en )
2023-06-08 21:58:22 +01:00
{
2024-01-29 14:44:30 +00:00
queue - > add ( priorityImmediate , queueItem ( funcVFODualWatch , QVariant : : fromValue ( en ) , false ) ) ;
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 ***";
2023-10-01 10:22:09 +01:00
currentModSrc [ m . data ] = rigInput ( ) ;
// Request the current inputSource.
switch ( m . data )
{
case 0 :
2023-10-30 19:14:35 +00:00
queue - > add ( priorityImmediate , funcDATAOffMod , false , false ) ;
2023-10-01 10:22:09 +01:00
break ;
case 1 :
2023-10-30 19:14:35 +00:00
queue - > add ( priorityImmediate , funcDATA1Mod , false , false ) ;
2023-10-01 10:22:09 +01:00
break ;
case 2 :
2023-10-30 19:14:35 +00:00
queue - > add ( priorityImmediate , funcDATA2Mod , false , false ) ;
2023-10-01 10:22:09 +01:00
break ;
case 3 :
2023-10-30 19:14:35 +00:00
queue - > add ( priorityImmediate , funcDATA3Mod , false , false ) ;
2023-10-01 10:22:09 +01:00
break ;
}
}
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);
if ( caps = = Q_NULLPTR )
{
// Note: This line makes it difficult to accept a different radio connecting.
return ;
} else {
showStatusBarText ( QString ( " Found radio at address 0x%1 of name %2 and model ID %3. " ) . arg ( rigCaps - > civ , 2 , 16 ) . arg ( rigCaps - > modelName ) . arg ( rigCaps - > modelID ) ) ;
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 ;
serverConfig . rigs . first ( ) - > civAddr = rigCaps - > civ ;
serverConfig . rigs . first ( ) - > baudRate = rigCaps - > baudRate ;
}
setWindowTitle ( rigCaps - > modelName ) ;
if ( rigCaps - > hasSpectrum )
{
2024-03-30 20:40:27 +00:00
foreach ( 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-03-30 20:40:27 +00:00
foreach ( auto receiver , receivers ) {
2024-03-25 12:42:08 +00:00
// Setup various combo box up for each VFO:
2024-03-30 20:40:27 +00:00
receiver - > clearMode ( ) ;
2024-03-25 12:42:08 +00:00
for ( auto & m : rigCaps - > modes )
{
//ui->modeSelectCombo->addItem(m.name, m.mk);
2024-03-30 20:40:27 +00:00
receiver - > addMode ( " Mode " + m . name , QVariant : : fromValue ( m ) ) ;
2024-03-25 12:42:08 +00:00
}
2024-03-30 20:40:27 +00:00
receiver - > clearFilter ( ) ;
2024-03-25 12:42:08 +00:00
for ( auto & f : rigCaps - > filters )
{
2024-03-30 20:40:27 +00:00
receiver - > addFilter ( f . name , f . num ) ;
2024-03-25 12:42:08 +00:00
}
2024-03-30 20:40:27 +00:00
receiver - > clearData ( ) ;
2024-03-25 12:42:08 +00:00
2024-03-30 20:40:27 +00:00
receiver - > addData ( " Data Off " , 0 ) ;
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcDATA1Mod ) )
{
setupui - > updateModSourceList ( 1 , rigCaps - > inputs ) ;
if ( ! rigCaps - > commands . contains ( funcDATA2Mod ) )
{
2024-03-30 20:40:27 +00:00
receiver - > addData ( " Data On " , 2 ) ;
2024-03-25 12:42:08 +00:00
}
2024-05-04 23:40:34 +01:00
} else {
setupui - > hideModSource ( 1 ) ;
2024-03-25 12:42:08 +00:00
}
if ( rigCaps - > commands . contains ( funcDATA2Mod ) )
{
setupui - > updateModSourceList ( 2 , rigCaps - > inputs ) ;
2024-03-30 20:40:27 +00:00
receiver - > addData ( " Data 1 " , 2 ) ;
receiver - > addData ( " Data 2 " , 2 ) ;
2024-05-04 23:40:34 +01:00
} else {
setupui - > hideModSource ( 2 ) ;
2024-03-25 12:42:08 +00:00
}
if ( rigCaps - > commands . contains ( funcDATA3Mod ) )
{
setupui - > updateModSourceList ( 3 , rigCaps - > inputs ) ;
2024-03-30 20:40:27 +00:00
receiver - > addData ( " Data 3 " , 3 ) ;
2024-05-04 23:40:34 +01:00
} else {
setupui - > hideModSource ( 3 ) ;
2024-03-25 12:42:08 +00:00
}
2024-03-30 20:40:27 +00:00
receiver - > clearSpans ( ) ;
2024-03-25 12:42:08 +00:00
if ( rigCaps - > hasSpectrum )
{
for ( unsigned int i = 0 ; i < rigCaps - > scopeCenterSpans . size ( ) ; i + + )
{
2024-03-30 20:40:27 +00:00
receiver - > addSpan ( rigCaps - > scopeCenterSpans . at ( i ) . name , QVariant : : fromValue ( rigCaps - > scopeCenterSpans . at ( i ) ) ) ;
2024-03-25 12:42:08 +00:00
}
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 )
{
ui - > attSelCombo - > addItem ( ( ( att = = 0 ) ? QString ( " 0 dB " ) : QString ( " -%1 dB " ) . arg ( att ) ) , att ) ;
}
} 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->scopeBWCombo->blockSignals(true);
//ui->scopeBWCombo->clear();
ui - > tuneEnableChk - > setEnabled ( rigCaps - > commands . contains ( funcTunerStatus ) ) ;
ui - > tuneNowBtn - > setEnabled ( rigCaps - > commands . contains ( funcTunerStatus ) ) ;
ui - > memoriesBtn - > setEnabled ( rigCaps - > commands . contains ( funcMemoryContents ) ) ;
//ui->useRTSforPTTchk->setChecked(prefs.forceRTSasPTT);
// ui->audioSystemCombo->setEnabled(false);
//ui->audioSystemServerCombo->setEnabled(false);
ui - > connectBtn - > setText ( " Disconnect from Radio " ) ; // We must be connected now.
connStatus = connConnected ;
if ( usingLAN )
{
ui - > afGainSlider - > setValue ( prefs . localAFgain ) ;
emit sendLevel ( funcAfGain , prefs . localAFgain ) ;
}
// 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-07-13 13:59:37 +01:00
// Assorted checkboxes
void wfmain : : on_nbEnableChk_clicked ( bool checked )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcNoiseBlanker , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
}
void wfmain : : on_nrEnableChk_clicked ( bool checked )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcNoiseReduction , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
}
void wfmain : : on_ipPlusEnableChk_clicked ( bool checked )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcIPPlus , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
}
void wfmain : : on_compEnableChk_clicked ( bool checked )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcCompressor , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
}
void wfmain : : on_voxEnableChk_clicked ( bool checked )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcVox , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
}
2024-07-23 09:18:27 +01:00
void wfmain : : on_digiselEnableChk_clicked ( bool checked )
{
queue - > addUnique ( priorityImmediate , queueItem ( funcDigiSel , QVariant : : fromValue < bool > ( checked ) , false , currentReceiver ) ) ;
}
2024-07-13 13:59:37 +01: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