1 // -*- Mode: C++ -*-
2 #ifndef MAINWINDOW_H
3 #define MAINWINDOW_H
4 
5 #include <QMainWindow>
6 #include <QByteArray>
7 #include <QString>
8 #include <QStringList>
9 #include <QLabel>
10 #include <QThread>
11 #include <QProcess>
12 #include <QProgressBar>
13 #include <QTimer>
14 #include <QDateTime>
15 #include <QList>
16 #include <QAudioDeviceInfo>
17 #include <QScopedPointer>
18 #include <QDir>
19 #include <QProgressDialog>
20 #include <QAbstractSocket>
21 #include <QHostAddress>
22 #include <QPointer>
23 #include <QSet>
24 #include <QVector>
25 #include <QQueue>
26 #include <QFuture>
27 #include <QFutureWatcher>
28 #include <qrzlookup.h>
29 
30 #include "MultiGeometryWidget.hpp"
31 #include "NonInheritingProcess.hpp"
32 #include "Audio/AudioDevice.hpp"
33 #include "commons.h"
34 #include "Radio.hpp"
35 #include "models/Modes.hpp"
36 #include "models/FrequencyList.hpp"
37 #include "Configuration.hpp"
38 #include "WSPR/WSPRBandHopping.hpp"
39 #include "Transceiver/Transceiver.hpp"
40 #include "DisplayManual.hpp"
41 #include "Network/PSKReporter.hpp"
42 #include "logbook/logbook.h"
43 #include "astro.h"
44 #include "MessageBox.hpp"
45 #include "Network/NetworkAccessManager.hpp"
46 
47 #define NUM_JT4_SYMBOLS 206                //(72+31)*2, embedded sync
48 #define NUM_JT65_SYMBOLS 126               //63 data + 63 sync
49 #define NUM_JT9_SYMBOLS 85                 //69 data + 16 sync
50 #define NUM_WSPR_SYMBOLS 162               //(50+31)*2, embedded sync
51 #define NUM_MSK144_SYMBOLS 144             //s8 + d48 + s8 + d80
52 #define NUM_Q65_SYMBOLS 85                 //63 data + 22 sync
53 #define NUM_FT8_SYMBOLS 79
54 #define NUM_FT4_SYMBOLS 105
55 #define NUM_FST4_SYMBOLS 160             //240/2 data + 5*8 sync
56 #define NUM_CW_SYMBOLS 250
57 #define MAX_NUM_SYMBOLS 250
58 #define TX_SAMPLE_RATE 48000
59 #define NRING 3456000
60 
61 extern int volatile itone[MAX_NUM_SYMBOLS];   //Audio tones for all Tx symbols
62 extern int volatile icw[NUM_CW_SYMBOLS];	    //Dits for CW ID
63 
64 //--------------------------------------------------------------- MainWindow
65 namespace Ui {
66   class MainWindow;
67 }
68 
69 class QProcessEnvironment;
70 class QSharedMemory;
71 class QSplashScreen;
72 class QSettings;
73 class QLineEdit;
74 class QFont;
75 class QHostInfo;
76 class EchoGraph;
77 class FastGraph;
78 class WideGraph;
79 class LogQSO;
80 class Transceiver;
81 class MessageAveraging;
82 class FoxLogWindow;
83 class CabrilloLogWindow;
84 class ColorHighlighting;
85 class MessageClient;
86 class QTime;
87 class WSPRBandHopping;
88 
89 // Z
90 class UnfilteredView;
91 class PSKReporterWidget;
92 
93 class HelpTextWindow;
94 class WSPRNet;
95 class SoundOutput;
96 class Modulator;
97 class SoundInput;
98 class Detector;
99 class SampleDownloader;
100 class MultiSettings;
101 class EqualizationToolsDialog;
102 class DecodedText;
103 
104 class MainWindow
105   : public MultiGeometryWidget<3, QMainWindow>
106 {
107   Q_OBJECT;
108 
109 public:
110   using Frequency = Radio::Frequency;
111   using FrequencyDelta = Radio::FrequencyDelta;
112   using Mode = Modes::Mode;
113 
114   explicit MainWindow(QDir const& temp_directory, bool multiple, MultiSettings *,
115                       QSharedMemory *shdmem, unsigned downSampleFactor,
116                       QSplashScreen *, QProcessEnvironment const&,
117                       QWidget *parent = nullptr);
118   ~MainWindow();
119 
decoderBusy()120   int decoderBusy () const {return m_decoderBusy;}
121   // Z
122   void log(QString s);
123 
124 public slots:
125   void showSoundInError(const QString& errorMsg);
126   void showSoundOutError(const QString& errorMsg);
127   void showStatusMessage(const QString& statusMsg);
128   void dataSink(qint64 frames);
129   void fastSink(qint64 frames);
130   void diskDat();
131   void freezeDecode(int n);
132   void guiUpdate();
133   void doubleClickOnCall (Qt::KeyboardModifiers);
134   void doubleClickOnCall2(Qt::KeyboardModifiers);
135   void doubleClickOnFoxQueue(Qt::KeyboardModifiers);
136   void readFromStdout();
137   void p1ReadFromStdout();
138   void setXIT(int n, Frequency base = 0u);
139   void setFreq4(int rxFreq, int txFreq);
140   void msgAvgDecode2();
141   void fastPick(int x0, int x1, int y);
142 
143 private:
144   void change_layout (std::size_t) override;
145   void keyPressEvent (QKeyEvent *) override;
146   void closeEvent(QCloseEvent *) override;
147   void childEvent(QChildEvent *) override;
148   bool eventFilter(QObject *, QEvent *) override;
149 
150 private slots:
151   void initialize_fonts ();
152   void on_tx1_editingFinished();
153   void on_tx2_editingFinished();
154   void on_tx3_editingFinished();
155   void on_tx4_editingFinished();
156   void on_tx5_currentTextChanged (QString const&);
157   void on_tx6_editingFinished();
158   void on_actionSettings_triggered();
159   void on_monitorButton_clicked (bool);
160   void on_actionAbout_triggered();
161   void on_autoButton_clicked (bool);
162   void on_stopTxButton_clicked();
163   void on_stopButton_clicked();
164   void on_actionRelease_Notes_triggered ();
165   void on_actionFT8_DXpedition_Mode_User_Guide_triggered();
166   void on_actionQSG_FST4_triggered();
167   void on_actionQSG_Q65_triggered();
168   void on_actionQSG_X250_M3_triggered();
169   void on_actionOnline_User_Guide_triggered();
170   void on_actionLocal_User_Guide_triggered();
171   void on_actionWide_Waterfall_triggered();
172   void on_actionOpen_triggered();
173   void on_actionOpen_next_in_directory_triggered();
174   void on_actionDecode_remaining_files_in_directory_triggered();
175   void on_actionDelete_all_wav_files_in_SaveDir_triggered();
176   void on_actionOpen_log_directory_triggered ();
177   void on_actionNone_triggered();
178   void on_actionSave_all_triggered();
179   void on_actionKeyboard_shortcuts_triggered();
180   void on_actionSpecial_mouse_commands_triggered();
181   void on_actionSolve_FreqCal_triggered();
182   void on_actionCopyright_Notice_triggered();
183   void on_actionSWL_Mode_triggered (bool checked);
184   void on_DecodeButton_clicked (bool);
185   void decode();
186   void decodeBusy(bool b);
187   void on_EraseButton_clicked();
188   void band_activity_cleared ();
189   void rx_frequency_activity_cleared ();
190   void on_txFirstCheckBox_stateChanged(int arg1);
191   void set_dateTimeQSO(int m_ntx);
192   void set_ntx(int n);
193   void on_txrb1_toggled(bool status);
194   void on_txrb1_doubleClicked ();
195   void on_txrb2_toggled(bool status);
196   void on_txrb3_toggled(bool status);
197   void on_txrb4_toggled(bool status);
198   void on_txrb4_doubleClicked ();
199   void on_txrb5_toggled(bool status);
200   void on_txrb5_doubleClicked ();
201   void on_txrb6_toggled(bool status);
202   void on_txb1_clicked();
203   void on_txb1_doubleClicked ();
204   void on_txb2_clicked();
205   void on_txb3_clicked();
206   void on_txb4_clicked();
207   void on_txb4_doubleClicked ();
208   void on_txb5_clicked();
209   void on_txb5_doubleClicked ();
210   void on_txb6_clicked();
211   void on_lookupButton_clicked();
212   void on_addButton_clicked();
213   void on_dxCallEntry_textChanged (QString const&);
214   void on_dxGridEntry_textChanged (QString const&);
215   void on_dxCallEntry_returnPressed ();
216   void on_genStdMsgsPushButton_clicked();
217   void on_logQSOButton_clicked();
218   void on_actionJT9_triggered();
219   void on_actionJT65_triggered();
220   void on_actionJT4_triggered();
221   void on_actionFT4_triggered();
222   void on_actionFT8_triggered();
223   void on_actionFST4_triggered();
224   void on_actionFST4W_triggered();
225   void on_TxFreqSpinBox_valueChanged(int arg1);
226   void on_actionSave_decoded_triggered();
227   void on_actionQuickDecode_toggled (bool);
228   void on_actionMediumDecode_toggled (bool);
229   void on_actionDeepestDecode_toggled (bool);
230   void bumpFqso(int n);
231   void on_actionErase_ALL_TXT_triggered();
232   void on_reset_cabrillo_log_action_triggered ();
233   void on_actionErase_wsjtx_log_adi_triggered();
234   void on_actionErase_WSPR_hashtable_triggered();
235   void on_actionExport_Cabrillo_log_triggered();
236   void startTx2();
237   void startP1();
238   void stopTx();
239   void stopTx2();
240   void on_rptSpinBox_valueChanged(int n);
241   void killFile();
242   void on_tuneButton_clicked (bool);
243   void on_pbR2T_clicked();
244   void on_pbT2R_clicked();
245   void acceptQSO (QDateTime const&, QString const& call, QString const& grid
246                   , Frequency dial_freq, QString const& mode
247                   , QString const& rpt_sent, QString const& rpt_received
248                   , QString const& tx_power, QString const& comments
249                   , QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
250                   , QString const& my_call, QString const& my_grid
251                   , QString const& exchange_sent, QString const& exchange_rcvd
252                   , QString const& propmode, QByteArray const& ADIF);
253   void on_bandComboBox_currentIndexChanged (int index);
254   void on_bandComboBox_editTextChanged (QString const& text);
255   void on_bandComboBox_activated (int index);
256   void on_readFreq_clicked();
257   void on_RxFreqSpinBox_valueChanged(int n);
258   void on_outAttenuation_valueChanged (int);
259   void rigOpen ();
260   void handle_transceiver_update (Transceiver::TransceiverState const&);
261   void handle_transceiver_failure (QString const& reason);
262   void on_actionAstronomical_data_toggled (bool);
263   void on_actionShort_list_of_add_on_prefixes_and_suffixes_triggered();
264   void band_changed (Frequency);
265   void monitor (bool);
266   void end_tuning ();
267   void stop_tuning ();
268   void stopTuneATU();
269   void auto_tx_mode(bool);
270   void on_actionMessage_averaging_triggered();
271   void on_contest_log_action_triggered ();
272   void on_fox_log_action_triggered ();
273   void on_actionColors_triggered();
274   void on_actionInclude_averaging_toggled (bool);
275   void on_actionInclude_correlation_toggled (bool);
276   void on_actionEnable_AP_DXcall_toggled (bool);
277   void on_actionAuto_Clear_Avg_toggled (bool);
278   void VHF_features_enabled(bool b);
279   void on_sbSubmode_valueChanged(int n);
280   void on_cbShMsgs_toggled(bool b);
281   void on_cbSWL_toggled(bool b);
282   void on_cbTx6_toggled(bool b);
283   void on_cbMenus_toggled(bool b);
284   void on_cbCQonly_toggled(bool b);
285   void on_cbFirst_toggled(bool b);
286   void on_cbAutoSeq_toggled(bool b);
287   void networkError (QString const&);
288   void on_ClrAvgButton_clicked();
289   void on_actionWSPR_triggered();
290   void on_syncSpinBox_valueChanged(int n);
291   void on_TxPowerComboBox_currentIndexChanged(int);
292   void on_sbTxPercent_valueChanged(int n);
293   void on_cbUploadWSPR_Spots_toggled(bool b);
294   void WSPR_config(bool b);
295   void uploadWSPRSpots (bool direct_post = false, QString const& decode_text = QString {});
296   void TxAgain();
297   void uploadResponse(QString const& response);
298   void on_WSPRfreqSpinBox_valueChanged(int n);
299   void on_sbFST4W_RxFreq_valueChanged(int n);
300   void on_sbFST4W_FTol_valueChanged(int n);
301   void on_pbTxNext_clicked(bool b);
302   void on_actionEcho_Graph_triggered();
303   void on_actionEcho_triggered();
304   void on_actionFast_Graph_triggered();
305   void fast_decode_done();
306   void on_actionMeasure_reference_spectrum_triggered();
307   void on_actionErase_reference_spectrum_triggered();
308   void on_actionMeasure_phase_response_triggered();
309   void on_sbTR_valueChanged (int);
310   void on_sbTR_FST4W_valueChanged (int);
311   void on_sbFtol_valueChanged (int);
312   void on_cbFast9_clicked(bool b);
313   void on_sbCQTxFreq_valueChanged(int n);
314   void on_cbCQTx_toggled(bool b);
315   void on_actionMSK144_triggered();
316   void on_actionQ65_triggered();
317   void on_actionFreqCal_triggered();
318   void splash_done ();
319   void on_measure_check_box_stateChanged (int);
320   void on_sbNlist_valueChanged(int n);
321   void on_sbNslots_valueChanged(int n);
322   void on_sbMax_dB_valueChanged(int n);
323   void on_sbF_Low_valueChanged(int n);
324   void on_sbF_High_valueChanged(int n);
325   void chk_FST4_freq_range();
326   void on_pbFoxReset_clicked();
327   void on_comboBoxHoundSort_activated (int index);
328   void not_GA_warning_message ();
329   void checkMSK144ContestType();
330   void on_pbBestSP_clicked();
331   void on_RoundRobin_currentTextChanged(QString text);
332   void  setTxMsg(int n);
333   bool stdCall(QString const& w);
334   void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode
335                          , bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call
336                          , QString const& dx_grid, bool generate_messages);
337 	// Z
338      void on_cbAutoCall_toggled(bool b);
339      void on_cbAutoCQ_toggled(bool b);
340      bool callsignFiltered(DecodedText dt);
341      void on_btn_addToIgnore_clicked();
342      void on_btn_clearIgnore_clicked();
343      void on_actionIgnore_station_triggered();
344      void on_actionCall_next_triggered();
345      void on_actionClear_triggered();
346      void on_cb_autoCallNext_toggled(bool b);
347      void on_cbMini_toggled(bool b);
348      void on_cbCQonlyIncl73_toggled(bool b);
349      void on_cb_filtering_toggled (bool b);
350      void on_actionSet_Rx_Freq_triggered();
351      void on_actionQRZ_Lookup_triggered();
352      void on_actionCopy_triggered();
353      void moveEvent(QMoveEvent *) override;
354      void hideEvent(QHideEvent *) override;
355      void showEvent(QShowEvent *) override;
356      void on_txrb6_doubleClicked ();
357      void dxLookup(QString dxCall, QString dxGrid);
358      void leftClickHandler(Qt::KeyboardModifiers modifiers);
359      void on_actionCall_info_triggered();
360      void on_actionDark_mode_triggered();
361      void qrzInit();
362      void qrzSetSessionKey(QNetworkReply *r) ;
363      void qrzResponseHandler(QNetworkReply * r);
364      void on_q_button_clicked();
365      void on_ci_pb_lookup_clicked();
366      void on_cb_specialMode_currentIndexChanged( int index);
367      void on_cb_autoModeSwitch_toggled(bool b);
368      void on_actionAbout_WSJT_Z_triggered();
369      void on_pb_WDReset_clicked();
370      void resetAutoSwitch();
371      int watchdog();
372      void on_actionUnfiltered_View_triggered();
373      void on_actionPSKReporter_triggered();
374      void updateQsoCounter(bool increment);
375      void on_txFirstCheckBox_toggled();
376 
377 private:
378   Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
379       unsigned channels, unsigned msBuffered) const;
380   Q_SIGNAL void stopAudioOutputStream () const;
381   Q_SIGNAL void startAudioInputStream (QAudioDeviceInfo const&,
382       int framesPerBuffer, AudioDevice * sink,
383       unsigned downSampleFactor, AudioDevice::Channel) const;
384   Q_SIGNAL void suspendAudioInputStream () const;
385   Q_SIGNAL void resumeAudioInputStream () const;
386   Q_SIGNAL void startDetector (AudioDevice::Channel) const;
387   Q_SIGNAL void FFTSize (unsigned) const;
388   Q_SIGNAL void detectorClose () const;
389   Q_SIGNAL void finished () const;
390   Q_SIGNAL void transmitFrequency (double) const;
391   Q_SIGNAL void endTransmitMessage (bool quick = false) const;
392   Q_SIGNAL void tune (bool = true) const;
393   Q_SIGNAL void sendMessage (QString mode, unsigned symbolsLength,
394       double framesPerSymbol, double frequency, double toneSpacing,
395       SoundOutput *, AudioDevice::Channel = AudioDevice::Mono,
396       bool synchronize = true, bool fastMode = false, double dBSNR = 99.,
397                              int TRperiod=60) const;
398   Q_SIGNAL void outAttenuationChanged (qreal) const;
399   Q_SIGNAL void toggleShorthand () const;
400   Q_SIGNAL void reset_audio_input_stream (bool report_dropped_frames) const;
401 
402 private:
403   void set_mode (QString const& mode);
404   void astroUpdate ();
405   void writeAllTxt(QString message);
406   void auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance);
407   void trim_view (bool b);
408   void foxTest();
409   void setColorHighlighting();
410   void chkFT4();
411   bool elide_tx1_not_allowed () const;
412   // Z
413   void ci_gridLookup();
414   void switchBands();
415   void ZMessage();
416   void ZProcess();
417 
418   QProcessEnvironment const& m_env;
419   NetworkAccessManager m_network_manager;
420   bool m_valid;
421   QSplashScreen * m_splash;
422   QString m_revision;
423   bool m_multiple;
424   MultiSettings * m_multi_settings;
425   QPushButton * m_configurations_button;
426   QSettings * m_settings;
427   QScopedPointer<Ui::MainWindow> ui;
428 
429   Configuration m_config;
430   LogBook m_logBook;            // must be after Configuration construction
431   WSPRBandHopping m_WSPR_band_hopping;
432   bool m_WSPR_tx_next;
433   MessageBox m_rigErrorMessageBox;
434   QScopedPointer<SampleDownloader> m_sampleDownloader;
435   QScopedPointer<EqualizationToolsDialog> m_equalizationToolsDialog;
436 
437   QScopedPointer<WideGraph> m_wideGraph;
438   QScopedPointer<EchoGraph> m_echoGraph;
439   QScopedPointer<FastGraph> m_fastGraph;
440   QScopedPointer<LogQSO> m_logDlg;
441   QScopedPointer<Astro> m_astroWidget;
442   QScopedPointer<HelpTextWindow> m_shortcuts;
443   QScopedPointer<HelpTextWindow> m_prefixes;
444   QScopedPointer<HelpTextWindow> m_mouseCmnds;
445   QScopedPointer<MessageAveraging> m_msgAvgWidget;
446   QScopedPointer<FoxLogWindow> m_foxLogWindow;
447   QScopedPointer<CabrilloLogWindow> m_contestLogWindow;
448   QScopedPointer<ColorHighlighting> m_colorHighlighting;
449   Transceiver::TransceiverState m_rigState;
450   Frequency  m_lastDialFreq;
451   QString m_lastBand;
452   QString m_lastCallsign;
453   Frequency  m_dialFreqRxWSPR;  // best guess at WSPR QRG
454 
455   Detector * m_detector;
456   unsigned m_FFTSize;
457   SoundInput * m_soundInput;
458   Modulator * m_modulator;
459   SoundOutput * m_soundOutput;
460   int m_rx_audio_buffer_frames;
461   int m_tx_audio_buffer_frames;
462   QThread m_audioThread;
463 
464   qint64  m_msErase;
465   qint64  m_secBandChanged;
466   qint64  m_freqMoon;
467   qint64  m_fullFoxCallTime;
468 
469   Frequency m_freqNominal;
470   Frequency m_freqTxNominal;
471   Astro::Correction m_astroCorrection;
472   bool m_reverse_Doppler;
473 
474   double  m_tRemaining;
475   double  m_TRperiod;
476 
477   float   m_DTtol;
478   float   m_t0;
479   float   m_t1;
480   float   m_t0Pick;
481   float   m_t1Pick;
482   float   m_fCPUmskrtd;
483 
484   qint32  m_waterfallAvg;
485   qint32  m_ntx;
486   bool m_gen_message_is_cq;
487   bool m_send_RR73;
488   qint32  m_timeout;
489   qint32  m_XIT;
490   qint32  m_setftx;
491   qint32  m_ndepth;
492   qint32  m_sec0;
493   qint32  m_RxLog;
494   qint32  m_nutc0;
495   qint32  m_ntr;
496   qint32  m_tx;
497   qint32  m_hsym;
498   qint32  m_nsps;
499   qint32  m_hsymStop;
500   qint32  m_inGain;
501   qint32  m_ncw;
502   qint32  m_secID;
503   qint32  m_idleMinutes;
504   qint32  m_nSubMode;
505   qint32  m_nclearave;
506   qint32  m_minSync;
507   qint32  m_dBm;
508   qint32  m_nWSPRdecodes;
509   qint32  m_k0;
510   qint32  m_kdone;
511   qint32  m_nPick;
512   FrequencyList_v2::const_iterator m_frequency_list_fcal_iter;
513   qint32  m_nTx73;
514   qint32  m_UTCdisk;
515   qint32  m_wait;
516   qint32  m_isort;
517   qint32  m_max_dB;
518   qint32  m_nDXped=0;
519   qint32  m_nSortedHounds=0;
520   qint32  m_nHoundsCalling=0;
521   qint32  m_Nlist=12;
522   qint32  m_Nslots=5;
523   qint32  m_nFoxMsgTimes[5]={0,0,0,0,0};
524   qint32  m_tAutoOn;
525   qint32  m_tFoxTx=0;
526   qint32  m_tFoxTx0=0;
527   qint32  m_maxStrikes=3;      //Max # of repeats: 3 strikes and you're out
528   qint32  m_maxFoxWait=3;      //Max wait time for expected Hound replies
529   qint32  m_foxCQtime=10;      //CQs at least every 5 minutes
530   qint32  m_tFoxTxSinceCQ=999; //Fox Tx cycles since most recent CQ
531   qint32  m_nFoxFreq;          //Audio freq at which Hound received a call from Fox
532   qint32  m_nSentFoxRrpt=0;    //Serial number for next R+rpt Hound will send to Fox
533   qint32  m_kin0=0;
534   qint32  m_earlyDecode=41;
535   qint32  m_earlyDecode2=47;
536   qint32  m_nDecodes=0;
537 
538   bool    m_btxok;		//True if OK to transmit
539   bool    m_diskData;
540   bool    m_loopall;
541   bool    m_decoderBusy;
542   bool    m_txFirst;
543   bool    m_auto;
544   bool    m_restart;
545   bool    m_startAnother;
546   bool    m_saveDecoded;
547   bool    m_saveAll;
548   bool    m_widebandDecode;
549   bool    m_call3Modified;
550   bool    m_dataAvailable;
551   bool    m_bDecoded;
552   bool    m_noSuffix;
553   bool    m_decodedText2;
554   bool    m_freeText;
555   bool    m_sentFirst73;
556   int     m_currentMessageType;
557   QString m_currentMessage;
558   int     m_lastMessageType;
559   QString m_lastMessageSent;
560   QString m_tBlankLine;
561   bool    m_bShMsgs;
562   bool    m_bSWL;
563   bool    m_uploadWSPRSpots;
564   bool    m_uploading;
565   bool    m_grid6;
566   bool    m_tuneup;
567   bool    m_bTxTime;
568   bool    m_rxDone;
569   bool    m_bSimplex; // not using split even if it is available
570   bool    m_bEchoTxOK;
571   bool    m_bTransmittedEcho;
572   bool    m_bEchoTxed;
573   bool    m_bFastMode;
574   bool    m_bFast9;
575   bool    m_bFastDecodeCalled;
576   bool    m_bDoubleClickAfterCQnnn;
577   bool    m_bRefSpec;
578   bool    m_bClearRefSpec;
579   bool    m_bTrain;
580   bool    m_bUseRef;
581   bool    m_bFastDone;
582   bool    m_bAltV;
583   bool    m_bNoMoreFiles;
584   bool    m_bDoubleClicked;
585   bool    m_bCallingCQ;
586   bool    m_bAutoReply;
587   bool    m_bCheckedContest;
588   bool    m_bWarnedSplit=false;
589   bool    m_bTUmsg;
590   bool    m_bBestSPArmed=false;
591   bool    m_bOK_to_chk=false;
592   bool    m_bSentReport=false;
593 
594   // Z
595   bool    m_beeped=false;
596   QString m_lastCall;
597   int	  m_lastX = -1;
598   int	  m_lastY = -1;
599   int     m_maxDistance = 0;
600   int     m_maxSignal = -30;
601   QString m_priorityCall;
602   int     m_decodeCount = 0;
603   bool    m_prioTxFirst;
604   int     m_prioFreq;
605   QString m_prioGrid;
606   bool    m_infoMessageShown = false;
607   bool    m_autoModeSwitch = false;
608   bool    m_timeToHop = false;
609   QScopedPointer<UnfilteredView> m_unfilteredView;
610   QScopedPointer<PSKReporterWidget> m_pskReporterView;
611   QThread * m_pskReporterThread;
612   QDateTime m_ignoreListReset;
613   qint64 m_msTxFirst;
614   bool m_TxFirstLock = false;
615   int qso_total = 0;
616   int qso_new = 0;
617 
618   QByteArray m_unfilteredViewGeometry;
619   QByteArray m_pskReporterViewGeometry;
620   enum
621     {
622       CALLING,
623       REPLYING,
624       REPORT,
625       ROGER_REPORT,
626       ROGERS,
627       SIGNOFF
628     }
629     m_QSOProgress;        //State machine counter
630 
631   enum {CALL, GRID, DXCC, MULT};
632 
633   int			m_ihsym;
634   int			m_nzap;
635   int			m_npts8;
636   float		m_px;
637   float   m_pxmax;
638   float		m_df3;
639   int			m_iptt0;
640   bool		m_btxok0;
641   int			m_nsendingsh;
642   double	m_onAirFreq0;
643   bool		m_first_error;
644 
645   char    m_msg[100][80];
646 
647   // labels in status bar
648   QLabel tx_status_label;
649   QLabel config_label;
650   QLabel mode_label;
651   QLabel last_tx_label;
652   // Z
653   QLabel qso_count;
654   QLabel labAz;
655   QLabel labDate;
656   QString qrzSessionKey;
657   QString qrzPendingLookupCall;
658   QNetworkAccessManager * networkManager;
659 
660   QLabel auto_tx_label;
661   QLabel band_hopping_label;
662   QLabel ndecodes_label;
663   QProgressBar progressBar;
664   QLabel watchdog_label;
665 
666   QFuture<void> m_wav_future;
667   QFutureWatcher<void> m_wav_future_watcher;
668   QFutureWatcher<void> watcher3;
669   QFutureWatcher<QString> m_saveWAVWatcher;
670 
671   NonInheritingProcess proc_jt9;
672   NonInheritingProcess p1;
673   NonInheritingProcess p3;
674 
675   WSPRNet *wsprNet;
676 
677   QTimer m_guiTimer;
678   QTimer ptt1Timer;                 //StartTx delay
679   QTimer ptt0Timer;                 //StopTx delay
680   QTimer logQSOTimer;
681   QTimer killFileTimer;
682   QTimer tuneButtonTimer;
683   QTimer uploadTimer;
684   QTimer tuneATU_Timer;
685   QTimer TxAgainTimer;
686   QTimer minuteTimer;
687   QTimer splashTimer;
688   QTimer p1Timer;
689 
690   QString m_path;
691   QString m_baseCall;
692   QString m_hisCall;
693   QString m_hisGrid;
694   QString m_appDir;
695   QString m_cqStr;
696   QString m_palette;
697   QString m_dateTime;
698   QString m_mode;
699   QString m_fnameWE;            // save path without extension
700   QString m_rpt;
701   QString m_nextRpt;
702   QString m_rptSent;
703   QString m_rptRcvd;
704   QString m_qsoStart;
705   QString m_qsoStop;
706   QStringList m_cmndP1;
707   QString m_msgSent0;
708   QString m_calls;
709   QString m_CQtype;
710   QString m_opCall;
711   QString m_houndCallers;        //Sorted list of Hound callers
712   QString m_fm0;
713   QString m_fm1;
714   QString m_xSent;               //Contest exchange sent
715   QString m_xRcvd;               //Contest exchange received
716   QString m_currentBand;
717   QString m_nextCall;
718   QString m_nextGrid;
719   QString m_fileDateTime;
720   QString m_inQSOwith;
721   QString m_BestCQpriority;
722 
723   QSet<QString> m_pfx;
724   QSet<QString> m_sfx;
725 
726   struct FoxQSO       //Everything we need to know about QSOs in progress (or recently logged).
727   {
728     QString grid;       //Hound's declared locator
729     QString sent;       //Report sent to Hound
730     QString rcvd;       //Report received from Hound
731     qint32  ncall;      //Number of times report sent to Hound
732     qint32  nRR73;      //Number of times RR73 sent to Hound
733     qint32  tFoxRrpt;   //m_tFoxTx (Fox Tx cycle counter) when R+rpt was received from Hound
734     qint32  tFoxTxRR73; //m_tFoxTx when RR73 was sent to Hound
735   };
736 
737   QMap<QString,FoxQSO> m_foxQSO;       //Key = HoundCall, value = parameters for QSO in progress
738   QMap<QString,QString> m_loggedByFox; //Key = HoundCall, value = logged band
739 
740   struct FixupQSO       //Info for fixing Fox's log from file "FoxQSO.txt"
741   {
742     QString grid;       //Hound's declared locator
743     QString sent;       //Report sent to Hound
744     QString rcvd;       //Report received from Hound
745     QDateTime QSO_time;
746   };
747   QMap<QString,FixupQSO> m_fixupQSO;       //Key = HoundCall, value = info for QSO in progress
748 
749   QQueue<QString> m_houndQueue;        //Selected Hounds available for starting a QSO
750   QQueue<QString> m_foxQSOinProgress;  //QSOs in progress: Fox has sent a report
751   QQueue<qint64>  m_foxRateQueue;
752 
753   QDateTime m_dateTimeQSOOn;
754   QDateTime m_dateTimeLastTX;
755   QDateTime m_dateTimeSentTx3;
756   QDateTime m_dateTimeRcvdRR73;
757   QDateTime m_dateTimeBestSP;
758   QDateTime m_dateTimeSeqStart;        //Nominal start time of Rx sequence about to be decoded
759 
760   QSharedMemory *mem_jt9;
761   QString m_QSOText;
762   unsigned m_downSampleFactor;
763   QThread::Priority m_audioThreadPriority;
764   bool m_bandEdited;
765   bool m_splitMode;
766   bool m_monitoring;
767   bool m_tx_when_ready;
768   bool m_transmitting;
769   bool m_tune;
770   bool m_tx_watchdog;           // true when watchdog triggered
771   bool m_block_pwr_tooltip;
772   bool m_PwrBandSetOK;
773   bool m_bDisplayedOnce;
774   Frequency m_lastMonitoredFrequency;
775   double m_toneSpacing;
776   int m_firstDecode;
777   QProgressDialog m_optimizingProgress;
778   QTimer m_heartbeat;
779   MessageClient * m_messageClient;
780   PSKReporter m_psk_Reporter;
781   DisplayManual m_manual;
782   QHash<QString, QVariant> m_pwrBandTxMemory; // Remembers power level by band
783   QHash<QString, QVariant> m_pwrBandTuneMemory; // Remembers power level by band for tuning
784   QByteArray m_geometryNoControls;
785   QVector<double> m_phaseEqCoefficients;
786   bool m_block_udp_status_updates;
787 
788   //---------------------------------------------------- private functions
789   // Z
790 
791   void qrzLookup(QString dxCall);
792   void qrzVisible(bool b);
793   void clearCallInfo();
794   QString  stateLookup(QString callsign);
795   QString leftJustifyAppendage (QString message, QString appendage);
796   void clearRXWindows();
797 
798   void readSettings();
799   void set_application_font (QFont const&);
800   void setDecodedTextFont (QFont const&);
801   void writeSettings();
802   void createStatusBar();
803   void updateStatusBar();
804   void genStdMsgs(QString rpt, bool unconditional = false);
805   void genCQMsg();
806   void clearDX ();
807   void lookup();
808   void ba2msg(QByteArray ba, char* message);
809   void msgtype(QString t, QLineEdit* tx);
810   void stub();
811   void statusChanged();
812   void fixStop();
813   bool shortList(QString callsign) const;
814   void transmit (double snr = 99.);
815   void rigFailure (QString const& reason);
816   void pskSetLocal ();
817   void pskPost(DecodedText const& decodedtext);
818   void displayDialFrequency ();
819   void transmitDisplay (bool);
820   void processMessage(DecodedText const& message, Qt::KeyboardModifiers = Qt::NoModifier);
821   void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence, quint8 modifiers);
822   void locationChange(QString const& location);
823   void replayDecodes ();
824   void postDecode (bool is_new, QString const& message);
825   void postWSPRDecode (bool is_new, QStringList message_parts);
826   void enable_DXCC_entity (bool on);
827   void switch_mode (Mode);
828   void WSPR_scheduling ();
829   void freqCalStep();
830   void setRig (Frequency = 0);  // zero frequency means no change
831   void WSPR_history(Frequency dialFreq, int ndecodes);
832   QString beacon_start_time (int n = 0);
833   QString WSPR_message();
834   void fast_config(bool b);
835   void CQTxFreq();
836   void useNextCall();
837   void abortQSO();
838   void write_all(QString txRx, QString message);
839   bool isWorked(int itype, QString key, float fMHz=0, QString="");
840 
841   QString save_wave_file (QString const& name
842                           , short const * data
843                           , int samples
844                           , QString const& my_callsign
845                           , QString const& my_grid
846                           , QString const& mode
847                           , qint32 sub_mode
848                           , Frequency frequency
849                           , QString const& his_call
850                           , QString const& his_grid) const;
851   void hound_reply ();
852   QString sortHoundCalls(QString t, int isort, int max_dB);
853   void rm_tb4(QString houndCall);
854   void read_wav_file (QString const& fname);
855   void decodeDone ();
856   bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus);
857   void subProcessError (QProcess *, QProcess::ProcessError);
858   void statusUpdate () const;
859   void update_watchdog_label ();
860   void on_the_minute ();
861   void add_child_to_event_filter (QObject *);
862   void remove_child_from_event_filter (QObject *);
863   void setup_status_bar (bool vhf);
864   void tx_watchdog (bool triggered);
865   qint64  nWidgets(QString t);
866   void displayWidgets(qint64 n);
867   QChar current_submode () const; // returns QChar {0} if submode is not appropriate
868   void write_transmit_entry (QString const& file_name);
869   void selectHound(QString t);
870   void houndCallers();
871   void foxRxSequencer(QString msg, QString houndCall, QString rptRcvd);
872   void foxTxSequencer();
873   void foxGenWaveform(int i,QString fm);
874   void writeFoxQSO (QString const& msg);
875   void to_jt9(qint32 n, qint32 istart, qint32 idone);
876   bool is77BitMode () const;
877 };
878 
879 extern int killbyname(const char* progName);
880 extern void getDev(int* numDevices,char hostAPI_DeviceName[][50],
881                    int minChan[], int maxChan[],
882                    int minSpeed[], int maxSpeed[]);
883 extern int next_tx_state(int pctx);
884 
885 #endif // MAINWINDOW_H
886