2018-06-19 19:58:52 +00:00
# include "wfmain.h"
# include "ui_wfmain.h"
# include "commhandler.h"
2018-11-24 08:10:05 +00:00
# include "rigidentities.h"
2018-06-19 19:58:52 +00:00
2020-03-12 03:58:31 +00:00
// This code is copyright 2017-2020 Elliott H. Liggett
2019-01-24 01:19:35 +00:00
// All rights reserved
2021-02-02 09:05:59 +00:00
wfmain : : wfmain ( const QString serialPortCL , const QString hostCL , QWidget * parent ) :
2018-06-19 19:58:52 +00:00
QMainWindow ( parent ) ,
ui ( new Ui : : wfmain )
{
2020-01-05 01:12:35 +00:00
QGuiApplication : : setApplicationDisplayName ( " wfview " ) ;
QGuiApplication : : setApplicationName ( QString ( " wfview " ) ) ;
2019-02-09 00:19:36 +00:00
2020-03-13 03:06:33 +00:00
setWindowIcon ( QIcon ( QString ( " :resources/wfview.png " ) ) ) ;
2018-06-19 19:58:52 +00:00
ui - > setupUi ( this ) ;
2018-06-20 06:45:56 +00:00
theParent = parent ;
2018-11-28 06:02:37 +00:00
2020-01-05 01:12:35 +00:00
setWindowTitle ( QString ( " wfview " ) ) ;
2019-02-09 00:19:36 +00:00
2021-02-02 09:05:59 +00:00
this - > serialPortCL = serialPortCL ;
this - > hostCL = hostCL ;
2021-01-25 00:16:38 +00:00
haveRigCaps = false ;
2019-01-24 01:19:35 +00:00
ui - > bandStkLastUsedBtn - > setVisible ( false ) ;
ui - > bandStkVoiceBtn - > setVisible ( false ) ;
ui - > bandStkDataBtn - > setVisible ( false ) ;
ui - > bandStkCWBtn - > setVisible ( false ) ;
2018-11-28 06:02:37 +00:00
keyF1 = new QShortcut ( this ) ;
keyF1 - > setKey ( Qt : : Key_F1 ) ;
connect ( keyF1 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF1 ( ) ) ) ;
keyF2 = new QShortcut ( this ) ;
keyF2 - > setKey ( Qt : : Key_F2 ) ;
connect ( keyF2 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF2 ( ) ) ) ;
keyF3 = new QShortcut ( this ) ;
keyF3 - > setKey ( Qt : : Key_F3 ) ;
connect ( keyF3 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF3 ( ) ) ) ;
keyF4 = new QShortcut ( this ) ;
keyF4 - > setKey ( Qt : : Key_F4 ) ;
connect ( keyF4 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF4 ( ) ) ) ;
2019-01-24 01:19:35 +00:00
keyF5 = new QShortcut ( this ) ;
keyF5 - > setKey ( Qt : : Key_F5 ) ;
connect ( keyF5 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF5 ( ) ) ) ;
2019-01-28 23:36:17 +00:00
keyF6 = new QShortcut ( this ) ;
keyF6 - > setKey ( Qt : : Key_F6 ) ;
connect ( keyF6 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF6 ( ) ) ) ;
keyF7 = new QShortcut ( this ) ;
keyF7 - > setKey ( Qt : : Key_F7 ) ;
connect ( keyF7 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF7 ( ) ) ) ;
keyF8 = new QShortcut ( this ) ;
keyF8 - > setKey ( Qt : : Key_F8 ) ;
connect ( keyF8 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF8 ( ) ) ) ;
keyF9 = new QShortcut ( this ) ;
keyF9 - > setKey ( Qt : : Key_F9 ) ;
connect ( keyF9 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF9 ( ) ) ) ;
keyF10 = new QShortcut ( this ) ;
keyF10 - > setKey ( Qt : : Key_F10 ) ;
connect ( keyF10 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF10 ( ) ) ) ;
2019-02-01 20:21:54 +00:00
keyF11 = new QShortcut ( this ) ;
keyF11 - > setKey ( Qt : : Key_F11 ) ;
connect ( keyF11 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF11 ( ) ) ) ;
keyF12 = new QShortcut ( this ) ;
keyF12 - > setKey ( Qt : : Key_F12 ) ;
connect ( keyF12 , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF12 ( ) ) ) ;
keyControlT = new QShortcut ( this ) ;
keyControlT - > setKey ( Qt : : CTRL + Qt : : Key_T ) ;
connect ( keyControlT , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlT ( ) ) ) ;
keyControlR = new QShortcut ( this ) ;
keyControlR - > setKey ( Qt : : CTRL + Qt : : Key_R ) ;
connect ( keyControlR , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlR ( ) ) ) ;
keyControlI = new QShortcut ( this ) ;
keyControlI - > setKey ( Qt : : CTRL + Qt : : Key_I ) ;
connect ( keyControlI , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlI ( ) ) ) ;
keyControlU = new QShortcut ( this ) ;
keyControlU - > setKey ( Qt : : CTRL + Qt : : Key_U ) ;
connect ( keyControlU , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlU ( ) ) ) ;
2018-11-28 06:02:37 +00:00
keyStar = new QShortcut ( this ) ;
keyStar - > setKey ( Qt : : Key_Asterisk ) ;
connect ( keyStar , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutStar ( ) ) ) ;
2019-01-28 23:46:14 +00:00
keySlash = new QShortcut ( this ) ;
keySlash - > setKey ( Qt : : Key_Slash ) ;
connect ( keySlash , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutSlash ( ) ) ) ;
2019-02-04 05:51:30 +00:00
keyMinus = new QShortcut ( this ) ;
keyMinus - > setKey ( Qt : : Key_Minus ) ;
connect ( keyMinus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutMinus ( ) ) ) ;
keyPlus = new QShortcut ( this ) ;
keyPlus - > setKey ( Qt : : Key_Plus ) ;
connect ( keyPlus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutPlus ( ) ) ) ;
2019-02-04 18:32:16 +00:00
keyShiftMinus = new QShortcut ( this ) ;
2019-02-06 00:11:25 +00:00
keyShiftMinus - > setKey ( Qt : : SHIFT + Qt : : Key_Minus ) ;
2019-02-04 18:32:16 +00:00
connect ( keyShiftMinus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutShiftMinus ( ) ) ) ;
keyShiftPlus = new QShortcut ( this ) ;
2019-02-06 00:11:25 +00:00
keyShiftPlus - > setKey ( Qt : : SHIFT + Qt : : Key_Plus ) ;
2019-02-04 18:32:16 +00:00
connect ( keyShiftPlus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutShiftPlus ( ) ) ) ;
2019-02-06 00:11:25 +00:00
keyControlMinus = new QShortcut ( this ) ;
keyControlMinus - > setKey ( Qt : : CTRL + Qt : : Key_Minus ) ;
connect ( keyControlMinus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlMinus ( ) ) ) ;
keyControlPlus = new QShortcut ( this ) ;
keyControlPlus - > setKey ( Qt : : CTRL + Qt : : Key_Plus ) ;
connect ( keyControlPlus , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutControlPlus ( ) ) ) ;
2020-03-10 18:08:36 +00:00
keyQuit = new QShortcut ( this ) ;
keyQuit - > setKey ( Qt : : CTRL + Qt : : Key_Q ) ;
connect ( keyQuit , SIGNAL ( activated ( ) ) , this , SLOT ( on_exitBtn_clicked ( ) ) ) ;
2020-03-17 22:15:01 +00:00
keyPageUp = new QShortcut ( this ) ;
keyPageUp - > setKey ( Qt : : Key_PageUp ) ;
connect ( keyPageUp , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutPageUp ( ) ) ) ;
keyPageDown = new QShortcut ( this ) ;
keyPageDown - > setKey ( Qt : : Key_PageDown ) ;
connect ( keyPageDown , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutPageDown ( ) ) ) ;
2019-02-07 18:15:10 +00:00
keyF = new QShortcut ( this ) ;
keyF - > setKey ( Qt : : Key_F ) ;
connect ( keyF , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutF ( ) ) ) ;
2019-02-06 00:11:25 +00:00
2019-02-07 18:15:10 +00:00
keyM = new QShortcut ( this ) ;
keyM - > setKey ( Qt : : Key_M ) ;
connect ( keyM , SIGNAL ( activated ( ) ) , this , SLOT ( shortcutM ( ) ) ) ;
2019-02-06 00:11:25 +00:00
2021-02-04 10:27:30 +00:00
// Enumerate audio devices, need to do before settings are loaded.
const auto deviceInfos = QAudioDeviceInfo : : availableDevices ( QAudio : : AudioOutput ) ;
for ( const QAudioDeviceInfo & deviceInfo : deviceInfos ) {
ui - > audioOutputCombo - > addItem ( deviceInfo . deviceName ( ) ) ;
}
2018-11-25 06:21:36 +00:00
setDefaultColors ( ) ; // set of UI colors with defaults populated
2018-11-30 06:31:20 +00:00
setDefPrefs ( ) ; // other default options
2018-11-29 21:41:42 +00:00
loadSettings ( ) ; // Look for saved preferences
// if setting for serial port is "auto" then...
2021-01-30 06:09:09 +00:00
// if(prefs.serialPortRadio == QString("auto"))
// {
// // Find the ICOM IC-7300.
// qDebug() << "Searching for serial port...";
// QDirIterator it("/dev/serial", QStringList() << "*IC-7300*", QDir::Files, QDirIterator::Subdirectories);
// while (it.hasNext())
// qDebug() << it.next();
// // if (it.isEmpty()) // fail or default to ttyUSB0 if present
// // iterator might not make sense
// serialPortRig = it.filePath(); // first? last?
// if(serialPortRig.isEmpty())
// {
// qDebug() << "Cannot find IC-7300 serial port. Trying /dev/ttyUSB0";
// serialPortRig = QString("/dev/ttyUSB0");
// }
// // end finding the 7300 code
// } else {
// serialPortRig = prefs.serialPortRadio;
// }
2018-11-29 21:41:42 +00:00
2018-06-19 19:58:52 +00:00
plot = ui - > plot ; // rename it waterfall.
wf = ui - > waterfall ;
2018-06-20 06:45:56 +00:00
tracer = new QCPItemTracer ( plot ) ;
//tracer->setGraphKey(5.5);
tracer - > setInterpolating ( true ) ;
2018-11-07 23:54:03 +00:00
tracer - > setStyle ( QCPItemTracer : : tsCrosshair ) ;
2018-06-20 06:45:56 +00:00
tracer - > setPen ( QPen ( Qt : : green ) ) ;
tracer - > setBrush ( Qt : : green ) ;
2018-11-07 23:54:03 +00:00
tracer - > setSize ( 30 ) ;
2018-06-19 19:58:52 +00:00
2021-01-25 00:16:38 +00:00
// spectWidth = 475; // fixed for now
// wfLength = 160; // fixed for now, time-length of waterfall
2018-06-19 19:58:52 +00:00
2021-01-25 00:16:38 +00:00
// // Initialize before use!
2018-06-19 19:58:52 +00:00
2021-01-25 00:16:38 +00:00
// QByteArray empty((int)spectWidth, '\x01');
// spectrumPeaks = QByteArray( (int)spectWidth, '\x01' );
// for(quint16 i=0; i<wfLength; i++)
// {
// wfimage.append(empty);
// }
2018-06-19 19:58:52 +00:00
// 0 1 2 3 4
modes < < " LSB " < < " USB " < < " AM " < < " CW " < < " RTTY " ;
2018-06-25 07:34:33 +00:00
// 5 6 7 8 9
modes < < " FM " < < " CW-R " < < " RTTY-R " < < " LSB-D " < < " USB-D " ;
2018-11-28 06:02:37 +00:00
// TODO: Add FM-D and AM-D which seem to exist
2018-06-19 19:58:52 +00:00
ui - > modeSelectCombo - > insertItems ( 0 , modes ) ;
spans < < " 2.5k " < < " 5.0k " < < " 10k " < < " 25k " ;
spans < < " 50k " < < " 100k " < < " 250k " < < " 500k " ;
ui - > scopeBWCombo - > insertItems ( 0 , spans ) ;
edges < < " 1 " < < " 2 " < < " 3 " ; // yep
ui - > scopeEdgeCombo - > insertItems ( 0 , edges ) ;
2018-06-20 06:45:56 +00:00
ui - > splitter - > setHandleWidth ( 5 ) ;
2020-04-23 22:22:23 +00:00
ui - > rfGainSlider - > setTickInterval ( 100 ) ;
ui - > rfGainSlider - > setSingleStep ( 100 ) ;
ui - > afGainSlider - > setSingleStep ( 100 ) ;
ui - > afGainSlider - > setSingleStep ( 100 ) ;
2021-02-02 09:05:59 +00:00
ui - > statusBar - > showMessage ( " Connecting to rig... " , 1000 ) ;
2018-06-20 06:45:56 +00:00
2021-01-30 08:44:36 +00:00
delayedCommand = new QTimer ( this ) ;
delayedCommand - > setInterval ( 250 ) ; // 250ms until we find rig civ and id, then 100ms.
delayedCommand - > setSingleShot ( true ) ;
connect ( delayedCommand , SIGNAL ( timeout ( ) ) , this , SLOT ( runDelayedCommand ( ) ) ) ;
2021-01-30 06:09:09 +00:00
openRig ( ) ;
2018-11-30 06:19:23 +00:00
2021-01-25 00:16:38 +00:00
qRegisterMetaType < rigCapabilities > ( ) ;
2018-06-19 19:58:52 +00:00
connect ( rig , SIGNAL ( haveFrequency ( double ) ) , this , SLOT ( receiveFreq ( double ) ) ) ;
connect ( this , SIGNAL ( getFrequency ( ) ) , rig , SLOT ( getFrequency ( ) ) ) ;
connect ( this , SIGNAL ( getMode ( ) ) , rig , SLOT ( getMode ( ) ) ) ;
2018-06-25 07:34:33 +00:00
connect ( this , SIGNAL ( getDataMode ( ) ) , rig , SLOT ( getDataMode ( ) ) ) ;
2018-11-07 23:54:03 +00:00
connect ( this , SIGNAL ( setDataMode ( bool ) ) , rig , SLOT ( setDataMode ( bool ) ) ) ;
2018-11-16 22:08:21 +00:00
connect ( this , SIGNAL ( getBandStackReg ( char , char ) ) , rig , SLOT ( getBandStackReg ( char , char ) ) ) ;
2018-11-07 23:54:03 +00:00
connect ( rig , SIGNAL ( havePTTStatus ( bool ) ) , this , SLOT ( receivePTTstatus ( bool ) ) ) ;
2019-02-10 07:13:18 +00:00
connect ( this , SIGNAL ( setPTT ( bool ) ) , rig , SLOT ( setPTT ( bool ) ) ) ;
2018-11-16 22:08:21 +00:00
connect ( rig , SIGNAL ( haveBandStackReg ( float , char , bool ) ) , this , SLOT ( receiveBandStackReg ( float , char , bool ) ) ) ;
2018-06-19 19:58:52 +00:00
connect ( this , SIGNAL ( getDebug ( ) ) , rig , SLOT ( getDebug ( ) ) ) ;
2018-12-18 22:34:04 +00:00
2018-06-19 19:58:52 +00:00
connect ( this , SIGNAL ( spectOutputDisable ( ) ) , rig , SLOT ( disableSpectOutput ( ) ) ) ;
connect ( this , SIGNAL ( spectOutputEnable ( ) ) , rig , SLOT ( enableSpectOutput ( ) ) ) ;
connect ( this , SIGNAL ( scopeDisplayDisable ( ) ) , rig , SLOT ( disableSpectrumDisplay ( ) ) ) ;
connect ( this , SIGNAL ( scopeDisplayEnable ( ) ) , rig , SLOT ( enableSpectrumDisplay ( ) ) ) ;
connect ( rig , SIGNAL ( haveMode ( QString ) ) , this , SLOT ( receiveMode ( QString ) ) ) ;
2018-11-16 22:08:21 +00:00
connect ( rig , SIGNAL ( haveDataMode ( bool ) ) , this , SLOT ( receiveDataModeStatus ( bool ) ) ) ;
2018-06-19 19:58:52 +00:00
connect ( rig , SIGNAL ( haveSpectrumData ( QByteArray , double , double ) ) , this , SLOT ( receiveSpectrumData ( QByteArray , double , double ) ) ) ;
2021-02-05 06:44:15 +00:00
connect ( rig , SIGNAL ( haveSpectrumFixedMode ( bool ) ) , this , SLOT ( receiveSpectrumFixedMode ( bool ) ) ) ;
2018-06-19 19:58:52 +00:00
connect ( this , SIGNAL ( setFrequency ( double ) ) , rig , SLOT ( setFrequency ( double ) ) ) ;
connect ( this , SIGNAL ( setScopeCenterMode ( bool ) ) , rig , SLOT ( setSpectrumCenteredMode ( bool ) ) ) ;
connect ( this , SIGNAL ( setScopeEdge ( char ) ) , rig , SLOT ( setScopeEdge ( char ) ) ) ;
connect ( this , SIGNAL ( setScopeSpan ( char ) ) , rig , SLOT ( setScopeSpan ( char ) ) ) ;
2018-12-18 22:34:04 +00:00
connect ( this , SIGNAL ( getScopeMode ( ) ) , rig , SLOT ( getScopeMode ( ) ) ) ;
connect ( this , SIGNAL ( getScopeEdge ( ) ) , rig , SLOT ( getScopeEdge ( ) ) ) ;
connect ( this , SIGNAL ( getScopeSpan ( ) ) , rig , SLOT ( getScopeSpan ( ) ) ) ;
2018-06-19 19:58:52 +00:00
connect ( this , SIGNAL ( setMode ( char ) ) , rig , SLOT ( setMode ( char ) ) ) ;
2018-11-16 22:08:21 +00:00
connect ( this , SIGNAL ( getRfGain ( ) ) , rig , SLOT ( getRfGain ( ) ) ) ;
2018-11-17 06:19:44 +00:00
connect ( this , SIGNAL ( getAfGain ( ) ) , rig , SLOT ( getAfGain ( ) ) ) ;
connect ( this , SIGNAL ( setRfGain ( unsigned char ) ) , rig , SLOT ( setRfGain ( unsigned char ) ) ) ;
connect ( this , SIGNAL ( setAfGain ( unsigned char ) ) , rig , SLOT ( setAfGain ( unsigned char ) ) ) ;
connect ( rig , SIGNAL ( haveRfGain ( unsigned char ) ) , this , SLOT ( receiveRfGain ( unsigned char ) ) ) ;
connect ( rig , SIGNAL ( haveAfGain ( unsigned char ) ) , this , SLOT ( receiveAfGain ( unsigned char ) ) ) ;
2018-11-18 08:01:20 +00:00
connect ( this , SIGNAL ( getSql ( ) ) , rig , SLOT ( getSql ( ) ) ) ;
connect ( rig , SIGNAL ( haveSql ( unsigned char ) ) , this , SLOT ( receiveSql ( unsigned char ) ) ) ;
2018-11-17 06:19:44 +00:00
connect ( this , SIGNAL ( startATU ( ) ) , rig , SLOT ( startATU ( ) ) ) ;
2018-11-17 07:13:59 +00:00
connect ( this , SIGNAL ( setATU ( bool ) ) , rig , SLOT ( setATU ( bool ) ) ) ;
2018-12-20 18:56:54 +00:00
connect ( this , SIGNAL ( getATUStatus ( ) ) , rig , SLOT ( getATUStatus ( ) ) ) ;
2018-11-20 07:42:34 +00:00
connect ( this , SIGNAL ( getRigID ( ) ) , rig , SLOT ( getRigID ( ) ) ) ;
2018-12-20 18:56:54 +00:00
connect ( rig , SIGNAL ( haveATUStatus ( unsigned char ) ) , this , SLOT ( receiveATUStatus ( unsigned char ) ) ) ;
2021-01-25 00:16:38 +00:00
connect ( rig , SIGNAL ( haveRigID ( rigCapabilities ) ) , this , SLOT ( receiveRigID ( rigCapabilities ) ) ) ;
2018-11-17 07:13:59 +00:00
2021-01-25 00:16:38 +00:00
// Speech (emitted from rig speaker)
2019-02-01 20:21:54 +00:00
connect ( this , SIGNAL ( sayAll ( ) ) , rig , SLOT ( sayAll ( ) ) ) ;
connect ( this , SIGNAL ( sayFrequency ( ) ) , rig , SLOT ( sayFrequency ( ) ) ) ;
connect ( this , SIGNAL ( sayMode ( ) ) , rig , SLOT ( sayMode ( ) ) ) ;
2018-06-19 19:58:52 +00:00
// Plot user interaction
connect ( plot , SIGNAL ( mouseDoubleClick ( QMouseEvent * ) ) , this , SLOT ( handlePlotDoubleClick ( QMouseEvent * ) ) ) ;
connect ( wf , SIGNAL ( mouseDoubleClick ( QMouseEvent * ) ) , this , SLOT ( handleWFDoubleClick ( QMouseEvent * ) ) ) ;
2018-11-07 23:54:03 +00:00
connect ( plot , SIGNAL ( mousePress ( QMouseEvent * ) ) , this , SLOT ( handlePlotClick ( QMouseEvent * ) ) ) ;
connect ( wf , SIGNAL ( mousePress ( QMouseEvent * ) ) , this , SLOT ( handleWFClick ( QMouseEvent * ) ) ) ;
2020-04-21 04:10:20 +00:00
connect ( wf , SIGNAL ( mouseWheel ( QWheelEvent * ) ) , this , SLOT ( handleWFScroll ( QWheelEvent * ) ) ) ;
connect ( plot , SIGNAL ( mouseWheel ( QWheelEvent * ) ) , this , SLOT ( handlePlotScroll ( QWheelEvent * ) ) ) ;
2018-06-19 19:58:52 +00:00
ui - > plot - > addGraph ( ) ; // primary
ui - > plot - > addGraph ( 0 , 0 ) ; // secondary, peaks, same axis as first?
ui - > waterfall - > addGraph ( ) ;
2018-06-20 06:45:56 +00:00
tracer - > setGraph ( plot - > graph ( 0 ) ) ;
2018-06-19 19:58:52 +00:00
colorMap = new QCPColorMap ( wf - > xAxis , wf - > yAxis ) ;
colorMapData = NULL ;
2020-03-27 23:34:32 +00:00
# if QCUSTOMPLOT_VERSION < 0x020001
2018-06-19 19:58:52 +00:00
wf - > addPlottable ( colorMap ) ;
2020-03-27 23:34:32 +00:00
# endif
2018-06-19 19:58:52 +00:00
colorScale = new QCPColorScale ( wf ) ;
ui - > tabWidget - > setCurrentIndex ( 0 ) ;
QColor color ( 20 + 200 / 4.0 * 1 , 70 * ( 1.6 - 1 / 4.0 ) , 150 , 150 ) ;
plot - > graph ( 1 ) - > setLineStyle ( QCPGraph : : lsLine ) ;
plot - > graph ( 1 ) - > setPen ( QPen ( color . lighter ( 200 ) ) ) ;
plot - > graph ( 1 ) - > setBrush ( QBrush ( color ) ) ;
drawPeaks = false ;
ui - > freqMhzLineEdit - > setValidator ( new QDoubleValidator ( 0 , 100 , 6 , this ) ) ;
2021-02-02 09:05:59 +00:00
;
2018-06-19 19:58:52 +00:00
2019-01-24 01:19:35 +00: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 ( ) ) ) ;
// Not needed since we automate this now.
/*
2018-06-25 07:34:33 +00:00
foreach ( const QSerialPortInfo & serialPortInfo , QSerialPortInfo : : availablePorts ( ) )
{
portList . append ( serialPortInfo . portName ( ) ) ;
2019-01-24 01:19:35 +00:00
// ui->commPortDrop->addItem(serialPortInfo.portName());
2018-06-25 07:34:33 +00:00
}
2019-01-24 01:19:35 +00:00
*/
2018-06-25 07:34:33 +00:00
2019-01-28 23:36:17 +00:00
# ifdef QT_DEBUG
qDebug ( ) < < " Running with debugging options enabled. " ;
ui - > debugBtn - > setVisible ( true ) ;
# else
ui - > debugBtn - > setVisible ( false ) ;
# endif
2018-11-18 08:01:20 +00:00
// Initial state of UI:
2018-11-25 06:21:36 +00:00
ui - > fullScreenChk - > setChecked ( prefs . useFullScreen ) ;
on_fullScreenChk_clicked ( prefs . useFullScreen ) ;
ui - > useDarkThemeChk - > setChecked ( prefs . useDarkMode ) ;
on_useDarkThemeChk_clicked ( prefs . useDarkMode ) ;
ui - > drawPeakChk - > setChecked ( prefs . drawPeaks ) ;
on_drawPeakChk_clicked ( prefs . drawPeaks ) ;
drawPeaks = prefs . drawPeaks ;
2018-11-18 08:01:20 +00:00
2021-01-30 06:09:09 +00:00
//getInitialRigState();
2018-07-04 00:20:03 +00:00
oldFreqDialVal = ui - > freqDial - > value ( ) ;
2018-06-19 19:58:52 +00:00
}
wfmain : : ~ wfmain ( )
{
2021-02-03 19:36:35 +00:00
# ifdef Q_OS_WIN // Prevent crash on exit in Windows.
2021-02-03 23:58:11 +00:00
delete rig ;
2021-02-03 19:36:35 +00:00
rigThread - > quit ( ) ;
2021-02-03 23:58:11 +00:00
rigThread - > wait ( ) ;
2021-02-05 06:06:48 +00:00
# endif
# ifdef Q_OS_LINUX
delete rig ;
rigThread - > quit ( ) ;
rigThread - > wait ( ) ;
2021-02-03 19:36:35 +00:00
# endif
2018-06-19 19:58:52 +00:00
delete ui ;
}
2021-01-30 06:09:09 +00: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.
//TODO: if(hasRunPreviously)
//TODO: if(useNetwork){...
// } else {
// 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-02-02 09:05:59 +00:00
// TODO: Use these if they are found
# ifdef QT_DEBUG
if ( ! serialPortCL . isEmpty ( ) )
2021-01-30 06:09:09 +00:00
{
2021-02-02 09:05:59 +00:00
qDebug ( ) < < " Serial port specified by user: " < < serialPortCL ;
} else {
qDebug ( ) < < " Serial port not specified. " ;
}
if ( ! hostCL . isEmpty ( ) )
{
qDebug ( ) < < " Remote host name specified by user: " < < hostCL ;
}
# endif
if ( ( prefs . serialPortRadio = = QString ( " auto " ) ) & & ( serialPortCL . isEmpty ( ) ) )
{
// Find the ICOM
// qDebug() << "Searching for serial port...";
QDirIterator it73 ( " /dev/serial " , 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 ) ;
if ( ! it73 . filePath ( ) . isEmpty ( ) )
2021-01-30 06:09:09 +00:00
{
2021-02-02 09:05:59 +00:00
// use
serialPortRig = it73 . filePath ( ) ; // first
} else if ( ! it97 . filePath ( ) . isEmpty ( ) )
{
// IC-9700 port
serialPortRig = it97 . filePath ( ) ;
} else if ( ! it785x . filePath ( ) . isEmpty ( ) )
{
// IC-785x port
serialPortRig = it785x . filePath ( ) ;
} else if ( ! it705 . filePath ( ) . isEmpty ( ) )
{
// IC-705
serialPortRig = it705 . filePath ( ) ;
} else {
//fall back:
qDebug ( ) < < " Could not find Icom serial port. Falling back to OS default. Use --port to specify, or modify preferences. " ;
# ifdef Q_OS_MAC
serialPortRig = QString ( " /dev/tty.SLAB_USBtoUART " ) ;
# endif
# ifdef Q_OS_LINUX
serialPortRig = QString ( " /dev/ttyUSB0 " ) ;
# endif
# ifdef Q_OS_UNIX
2021-01-30 06:09:09 +00:00
serialPortRig = QString ( " /dev/ttyUSB0 " ) ;
2021-02-02 09:05:59 +00:00
# endif
2021-01-30 06:09:09 +00:00
}
2021-02-02 09:05:59 +00:00
2021-01-30 06:09:09 +00:00
} else {
2021-02-02 09:05:59 +00:00
if ( serialPortCL . isEmpty ( ) )
{
serialPortRig = prefs . serialPortRadio ;
} else {
serialPortRig = serialPortCL ;
}
2021-01-30 06:09:09 +00:00
}
2021-02-03 19:36:35 +00:00
// Here, the radioCIVAddr is being set from a default preference, which is for the 7300.
2021-01-30 06:09:09 +00:00
// However, we will not use it initially. OTOH, if it is set explicitedly to a value in the prefs,
// then we skip auto detection.
2021-02-03 19:36:35 +00:00
if ( prefs . enableLAN )
rig = new rigCommander ( prefs . radioCIVAddr , QHostAddress ( prefs . ipAddress ) , prefs . controlLANPort , prefs . serialLANPort , prefs . audioLANPort , prefs . username , prefs . password ) ;
else
rig = new rigCommander ( prefs . radioCIVAddr , serialPortRig , prefs . serialPortBaud ) ;
2021-01-30 06:09:09 +00:00
rigThread = new QThread ( this ) ;
rig - > moveToThread ( rigThread ) ;
connect ( rigThread , SIGNAL ( started ( ) ) , rig , SLOT ( process ( ) ) ) ;
connect ( rig , SIGNAL ( finished ( ) ) , rigThread , SLOT ( quit ( ) ) ) ;
2021-02-02 09:05:59 +00:00
connect ( rig , SIGNAL ( haveSerialPortError ( QString , QString ) ) , this , SLOT ( receiveSerialPortError ( QString , QString ) ) ) ;
2021-01-30 06:09:09 +00:00
rigThread - > start ( ) ;
connect ( this , SIGNAL ( getRigCIV ( ) ) , rig , SLOT ( findRigs ( ) ) ) ;
connect ( rig , SIGNAL ( discoveredRigID ( rigCapabilities ) ) , this , SLOT ( receiveFoundRigID ( rigCapabilities ) ) ) ;
2021-02-02 09:05:59 +00:00
ui - > statusBar - > showMessage ( QString ( " Connecting to rig using serial port " ) . append ( serialPortRig ) , 1000 ) ;
2021-01-30 06:09:09 +00:00
if ( prefs . radioCIVAddr = = 0 )
{
// tell rigCommander to broadcast a request for all rig IDs.
2021-02-02 09:05:59 +00:00
// qDebug() << "Beginning search from wfview for rigCIV (auto-detection broadcast)";
ui - > statusBar - > showMessage ( QString ( " Searching CIV bus for connected radios. " ) , 1000 ) ;
2021-01-30 06:09:09 +00:00
emit getRigCIV ( ) ;
cmdOutQue . append ( cmdGetRigCIV ) ;
2021-01-30 08:44:36 +00:00
delayedCommand - > start ( ) ;
2021-01-30 06:09:09 +00: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.
qDebug ( ) < < " Skipping automatic CIV, using user-supplied value of " < < prefs . radioCIVAddr ;
getInitialRigState ( ) ;
}
}
void wfmain : : receiveFoundRigID ( rigCapabilities rigCaps )
{
// Entry point for unknown rig being identified at the start of the program.
//now we know what the rig ID is:
2021-02-02 09:05:59 +00:00
//qDebug() << "In wfview, we now have a reply to our request for rig identity sent to CIV BROADCAST.";
2021-01-30 08:44:36 +00:00
delayedCommand - > setInterval ( 100 ) ; // faster polling is ok now.
2021-01-30 06:09:09 +00:00
receiveRigID ( rigCaps ) ;
getInitialRigState ( ) ;
2021-02-02 09:05:59 +00:00
QString message = QString ( " Found model: " ) . append ( rigCaps . modelName ) ;
ui - > statusBar - > showMessage ( message , 1500 ) ;
2021-01-30 06:09:09 +00:00
return ;
}
2021-02-02 09:05:59 +00:00
void wfmain : : receiveSerialPortError ( QString port , QString errorText )
{
qDebug ( ) < < " wfmain: received serial port error for port: " < < port < < " with message: " < < errorText ;
ui - > statusBar - > showMessage ( QString ( " ERROR: using port " ) . append ( port ) . append ( " : " ) . append ( errorText ) , 10000 ) ;
// TODO: Dialog box, exit, etc
}
2021-01-30 06:09:09 +00:00
2018-11-25 06:21:36 +00:00
void wfmain : : setDefPrefs ( )
{
2021-02-05 05:03:16 +00:00
defPrefs . useFullScreen = false ;
2018-11-25 06:21:36 +00:00
defPrefs . useDarkMode = true ;
defPrefs . drawPeaks = true ;
2019-02-09 00:05:45 +00:00
defPrefs . stylesheetPath = QString ( " qdarkstyle/style.qss " ) ;
2021-01-30 06:09:09 +00:00
defPrefs . radioCIVAddr = 0x00 ; // previously was 0x94 for 7300.
2018-11-29 21:41:42 +00:00
defPrefs . serialPortRadio = QString ( " auto " ) ;
2020-03-30 21:09:52 +00:00
defPrefs . serialPortBaud = 115200 ;
2018-11-25 06:21:36 +00:00
defPrefs . enablePTT = false ;
defPrefs . niceTS = true ;
2021-02-05 04:54:34 +00:00
defPrefs . enableLAN = false ;
defPrefs . ipAddress = QString ( " " ) ;
defPrefs . controlLANPort = 50001 ;
defPrefs . serialLANPort = 50002 ;
defPrefs . audioLANPort = 50003 ;
defPrefs . username = QString ( " " ) ;
defPrefs . password = QString ( " " ) ;
defPrefs . audioOutput = QString ( " " ) ;
2018-11-25 06:21:36 +00:00
}
2018-11-24 08:10:05 +00:00
void wfmain : : loadSettings ( )
{
qDebug ( ) < < " Loading settings from " < < settings . fileName ( ) ;
// Basic things to load:
// UI: (full screen, dark theme, draw peaks, colors, etc)
2018-11-25 06:21:36 +00:00
settings . beginGroup ( " Interface " ) ;
prefs . useFullScreen = settings . value ( " UseFullScreen " , defPrefs . useFullScreen ) . toBool ( ) ;
prefs . useDarkMode = settings . value ( " UseDarkMode " , defPrefs . useDarkMode ) . toBool ( ) ;
prefs . drawPeaks = settings . value ( " DrawPeaks " , defPrefs . drawPeaks ) . toBool ( ) ;
2019-02-09 00:05:45 +00:00
prefs . stylesheetPath = settings . value ( " StylesheetPath " , defPrefs . stylesheetPath ) . toString ( ) ;
2020-04-04 22:39:59 +00:00
ui - > splitter - > restoreState ( settings . value ( " splitter " ) . toByteArray ( ) ) ;
2020-04-04 23:51:46 +00:00
restoreGeometry ( settings . value ( " windowGeometry " ) . toByteArray ( ) ) ;
restoreState ( settings . value ( " windowState " ) . toByteArray ( ) ) ;
setWindowState ( Qt : : WindowActive ) ; // Works around QT bug to returns window+keyboard focus.
2018-11-25 06:21:36 +00:00
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
// Radio and Comms: C-IV addr, port to use
2018-11-25 06:21:36 +00:00
settings . beginGroup ( " Radio " ) ;
2018-12-18 22:34:04 +00:00
prefs . radioCIVAddr = ( unsigned char ) settings . value ( " RigCIVuInt " , defPrefs . radioCIVAddr ) . toInt ( ) ;
2018-11-25 06:21:36 +00:00
prefs . serialPortRadio = settings . value ( " SerialPortRadio " , defPrefs . serialPortRadio ) . toString ( ) ;
2020-03-30 21:09:52 +00:00
prefs . serialPortBaud = ( quint32 ) settings . value ( " SerialPortBaud " , defPrefs . serialPortBaud ) . toInt ( ) ;
2018-11-25 06:21:36 +00:00
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
// Misc. user settings (enable PTT, draw peaks, etc)
2018-11-25 06:21:36 +00:00
settings . beginGroup ( " Controls " ) ;
prefs . enablePTT = settings . value ( " EnablePTT " , defPrefs . enablePTT ) . toBool ( ) ;
2019-02-10 07:13:18 +00:00
ui - > pttEnableChk - > setChecked ( prefs . enablePTT ) ;
2018-11-25 06:21:36 +00:00
prefs . niceTS = settings . value ( " NiceTS " , defPrefs . niceTS ) . toBool ( ) ;
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
2021-02-03 19:36:35 +00:00
settings . beginGroup ( " LAN " ) ;
prefs . enableLAN = settings . value ( " EnableLAN " , defPrefs . enableLAN ) . toBool ( ) ;
ui - > lanEnableChk - > setChecked ( prefs . enableLAN ) ;
prefs . ipAddress = settings . value ( " IPAddress " , defPrefs . ipAddress ) . toString ( ) ;
ui - > ipAddressTxt - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
ui - > ipAddressTxt - > setText ( prefs . ipAddress ) ;
prefs . controlLANPort = settings . value ( " ControlLANPort " , defPrefs . controlLANPort ) . toInt ( ) ;
ui - > controlPortTxt - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
ui - > controlPortTxt - > setText ( QString ( " %1 " ) . arg ( prefs . controlLANPort ) ) ;
prefs . serialLANPort = settings . value ( " SerialLANPort " , defPrefs . serialLANPort ) . toInt ( ) ;
ui - > serialPortTxt - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
ui - > serialPortTxt - > setText ( QString ( " %1 " ) . arg ( prefs . serialLANPort ) ) ;
prefs . audioLANPort = settings . value ( " AudioLANPort " , defPrefs . audioLANPort ) . toInt ( ) ;
ui - > audioPortTxt - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
ui - > audioPortTxt - > setText ( QString ( " %1 " ) . arg ( prefs . audioLANPort ) ) ;
prefs . username = settings . value ( " Username " , defPrefs . username ) . toString ( ) ;
ui - > usernameTxt - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
ui - > usernameTxt - > setText ( QString ( " %1 " ) . arg ( prefs . username ) ) ;
prefs . password = settings . value ( " Password " , defPrefs . password ) . toString ( ) ;
ui - > passwordTxt - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
ui - > passwordTxt - > setText ( QString ( " %1 " ) . arg ( prefs . password ) ) ;
2021-02-04 10:27:30 +00:00
prefs . audioOutput = settings . value ( " AudioOutput " , defPrefs . audioOutput ) . toString ( ) ;
ui - > audioOutputCombo - > setEnabled ( ui - > lanEnableChk - > isChecked ( ) ) ;
int audioIndex = ui - > audioOutputCombo - > findText ( " prefs.audioOutput " ) ;
if ( audioIndex - 1 )
ui - > audioOutputCombo - > setCurrentIndex ( audioIndex ) ;
2021-02-03 19:36:35 +00:00
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
// Memory channels
2018-11-25 06:21:36 +00:00
settings . beginGroup ( " Memory " ) ;
int size = settings . beginReadArray ( " Channel " ) ;
int chan = 0 ;
double freq ;
unsigned char mode ;
bool isSet ;
2018-11-27 07:10:23 +00: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-25 06:21:36 +00:00
for ( int i = 0 ; i < size ; i + + )
{
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 ( ) ;
if ( isSet )
{
mem . setPreset ( chan , freq , ( mode_kind ) mode ) ;
}
}
settings . endArray ( ) ;
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
}
2020-04-04 23:51:46 +00:00
2018-11-24 08:10:05 +00:00
void wfmain : : saveSettings ( )
{
qDebug ( ) < < " Saving settings to " < < settings . fileName ( ) ;
// Basic things to load:
// UI: (full screen, dark theme, draw peaks, colors, etc)
settings . beginGroup ( " Interface " ) ;
2018-11-27 07:10:23 +00:00
settings . setValue ( " UseFullScreen " , prefs . useFullScreen ) ;
settings . setValue ( " UseDarkMode " , prefs . useDarkMode ) ;
settings . setValue ( " DrawPeaks " , prefs . drawPeaks ) ;
2019-02-09 00:05:45 +00:00
settings . setValue ( " StylesheetPath " , prefs . stylesheetPath ) ;
2020-04-04 22:39:59 +00:00
settings . setValue ( " splitter " , ui - > splitter - > saveState ( ) ) ;
2020-04-04 23:51:46 +00:00
settings . setValue ( " windowGeometry " , saveGeometry ( ) ) ;
settings . setValue ( " windowState " , saveState ( ) ) ;
2018-11-24 08:10:05 +00:00
settings . endGroup ( ) ;
// Radio and Comms: C-IV addr, port to use
settings . beginGroup ( " Radio " ) ;
2018-11-27 07:10:23 +00:00
settings . setValue ( " RigCIVuInt " , prefs . radioCIVAddr ) ;
settings . setValue ( " SerialPortRadio " , prefs . serialPortRadio ) ;
2020-03-30 21:09:52 +00:00
settings . setValue ( " SerialPortBaud " , prefs . serialPortBaud ) ;
2018-11-24 08:10:05 +00:00
settings . endGroup ( ) ;
// Misc. user settings (enable PTT, draw peaks, etc)
settings . beginGroup ( " Controls " ) ;
2018-11-27 07:10:23 +00:00
settings . setValue ( " EnablePTT " , prefs . enablePTT ) ;
settings . setValue ( " NiceTS " , prefs . niceTS ) ;
2018-11-24 08:10:05 +00:00
settings . endGroup ( ) ;
2021-02-03 19:36:35 +00:00
settings . beginGroup ( " LAN " ) ;
settings . setValue ( " EnableLAN " , prefs . enableLAN ) ;
settings . setValue ( " IPAddress " , prefs . ipAddress ) ;
settings . setValue ( " ControlLANPort " , prefs . controlLANPort ) ;
settings . setValue ( " SerialLANPort " , prefs . serialLANPort ) ;
settings . setValue ( " AudioLANPort " , prefs . audioLANPort ) ;
settings . setValue ( " Username " , prefs . username ) ;
settings . setValue ( " Password " , prefs . password ) ;
2021-02-04 10:27:30 +00:00
settings . setValue ( " AudioOutput " , prefs . audioOutput ) ;
2021-02-03 19:36:35 +00:00
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
// Memory channels
settings . beginGroup ( " Memory " ) ;
settings . beginWriteArray ( " Channel " , ( int ) mem . getNumPresets ( ) ) ;
preset_kind temp ;
for ( int i = 0 ; i < ( int ) mem . getNumPresets ( ) ; i + + )
{
temp = mem . getPreset ( ( int ) i ) ;
settings . setArrayIndex ( i ) ;
2018-11-25 06:21:36 +00:00
settings . setValue ( " chan " , i ) ;
2018-11-24 08:10:05 +00:00
settings . setValue ( " freq " , temp . frequency ) ;
settings . setValue ( " mode " , temp . mode ) ;
2018-11-25 06:21:36 +00:00
settings . setValue ( " isSet " , temp . isSet ) ;
2018-11-24 08:10:05 +00:00
}
settings . endArray ( ) ;
settings . endGroup ( ) ;
2018-11-25 06:21:36 +00:00
// Note: X and Y get the same colors. See setPlotTheme() function
settings . beginGroup ( " DarkColors " ) ;
settings . setValue ( " Dark_PlotBackground " , QColor ( 0 , 0 , 0 , 255 ) ) ;
settings . setValue ( " Dark_PlotAxisPen " , QColor ( 75 , 75 , 75 , 255 ) ) ;
settings . setValue ( " Dark_PlotLegendTextColor " , QColor ( 255 , 255 , 255 , 255 ) ) ;
settings . setValue ( " Dark_PlotLegendBorderPen " , QColor ( 255 , 255 , 255 , 255 ) ) ;
settings . setValue ( " Dark_PlotLegendBrush " , QColor ( 0 , 0 , 0 , 200 ) ) ;
settings . setValue ( " Dark_PlotTickLabel " , QColor ( Qt : : white ) ) ;
settings . setValue ( " Dark_PlotBasePen " , QColor ( Qt : : white ) ) ;
settings . setValue ( " Dark_PlotTickPen " , QColor ( Qt : : white ) ) ;
settings . setValue ( " Dark_PlotFreqTracer " , QColor ( Qt : : yellow ) ) ;
settings . endGroup ( ) ;
settings . beginGroup ( " LightColors " ) ;
settings . setValue ( " Light_PlotBackground " , QColor ( 255 , 255 , 255 , 255 ) ) ;
settings . setValue ( " Light_PlotAxisPen " , QColor ( 200 , 200 , 200 , 255 ) ) ;
settings . setValue ( " Light_PlotLegendTextColor " , QColor ( 0 , 0 , 0 , 255 ) ) ;
settings . setValue ( " Light_PlotLegendBorderPen " , QColor ( 0 , 0 , 0 , 255 ) ) ;
settings . setValue ( " Light_PlotLegendBrush " , QColor ( 255 , 255 , 255 , 200 ) ) ;
settings . setValue ( " Light_PlotTickLabel " , QColor ( Qt : : black ) ) ;
settings . setValue ( " Light_PlotBasePen " , QColor ( Qt : : black ) ) ;
settings . setValue ( " Light_PlotTickPen " , QColor ( Qt : : black ) ) ;
settings . setValue ( " Light_PlotFreqTracer " , QColor ( Qt : : blue ) ) ;
settings . endGroup ( ) ;
// This is a reference to see how the preference file is encoded.
settings . beginGroup ( " StandardColors " ) ;
settings . setValue ( " white " , QColor ( Qt : : white ) ) ;
settings . setValue ( " black " , QColor ( Qt : : black ) ) ;
settings . setValue ( " red_opaque " , QColor ( Qt : : red ) ) ;
settings . setValue ( " red_translucent " , QColor ( 255 , 0 , 0 , 128 ) ) ;
settings . setValue ( " green_opaque " , QColor ( Qt : : green ) ) ;
settings . setValue ( " green_translucent " , QColor ( 0 , 255 , 0 , 128 ) ) ;
settings . setValue ( " blue_opaque " , QColor ( Qt : : blue ) ) ;
settings . setValue ( " blue_translucent " , QColor ( 0 , 0 , 255 , 128 ) ) ;
settings . endGroup ( ) ;
2018-11-24 08:10:05 +00:00
settings . sync ( ) ; // Automatic, not needed (supposedly)
}
2021-01-25 00:16:38 +00:00
void wfmain : : prepareWf ( )
{
// All this code gets moved in from the constructor of wfmain.
if ( haveRigCaps )
{
// do things
spectWidth = rigCaps . spectLenMax ; // was fixed at 475
wfLength = 160 ; // fixed for now, time-length of waterfall
// Initialize before use!
QByteArray empty ( ( int ) spectWidth , ' \x01 ' ) ;
spectrumPeaks = QByteArray ( ( int ) spectWidth , ' \x01 ' ) ;
for ( quint16 i = 0 ; i < wfLength ; i + + )
{
wfimage . append ( empty ) ;
}
// from line 305-313:
colorMap - > data ( ) - > setValueRange ( QCPRange ( 0 , wfLength - 1 ) ) ;
colorMap - > data ( ) - > setKeyRange ( QCPRange ( 0 , spectWidth - 1 ) ) ;
colorMap - > setDataRange ( QCPRange ( 0 , rigCaps . spectAmpMax ) ) ;
colorMap - > setGradient ( QCPColorGradient : : gpJet ) ; // TODO: Add preference
colorMapData = new QCPColorMapData ( spectWidth , wfLength , QCPRange ( 0 , spectWidth - 1 ) , QCPRange ( 0 , wfLength - 1 ) ) ;
colorMap - > setData ( colorMapData ) ;
spectRowCurrent = 0 ;
wf - > yAxis - > setRangeReversed ( true ) ;
wf - > xAxis - > setVisible ( false ) ;
} else {
qDebug ( ) < < " Cannot prepare WF view without rigCaps. Waiting on this. " ;
return ;
}
}
2018-11-24 08:10:05 +00:00
2018-11-28 06:02:37 +00:00
// Key shortcuts (hotkeys)
void wfmain : : shortcutF11 ( )
{
if ( onFullscreen )
{
this - > showNormal ( ) ;
onFullscreen = false ;
} else {
this - > showFullScreen ( ) ;
onFullscreen = true ;
}
2021-02-05 05:03:16 +00:00
ui - > fullScreenChk - > setChecked ( onFullscreen ) ;
2018-11-28 06:02:37 +00:00
}
void wfmain : : shortcutF1 ( )
{
ui - > tabWidget - > setCurrentIndex ( 0 ) ;
}
void wfmain : : shortcutF2 ( )
{
ui - > tabWidget - > setCurrentIndex ( 1 ) ;
}
void wfmain : : shortcutF3 ( )
{
ui - > tabWidget - > setCurrentIndex ( 2 ) ;
2018-11-30 06:20:27 +00:00
ui - > freqMhzLineEdit - > clear ( ) ;
ui - > freqMhzLineEdit - > setFocus ( ) ;
2018-11-28 06:02:37 +00:00
}
void wfmain : : shortcutF4 ( )
{
ui - > tabWidget - > setCurrentIndex ( 3 ) ;
}
2019-01-28 23:36:17 +00:00
// Mode switch keys:
2018-11-28 06:02:37 +00:00
void wfmain : : shortcutF5 ( )
{
2019-01-28 23:36:17 +00:00
// LSB
ui - > modeSelectCombo - > setCurrentIndex ( 0 ) ;
2019-02-03 22:09:06 +00:00
on_modeSelectCombo_activated ( 0 ) ;
2019-01-28 23:36:17 +00:00
}
void wfmain : : shortcutF6 ( )
{
// USB
ui - > modeSelectCombo - > setCurrentIndex ( 1 ) ;
2019-02-03 22:09:06 +00:00
on_modeSelectCombo_activated ( 1 ) ;
2019-01-28 23:36:17 +00:00
}
void wfmain : : shortcutF7 ( )
{
// AM
ui - > modeSelectCombo - > setCurrentIndex ( 2 ) ;
2019-02-03 22:09:06 +00:00
on_modeSelectCombo_activated ( 2 ) ;
2019-01-28 23:36:17 +00:00
}
void wfmain : : shortcutF8 ( )
{
// CW
ui - > modeSelectCombo - > setCurrentIndex ( 3 ) ;
2019-02-03 22:09:06 +00:00
on_modeSelectCombo_activated ( 3 ) ;
2019-01-28 23:36:17 +00:00
}
void wfmain : : shortcutF9 ( )
{
// USB-D
ui - > modeSelectCombo - > setCurrentIndex ( 9 ) ;
2019-02-03 22:09:06 +00:00
on_modeSelectCombo_activated ( 9 ) ;
2019-01-28 23:36:17 +00:00
}
void wfmain : : shortcutF10 ( )
{
// Build information, debug, whatever you wish
2019-01-24 01:19:35 +00:00
QString buildInfo = QString ( " Build " + QString ( GITSHORT ) + " on " + QString ( __DATE__ ) + " at " + __TIME__ + " by " + UNAME + " @ " + HOST ) ;
showStatusBarText ( buildInfo ) ;
2018-11-28 06:02:37 +00:00
}
2019-02-01 20:21:54 +00:00
void wfmain : : shortcutF12 ( )
{
// Speak current frequency and mode via IC-7300
showStatusBarText ( " Sending speech command to radio. " ) ;
emit sayAll ( ) ;
}
void wfmain : : shortcutControlT ( )
{
// Transmit
qDebug ( ) < < " Activated Control-T shortcut " ;
2020-03-12 03:58:31 +00:00
showStatusBarText ( QString ( " Transmitting. Press Control-R to receive. " ) ) ;
2019-02-01 20:21:54 +00:00
ui - > pttOnBtn - > click ( ) ;
}
void wfmain : : shortcutControlR ( )
{
// Receive
ui - > pttOffBtn - > click ( ) ;
}
void wfmain : : shortcutControlI ( )
{
// Enable ATU
ui - > tuneEnableChk - > click ( ) ;
}
void wfmain : : shortcutControlU ( )
{
// Run ATU tuning cycle
ui - > tuneNowBtn - > click ( ) ;
}
2018-11-28 06:02:37 +00:00
void wfmain : : shortcutStar ( )
{
// Jump to frequency tab from Asterisk key on keypad
ui - > tabWidget - > setCurrentIndex ( 2 ) ;
2018-11-30 06:19:23 +00:00
ui - > freqMhzLineEdit - > clear ( ) ;
ui - > freqMhzLineEdit - > setFocus ( ) ;
2018-11-28 06:02:37 +00:00
}
2019-01-28 23:46:14 +00:00
void wfmain : : shortcutSlash ( )
{
// Cycle through available modes
2019-02-01 20:21:54 +00:00
ui - > modeSelectCombo - > setCurrentIndex ( ( ui - > modeSelectCombo - > currentIndex ( ) + 1 ) % ui - > modeSelectCombo - > count ( ) ) ;
2019-02-03 22:09:06 +00:00
on_modeSelectCombo_activated ( ui - > modeSelectCombo - > currentIndex ( ) ) ;
2019-01-28 23:46:14 +00:00
}
2018-11-28 06:02:37 +00:00
2019-02-04 05:51:30 +00:00
void wfmain : : shortcutMinus ( )
{
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) - ui - > freqDial - > singleStep ( ) ) ;
}
void wfmain : : shortcutPlus ( )
{
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) + ui - > freqDial - > singleStep ( ) ) ;
}
2019-02-04 18:32:16 +00:00
void wfmain : : shortcutShiftMinus ( )
{
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) - ui - > freqDial - > pageStep ( ) ) ;
}
void wfmain : : shortcutShiftPlus ( )
{
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) + ui - > freqDial - > pageStep ( ) ) ;
}
2019-02-06 00:11:25 +00:00
void wfmain : : shortcutControlMinus ( )
{
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) - ui - > freqDial - > pageStep ( ) ) ;
}
2019-02-04 18:32:16 +00:00
2019-02-06 00:11:25 +00:00
void wfmain : : shortcutControlPlus ( )
{
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) + ui - > freqDial - > pageStep ( ) ) ;
}
2019-02-04 18:32:16 +00:00
2020-03-17 22:15:01 +00:00
void wfmain : : shortcutPageUp ( )
{
emit setFrequency ( this - > freqMhz + 1.0 ) ;
cmdOutQue . append ( cmdGetFreq ) ;
2020-03-23 21:58:31 +00:00
//cmdOutQue.append(cmdGetMode); // maybe not really needed.
2020-03-17 22:15:01 +00:00
delayedCommand - > start ( ) ;
}
void wfmain : : shortcutPageDown ( )
{
emit setFrequency ( this - > freqMhz - 1.0 ) ;
cmdOutQue . append ( cmdGetFreq ) ;
2020-03-23 21:58:31 +00:00
//cmdOutQue.append(cmdGetMode); // maybe not really needed.
2020-03-17 22:15:01 +00:00
delayedCommand - > start ( ) ;
}
2019-02-07 18:15:10 +00: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 ( ) ;
}
2019-02-04 05:51:30 +00:00
2021-01-30 08:44:36 +00:00
void wfmain : : getInitialRigState ( )
2018-06-23 07:31:41 +00:00
{
2018-11-24 08:10:05 +00: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
// the polling interval is set at 100ms. Faster is possible but slower
// computers will glitch occassionally.
2018-06-23 07:31:41 +00:00
2021-01-30 08:44:36 +00:00
//cmdOutQue.append(cmdGetRigID);
2018-11-20 07:42:34 +00:00
2018-06-23 07:31:41 +00:00
cmdOutQue . append ( cmdGetFreq ) ;
cmdOutQue . append ( cmdGetMode ) ;
2018-11-24 08:10:05 +00:00
cmdOutQue . append ( cmdNone ) ;
2018-11-16 22:08:21 +00:00
2018-06-23 07:31:41 +00:00
cmdOutQue . append ( cmdGetFreq ) ;
cmdOutQue . append ( cmdGetMode ) ;
2018-11-17 06:19:44 +00:00
cmdOutQue . append ( cmdGetRxGain ) ;
cmdOutQue . append ( cmdGetAfGain ) ;
2018-12-20 19:22:52 +00:00
// cmdOutQue.append(cmdGetSql); // implimented but not used
// TODO:
2018-11-24 08:10:05 +00:00
// get TX level
// get Scope reference Level
2021-01-30 08:44:36 +00:00
//cmdOutQue.append(cmdNone);
//cmdOutQue.append(cmdGetRigID);
//cmdOutQue.append(cmdNone);
//cmdOutQue.append(cmdGetRigID);
2021-01-25 00:16:38 +00:00
2018-11-24 08:10:05 +00:00
cmdOutQue . append ( cmdDispEnable ) ;
cmdOutQue . append ( cmdSpecOn ) ;
// get spectrum mode (center or edge)
// get spectrum span or edge limit number [1,2,3], update UI
2018-11-17 06:19:44 +00:00
2018-12-20 19:22:52 +00:00
cmdOutQue . append ( cmdNone ) ;
cmdOutQue . append ( cmdGetATUStatus ) ;
2018-06-23 07:31:41 +00:00
cmdOut = cmdNone ;
delayedCommand - > start ( ) ;
}
2018-11-07 23:54:03 +00:00
void wfmain : : showStatusBarText ( QString text )
{
ui - > statusBar - > showMessage ( text , 5000 ) ;
}
2018-06-23 07:31:41 +00:00
2018-06-22 23:31:52 +00:00
void wfmain : : on_useDarkThemeChk_clicked ( bool checked )
2018-06-20 06:45:56 +00:00
{
2018-06-22 23:31:52 +00:00
setAppTheme ( checked ) ;
setPlotTheme ( wf , checked ) ;
setPlotTheme ( plot , checked ) ;
2018-11-27 07:10:23 +00:00
prefs . useDarkMode = checked ;
2018-06-22 23:31:52 +00:00
}
void wfmain : : setAppTheme ( bool isDark )
{
if ( isDark )
{
2019-02-09 00:05:45 +00:00
// QFile f(":qdarkstyle/style.qss"); // built-in resource
2020-01-05 01:12:35 +00:00
QFile f ( " /usr/share/wfview/stylesheets/ " + prefs . stylesheetPath ) ;
2018-06-22 23:31:52 +00:00
if ( ! f . exists ( ) )
{
printf ( " Unable to set stylesheet, file not found \n " ) ;
2020-03-10 18:08:36 +00:00
printf ( " Tried to load: [%s] \n " , QString ( QString ( " /usr/share/wfview/stylesheets/ " ) + prefs . stylesheetPath ) . toStdString ( ) . c_str ( ) ) ;
2018-06-22 23:31:52 +00:00
}
else
{
f . open ( QFile : : ReadOnly | QFile : : Text ) ;
QTextStream ts ( & f ) ;
qApp - > setStyleSheet ( ts . readAll ( ) ) ;
}
} else {
qApp - > setStyleSheet ( " " ) ;
}
}
2018-11-25 06:21:36 +00:00
void wfmain : : setDefaultColors ( )
{
defaultColors . Dark_PlotBackground = QColor ( 0 , 0 , 0 , 255 ) ;
defaultColors . Dark_PlotAxisPen = QColor ( 75 , 75 , 75 , 255 ) ;
defaultColors . Dark_PlotLegendTextColor = QColor ( 255 , 255 , 255 , 255 ) ;
defaultColors . Dark_PlotLegendBorderPen = QColor ( 255 , 255 , 255 , 255 ) ;
defaultColors . Dark_PlotLegendBrush = QColor ( 0 , 0 , 0 , 200 ) ;
defaultColors . Dark_PlotTickLabel = QColor ( Qt : : white ) ;
defaultColors . Dark_PlotBasePen = QColor ( Qt : : white ) ;
defaultColors . Dark_PlotTickPen = QColor ( Qt : : white ) ;
defaultColors . Dark_PlotFreqTracer = QColor ( Qt : : yellow ) ;
defaultColors . Light_PlotBackground = QColor ( 255 , 255 , 255 , 255 ) ;
defaultColors . Light_PlotAxisPen = QColor ( 200 , 200 , 200 , 255 ) ;
defaultColors . Light_PlotLegendTextColor = QColor ( 0 , 0 , 0 , 255 ) ;
defaultColors . Light_PlotLegendBorderPen = QColor ( 0 , 0 , 0 , 255 ) ;
defaultColors . Light_PlotLegendBrush = QColor ( 255 , 255 , 255 , 200 ) ;
defaultColors . Light_PlotTickLabel = QColor ( Qt : : black ) ;
defaultColors . Light_PlotBasePen = QColor ( Qt : : black ) ;
defaultColors . Light_PlotTickPen = QColor ( Qt : : black ) ;
defaultColors . Light_PlotFreqTracer = QColor ( Qt : : blue ) ;
}
2018-06-22 23:31:52 +00:00
void wfmain : : setPlotTheme ( QCustomPlot * plot , bool isDark )
{
if ( isDark )
{
plot - > setBackground ( QColor ( 0 , 0 , 0 , 255 ) ) ;
plot - > xAxis - > grid ( ) - > setPen ( QColor ( 75 , 75 , 75 , 255 ) ) ;
plot - > yAxis - > grid ( ) - > setPen ( QColor ( 75 , 75 , 75 , 255 ) ) ;
plot - > legend - > setTextColor ( QColor ( 255 , 255 , 255 , 255 ) ) ;
plot - > legend - > setBorderPen ( QColor ( 255 , 255 , 255 , 255 ) ) ;
plot - > legend - > setBrush ( QColor ( 0 , 0 , 0 , 200 ) ) ;
plot - > xAxis - > setTickLabelColor ( Qt : : white ) ;
plot - > xAxis - > setLabelColor ( Qt : : white ) ;
plot - > yAxis - > setTickLabelColor ( Qt : : white ) ;
plot - > yAxis - > setLabelColor ( Qt : : white ) ;
plot - > xAxis - > setBasePen ( QPen ( Qt : : white ) ) ;
plot - > xAxis - > setTickPen ( QPen ( Qt : : white ) ) ;
plot - > yAxis - > setBasePen ( QPen ( Qt : : white ) ) ;
plot - > yAxis - > setTickPen ( QPen ( Qt : : white ) ) ;
2018-07-04 00:20:03 +00:00
plot - > graph ( 0 ) - > setPen ( QPen ( Qt : : yellow ) ) ; // magenta, yellow, green, lightGray
2018-06-22 23:31:52 +00:00
} else {
2018-06-23 07:31:41 +00:00
//color = ui->groupBox->palette().color(QPalette::Button);
2018-06-22 23:31:52 +00:00
plot - > setBackground ( QColor ( 255 , 255 , 255 , 255 ) ) ;
2018-06-23 07:31:41 +00:00
//plot->setBackground(color);
2018-06-22 23:31:52 +00:00
plot - > xAxis - > grid ( ) - > setPen ( QColor ( 200 , 200 , 200 , 255 ) ) ;
plot - > yAxis - > grid ( ) - > setPen ( QColor ( 200 , 200 , 200 , 255 ) ) ;
plot - > legend - > setTextColor ( QColor ( 0 , 0 , 0 , 255 ) ) ;
plot - > legend - > setBorderPen ( QColor ( 0 , 0 , 0 , 255 ) ) ;
plot - > legend - > setBrush ( QColor ( 255 , 255 , 255 , 200 ) ) ;
plot - > xAxis - > setTickLabelColor ( Qt : : black ) ;
plot - > xAxis - > setLabelColor ( Qt : : black ) ;
plot - > yAxis - > setTickLabelColor ( Qt : : black ) ;
plot - > yAxis - > setLabelColor ( Qt : : black ) ;
plot - > xAxis - > setBasePen ( QPen ( Qt : : black ) ) ;
plot - > xAxis - > setTickPen ( QPen ( Qt : : black ) ) ;
plot - > yAxis - > setBasePen ( QPen ( Qt : : black ) ) ;
plot - > yAxis - > setTickPen ( QPen ( Qt : : black ) ) ;
plot - > graph ( 0 ) - > setPen ( QPen ( Qt : : blue ) ) ;
}
2018-06-20 06:45:56 +00:00
}
2018-06-19 19:58:52 +00:00
void wfmain : : runDelayedCommand ( )
{
2018-06-23 07:31:41 +00:00
cmds qdCmd ;
2020-03-17 22:15:01 +00:00
// Note: This cmdOut queue will be removed entirely soon and only the cmdOutQue will be available.
2018-06-19 19:58:52 +00:00
switch ( cmdOut )
{
case cmdGetFreq :
emit getFrequency ( ) ;
break ;
case cmdGetMode :
emit getMode ( ) ;
break ;
default :
break ;
}
2018-06-25 07:34:33 +00:00
cmdOut = cmdNone ; // yep. Hope this wasn't called twice in a row rapidly.
2018-06-23 07:31:41 +00:00
2019-01-10 06:44:48 +00:00
// Note: All command should use this queue. There is no need to use the above system.
2018-06-23 07:31:41 +00:00
if ( ! cmdOutQue . isEmpty ( ) )
{
qdCmd = cmdOutQue . takeFirst ( ) ;
switch ( qdCmd )
{
2018-11-20 07:42:34 +00:00
case cmdNone :
2018-11-29 22:32:59 +00:00
//qDebug() << "NOOP";
2018-11-20 07:42:34 +00:00
break ;
case cmdGetRigID :
emit getRigID ( ) ;
break ;
2021-01-30 06:09:09 +00:00
case cmdGetRigCIV :
2021-01-30 08:44:36 +00:00
// if(!know rig civ already)
if ( ! haveRigCaps )
{
emit getRigCIV ( ) ;
cmdOutQue . append ( cmdGetRigCIV ) ; // This way, we stay here until we get an answer.
}
2021-01-30 06:09:09 +00:00
break ;
2018-06-23 07:31:41 +00:00
case cmdGetFreq :
emit getFrequency ( ) ;
break ;
case cmdGetMode :
emit getMode ( ) ;
break ;
case cmdGetDataMode :
2018-11-29 22:32:59 +00:00
// qDebug() << "Sending query for data mode";
2018-06-25 07:34:33 +00:00
emit getDataMode ( ) ;
2018-06-23 07:31:41 +00:00
break ;
2018-11-07 23:54:03 +00:00
case cmdSetDataModeOff :
emit setDataMode ( false ) ;
break ;
case cmdSetDataModeOn :
emit setDataMode ( true ) ;
break ;
2018-11-16 22:08:21 +00:00
case cmdDispEnable :
emit scopeDisplayEnable ( ) ;
break ;
case cmdDispDisable :
emit scopeDisplayDisable ( ) ;
break ;
case cmdSpecOn :
emit spectOutputEnable ( ) ;
break ;
case cmdSpecOff :
emit spectOutputDisable ( ) ;
break ;
2018-11-17 06:19:44 +00:00
case cmdGetRxGain :
emit getRfGain ( ) ;
break ;
case cmdGetAfGain :
emit getAfGain ( ) ;
break ;
2018-11-18 08:01:20 +00:00
case cmdGetSql :
emit getSql ( ) ;
break ;
2018-12-20 18:56:54 +00:00
case cmdGetATUStatus :
emit getATUStatus ( ) ;
break ;
2018-06-23 07:31:41 +00:00
default :
break ;
}
}
if ( cmdOutQue . isEmpty ( ) )
{
// done
} else {
// next
2018-11-28 06:02:37 +00:00
// TODO: If we always do ->start, then it will not be necessary for
// every command insertion to include a ->start.... probably worth doing.
2018-06-23 07:31:41 +00:00
delayedCommand - > start ( ) ;
}
2018-06-19 19:58:52 +00:00
}
2021-01-25 00:16:38 +00:00
void wfmain : : receiveRigID ( rigCapabilities rigCaps )
{
// Note: We intentionally request rigID several times
// because without rigID, we can't do anything with the waterfall.
if ( haveRigCaps )
{
return ;
} else {
2021-02-02 09:05:59 +00:00
# ifdef QT_DEBUG
qDebug ( ) < < " Rig name: " < < rigCaps . modelName ;
qDebug ( ) < < " Has LAN capabilities: " < < rigCaps . hasLan ;
2021-01-25 00:16:38 +00:00
qDebug ( ) < < " Rig ID received into wfmain: spectLenMax: " < < rigCaps . spectLenMax ;
qDebug ( ) < < " Rig ID received into wfmain: spectAmpMax: " < < rigCaps . spectAmpMax ;
qDebug ( ) < < " Rig ID received into wfmain: spectSeqMax: " < < rigCaps . spectSeqMax ;
qDebug ( ) < < " Rig ID received into wfmain: hasSpectrum: " < < rigCaps . hasSpectrum ;
2021-02-02 09:05:59 +00:00
# endif
2021-01-25 00:16:38 +00:00
this - > rigCaps = rigCaps ;
this - > spectWidth = rigCaps . spectLenMax ; // used once haveRigCaps is true.
haveRigCaps = true ;
prepareWf ( ) ;
// 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:
cmdOutQue . append ( cmdGetFreq ) ;
cmdOutQue . append ( cmdGetMode ) ;
}
}
2018-06-19 19:58:52 +00:00
void wfmain : : receiveFreq ( double freqMhz )
{
2021-01-25 00:16:38 +00:00
//qDebug() << "HEY WE GOT A Frequency: " << freqMhz;
2018-06-19 19:58:52 +00:00
ui - > freqLabel - > setText ( QString ( " %1 " ) . arg ( freqMhz , 0 , ' f ' ) ) ;
2018-06-20 06:45:56 +00:00
this - > freqMhz = freqMhz ;
2018-07-04 00:20:03 +00:00
this - > knobFreqMhz = freqMhz ;
2019-12-26 08:27:14 +00:00
//showStatusBarText(QString("Frequency: %1").arg(freqMhz));
2018-11-07 23:54:03 +00:00
}
void wfmain : : receivePTTstatus ( bool pttOn )
{
2018-11-16 22:08:21 +00:00
// NOTE: This will only show up if we actually receive a PTT status
2018-11-07 23:54:03 +00:00
qDebug ( ) < < " PTT status: " < < pttOn ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : receiveSpectrumData ( QByteArray spectrum , double startFreq , double endFreq )
{
2021-01-25 00:16:38 +00:00
if ( ! haveRigCaps )
{
2021-02-02 09:05:59 +00:00
# ifdef QT_DEBUG
2021-01-25 00:16:38 +00:00
qDebug ( ) < < " Spectrum received, but RigID incomplete. " ;
2021-02-02 09:05:59 +00:00
# endif
2021-01-25 00:16:38 +00:00
return ;
}
2018-06-19 19:58:52 +00:00
if ( ( startFreq ! = oldLowerFreq ) | | ( endFreq ! = oldUpperFreq ) )
{
2019-01-10 06:44:48 +00:00
// If the frequency changed and we were drawing peaks, now is the time to clearn them
2018-06-19 19:58:52 +00:00
if ( drawPeaks )
2019-01-10 06:44:48 +00:00
{
// TODO: create non-button function to do this
// This will break if the button is ever moved or renamed.
2018-06-19 19:58:52 +00:00
on_clearPeakBtn_clicked ( ) ;
2019-01-10 06:44:48 +00:00
}
2018-06-19 19:58:52 +00:00
}
oldLowerFreq = startFreq ;
oldUpperFreq = endFreq ;
//qDebug() << "start: " << startFreq << " end: " << endFreq;
quint16 specLen = spectrum . length ( ) ;
//qDebug() << "Spectrum data received at UI! Length: " << specLen;
2021-01-25 00:16:38 +00:00
//if( (specLen != 475) || (specLen!=689) )
if ( specLen ! = rigCaps . spectLenMax )
2018-06-19 19:58:52 +00:00
{
2021-02-02 09:05:59 +00:00
# ifdef QT_DEBUG
2021-01-25 00:16:38 +00:00
qDebug ( ) < < " ------------------------------------------- " ;
qDebug ( ) < < " ------ Unusual spectrum received, length: " < < specLen ;
qDebug ( ) < < " ------ Expected spectrum length: " < < rigCaps . spectLenMax ;
qDebug ( ) < < " ------ This should happen once at most. " ;
2021-02-02 09:05:59 +00:00
# endif
2018-06-19 19:58:52 +00:00
return ; // safe. Using these unusual length things is a problem.
}
QVector < double > x ( spectWidth ) , y ( spectWidth ) , y2 ( spectWidth ) ;
for ( int i = 0 ; i < spectWidth ; i + + )
{
x [ i ] = ( i * ( endFreq - startFreq ) / spectWidth ) + startFreq ;
}
for ( int i = 0 ; i < specLen ; i + + )
{
//x[i] = (i * (endFreq-startFreq)/specLen) + startFreq;
y [ i ] = spectrum . at ( i ) ;
if ( drawPeaks )
{
if ( spectrum . at ( i ) > spectrumPeaks . at ( i ) )
{
spectrumPeaks [ i ] = spectrum . at ( i ) ;
}
y2 [ i ] = spectrumPeaks . at ( i ) ;
}
}
//ui->qcp->addGraph();
plot - > graph ( 0 ) - > setData ( x , y ) ;
2018-06-20 06:45:56 +00:00
if ( ( freqMhz < endFreq ) & & ( freqMhz > startFreq ) )
{
2018-07-04 00:20:03 +00:00
// tracer->setGraphKey(freqMhz);
tracer - > setGraphKey ( knobFreqMhz ) ;
2018-06-20 06:45:56 +00:00
}
2018-06-19 19:58:52 +00:00
if ( drawPeaks )
{
plot - > graph ( 1 ) - > setData ( x , y2 ) ; // peaks
}
plot - > yAxis - > setRange ( 0 , 160 ) ;
plot - > xAxis - > setRange ( startFreq , endFreq ) ;
plot - > replot ( ) ;
if ( specLen = = spectWidth )
{
wfimage . prepend ( spectrum ) ;
if ( wfimage . length ( ) > wfLength )
{
wfimage . remove ( wfLength ) ;
}
// Waterfall:
for ( int row = 0 ; row < wfLength ; row + + )
{
for ( int col = 0 ; col < spectWidth ; col + + )
{
//colorMap->data()->cellToCoord(xIndex, yIndex, &x, &y)
// Very fast but doesn't roll downward:
//colorMap->data()->setCell( col, spectRowCurrent, spectrum.at(col) );
// Slow but rolls:
colorMap - > data ( ) - > setCell ( col , row , wfimage . at ( row ) . at ( col ) ) ;
}
}
//colorMap->data()->setRange(QCPRange(startFreq, endFreq), QCPRange(0,wfLength-1));
wf - > yAxis - > setRange ( 0 , wfLength - 1 ) ;
wf - > xAxis - > setRange ( 0 , spectWidth - 1 ) ;
wf - > replot ( ) ;
spectRowCurrent = ( spectRowCurrent + 1 ) % wfLength ;
//qDebug() << "updating spectrum, new row is: " << spectRowCurrent;
}
}
2021-02-05 06:44:15 +00:00
void wfmain : : receiveSpectrumFixedMode ( bool isFixed )
{
ui - > scopeCenterModeChk - > setChecked ( ! isFixed ) ;
}
2018-06-19 19:58:52 +00:00
void wfmain : : handlePlotDoubleClick ( QMouseEvent * me )
{
double x ;
2018-11-07 23:54:03 +00:00
//double y;
2018-06-19 19:58:52 +00:00
//double px;
x = plot - > xAxis - > pixelToCoord ( me - > pos ( ) . x ( ) ) ;
2018-11-07 23:54:03 +00:00
//y = plot->yAxis->pixelToCoord(me->pos().y());
2018-06-19 19:58:52 +00:00
emit setFrequency ( x ) ;
cmdOut = cmdGetFreq ;
delayedCommand - > start ( ) ;
2018-11-07 23:54:03 +00:00
showStatusBarText ( QString ( " Going to %1 MHz " ) . arg ( x ) ) ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : handleWFDoubleClick ( QMouseEvent * me )
{
double x ;
//double y;
//x = wf->xAxis->pixelToCoord(me->pos().x());
//y = wf->yAxis->pixelToCoord(me->pos().y());
// cheap trick until I figure out how the axis works on the WF:
x = plot - > xAxis - > pixelToCoord ( me - > pos ( ) . x ( ) ) ;
emit setFrequency ( x ) ;
cmdOut = cmdGetFreq ;
delayedCommand - > start ( ) ;
2018-11-07 23:54:03 +00:00
showStatusBarText ( QString ( " Going to %1 MHz " ) . arg ( x ) ) ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : handlePlotClick ( QMouseEvent * me )
{
2018-11-07 23:54:03 +00:00
double x = plot - > xAxis - > pixelToCoord ( me - > pos ( ) . x ( ) ) ;
showStatusBarText ( QString ( " Selected %1 MHz " ) . arg ( x ) ) ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : handleWFClick ( QMouseEvent * me )
{
2018-11-07 23:54:03 +00:00
double x = plot - > xAxis - > pixelToCoord ( me - > pos ( ) . x ( ) ) ;
showStatusBarText ( QString ( " Selected %1 MHz " ) . arg ( x ) ) ;
2018-06-19 19:58:52 +00:00
}
2020-04-21 04:10:20 +00:00
void wfmain : : handleWFScroll ( QWheelEvent * we )
{
// The wheel event is typically
// .y() and is +/- 120.
// We will click the dial once for every 120 received.
//QPoint delta = we->angleDelta();
2021-02-02 09:05:59 +00:00
// TODO: Use other method, knob has too few positions to be useful for large steps.
2020-04-21 04:10:20 +00:00
int steps = we - > angleDelta ( ) . y ( ) / 120 ;
2020-04-21 04:23:34 +00:00
Qt : : KeyboardModifiers key = we - > modifiers ( ) ;
if ( key = = Qt : : ShiftModifier )
{
2021-02-02 09:05:59 +00:00
steps * = 20 ;
2020-04-21 04:23:34 +00:00
} else if ( key = = Qt : : ControlModifier )
{
steps * = 10 ;
}
2020-04-21 19:35:44 +00:00
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) + ( steps ) * ui - > freqDial - > singleStep ( ) ) ;
2020-04-21 04:10:20 +00:00
}
void wfmain : : handlePlotScroll ( QWheelEvent * we )
{
int steps = we - > angleDelta ( ) . y ( ) / 120 ;
2020-04-21 04:23:34 +00:00
Qt : : KeyboardModifiers key = we - > modifiers ( ) ;
if ( key = = Qt : : ShiftModifier )
{
// TODO: Zoom
} else if ( key = = Qt : : ControlModifier )
{
steps * = 10 ;
}
2020-04-21 19:35:44 +00:00
ui - > freqDial - > setValue ( ui - > freqDial - > value ( ) + ( steps ) * ui - > freqDial - > singleStep ( ) ) ;
2020-04-21 04:10:20 +00:00
}
2018-06-19 19:58:52 +00:00
void wfmain : : on_startBtn_clicked ( )
{
emit spectOutputEnable ( ) ;
}
void wfmain : : on_stopBtn_clicked ( )
{
emit spectOutputDisable ( ) ;
//emit scopeDisplayDisable();
}
void wfmain : : receiveMode ( QString mode )
{
2018-11-30 06:31:20 +00:00
//ui->modeLabel->setText(mode);
2018-06-19 19:58:52 +00:00
int index ;
//bool ok;
2018-12-03 07:16:08 +00:00
index = modes . indexOf ( QRegExp ( mode ) ) ; // find the number corresponding to the mode
2018-12-18 22:34:04 +00:00
// qDebug() << "Received mode " << mode << " current mode: " << currentModeIndex << " search index: " << index;
2018-06-19 19:58:52 +00:00
if ( currentModeIndex = = index )
{
// do nothing, no need to change the selected mode and fire more events off.
2018-11-24 08:10:05 +00:00
// TODO/NOTE: This will not check the DATA mode status, may be worth re-thinking this.
// Do not update UI.
// return;
} else if ( ( index > = 0 ) & & ( index < 9 ) )
2018-06-19 19:58:52 +00:00
{
2019-01-10 06:44:48 +00:00
ui - > modeSelectCombo - > blockSignals ( true ) ;
2018-06-19 19:58:52 +00:00
ui - > modeSelectCombo - > setCurrentIndex ( index ) ;
2019-01-10 06:44:48 +00:00
ui - > modeSelectCombo - > blockSignals ( false ) ;
2018-06-19 19:58:52 +00:00
currentModeIndex = index ;
}
// Note: we need to know if the DATA mode is active to reach mode-D
// some kind of queued query:
2018-11-16 22:08:21 +00:00
cmdOutQue . append ( cmdGetDataMode ) ;
delayedCommand - > start ( ) ; // why was that commented out?
}
void wfmain : : receiveDataModeStatus ( bool dataEnabled )
{
2018-11-29 22:32:59 +00:00
// qDebug() << "Received data mode " << dataEnabled << "\n";
2018-11-16 22:08:21 +00:00
if ( dataEnabled )
{
if ( currentModeIndex = = 0 )
{
2018-11-27 07:10:23 +00:00
// LSB
2018-11-16 22:08:21 +00:00
ui - > modeSelectCombo - > setCurrentIndex ( 8 ) ;
2018-11-30 06:31:20 +00:00
//ui->modeLabel->setText( "LSB-D" );
2018-11-16 22:08:21 +00:00
} else if ( currentModeIndex = = 1 )
{
2018-11-27 07:10:23 +00:00
// USB
2018-11-16 22:08:21 +00:00
ui - > modeSelectCombo - > setCurrentIndex ( 9 ) ;
2018-11-30 06:31:20 +00:00
//ui->modeLabel->setText( "USB-D" );
2019-01-10 06:44:48 +00:00
}
2018-11-27 07:10:23 +00:00
} else {
// update to _not_ have the -D
ui - > modeSelectCombo - > setCurrentIndex ( currentModeIndex ) ;
// No need to update status label?
2018-11-16 22:08:21 +00:00
}
2018-06-19 19:58:52 +00:00
}
void wfmain : : on_clearPeakBtn_clicked ( )
{
2021-01-25 00:16:38 +00:00
if ( haveRigCaps )
{
spectrumPeaks = QByteArray ( ( int ) spectWidth , ' \x01 ' ) ;
}
return ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : on_drawPeakChk_clicked ( bool checked )
{
if ( checked )
{
on_clearPeakBtn_clicked ( ) ; // clear
drawPeaks = true ;
} else {
drawPeaks = false ;
2020-03-27 23:34:32 +00:00
# if QCUSTOMPLOT_VERSION >= 0x020000
plot - > graph ( 1 ) - > data ( ) - > clear ( ) ;
# else
2018-06-19 19:58:52 +00:00
plot - > graph ( 1 ) - > clearData ( ) ;
2020-03-27 23:34:32 +00:00
# endif
2018-06-19 19:58:52 +00:00
}
2018-11-27 07:10:23 +00:00
prefs . drawPeaks = checked ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : on_fullScreenChk_clicked ( bool checked )
{
if ( checked )
2018-11-28 06:02:37 +00:00
{
2018-06-19 19:58:52 +00:00
this - > showFullScreen ( ) ;
2018-11-28 06:02:37 +00:00
onFullscreen = true ;
} else {
2018-06-19 19:58:52 +00:00
this - > showNormal ( ) ;
2018-11-28 06:02:37 +00:00
onFullscreen = false ;
}
2018-11-27 07:10:23 +00:00
prefs . useFullScreen = checked ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : on_goFreqBtn_clicked ( )
{
bool ok = false ;
double freq = ui - > freqMhzLineEdit - > text ( ) . toDouble ( & ok ) ;
if ( ok )
{
emit setFrequency ( freq ) ;
2018-11-24 08:10:05 +00:00
// TODO: change to cmdQueue
2018-06-19 19:58:52 +00:00
cmdOut = cmdGetFreq ;
delayedCommand - > start ( ) ;
}
ui - > freqMhzLineEdit - > selectAll ( ) ;
freqTextSelected = true ;
2018-11-16 22:08:21 +00:00
ui - > tabWidget - > setCurrentIndex ( 0 ) ;
2018-06-19 19:58:52 +00:00
}
void wfmain : : checkFreqSel ( )
{
if ( freqTextSelected )
{
freqTextSelected = false ;
ui - > freqMhzLineEdit - > clear ( ) ;
}
}
void wfmain : : on_f0btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 0 " ) ) ;
}
void wfmain : : on_f1btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 1 " ) ) ;
}
void wfmain : : on_f2btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 2 " ) ) ;
}
void wfmain : : on_f3btn_clicked ( )
{
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 3 " ) ) ;
}
void wfmain : : on_f4btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 4 " ) ) ;
}
void wfmain : : on_f5btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 5 " ) ) ;
}
void wfmain : : on_f6btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 6 " ) ) ;
}
void wfmain : : on_f7btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 7 " ) ) ;
}
void wfmain : : on_f8btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 8 " ) ) ;
}
void wfmain : : on_f9btn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " 9 " ) ) ;
}
void wfmain : : on_fDotbtn_clicked ( )
{
checkFreqSel ( ) ;
ui - > freqMhzLineEdit - > setText ( ui - > freqMhzLineEdit - > text ( ) . append ( " . " ) ) ;
}
void wfmain : : on_fBackbtn_clicked ( )
{
QString currentFreq = ui - > freqMhzLineEdit - > text ( ) ;
currentFreq . chop ( 1 ) ;
ui - > freqMhzLineEdit - > setText ( currentFreq ) ;
}
void wfmain : : on_fCEbtn_clicked ( )
{
ui - > freqMhzLineEdit - > clear ( ) ;
freqTextSelected = false ;
}
void wfmain : : on_scopeCenterModeChk_clicked ( bool checked )
{
emit setScopeCenterMode ( checked ) ;
}
void wfmain : : on_fEnterBtn_clicked ( )
{
2018-11-24 08:10:05 +00:00
// TODO: do not jump to main tab on enter, only on return
// or something.
// Maybe this should be an option in settings.
2018-06-19 19:58:52 +00:00
on_goFreqBtn_clicked ( ) ;
}
void wfmain : : on_scopeBWCombo_currentIndexChanged ( int index )
{
emit setScopeSpan ( ( char ) index ) ;
}
void wfmain : : on_scopeEdgeCombo_currentIndexChanged ( int index )
{
emit setScopeEdge ( ( char ) index + 1 ) ;
}
2018-06-25 07:34:33 +00:00
void wfmain : : on_modeSelectCombo_activated ( int index )
{
2018-11-07 23:54:03 +00:00
// Reference:
// 0 1 2 3 4
//modes << "LSB" << "USB" << "AM" << "CW" << "RTTY";
// 5 6 7 8 9
//modes << "FM" << "CW-R" << "RTTY-R" << "LSB-D" << "USB-D";
2019-02-03 22:09:06 +00:00
// The "acticvated" signal means the user initiated a mode change.
// This function is not called if code initated the change.
2018-06-19 19:58:52 +00:00
if ( index < 10 )
{
2018-11-07 23:54:03 +00:00
// qDebug() << "Mode selection changed. index: " << index;
2018-06-19 19:58:52 +00:00
if ( index > 7 )
{
// set data mode on
2018-11-07 23:54:03 +00:00
// emit setDataMode(true);
cmdOutQue . append ( cmdSetDataModeOn ) ;
delayedCommand - > start ( ) ;
index = index - 8 ;
2018-06-19 19:58:52 +00:00
} else {
// set data mode off
2018-11-07 23:54:03 +00:00
//emit setDataMode(false);
cmdOutQue . append ( cmdSetDataModeOff ) ;
delayedCommand - > start ( ) ;
2018-06-19 19:58:52 +00:00
}
2018-11-07 23:54:03 +00:00
emit setMode ( index ) ;
2018-06-19 19:58:52 +00:00
}
2018-06-25 07:34:33 +00:00
2018-06-19 19:58:52 +00:00
}
2018-06-22 23:31:52 +00:00
2018-11-16 22:08:21 +00:00
//void wfmain::on_freqDial_actionTriggered(int action)
//{
2018-06-25 07:34:33 +00:00
//qDebug() << "Action: " << action; // "7" == changed?
2018-11-07 23:54:03 +00:00
// TODO: remove this
2018-11-16 22:08:21 +00:00
//}
2018-06-22 23:31:52 +00:00
2018-06-25 07:34:33 +00:00
void wfmain : : on_freqDial_valueChanged ( int value )
{
2018-07-04 00:20:03 +00:00
// qDebug() << "Old value: " << oldFreqDialVal << " New value: " << value ;
2018-11-07 23:54:03 +00:00
double stepSize = 0.000100 ; // 100 Hz steps
2018-07-04 00:20:03 +00:00
double newFreqMhz = 0 ;
volatile int delta = 0 ;
int maxVal = ui - > freqDial - > maximum ( ) ;
int directPath = 0 ;
int crossingPath = 0 ;
int distToMaxNew = 0 ;
int distToMaxOld = 0 ;
if ( value = = 0 )
{
distToMaxNew = 0 ;
} else {
distToMaxNew = maxVal - value ;
}
if ( oldFreqDialVal ! = 0 )
{
distToMaxOld = maxVal - oldFreqDialVal ;
} else {
distToMaxOld = 0 ;
}
directPath = abs ( value - oldFreqDialVal ) ;
if ( value < maxVal / 2 )
{
crossingPath = value + distToMaxOld ;
} else {
crossingPath = distToMaxNew + oldFreqDialVal ;
}
if ( directPath > crossingPath )
{
// use crossing path, it is shorter
delta = crossingPath ;
// mnow calculate the direction:
if ( value > oldFreqDialVal )
{
// CW
delta = delta ;
} else {
// CCW
delta * = - 1 ;
}
} else {
// use direct path
// crossing path is larger than direct path, use direct path
//delta = directPath;
// now calculate the direction
delta = value - oldFreqDialVal ;
}
newFreqMhz = knobFreqMhz + ( delta * stepSize ) ;
// qDebug() << "old freq: " << knobFreqMhz << " new freq: " << newFreqMhz << "knobDelta: " << delta << " freq delta: " << newFreqMhz - knobFreqMhz;
2018-11-16 22:08:21 +00:00
if ( ui - > tuningFloorZerosChk - > isChecked ( ) )
{
newFreqMhz = ( double ) round ( newFreqMhz * 10000 ) / 10000.0 ;
}
2018-07-04 00:20:03 +00:00
this - > knobFreqMhz = newFreqMhz ; // the frequency we think we should be on.
oldFreqDialVal = value ;
ui - > freqLabel - > setText ( QString ( " %1 " ) . arg ( knobFreqMhz , 0 , ' f ' ) ) ;
emit setFrequency ( newFreqMhz ) ;
//emit getFrequency();
2018-06-25 07:34:33 +00:00
}
2018-11-16 22:08:21 +00:00
void wfmain : : receiveBandStackReg ( float freq , char mode , bool dataOn )
{
// read the band stack and apply by sending out commands
setFrequency ( freq ) ;
setMode ( mode ) ; // make sure this is what you think it is
// setDataMode(dataOn); // signal out
if ( dataOn )
{
cmdOutQue . append ( cmdSetDataModeOn ) ;
} else {
cmdOutQue . append ( cmdSetDataModeOff ) ;
}
cmdOutQue . append ( cmdGetFreq ) ;
cmdOutQue . append ( cmdGetMode ) ;
ui - > tabWidget - > setCurrentIndex ( 0 ) ;
delayedCommand - > start ( ) ;
}
void wfmain : : bandStackBtnClick ( )
{
bandStkRegCode = ui - > bandStkPopdown - > currentIndex ( ) + 1 ;
waitingForBandStackRtn = true ; // so that when the return is parsed we jump to this frequency/mode info
emit getBandStackReg ( bandStkBand , bandStkRegCode ) ;
}
void wfmain : : on_band6mbtn_clicked ( )
{
bandStkBand = 0x10 ; // 6 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band10mbtn_clicked ( )
{
bandStkBand = 0x09 ; // 10 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band12mbtn_clicked ( )
{
bandStkBand = 0x08 ; // 12 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band15mbtn_clicked ( )
{
bandStkBand = 0x07 ; // 15 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band17mbtn_clicked ( )
{
bandStkBand = 0x06 ; // 17 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band20mbtn_clicked ( )
{
bandStkBand = 0x05 ; // 20 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band30mbtn_clicked ( )
{
bandStkBand = 0x04 ; // 30 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band40mbtn_clicked ( )
{
bandStkBand = 0x03 ; // 40 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band60mbtn_clicked ( )
{
// This one is tricky. There isn't a band stack register on the
// 7300 for 60 meters, so we just drop to the middle of the band:
// Channel 1: 5330.5 kHz
// Channel 2: 5346.5 kHz
// Channel 3: 5357.0 kHz
// Channel 4: 5371.5 kHz
// Channel 5: 5403.5 kHz
// Really not sure what the best strategy here is, don't want to
// clutter the UI with 60M channel buttons...
setFrequency ( 5.3305 ) ;
}
void wfmain : : on_band80mbtn_clicked ( )
{
bandStkBand = 0x02 ; // 80 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_band160mbtn_clicked ( )
{
bandStkBand = 0x01 ; // 160 meters
bandStackBtnClick ( ) ;
}
void wfmain : : on_bandGenbtn_clicked ( )
{
// "GENE" general coverage frequency outside the ham bands
// which does probably include any 60 meter frequencies used.
bandStkBand = 0x11 ; // GEN
bandStackBtnClick ( ) ;
}
void wfmain : : on_aboutBtn_clicked ( )
{
// Show.....
// Build date, time, git checksum (short)
// QT library version
// stylesheet credit
// contact information
2020-03-12 00:44:47 +00:00
QMessageBox msgBox ( this ) ;
2020-03-14 02:43:12 +00:00
msgBox . setWindowTitle ( " Abou wfview " ) ;
2020-03-12 00:44:47 +00:00
msgBox . setTextFormat ( Qt : : RichText ) ;
2020-03-13 03:06:33 +00:00
msgBox . setWindowIcon ( QIcon ( " :resources/wfview.png " ) ) ;
2020-03-12 00:44:47 +00:00
// TODO: change style of link color based on current CSS sheet.
2020-03-10 17:17:39 +00:00
QString copyright = QString ( " Copyright 2017-2020 Elliott H. Liggett. All rights reserved. " ) ;
2020-03-16 01:03:35 +00:00
QString ssCredit = QString ( " <br/>Stylesheet qdarkstyle used under MIT license, stored in /usr/share/wfview/stylesheets/. " ) ;
2020-03-12 00:44:47 +00:00
QString contact = QString ( " <br/>email the author: kilocharlie8@gmail.com or W6EL on the air! " ) ;
QString website = QString ( " <br/><br/>Get the latest version from our gitlab repo: <a href='https://gitlab.com/eliggett/wfview' style='color: cyan;'>https://gitlab.com/eliggett/wfview</a> " ) ;
QString docs = QString ( " <br/>Also see the <a href='https://gitlab.com/eliggett/wfview/-/wikis/home' style='color: cyan;'>wiki</a> for the <a href='https://gitlab.com/eliggett/wfview/-/wikis/User-FAQ' style='color: cyan;'>FAQ</a>, <a href='https://gitlab.com/eliggett/wfview/-/wikis/Keystrokes' style='color: cyan;'>Keystrokes</a>, and more. " ) ;
QString buildInfo = QString ( " <br/><br/>Build " + QString ( GITSHORT ) + " on " + QString ( __DATE__ ) + " at " + __TIME__ + " by " + UNAME + " @ " + HOST ) ;
2018-11-16 22:08:21 +00:00
QString aboutText = copyright + " \n " + ssCredit + " \n " ;
2020-03-12 00:44:47 +00:00
aboutText . append ( contact + " \n " + website + " \n " + docs + " \n " + buildInfo ) ;
2018-11-16 22:08:21 +00:00
2020-03-12 00:44:47 +00:00
msgBox . setText ( aboutText ) ;
msgBox . exec ( ) ;
2018-11-16 22:08:21 +00:00
}
void wfmain : : on_aboutQtBtn_clicked ( )
{
2020-03-10 17:17:39 +00:00
QMessageBox : : aboutQt ( this , " wfview " ) ;
2018-11-16 22:08:21 +00:00
}
void wfmain : : on_fStoBtn_clicked ( )
{
// sequence:
// type frequency
// press Enter or Go
// change mode if desired
2018-11-24 08:10:05 +00:00
// type in index number 0 through 99
2018-11-16 22:08:21 +00:00
// press STO
2018-11-24 08:10:05 +00:00
bool ok ;
QString freqString ;
int preset_number = ui - > freqMhzLineEdit - > text ( ) . toInt ( & ok ) ;
if ( ok & & ( preset_number > = 0 ) & & ( preset_number < 100 ) )
{
// TODO: keep an enum around with the current mode
mem . setPreset ( preset_number , freqMhz , ( mode_kind ) ui - > modeSelectCombo - > currentIndex ( ) ) ;
2020-03-30 21:09:52 +00:00
showStatusBarText ( QString ( " Storing frequency %1 to memory location %2 " ) . arg ( freqMhz ) . arg ( preset_number ) ) ;
2018-11-24 08:10:05 +00:00
} else {
2020-03-30 21:09:52 +00:00
showStatusBarText ( QString ( " Could not store preset to %1. Valid preset numbers are 0 to 99 " ) . arg ( preset_number ) ) ;
2018-11-24 08:10:05 +00:00
}
2018-11-16 22:08:21 +00:00
}
void wfmain : : on_fRclBtn_clicked ( )
{
// Sequence:
// type memory location 0 through 99
// press RCL
// Program recalls data stored in vector at position specified
// drop contents into text box, press go button
// add delayed command for mode and data mode
2018-11-24 08:10:05 +00:00
preset_kind temp ;
bool ok ;
QString freqString ;
int preset_number = ui - > freqMhzLineEdit - > text ( ) . toInt ( & ok ) ;
if ( ok & & ( preset_number > = 0 ) & & ( preset_number < 100 ) )
{
temp = mem . getPreset ( preset_number ) ;
freqString = QString ( " %1 " ) . arg ( temp . frequency ) ;
ui - > freqMhzLineEdit - > setText ( freqString ) ;
ui - > goFreqBtn - > click ( ) ;
} else {
qDebug ( ) < < " Could not recall preset. Valid presets are 0 through 99. " ;
}
2018-11-16 22:08:21 +00:00
}
2018-11-17 06:19:44 +00:00
void wfmain : : on_rfGainSlider_valueChanged ( int value )
{
emit setRfGain ( ( unsigned char ) value ) ;
}
void wfmain : : on_afGainSlider_valueChanged ( int value )
{
2018-12-19 20:31:44 +00:00
// qDebug() << "Setting AF gain to " << value;
2018-11-17 06:19:44 +00:00
emit setAfGain ( ( unsigned char ) value ) ;
}
void wfmain : : receiveRfGain ( unsigned char level )
{
2018-11-18 08:01:20 +00:00
// qDebug() << "Receive RF level of" << (int)level << " = " << 100*level/255.0 << "%";
2018-12-19 20:31:44 +00:00
ui - > rfGainSlider - > blockSignals ( true ) ;
2018-11-17 06:19:44 +00:00
ui - > rfGainSlider - > setValue ( level ) ;
2018-12-19 20:31:44 +00:00
ui - > rfGainSlider - > blockSignals ( false ) ;
2018-11-17 06:19:44 +00:00
}
void wfmain : : receiveAfGain ( unsigned char level )
{
2018-12-19 20:31:44 +00:00
// qDebug() << "Receive AF level of" << (int)level << " = " << 100*level/255.0 << "%";
ui - > afGainSlider - > blockSignals ( true ) ;
2018-11-17 06:19:44 +00:00
ui - > afGainSlider - > setValue ( level ) ;
2018-12-19 20:31:44 +00:00
ui - > afGainSlider - > blockSignals ( false ) ;
2018-11-17 06:19:44 +00:00
}
2018-11-18 08:01:20 +00:00
void wfmain : : receiveSql ( unsigned char level )
{
2020-03-12 03:58:31 +00:00
// TODO: Maybe add squelch control
2018-11-29 22:32:59 +00:00
// qDebug() << "Receive SQL level of " << (int)level << " = " << 100*level/255.0 << "%";
2018-11-18 08:01:20 +00:00
// ui->sqlSlider->setValue(level); // No SQL control so far
2018-12-18 22:34:04 +00:00
( void ) level ;
2018-11-18 08:01:20 +00:00
}
2018-11-17 06:19:44 +00:00
void wfmain : : on_drawTracerChk_toggled ( bool checked )
{
tracer - > setVisible ( checked ) ;
2018-11-27 07:10:23 +00:00
prefs . drawTracer = checked ;
2018-11-17 06:19:44 +00:00
}
void wfmain : : on_tuneNowBtn_clicked ( )
{
emit startATU ( ) ;
2018-12-20 19:22:52 +00:00
showStatusBarText ( " Starting ATU tuning cycle... " ) ;
2018-12-19 20:31:44 +00:00
cmdOutQue . append ( cmdGetATUStatus ) ;
delayedCommand - > start ( ) ;
2018-11-17 07:13:59 +00:00
}
2018-11-17 06:19:44 +00:00
2018-11-17 07:13:59 +00:00
void wfmain : : on_tuneEnableChk_clicked ( bool checked )
{
emit setATU ( checked ) ;
if ( checked )
{
showStatusBarText ( " Turning on ATU " ) ;
} else {
showStatusBarText ( " Turning off ATU " ) ;
}
2018-11-17 06:19:44 +00:00
}
2018-11-20 07:42:34 +00:00
void wfmain : : on_exitBtn_clicked ( )
{
// Are you sure?
QApplication : : exit ( ) ;
}
2018-11-24 08:10:05 +00:00
void wfmain : : on_pttOnBtn_clicked ( )
{
// is it enabled?
2019-01-24 01:19:35 +00:00
if ( ! ui - > pttEnableChk - > isChecked ( ) )
{
2020-03-12 03:58:31 +00:00
showStatusBarText ( " PTT is disabled, not sending command. Change under Settings tab. " ) ;
2019-01-24 01:19:35 +00:00
return ;
}
2018-11-24 08:10:05 +00:00
2019-01-24 01:19:35 +00:00
// Are we already PTT? Not a big deal, just send again anyway.
2020-03-12 03:58:31 +00:00
showStatusBarText ( " Sending PTT ON command. Use Control-R to receive. " ) ;
2019-01-24 01:19:35 +00:00
emit setPTT ( true ) ;
2018-11-24 08:10:05 +00:00
// send PTT
// Start 3 minute timer
2019-01-24 01:19:35 +00:00
pttTimer - > start ( ) ;
2018-11-24 08:10:05 +00:00
}
void wfmain : : on_pttOffBtn_clicked ( )
{
// Send the PTT OFF command (more than once?)
2019-01-24 01:19:35 +00:00
showStatusBarText ( " Sending PTT OFF command " ) ;
emit setPTT ( false ) ;
2018-11-24 08:10:05 +00:00
2018-11-27 07:10:23 +00:00
// Stop the 3 min timer
2019-01-24 01:19:35 +00:00
pttTimer - > stop ( ) ;
}
void wfmain : : handlePttLimit ( )
{
// transmission time exceeded!
showStatusBarText ( " Transmit timeout at 3 minutes. Sending PTT OFF command now. " ) ;
emit setPTT ( false ) ;
2018-11-24 08:10:05 +00:00
}
2018-11-27 07:10:23 +00:00
void wfmain : : on_saveSettingsBtn_clicked ( )
{
saveSettings ( ) ; // save memory, UI, and radio settings
}
2018-12-19 20:31:44 +00:00
void wfmain : : receiveATUStatus ( unsigned char atustatus )
{
2018-12-20 19:22:52 +00:00
// qDebug() << "Received ATU status update: " << (unsigned int) atustatus;
2018-12-19 20:31:44 +00:00
switch ( atustatus )
{
case 0x00 :
// ATU not active
ui - > tuneEnableChk - > blockSignals ( true ) ;
ui - > tuneEnableChk - > setChecked ( false ) ;
ui - > tuneEnableChk - > blockSignals ( false ) ;
showStatusBarText ( " ATU not enabled. " ) ;
break ;
case 0x01 :
// ATU enabled
ui - > tuneEnableChk - > blockSignals ( true ) ;
ui - > tuneEnableChk - > setChecked ( true ) ;
ui - > tuneEnableChk - > blockSignals ( false ) ;
showStatusBarText ( " ATU enabled. " ) ;
break ;
case 0x02 :
// ATU tuning in-progress.
// Add command queue to check again and update status bar
2018-12-20 19:22:52 +00:00
// qDebug() << "Received ATU status update that *tuning* is taking place";
showStatusBarText ( " ATU is Tuning... " ) ;
cmdOutQue . append ( cmdGetATUStatus ) ; // Sometimes the first hit seems to be missed.
2018-12-19 20:31:44 +00:00
cmdOutQue . append ( cmdGetATUStatus ) ;
delayedCommand - > start ( ) ;
break ;
2018-12-20 18:56:54 +00:00
default :
qDebug ( ) < < " Did not understand ATU status: " < < ( unsigned int ) atustatus ;
2018-12-20 19:22:52 +00:00
break ;
2018-12-19 20:31:44 +00:00
}
}
2019-02-10 07:13:18 +00:00
void wfmain : : on_pttEnableChk_clicked ( bool checked )
{
prefs . enablePTT = checked ;
}
2021-02-03 19:36:35 +00:00
void wfmain : : on_lanEnableChk_clicked ( bool checked )
{
prefs . enableLAN = checked ;
2021-02-05 04:54:34 +00:00
ui - > ipAddressTxt - > setEnabled ( checked ) ;
ui - > controlPortTxt - > setEnabled ( checked ) ;
ui - > serialPortTxt - > setEnabled ( checked ) ;
ui - > audioPortTxt - > setEnabled ( checked ) ;
ui - > usernameTxt - > setEnabled ( checked ) ;
ui - > passwordTxt - > setEnabled ( checked ) ;
if ( checked )
{
showStatusBarText ( " After filling in values, press Save Settings and re-start wfview. " ) ;
}
2021-02-03 19:36:35 +00:00
}
void wfmain : : on_ipAddressTxt_textChanged ( QString text )
{
prefs . ipAddress = text ;
}
void wfmain : : on_controlPortTxt_textChanged ( QString text )
{
2021-02-05 04:54:34 +00:00
prefs . controlLANPort = text . toUInt ( ) ;
2021-02-03 19:36:35 +00:00
}
void wfmain : : on_serialPortTxt_textChanged ( QString text )
{
2021-02-05 04:54:34 +00:00
prefs . serialLANPort = text . toUInt ( ) ;
2021-02-03 19:36:35 +00:00
}
void wfmain : : on_audioPortTxt_textChanged ( QString text )
{
2021-02-05 04:54:34 +00:00
prefs . audioLANPort = text . toUInt ( ) ;
2021-02-03 19:36:35 +00:00
}
void wfmain : : on_usernameTxt_textChanged ( QString text )
{
prefs . username = text ;
}
void wfmain : : on_passwordTxt_textChanged ( QString text )
{
prefs . password = text ;
}
2021-02-04 10:27:30 +00:00
void wfmain : : on_audioOutputCombo_currentIndexChanged ( QString text )
{
prefs . audioOutput = text ;
}
2018-12-18 22:34:04 +00:00
// --- DEBUG FUNCTION ---
void wfmain : : on_debugBtn_clicked ( )
{
2021-01-30 06:09:09 +00:00
qDebug ( ) < < " Debug button pressed. " ;
2019-12-26 08:27:14 +00:00
// TODO: Why don't these commands work?!
//emit getScopeMode();
//emit getScopeEdge(); // 1,2,3 only in "fixed" mode
//emit getScopeSpan(); // in khz, only in "center" mode
2021-01-30 06:09:09 +00:00
qDebug ( ) < < " Debug: finding rigs attached. Let's see if this works. " ;
rig - > findRigs ( ) ;
2018-12-18 22:34:04 +00:00
}