// -*- Mode: C++ -*- #ifndef MAINWINDOW_H #define MAINWINDOW_H #ifdef QT5 #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "AudioDevice.hpp" #include "commons.h" #include "Radio.hpp" #include "Modes.hpp" #include "FrequencyList.hpp" #include "Configuration.hpp" #include "WSPRBandHopping.hpp" #include "Transceiver.hpp" #include "DisplayManual.hpp" #include "psk_reporter.h" #include "logbook/logbook.h" #include "commons.h" #include "astro.h" #include "MessageBox.hpp" #include "NetworkAccessManager.hpp" #include "qorderedmap.h" #include "qpriorityqueue.h" #include "varicode.h" #include "MessageClient.hpp" #include "APRSISClient.h" #include "keyeater.h" #define NUM_JT4_SYMBOLS 206 //(72+31)*2, embedded sync #define NUM_JT65_SYMBOLS 126 //63 data + 63 sync #define NUM_JT9_SYMBOLS 85 //69 data + 16 sync #define NUM_WSPR_SYMBOLS 162 //(50+31)*2, embedded sync #define NUM_WSPR_LF_SYMBOLS 412 //300 data + 109 sync + 3 ramp #define NUM_ISCAT_SYMBOLS 1291 //30*11025/256 #define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80 #define NUM_QRA64_SYMBOLS 84 //63 data + 21 sync #define NUM_FT8_SYMBOLS 79 // 12.6 seconds, 15 seconds would be 93.75 symbols #define NUM_CW_SYMBOLS 250 #define TX_SAMPLE_RATE 48000 #define N_WIDGETS 33 extern int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols extern int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID //--------------------------------------------------------------- MainWindow namespace Ui { class MainWindow; } class QSettings; class QLineEdit; class QFont; class QHostInfo; class EchoGraph; class FastGraph; class WideGraph; class LogQSO; class Transceiver; class MessageAveraging; class MessageClient; class QTime; class WSPRBandHopping; class HelpTextWindow; class WSPRNet; class SoundOutput; class Modulator; class SoundInput; class Detector; class MultiSettings; class EqualizationToolsDialog; class DecodedText; using namespace std; typedef std::function Callback; class MainWindow : public QMainWindow { Q_OBJECT; struct CallDetail; public: using Frequency = Radio::Frequency; using FrequencyDelta = Radio::FrequencyDelta; using Mode = Modes::Mode; explicit MainWindow(QDir const& temp_directory, bool multiple, MultiSettings *, QSharedMemory *shdmem, unsigned downSampleFactor, QSplashScreen *, QWidget *parent = nullptr); ~MainWindow(); public slots: void showSoundInError(const QString& errorMsg); void showSoundOutError(const QString& errorMsg); void showStatusMessage(const QString& statusMsg); void dataSink(qint64 frames); void fastSink(qint64 frames); void diskDat(); void freezeDecode(int n); void guiUpdate(); void readFromStdout(); void p1ReadFromStdout(); void setXIT(int n, Frequency base = 0u); void qsy(int hzDelta); void setFreqOffsetForRestore(int freq, bool shouldRestore); bool tryRestoreFreqOffset(); void setFreq4(int rxFreq, int txFreq); void msgAvgDecode2(); void fastPick(int x0, int x1, int y); bool hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset); void logCallActivity(CallDetail d, bool spot=true); QString lookupCallInCompoundCache(QString const &call); void cacheActivity(QString key); void restoreActivity(QString key); void clearActivity(); void createAllcallTableRows(QTableWidget *table, const QString &selectedCall); void displayTextForFreq(QString text, int freq, QDateTime date, bool isTx, bool isNewLine, bool isLast); void writeNoticeTextToUI(QDateTime date, QString text); int writeMessageTextToUI(QDateTime date, QString text, int freq, bool bold, int block=-1); bool isMessageQueuedForTransmit(); void prependMessageText(QString text); void addMessageText(QString text, bool clear=false, bool selectFirstPlaceholder=false); void enqueueMessage(int priority, QString message, int freq, Callback c); void enqueueHeartbeat(QString message); void resetMessage(); void resetMessageUI(); void restoreMessage(); void initializeDummyData(); bool ensureCallsignSet(bool alert=true); bool ensureSelcalCallsignSelected(bool alert=true); bool ensureKeyNotStuck(QString const& text); void createMessage(QString const& text); void createMessageTransmitQueue(QString const& text); void resetMessageTransmitQueue(); QPair popMessageFrame(); protected: void keyPressEvent (QKeyEvent *) override; void closeEvent(QCloseEvent *) override; void childEvent(QChildEvent *) override; bool eventFilter(QObject *, QEvent *) override; private slots: void initialize_fonts (); void on_tx1_editingFinished(); void on_tx2_editingFinished(); void on_tx3_editingFinished(); void on_tx4_editingFinished(); void on_tx5_currentTextChanged (QString const&); void on_tx6_editingFinished(); void on_menuWindow_aboutToShow(); void on_actionShow_Band_Activity_triggered(bool checked); void on_actionShow_Call_Activity_triggered(bool checked); void on_actionShow_Waterfall_triggered(bool checked); void on_actionShow_Waterfall_Controls_triggered(bool checked); void on_actionShow_Time_Drift_Controls_triggered(bool checked); void on_actionReset_Window_Sizes_triggered(); void on_actionSettings_triggered(); void openSettings(int tab=0); void prepareSpotting(); void on_spotButton_clicked(bool checked); void on_monitorButton_clicked (bool); void on_actionAbout_triggered(); void on_autoButton_clicked (bool); void on_labDialFreq_clicked(); void on_monitorTxButton_clicked(); void on_stopTxButton_clicked(); void on_stopButton_clicked(); void on_actionAdd_Log_Entry_triggered(); void on_actionRelease_Notes_triggered (); void on_actionFT8_DXpedition_Mode_User_Guide_triggered(); void on_actionOnline_User_Guide_triggered(); void on_actionLocal_User_Guide_triggered(); void on_actionWide_Waterfall_triggered(); void on_actionOpen_triggered(); void on_actionOpen_next_in_directory_triggered(); void on_actionDecode_remaining_files_in_directory_triggered(); void on_actionDelete_all_wav_files_in_SaveDir_triggered(); void on_actionOpen_log_directory_triggered (); void on_actionOpen_Save_Directory_triggered(); void on_actionNone_triggered(); void on_actionSave_all_triggered(); void on_actionKeyboard_shortcuts_triggered(); void on_actionSpecial_mouse_commands_triggered(); void on_actionSolve_FreqCal_triggered(); void on_actionCopyright_Notice_triggered(); void on_DecodeButton_clicked (bool); void decode(); void decodeBusy(bool b); void on_EraseButton_clicked(); void set_dateTimeQSO(int m_ntx); void set_ntx(int n); void on_txrb1_toggled(bool status); void on_txrb1_doubleClicked (); void on_txrb2_toggled(bool status); void on_txrb3_toggled(bool status); void on_txrb4_toggled(bool status); void on_txrb4_doubleClicked (); void on_txrb5_toggled(bool status); void on_txrb5_doubleClicked (); void on_txrb6_toggled(bool status); void on_txb1_clicked(); void on_txb1_doubleClicked (); void on_txb2_clicked(); void on_txb3_clicked(); void on_txb4_clicked(); void on_txb4_doubleClicked (); void on_txb5_clicked(); void on_txb5_doubleClicked (); void on_txb6_clicked(); void on_startTxButton_toggled(bool checked); void toggleTx(bool start); void on_rbNextFreeTextMsg_toggled (bool status); void on_lookupButton_clicked(); void on_addButton_clicked(); void on_dxCallEntry_textChanged (QString const&); void on_dxGridEntry_textChanged (QString const&); void on_dxCallEntry_returnPressed (); void on_genStdMsgsPushButton_clicked(); void on_logQSOButton_clicked(); void on_actionFT8_triggered(); void on_TxFreqSpinBox_valueChanged(int arg1); void on_actionSave_decoded_triggered(); void on_actionQuickDecode_toggled (bool); void on_actionMediumDecode_toggled (bool); void on_actionDeepDecode_toggled (bool); void on_actionDeepestDecode_toggled (bool); void bumpFqso(int n); void on_actionErase_ALL_TXT_triggered(); void on_actionErase_FoxQSO_txt_triggered(); void on_actionErase_js8call_log_adi_triggered(); void startTx(); void startTx2(); void startP1(); void stopTx(); void stopTx2(); void on_pbCallCQ_clicked(); void on_pbAnswerCaller_clicked(); void on_pbSendRRR_clicked(); void on_pbAnswerCQ_clicked(); void on_pbSendReport_clicked(); void on_pbSend73_clicked(); void on_rbGenMsg_clicked(bool checked); void on_rbFreeText_clicked(bool checked); void on_clearAction_triggered(QObject * sender); void on_cqMacroButton_clicked(); void on_replyMacroButton_clicked(); void on_snrMacroButton_clicked(); void on_qthMacroButton_clicked(); void on_qtcMacroButton_clicked(); void setShowColumn(QString tableKey, QString columnKey, bool value); bool showColumn(QString tableKey, QString columnKey, bool default_=true); void buildShowColumnsMenu(QMenu *menu, QString tableKey); void setSortBy(QString key, QString value); QString getSortBy(QString key, QString defaultValue); void buildSortByMenu(QMenu * menu, QString key, QString defaultValue, QList > values); void buildBandActivitySortByMenu(QMenu * menu); void buildCallActivitySortByMenu(QMenu * menu); void buildQueryMenu(QMenu *, QString callsign); QMap buildMacroValues(); QString replaceMacros(QString const &text, QMap values, bool prune); void buildSavedMessagesMenu(QMenu *menu); void buildRelayMenu(QMenu *menu); QAction* buildRelayAction(QString call); void buildEditMenu(QMenu *, QTextEdit *); void on_queryButton_pressed(); void on_macrosMacroButton_pressed(); void on_deselectButton_pressed(); void on_tableWidgetRXAll_cellClicked(int row, int col); void on_tableWidgetRXAll_cellDoubleClicked(int row, int col); void on_tableWidgetRXAll_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected); void on_tableWidgetCalls_cellClicked(int row, int col); void on_tableWidgetCalls_cellDoubleClicked(int row, int col); void on_tableWidgetCalls_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected); void on_freeTextMsg_currentTextChanged (QString const&); void on_nextFreeTextMsg_currentTextChanged (QString const&); void on_extFreeTextMsgEdit_currentTextChanged (QString const&); int currentFreqOffset(); QList> buildMessageFrames(QString const& text); bool prepareNextMessageFrame(); bool isFreqOffsetFree(int f, int bw); int findFreeFreqOffset(int fmin, int fmax, int bw); void scheduleHeartbeat(bool first=false); void pauseHeartbeat(); void unpauseHeartbeat(); void checkHeartbeat(); void prepareHeartbeat(); QString calculateDistance(QString const& grid, int *pDistance=nullptr, int *pAzimuth=nullptr); void on_driftSpinBox_valueChanged(int n); void on_driftSyncButton_clicked(); void on_driftSyncEndButton_clicked(); void on_driftSyncResetButton_clicked(); void setDrift(int n); void on_rptSpinBox_valueChanged(int n); void killFile(); void on_tuneButton_clicked (bool); void on_pbR2T_clicked(); void on_pbT2R_clicked(); void on_heartbeatButton_clicked(); void on_selcalButton_clicked(); void acceptQSO (QDateTime const&, QString const& call, QString const& grid , Frequency dial_freq, QString const& mode , QString const& rpt_sent, QString const& rpt_received , QString const& tx_power, QString const& comments , QString const& name, QDateTime const& QSO_date_on, QString const& operator_call , QString const& my_call, QString const& my_grid, QByteArray const& ADIF); void on_bandComboBox_currentIndexChanged (int index); void on_bandComboBox_activated (int index); void on_readFreq_clicked(); void on_pbTxMode_clicked(); void on_RxFreqSpinBox_valueChanged(int n); void on_outAttenuation_valueChanged (int); void rigOpen (); void handle_transceiver_update (Transceiver::TransceiverState const&); void handle_transceiver_failure (QString const& reason); void on_actionAstronomical_data_toggled (bool); void on_actionShort_list_of_add_on_prefixes_and_suffixes_triggered(); void band_changed (Frequency); void monitor (bool); void stop_tuning (); void stopTuneATU(); void auto_tx_mode(bool); void on_actionMessage_averaging_triggered(); void on_actionFox_Log_triggered(); void on_actionInclude_averaging_toggled (bool); void on_actionInclude_correlation_toggled (bool); void on_actionEnable_AP_DXcall_toggled (bool); void VHF_features_enabled(bool b); void on_sbSubmode_valueChanged(int n); void on_cbShMsgs_toggled(bool b); void on_cbSWL_toggled(bool b); void on_cbTx6_toggled(bool b); void on_cbMenus_toggled(bool b); void on_cbCQonly_toggled(bool b); void on_cbFirst_toggled(bool b); void on_cbAutoSeq_toggled(bool b); void networkMessage(Message const &message); void sendNetworkMessage(QString const &type, QString const &message); void sendNetworkMessage(QString const &type, QString const &message, const QMap ¶ms); void networkError (QString const&); void on_ClrAvgButton_clicked(); void on_syncSpinBox_valueChanged(int n); void on_TxPowerComboBox_currentIndexChanged(const QString &arg1); void on_sbTxPercent_valueChanged(int n); void on_cbUploadWSPR_Spots_toggled(bool b); void WSPR_config(bool b); void uploadSpots(); void TxAgain(); void uploadResponse(QString response); void on_WSPRfreqSpinBox_valueChanged(int n); void on_pbTxNext_clicked(bool b); void on_actionEcho_Graph_triggered(); void on_actionFast_Graph_triggered(); void fast_decode_done(); void on_actionMeasure_reference_spectrum_triggered(); void on_actionErase_reference_spectrum_triggered(); void on_actionMeasure_phase_response_triggered(); void on_sbTR_valueChanged (int); void on_sbFtol_valueChanged (int); void on_cbFast9_clicked(bool b); void on_sbCQTxFreq_valueChanged(int n); void on_cbCQTx_toggled(bool b); void splash_done (); void on_measure_check_box_stateChanged (int); void checkExpiryWarningMessage (); void checkStartupWarnings (); void clearCallsignSelected(); void refreshTextDisplay(); private: Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo, unsigned channels, unsigned msBuffered) const; Q_SIGNAL void stopAudioOutputStream () const; Q_SIGNAL void startAudioInputStream (QAudioDeviceInfo const&, int framesPerBuffer, AudioDevice * sink, unsigned downSampleFactor, AudioDevice::Channel) const; Q_SIGNAL void suspendAudioInputStream () const; Q_SIGNAL void resumeAudioInputStream () const; Q_SIGNAL void startDetector (AudioDevice::Channel) const; Q_SIGNAL void FFTSize (unsigned) const; Q_SIGNAL void detectorClose () const; Q_SIGNAL void finished () const; Q_SIGNAL void transmitFrequency (double) const; Q_SIGNAL void endTransmitMessage (bool quick = false) const; Q_SIGNAL void tune (bool = true) const; Q_SIGNAL void sendMessage (unsigned symbolsLength, double framesPerSymbol, double frequency, double toneSpacing, SoundOutput *, AudioDevice::Channel = AudioDevice::Mono, bool synchronize = true, bool fastMode = false, double dBSNR = 99., int TRperiod=60) const; Q_SIGNAL void outAttenuationChanged (qreal) const; Q_SIGNAL void toggleShorthand () const; private: void astroUpdate (); void writeAllTxt(QString message, int bits); void hideMenus(bool b); NetworkAccessManager m_network_manager; bool m_valid; QSplashScreen * m_splash; QString m_revision; bool m_multiple; MultiSettings * m_multi_settings; QPushButton * m_configurations_button; QSettings * m_settings; QScopedPointer ui; // other windows Configuration m_config; WSPRBandHopping m_WSPR_band_hopping; bool m_WSPR_tx_next; MessageBox m_rigErrorMessageBox; QScopedPointer m_equalizationToolsDialog; QScopedPointer m_wideGraph; QScopedPointer m_echoGraph; QScopedPointer m_fastGraph; QScopedPointer m_logDlg; QScopedPointer m_astroWidget; QScopedPointer m_shortcuts; QScopedPointer m_prefixes; QScopedPointer m_mouseCmnds; QScopedPointer m_msgAvgWidget; Transceiver::TransceiverState m_rigState; Frequency m_lastDialFreq; QString m_lastBand; QString m_lastCallsign; Frequency m_dialFreqRxWSPR; // best guess at WSPR QRG Detector * m_detector; unsigned m_FFTSize; SoundInput * m_soundInput; Modulator * m_modulator; SoundOutput * m_soundOutput; QThread m_audioThread; qint64 m_msErase; qint64 m_secBandChanged; qint64 m_freqMoon; qint64 m_msec0; qint64 m_fullFoxCallTime; Frequency m_freqNominal; Frequency m_freqTxNominal; Astro::Correction m_astroCorrection; double m_s6; double m_tRemaining; float m_DTtol; float m_t0; float m_t1; float m_t0Pick; float m_t1Pick; float m_fCPUmskrtd; qint32 m_waterfallAvg; qint32 m_ntx; bool m_gen_message_is_cq; bool m_send_RR73; qint32 m_timeout; qint32 m_XIT; qint32 m_setftx; qint32 m_ndepth; qint32 m_sec0; qint32 m_RxLog; qint32 m_nutc0; qint32 m_ntr; qint32 m_tx; qint32 m_hsym; qint32 m_TRperiod; qint32 m_nsps; qint32 m_hsymStop; qint32 m_inGain; qint32 m_ncw; qint32 m_secID; qint32 m_idleMinutes; qint32 m_nSubMode; qint32 m_nclearave; qint32 m_minSync; qint32 m_dBm; qint32 m_pctx; qint32 m_nseq; qint32 m_nWSPRdecodes; qint32 m_k0; qint32 m_kdone; qint32 m_nPick; FrequencyList_v2::const_iterator m_frequency_list_fcal_iter; qint32 m_nTx73; qint32 m_UTCdisk; qint32 m_wait; qint32 m_i3bit; qint32 m_isort; qint32 m_max_dB; qint32 m_nDXped=0; qint32 m_nSortedHounds=0; qint32 m_nHoundsCalling=0; qint32 m_Nlist=12; qint32 m_Nslots=5; qint32 m_nFoxMsgTimes[5]={0,0,0,0,0}; qint32 m_tAutoOn; // qint32 m_maxQSOs; qint32 m_tFoxTx=0; qint32 m_tFoxTx0=0; qint32 m_maxStrikes=3; //Max # of repeats: 3 strikes and you're out qint32 m_maxFoxWait=3; //Max wait time for expected Hound replies qint32 m_foxCQtime=10; //CQs at least every 5 minutes qint32 m_tFoxTxSinceCQ=999; //Fox Tx cycles since most recent CQ qint32 m_nFoxFreq; //Audio freq at which Hound received a call from Fox qint32 m_nSentFoxRrpt=0; //Serial number for next R+rpt Hound will send to Fox bool m_btxok; //True if OK to transmit bool m_diskData; bool m_loopall; bool m_decoderBusy; bool m_auto; bool m_restart; bool m_startAnother; bool m_saveDecoded; bool m_saveAll; bool m_widebandDecode; bool m_call3Modified; bool m_dataAvailable; bool m_bDecoded; bool m_noSuffix; bool m_blankLine; bool m_decodedText2; bool m_freeText; bool m_sentFirst73; int m_currentMessageType; QString m_currentMessage; int m_currentMessageBits; int m_lastMessageType; QString m_lastMessageSent; bool m_bShMsgs; bool m_bSWL; bool m_uploadSpots; bool m_uploading; bool m_txNext; bool m_grid6; bool m_tuneup; bool m_bTxTime; bool m_rxDone; bool m_bSimplex; // not using split even if it is available bool m_bEchoTxOK; bool m_bTransmittedEcho; bool m_bEchoTxed; bool m_bFastMode; bool m_bFast9; bool m_bFastDecodeCalled; bool m_bDoubleClickAfterCQnnn; bool m_bRefSpec; bool m_bClearRefSpec; bool m_bTrain; bool m_bUseRef; bool m_bFastDone; bool m_bAltV; bool m_bNoMoreFiles; bool m_bQRAsyncWarned; bool m_bDoubleClicked; bool m_bCallingCQ; bool m_bAutoReply; bool m_bCheckedContest; bool m_bWarnedSplit=false; bool m_bWarnedHound=false; enum { CALLING, REPLYING, REPORT, ROGER_REPORT, ROGERS, SIGNOFF } m_QSOProgress; int m_extFreeTxtPos; int m_ihsym; int m_nzap; int m_npts8; float m_px; float m_pxmax; float m_df3; int m_iptt0; bool m_btxok0; int m_nsendingsh; double m_onAirFreq0; bool m_first_error; char m_msg[100][80]; // labels in status bar QLabel tx_status_label; QLabel config_label; QLabel mode_label; QLabel last_tx_label; QLabel auto_tx_label; QLabel band_hopping_label; QProgressBar progressBar; QLabel watchdog_label; QLabel wpm_label; QFuture m_wav_future; QFutureWatcher m_wav_future_watcher; QFutureWatcher watcher3; QFutureWatcher m_saveWAVWatcher; QProcess proc_js8; QProcess p1; QProcess p3; WSPRNet *wsprNet; QTimer m_guiTimer; QTimer ptt1Timer; //StartTx delay QTimer ptt0Timer; //StopTx delay QTimer logQSOTimer; QTimer killFileTimer; QTimer tuneButtonTimer; QTimer uploadTimer; QTimer tuneATU_Timer; QTimer TxAgainTimer; QTimer minuteTimer; QTimer splashTimer; QTimer p1Timer; QTimer heartbeatTimer; QString m_path; QString m_baseCall; QString m_hisCall; QString m_hisGrid; QString m_appDir; QString m_palette; QString m_dateTime; QString m_mode; QString m_modeTx; QString m_fnameWE; // save path without extension QString m_rpt; QString m_rptSent; QString m_rptRcvd; QString m_qsoStart; QString m_qsoStop; QString m_cmnd; QString m_cmndP1; QString m_msgSent0; QString m_fileToSave; QString m_calls; QString m_CQtype; QString m_opCall; QString m_houndCallers; //Sorted list of Hound callers QString m_fm0; QString m_fm1; QSet m_pfx; QSet m_sfx; struct CallDetail { QString call; QString through; QString grid; int freq; QDateTime ackTimestamp; QDateTime utcTimestamp; int snr; int bits; float tdrift; }; struct CommandDetail { bool isCompound; bool isBuffered; QString from; QString to; QString cmd; int freq; QDateTime utcTimestamp; int snr; int bits; QString grid; QString text; QString extra; float tdrift; }; struct ActivityDetail { bool isFree; bool isLowConfidence; bool isCompound; bool isDirected; bool isBuffered; int bits; int freq; QString text; QDateTime utcTimestamp; int snr; bool shouldDisplay; float tdrift; }; struct MessageBuffer { CommandDetail cmd; QQueue compound; QList msgs; }; bool m_bandActivityWasVisible; bool m_rxDirty; bool m_rxDisplayDirty; int m_txFrameCountEstimate; int m_txFrameCount; QTimer m_txTextDirtyDebounce; bool m_txTextDirty; QString m_txTextDirtyLastText; QString m_txTextDirtyLastSelectedCall; QString m_lastTxMessage; QDateTime m_lastTxTime; int m_timeDeltaMsMMA; int m_timeDeltaMsMMA_N; enum Priority { PriorityLow = 10, PriorityNormal = 100, PriorityHigh = 1000 }; struct PrioritizedMessage { QDateTime date; int priority; QString message; int freq; Callback callback; friend bool operator <(PrioritizedMessage const &a, PrioritizedMessage const &b){ if(a.priority < b.priority){ return true; } return a.date < b.date; } }; struct CachedDirectedType { bool isAllcall; QDateTime date; }; QMap m_showColumnsCache; // table column:key -> show boolean QMap m_sortCache; // table key -> sort by QPriorityQueue m_txMessageQueue; // messages to be sent QQueue> m_txFrameQueue; // frames to be sent QQueue m_rxActivityQueue; // all rx activity queue QQueue m_rxCommandQueue; // command queue for processing commands QQueue m_rxCallQueue; // call detail queue for spots to pskreporter QMap m_compoundCallCache; // base callsign -> compound callsign QCache m_txAllcallCommandCache; // callsign -> last tx QCache m_rxRecentCache; // freq -> last rx QCache m_rxDirectedCache; // freq -> last directed rx QCache m_rxCallCache; // call -> last freq seen QMap m_rxFrameBlockNumbers; // freq -> block QMap> m_bandActivity; // freq -> [(text, last timestamp), ...] QMap m_messageBuffer; // freq -> (cmd, [frames, ...]) QMap m_callActivity; // call -> (last freq, last timestamp) QQueue m_txHeartbeatQueue; // ping frames to be sent QMap m_aprsCallCache; QMap> m_callActivityCache; // band -> call activity QMap>> m_bandActivityCache; // band -> band activity QMap m_rxTextCache; // band -> rx text QSet m_callSeenHeartbeat; // call int m_previousFreq; bool m_shouldRestoreFreq; bool m_bandHopped; Frequency m_bandHoppedFreq; struct FoxQSO //Everything we need to know about QSOs in progress (or recently logged). { QString grid; //Hound's declared locator QString sent; //Report sent to Hound QString rcvd; //Report received from Hound qint32 ncall; //Number of times report sent to Hound qint32 nRR73; //Number of times RR73 sent to Hound qint32 tFoxRrpt; //m_tFoxTx (Fox Tx cycle counter) when R+rpt was received from Hound qint32 tFoxTxRR73; //m_tFoxTx when RR73 was sent to Hound }; QMap m_foxQSO; //Key = HoundCall, value = parameters for QSO in progress QMap m_loggedByFox; //Key = HoundCall, value = logged band QQueue m_houndQueue; //Selected Hounds available for starting a QSO QQueue m_foxQSOinProgress; //QSOs in progress: Fox has sent a report QQueue m_foxRateQueue; bool m_nextHeartbeatQueued = false; bool m_nextHeartPaused = false; QDateTime m_nextHeartbeat; QDateTime m_dateTimeQSOOn; QDateTime m_dateTimeLastTX; QSharedMemory *mem_js8; LogBook m_logBook; QString m_QSOText; unsigned m_msAudioOutputBuffered; unsigned m_framesAudioInputBuffered; unsigned m_downSampleFactor; QThread::Priority m_audioThreadPriority; bool m_bandEdited; bool m_splitMode; bool m_monitoring; bool m_tx_when_ready; bool m_transmitting; bool m_tune; bool m_deadAirTone; bool m_tx_watchdog; // true when watchdog triggered bool m_block_pwr_tooltip; bool m_PwrBandSetOK; bool m_bVHFwarned; bool m_bDisplayedOnce; Frequency m_lastMonitoredFrequency; double m_toneSpacing; int m_firstDecode; QProgressDialog m_optimizingProgress; QTimer m_heartbeat; MessageClient * m_messageClient; PSK_Reporter *psk_Reporter; APRSISClient * m_aprsClient; DisplayManual m_manual; QHash m_pwrBandTxMemory; // Remembers power level by band QHash m_pwrBandTuneMemory; // Remembers power level by band for tuning QByteArray m_geometryNoControls; QVector m_phaseEqCoefficients; //---------------------------------------------------- private functions void readSettings(); void set_application_font (QFont const&); void setDecodedTextFont (QFont const&); void writeSettings(); void createStatusBar(); void updateStatusBar(); void clearDX (); void lookup(); void ba2msg(QByteArray ba, char* message); void msgtype(QString t, QLineEdit* tx); void stub(); void statusChanged(); void fixStop(); bool shortList(QString callsign); void transmit (double snr = 99.); void rigFailure (QString const& reason); void pskSetLocal (); void aprsSetLocal (); void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid); void aprsLogReport(int offset, int snr, QString callsign, QString grid); Radio::Frequency dialFrequency(); void displayDialFrequency (); void transmitDisplay (bool); void locationChange(QString const& location); void replayDecodes (); void postDecode (bool is_new, QString const& message); void displayTransmit(); void updateButtonDisplay(); void updateTextDisplay(); void updateFrameCountEstimate(int count); void updateTextStatsDisplay(QString text, int count); void updateTxButtonDisplay(); bool isMyCallIncluded(QString const &text); bool isAllCallIncluded(QString const &text); bool isGroupCallIncluded(const QString &text); QString callsignSelected(bool useInputText=false); bool isRecentOffset(int offset); void markOffsetRecent(int offset); bool isDirectedOffset(int offset, bool *pIsAllCall); void markOffsetDirected(int offset, bool isAllCall); void clearOffsetDirected(int offset); void processActivity(bool force=false); void observeTimeDeltaForAverage(float delta); void resetTimeDeltaAverage(); void processRxActivity(); void processCompoundActivity(); void processBufferedActivity(); void processCommandActivity(); void writeDirectedCommandToFile(CommandDetail d); void processAlertReplyForCommand(CommandDetail d, QString from, QString cmd); void processSpots(); void processTxQueue(); void displayActivity(bool force=false); void displayBandActivity(); void displayCallActivity(); void postWSPRDecode (bool is_new, QStringList message_parts); void enable_DXCC_entity (bool on); void switch_mode (Mode); void WSPR_scheduling (); void freqCalStep(); void setRig (Frequency = 0); // zero frequency means no change void WSPR_history(Frequency dialFreq, int ndecodes); QString WSPR_hhmm(int n); void fast_config(bool b); void CQTxFreq(); QString save_wave_file (QString const& name , short const * data , int seconds , QString const& my_callsign , QString const& my_grid , QString const& mode , qint32 sub_mode , Frequency frequency , QString const& his_call , QString const& his_grid) const; void read_wav_file (QString const& fname); void decodeDone (); void subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); void subProcessError (QProcess *, QProcess::ProcessError); void statusUpdate () const; void update_watchdog_label (); void on_the_minute (); void tryBandHop(); void add_child_to_event_filter (QObject *); void remove_child_from_event_filter (QObject *); void setup_status_bar (bool vhf); void resetIdleTimer(); void incrementIdleTimer(); void tx_watchdog (bool triggered); qint64 nWidgets(QString t); void displayWidgets(qint64 n); void vhfWarning(); QChar current_submode () const; // returns QChar {0} if sub mode is // not appropriate void write_transmit_entry (QString const& file_name); }; extern int killbyname(const char* progName); extern void getDev(int* numDevices,char hostAPI_DeviceName[][50], int minChan[], int maxChan[], int minSpeed[], int maxSpeed[]); extern int next_tx_state(int pctx); #endif // MAINWINDOW_H