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