Merged from trunk (r8085 thru r8170 inc.):
------------------------------------------------------------------------ r8085 | k9an | 2017-09-13 01:46:16 +0100 (Wed, 13 Sep 2017) | 1 line Open up DT range to +/- 2.5 s for testing. ------------------------------------------------------------------------ r8086 | bsomervi | 2017-09-16 11:12:38 +0100 (Sat, 16 Sep 2017) | 1 line Do not allow window manager events to close the astronomical data window ------------------------------------------------------------------------ r8087 | bsomervi | 2017-09-16 21:27:05 +0100 (Sat, 16 Sep 2017) | 4 lines Fix regression in ADIF parser that caused failure with missing header Improved robustness of the ADIF parser and re-factored to more idiomatic C++. ------------------------------------------------------------------------ r8088 | bsomervi | 2017-09-16 21:27:13 +0100 (Sat, 16 Sep 2017) | 1 line Update band limits as per ADIF 3.0.6 specification ------------------------------------------------------------------------ r8089 | bsomervi | 2017-09-16 21:27:20 +0100 (Sat, 16 Sep 2017) | 1 line Use a single definition of band limits (Bands class) ------------------------------------------------------------------------ r8090 | bsomervi | 2017-09-16 21:27:33 +0100 (Sat, 16 Sep 2017) | 5 lines Add button to the decoded text window context menu to erase the contents Right-click either decoded text window to erase its contents. The "Erase" button on the main UI still operates as before although it is implemented differently now. ------------------------------------------------------------------------ r8091 | bsomervi | 2017-09-16 23:20:51 +0100 (Sat, 16 Sep 2017) | 1 line Correct the actions taken when clearing decodes windows ------------------------------------------------------------------------ r8092 | bsomervi | 2017-09-16 23:20:59 +0100 (Sat, 16 Sep 2017) | 8 lines Restore functionality of sending .WAV playback decodes to UDP Extended the Decode and WSPRDecode UDP messages with an "off air" boolean field indicating the decode was derived from a .WAV fle playback rather than an on air reception. Extended reference applications to use the new off air decode message field. ------------------------------------------------------------------------ r8093 | k9an | 2017-09-17 16:34:32 +0100 (Sun, 17 Sep 2017) | 1 line Experimental tweak to FT8 decoder. Try a second symbol metric if the first one fails - currently configured to use max-amplitude and max-log. ------------------------------------------------------------------------ r8094 | k9an | 2017-09-17 21:43:30 +0100 (Sun, 17 Sep 2017) | 1 line Restore the use of max-amplitude for ap passes. ------------------------------------------------------------------------ r8095 | k1jt | 2017-09-18 16:42:14 +0100 (Mon, 18 Sep 2017) | 2 lines Allow specialized use of "x2 Tone Spacing" in FT8 mode. ------------------------------------------------------------------------ r8096 | k1jt | 2017-09-18 16:47:29 +0100 (Mon, 18 Sep 2017) | 2 lines Allow X2 tone spacing also in JT9 (slow) modes. ------------------------------------------------------------------------ r8097 | k1jt | 2017-09-18 21:42:18 +0100 (Mon, 18 Sep 2017) | 2 lines Change CRLF line endings to *nix style. ------------------------------------------------------------------------ r8098 | k1jt | 2017-09-19 17:04:10 +0100 (Tue, 19 Sep 2017) | 2 lines Add a missing step to description of the Frequency Calibration procedure. ------------------------------------------------------------------------ r8099 | k1jt | 2017-09-20 17:31:04 +0100 (Wed, 20 Sep 2017) | 1 line Insert a link to FT8_Operating_Tips.pdf. ------------------------------------------------------------------------ r8100 | k1jt | 2017-09-20 20:11:04 +0100 (Wed, 20 Sep 2017) | 3 lines As an experiment, move "NA VHF Contest Mode" checkbox to main screen and query operator if d>10000 km. ------------------------------------------------------------------------ r8101 | k1jt | 2017-09-20 20:19:47 +0100 (Wed, 20 Sep 2017) | 2 lines Correct a tool-tip typo. ------------------------------------------------------------------------ r8102 | bsomervi | 2017-09-22 13:31:01 +0100 (Fri, 22 Sep 2017) | 1 line UI tweaks to improve portability between platforms and font size changes ------------------------------------------------------------------------ r8103 | bsomervi | 2017-09-22 16:36:24 +0100 (Fri, 22 Sep 2017) | 5 lines Extend UDP Reply message with keyboard modifiers This allows UDP servers to emulate keyboard modified double-clicks on decoded messages, E.g. ALT+double-click for replying to a CQ or QRZ call without changing ones Tx frequency offset. ------------------------------------------------------------------------ r8104 | bsomervi | 2017-09-22 16:49:42 +0100 (Fri, 22 Sep 2017) | 1 line Updated AD1C cty.dat file (21st Sept 2017) ------------------------------------------------------------------------ r8105 | k1jt | 2017-09-22 18:38:51 +0100 (Fri, 22 Sep 2017) | 2 lines Another attempt at eliminating confusion when NA VHF Contest Mode is in use. ------------------------------------------------------------------------ r8106 | k9an | 2017-09-22 21:36:52 +0100 (Fri, 22 Sep 2017) | 1 line Make sure that fastGrph is properly initialized. ------------------------------------------------------------------------ r8107 | bsomervi | 2017-09-22 23:08:41 +0100 (Fri, 22 Sep 2017) | 1 line Improve performance of the UDP reference application message_aggregator ------------------------------------------------------------------------ r8108 | bsomervi | 2017-09-22 23:08:49 +0100 (Fri, 22 Sep 2017) | 1 line Fix a regression in processing incoming Reply UDP messages ------------------------------------------------------------------------ r8109 | bsomervi | 2017-09-22 23:08:56 +0100 (Fri, 22 Sep 2017) | 4 lines Better handling of worked before and country name display Appended text is added at a fixed column unless the message overlaps in which case the appended information floats to thr right. ------------------------------------------------------------------------ r8110 | bsomervi | 2017-09-22 23:09:04 +0100 (Fri, 22 Sep 2017) | 4 lines Restore printing of MSK144 decode quality information Now that a way of dealing with worked before and country information without losing this information has been found. ------------------------------------------------------------------------ r8111 | bsomervi | 2017-09-22 23:09:11 +0100 (Fri, 22 Sep 2017) | 5 lines Fix an issue with truncated free text messages being generated This is an edge case when working a call like RI9F/GM4WJS where it is not possible to confirm receipt of the full compound callsign in a Tx5 73 message as "RI9F/GM4WJS 73" is 14 characters. ------------------------------------------------------------------------ r8112 | bsomervi | 2017-09-23 19:09:29 +0100 (Sat, 23 Sep 2017) | 1 line Tidy up some ugly code ------------------------------------------------------------------------ r8113 | bsomervi | 2017-09-23 19:09:37 +0100 (Sat, 23 Sep 2017) | 1 line Clean up some main window UI layout ------------------------------------------------------------------------ r8114 | k9an | 2017-09-23 20:39:42 +0100 (Sat, 23 Sep 2017) | 1 line Comment out some diagnostic writes. ------------------------------------------------------------------------ r8115 | k9an | 2017-09-23 20:56:45 +0100 (Sat, 23 Sep 2017) | 1 line Add some text for section 13.3 of the User Guide. ------------------------------------------------------------------------ r8116 | k9an | 2017-09-23 21:01:31 +0100 (Sat, 23 Sep 2017) | 1 line Minor change to new_features.adoc. ------------------------------------------------------------------------ r8117 | bsomervi | 2017-09-23 23:02:24 +0100 (Sat, 23 Sep 2017) | 1 line Minor additions to MSK144 phase eq docs ------------------------------------------------------------------------ r8118 | k9an | 2017-09-23 23:32:06 +0100 (Sat, 23 Sep 2017) | 1 line Fix up Table 2 caption. ------------------------------------------------------------------------ r8119 | bsomervi | 2017-09-24 22:14:10 +0100 (Sun, 24 Sep 2017) | 1 line Fix issues processing free text 73 messages ------------------------------------------------------------------------ r8120 | k1jt | 2017-09-25 18:02:52 +0100 (Mon, 25 Sep 2017) | 3 lines First tests of "RR73 NOW ..." and "NIL NOW ..." (i3bit=1, 2) messages in FT8. DO NOT USE THIS FEATURE ON THE AIR! ------------------------------------------------------------------------ r8121 | k1jt | 2017-09-25 20:21:25 +0100 (Mon, 25 Sep 2017) | 2 lines Make bDXped a member variable, default to false. ------------------------------------------------------------------------ r8122 | bsomervi | 2017-09-26 00:38:19 +0100 (Tue, 26 Sep 2017) | 1 line Fix regression in handling double-clicked CQ and QRZ calls ------------------------------------------------------------------------ r8123 | bsomervi | 2017-09-26 00:38:27 +0100 (Tue, 26 Sep 2017) | 1 line Fix a regression handling compound calls in 73 messages ------------------------------------------------------------------------ r8124 | k1jt | 2017-09-27 13:26:33 +0100 (Wed, 27 Sep 2017) | 2 lines Additions to Section 13.3 of WSJT-X User Guide: "Phase Equalkization". ------------------------------------------------------------------------ r8125 | k1jt | 2017-09-27 13:39:50 +0100 (Wed, 27 Sep 2017) | 31 lines Experimental new behavior for "Lock Tx=Rx" and for clicking on waterfall and decoded text. 1. Checkbox "Lock Tx=Rx" is now labeled "Lock Tx Freq", and its meaning is quite different. If checked, the audio Tx frequency cannot be changed. It's like the "Lock" function on some transceivers. 2. Clicking on the Wide Graph waterfall and on lines of decoded text now behave as follows: Click on Action --------------------------------------------------------------------- Waterfall: Click to set Rx frequency Shift-click to set Tx frequency Ctrl-click to set Rx and Tx frequencies If Lock Tx Freq is checked, Tx freq does not move Double-click to set Rx frequency and decode there Decoded Text: Double-click to copy transmitting callsign to DX Call and locator to DX Grid; change Rx frequency to decoded signal's frequency; generate standard messages. Tx frequency is not changed unless Ctrl is held down and Lock Tx Freq not checked. If this experimental behavior is adopted, some descriptions in the User Guide and Special Mouse Commands will need to be updated. 3. Starting to implement a new function on the Tools menu, "Solve for calibration parameters". This is not yet finished; DO NOT USE in its present form. ------------------------------------------------------------------------ r8126 | k1jt | 2017-09-27 13:50:21 +0100 (Wed, 27 Sep 2017) | 2 lines Add missing routine. ------------------------------------------------------------------------ r8127 | k1jt | 2017-09-28 02:35:09 +0100 (Thu, 28 Sep 2017) | 1 line Functional 'Solve for calibration parameters' on Tools menu. ------------------------------------------------------------------------ r8128 | k1jt | 2017-09-28 13:30:52 +0100 (Thu, 28 Sep 2017) | 1 line dummy ------------------------------------------------------------------------ r8129 | k9an | 2017-09-28 16:00:57 +0100 (Thu, 28 Sep 2017) | 1 line Correct a typo in the docs. ------------------------------------------------------------------------ r8130 | k1jt | 2017-09-28 16:05:41 +0100 (Thu, 28 Sep 2017) | 1 line Minor edits in User Guide. ------------------------------------------------------------------------ r8131 | k1jt | 2017-09-28 16:09:46 +0100 (Thu, 28 Sep 2017) | 3 lines Fix two ways that Loxk Tx Freq could be circumvented; display Echo Graph automatically when Echo mode is started; clean up display of FreqCal parameters. ------------------------------------------------------------------------ r8132 | k1jt | 2017-09-28 16:46:36 +0100 (Thu, 28 Sep 2017) | 2 lines Clean up the display of "Controls" checkbox on Wide Graph. ------------------------------------------------------------------------ r8133 | k1jt | 2017-09-28 16:55:24 +0100 (Thu, 28 Sep 2017) | 2 lines Display "NIL NOW ", etc., only for test cases. ------------------------------------------------------------------------ r8134 | k1jt | 2017-09-28 20:51:04 +0100 (Thu, 28 Sep 2017) | 2 lines Add some FreqCal info to User Guide. ------------------------------------------------------------------------ r8135 | k1jt | 2017-09-29 00:34:13 +0100 (Fri, 29 Sep 2017) | 1 line Move 'Controls' checkbox a few pixels to the right. ------------------------------------------------------------------------ r8136 | bsomervi | 2017-09-29 11:46:43 +0100 (Fri, 29 Sep 2017) | 1 line Fix accidental regression in UDP Reply message handling ------------------------------------------------------------------------ r8137 | bsomervi | 2017-09-29 11:57:22 +0100 (Fri, 29 Sep 2017) | 1 line Minor clarification for the User Guide waterfall controls description ------------------------------------------------------------------------ r8138 | k1jt | 2017-09-29 14:27:55 +0100 (Fri, 29 Sep 2017) | 2 lines Minor change to make shift/ctrl double-click logic more consistent. ------------------------------------------------------------------------ r8139 | k1jt | 2017-09-29 14:47:26 +0100 (Fri, 29 Sep 2017) | 1 line Remove a diagnostic qDebug(). ------------------------------------------------------------------------ r8140 | k1jt | 2017-09-29 14:59:16 +0100 (Fri, 29 Sep 2017) | 2 lines Additional instructions for using the FreqCal procedure. ------------------------------------------------------------------------ r8141 | k1jt | 2017-09-29 17:53:28 +0100 (Fri, 29 Sep 2017) | 2 lines Many updates to User Guide, mostly to reflect changes in "click behavior". ------------------------------------------------------------------------ r8142 | k1jt | 2017-09-29 17:53:57 +0100 (Fri, 29 Sep 2017) | 1 line Update mouse_sommands.txt. ------------------------------------------------------------------------ r8143 | k1jt | 2017-09-29 17:58:05 +0100 (Fri, 29 Sep 2017) | 3 lines Previous commit message should have mentioned a fix to "stdmsg.f90" that was preventing double-click on a JT65 "OOO" message from populating message fields. ------------------------------------------------------------------------ r8144 | k1jt | 2017-09-29 18:40:30 +0100 (Fri, 29 Sep 2017) | 2 lines Add an option to enforce simplex operation (moving both Tx and Rx frequency) when double-clicking on a decoded text line. ------------------------------------------------------------------------ r8145 | k1jt | 2017-09-30 14:56:33 +0100 (Sat, 30 Sep 2017) | 1 line Fix a regression that prevented double-click on call from working as in r8123. ------------------------------------------------------------------------ r8146 | k1jt | 2017-09-30 18:48:46 +0100 (Sat, 30 Sep 2017) | 21 lines Another try at optimizing the GUI for simplex and split behavior. Details below: 1. Checkbox "Double-click on call sets Tx and Rx freqs" has been removed from the Settings -> General tab. 2. Checkbox "Lock Tx Freq" on main window is relabled "Hold Tx Freq". 3. Behavior now defaults to the "simplex" behavior in use up to code revision r8123. In particular, double-clicking on decoded mesages that do not contain your own call moves both Rx and Tx frequencies. If the first callsign is your own call, only Rx freq moves. 4. If "Hold Tx Freq" is checked, double-clicking on decoded messages moves the Rx frequency; Tx frequency is moved only if CTRL was held down. 5. Clicking on the waterfall moves Rx and Tx frequencies as before: Rx only on a simple click, Tx only on SHIFT-click, and both on CTRL-click. This happens even if "Hold Tx Freq" is checked (which is why this box is no longer labeled "Lock Tx Freq"). ------------------------------------------------------------------------ r8147 | k1jt | 2017-09-30 20:25:01 +0100 (Sat, 30 Sep 2017) | 1 line Fix behavior with double-click on 'CQ <AA-ZZ> <call> <grid>.' ------------------------------------------------------------------------ r8148 | k1jt | 2017-10-01 13:35:43 +0100 (Sun, 01 Oct 2017) | 1 line Correct an improper disabling of TxFreqSpinBox. ------------------------------------------------------------------------ r8149 | k1jt | 2017-10-01 15:03:16 +0100 (Sun, 01 Oct 2017) | 1 line Update mouse_commands.txt and tool tips. ------------------------------------------------------------------------ r8150 | k1jt | 2017-10-01 15:58:10 +0100 (Sun, 01 Oct 2017) | 1 line Update 'blank line' band ID at 4*TRperiod/5. ------------------------------------------------------------------------ r8151 | bsomervi | 2017-10-01 22:43:59 +0100 (Sun, 01 Oct 2017) | 1 line Fix an invalid iterator increment when there are no FreqCal frequencies ------------------------------------------------------------------------ r8152 | bsomervi | 2017-10-01 22:44:07 +0100 (Sun, 01 Oct 2017) | 1 line Fix cty.dat lookups that were not honouring exact match flags ------------------------------------------------------------------------ r8153 | bsomervi | 2017-10-01 22:44:15 +0100 (Sun, 01 Oct 2017) | 6 lines Add "Apply" button to calibration solution message box Make calibration solution application iterative so that calibrations can be applied sequentially if desired. Tidy up calibration solution messages boxes and make i18n friendly. ------------------------------------------------------------------------ r8154 | k1jt | 2017-10-02 14:49:37 +0100 (Mon, 02 Oct 2017) | 2 lines Update User Guide and "mouse_commands". ------------------------------------------------------------------------ r8155 | k1jt | 2017-10-02 15:15:15 +0100 (Mon, 02 Oct 2017) | 2 lines Special DXpedition messages must not have the FreeText bit set. ------------------------------------------------------------------------ r8156 | k1jt | 2017-10-02 19:27:08 +0100 (Mon, 02 Oct 2017) | 2 lines Add more on Copyright protections. ------------------------------------------------------------------------ r8157 | k1jt | 2017-10-02 19:33:17 +0100 (Mon, 02 Oct 2017) | 2 lines Update the list of keyboard shortcuts. ------------------------------------------------------------------------ r8158 | k1jt | 2017-10-02 19:35:06 +0100 (Mon, 02 Oct 2017) | 2 lines Minor edits. ------------------------------------------------------------------------ r8159 | k1jt | 2017-10-03 02:23:24 +0100 (Tue, 03 Oct 2017) | 1 line Correct a misspelling; add quote marks; push 'About' to bottom of Tools menu. ------------------------------------------------------------------------ r8160 | k1jt | 2017-10-03 16:59:47 +0100 (Tue, 03 Oct 2017) | 2 lines Add KA9Q to the copyright notice. ------------------------------------------------------------------------ r8161 | k1jt | 2017-10-04 14:14:51 +0100 (Wed, 04 Oct 2017) | 2 lines Update an image; fix a typo. ------------------------------------------------------------------------ r8162 | k1jt | 2017-10-05 19:27:34 +0100 (Thu, 05 Oct 2017) | 2 lines Fix a bug involving "firstcall contains mycall" but not equal to mycall. ------------------------------------------------------------------------ r8163 | bsomervi | 2017-10-06 17:18:17 +0100 (Fri, 06 Oct 2017) | 1 line Add an accessor method to Configuration to get the current calibration parameters ------------------------------------------------------------------------ r8164 | bsomervi | 2017-10-06 17:18:25 +0100 (Fri, 06 Oct 2017) | 5 lines Rename the fmt.all calibration measurements file after accepting a solution This allows those who want to keep their calibration measurements after finding a solution to calibrate their station. The fmt.all file used to find and accept a solution is renamed to fmt.bak. ------------------------------------------------------------------------ r8165 | k1jt | 2017-10-13 15:36:10 +0100 (Fri, 13 Oct 2017) | 2 lines Update the Tool Tip displayed for Frequency Calibration parameters. ------------------------------------------------------------------------ r8166 | bsomervi | 2017-10-13 23:34:10 +0100 (Fri, 13 Oct 2017) | 1 line Fix an issue with editing IARU regions in the working frequencies table ------------------------------------------------------------------------ r8167 | bsomervi | 2017-10-13 23:34:21 +0100 (Fri, 13 Oct 2017) | 32 lines Improved frequency calibration Measure check box added to FreqCal mode, check to record to fmt.all with current calibration correction disabled, uncheck to see the impact of the current calibration parameters. The fmt.all file is now optionally renamed to fmt.bak when a calibration solution is accepted. This allows users to preserve an fmt.all file that they might have edited for best fit. A calibration procedure might proceed thus:- 1) select FreqCal mode, 2) step through suggested calibration test frequencies deleting those that have no usable signal, 3) enable "Menu->Tools->Execute frequency calibration cycle" and check that suitable signals are present, 4) select a suitable FTol and T/R period, 5) check "Measure" and let the cycle complete a few times to gather data, 6) uncheck "Measure" to complete the data capture, optionally tidy the fmt.all file with your favourite editor, 7) push "Menu->Tools->Solve for calibration parameters" and accept if you like what you see, 8) sit back and admire your accurately frequency calibrated station. ------------------------------------------------------------------------ r8168 | bsomervi | 2017-10-13 23:34:36 +0100 (Fri, 13 Oct 2017) | 4 lines Generic handling of keyboard modifiers via UDP and double-clicks This change opens up all keyboard modifier options to UDP Reply messages as well as double-clicks of decoded messages. ------------------------------------------------------------------------ r8169 | bsomervi | 2017-10-13 23:34:48 +0100 (Fri, 13 Oct 2017) | 3 lines User guide updates for frequency calibration mode Also some instances of non-italicized WSJT-X fixed. ------------------------------------------------------------------------ r8170 | k9an | 2017-10-14 02:02:38 +0100 (Sat, 14 Oct 2017) | 1 line Don't open the false_decodes.txt file. ------------------------------------------------------------------------ git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx-1.8@8171 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
@ -8,7 +8,7 @@
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
// Table of ADIF band definitions as defined in the ADIF
|
// Table of ADIF band definitions as defined in the ADIF
|
||||||
// specification.
|
// specification as at ADIF v3.0.6
|
||||||
struct ADIFBand
|
struct ADIFBand
|
||||||
{
|
{
|
||||||
char const * const name_;
|
char const * const name_;
|
||||||
@ -20,7 +20,7 @@ namespace
|
|||||||
{"560m", 501000u, 504000u},
|
{"560m", 501000u, 504000u},
|
||||||
{"160m", 1800000u, 2000000u},
|
{"160m", 1800000u, 2000000u},
|
||||||
{"80m", 3500000u, 4000000u},
|
{"80m", 3500000u, 4000000u},
|
||||||
{"60m", 5102000u, 5406500u},
|
{"60m", 5060000u, 5450000u},
|
||||||
{"40m", 7000000u, 7300000u},
|
{"40m", 7000000u, 7300000u},
|
||||||
{"30m", 10000000u, 10150000u},
|
{"30m", 10000000u, 10150000u},
|
||||||
{"20m", 14000000u, 14350000u},
|
{"20m", 14000000u, 14350000u},
|
||||||
|
@ -374,6 +374,7 @@ set (wsjt_FSRCS
|
|||||||
lib/fsk4hf/bpdecode174.f90
|
lib/fsk4hf/bpdecode174.f90
|
||||||
lib/fsk4hf/bpdecode300.f90
|
lib/fsk4hf/bpdecode300.f90
|
||||||
lib/baddata.f90
|
lib/baddata.f90
|
||||||
|
lib/calibrate.f90
|
||||||
lib/ccf2.f90
|
lib/ccf2.f90
|
||||||
lib/ccf65.f90
|
lib/ccf65.f90
|
||||||
lib/fsk4hf/chkcrc10.f90
|
lib/fsk4hf/chkcrc10.f90
|
||||||
@ -424,6 +425,7 @@ set (wsjt_FSRCS
|
|||||||
lib/fil4.f90
|
lib/fil4.f90
|
||||||
lib/fil6521.f90
|
lib/fil6521.f90
|
||||||
lib/filbig.f90
|
lib/filbig.f90
|
||||||
|
lib/fitcal.f90
|
||||||
lib/fix_contest_msg.f90
|
lib/fix_contest_msg.f90
|
||||||
lib/flat1.f90
|
lib/flat1.f90
|
||||||
lib/flat1a.f90
|
lib/flat1a.f90
|
||||||
|
@ -237,7 +237,7 @@ public:
|
|||||||
{
|
{
|
||||||
return {frequency_line_edit_.frequency ()
|
return {frequency_line_edit_.frequency ()
|
||||||
, Modes::value (mode_combo_box_.currentText ())
|
, Modes::value (mode_combo_box_.currentText ())
|
||||||
, IARURegions::value (region_combo_box_.currentIndex ())};
|
, IARURegions::value (region_combo_box_.currentText ())};
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -517,8 +517,8 @@ private:
|
|||||||
bool rig_changed_;
|
bool rig_changed_;
|
||||||
TransceiverState cached_rig_state_;
|
TransceiverState cached_rig_state_;
|
||||||
int rig_resolution_; // see Transceiver::resolution signal
|
int rig_resolution_; // see Transceiver::resolution signal
|
||||||
double frequency_calibration_intercept_;
|
CalibrationParams calibration_;
|
||||||
double frequency_calibration_slope_ppm_;
|
bool frequency_calibration_disabled_; // not persistent
|
||||||
unsigned transceiver_command_number_;
|
unsigned transceiver_command_number_;
|
||||||
|
|
||||||
// configuration fields that we publish
|
// configuration fields that we publish
|
||||||
@ -561,7 +561,6 @@ private:
|
|||||||
bool single_decode_;
|
bool single_decode_;
|
||||||
bool twoPass_;
|
bool twoPass_;
|
||||||
bool x2ToneSpacing_;
|
bool x2ToneSpacing_;
|
||||||
bool contestMode_;
|
|
||||||
bool realTimeDecode_;
|
bool realTimeDecode_;
|
||||||
QString udp_server_name_;
|
QString udp_server_name_;
|
||||||
port_type udp_server_port_;
|
port_type udp_server_port_;
|
||||||
@ -652,7 +651,6 @@ bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;}
|
|||||||
bool Configuration::single_decode () const {return m_->single_decode_;}
|
bool Configuration::single_decode () const {return m_->single_decode_;}
|
||||||
bool Configuration::twoPass() const {return m_->twoPass_;}
|
bool Configuration::twoPass() const {return m_->twoPass_;}
|
||||||
bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;}
|
bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;}
|
||||||
bool Configuration::contestMode() const {return m_->contestMode_;}
|
|
||||||
bool Configuration::realTimeDecode() const {return m_->realTimeDecode_;}
|
bool Configuration::realTimeDecode() const {return m_->realTimeDecode_;}
|
||||||
bool Configuration::split_mode () const {return m_->split_mode ();}
|
bool Configuration::split_mode () const {return m_->split_mode ();}
|
||||||
QString Configuration::udp_server_name () const {return m_->udp_server_name_;}
|
QString Configuration::udp_server_name () const {return m_->udp_server_name_;}
|
||||||
@ -675,6 +673,18 @@ QString Configuration::rig_name () const {return m_->rig_params_.rig_name;}
|
|||||||
bool Configuration::pwrBandTxMemory () const {return m_->pwrBandTxMemory_;}
|
bool Configuration::pwrBandTxMemory () const {return m_->pwrBandTxMemory_;}
|
||||||
bool Configuration::pwrBandTuneMemory () const {return m_->pwrBandTuneMemory_;}
|
bool Configuration::pwrBandTuneMemory () const {return m_->pwrBandTuneMemory_;}
|
||||||
|
|
||||||
|
void Configuration::set_calibration (CalibrationParams params)
|
||||||
|
{
|
||||||
|
m_->calibration_ = params;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Configuration::enable_calibration (bool on)
|
||||||
|
{
|
||||||
|
auto target_frequency = m_->remove_calibration (m_->cached_rig_state_.frequency ()) - m_->current_offset_;
|
||||||
|
m_->frequency_calibration_disabled_ = !on;
|
||||||
|
transceiver_frequency (target_frequency);
|
||||||
|
}
|
||||||
|
|
||||||
bool Configuration::is_transceiver_online () const
|
bool Configuration::is_transceiver_online () const
|
||||||
{
|
{
|
||||||
return m_->rig_active_;
|
return m_->rig_active_;
|
||||||
@ -794,12 +804,15 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
|
|||||||
QSettings * settings, QWidget * parent)
|
QSettings * settings, QWidget * parent)
|
||||||
: QDialog {parent}
|
: QDialog {parent}
|
||||||
, self_ {self}
|
, self_ {self}
|
||||||
|
, transceiver_thread_ {nullptr}
|
||||||
, ui_ {new Ui::configuration_dialog}
|
, ui_ {new Ui::configuration_dialog}
|
||||||
, settings_ {settings}
|
, settings_ {settings}
|
||||||
, doc_dir_ {doc_path ()}
|
, doc_dir_ {doc_path ()}
|
||||||
, data_dir_ {data_path ()}
|
, data_dir_ {data_path ()}
|
||||||
, temp_dir_ {temp_directory}
|
, temp_dir_ {temp_directory}
|
||||||
, writeable_data_dir_ {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}
|
, writeable_data_dir_ {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}
|
||||||
|
, restart_sound_input_device_ {false}
|
||||||
|
, restart_sound_output_device_ {false}
|
||||||
, frequencies_ {&bands_}
|
, frequencies_ {&bands_}
|
||||||
, next_frequencies_ {&bands_}
|
, next_frequencies_ {&bands_}
|
||||||
, stations_ {&bands_}
|
, stations_ {&bands_}
|
||||||
@ -814,6 +827,7 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
|
|||||||
, have_rig_ {false}
|
, have_rig_ {false}
|
||||||
, rig_changed_ {false}
|
, rig_changed_ {false}
|
||||||
, rig_resolution_ {0}
|
, rig_resolution_ {0}
|
||||||
|
, frequency_calibration_disabled_ {false}
|
||||||
, transceiver_command_number_ {0}
|
, transceiver_command_number_ {0}
|
||||||
, degrade_ {0.} // initialize to zero each run, not
|
, degrade_ {0.} // initialize to zero each run, not
|
||||||
// saved in settings
|
// saved in settings
|
||||||
@ -1025,9 +1039,6 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
|
|||||||
ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_);
|
ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_);
|
||||||
ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_);
|
ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_);
|
||||||
|
|
||||||
restart_sound_input_device_ = false;
|
|
||||||
restart_sound_output_device_ = false;
|
|
||||||
|
|
||||||
enumerate_rigs ();
|
enumerate_rigs ();
|
||||||
initialize_models ();
|
initialize_models ();
|
||||||
|
|
||||||
@ -1092,7 +1103,6 @@ void Configuration::impl::initialize_models ()
|
|||||||
ui_->single_decode_check_box->setChecked(single_decode_);
|
ui_->single_decode_check_box->setChecked(single_decode_);
|
||||||
ui_->cbTwoPass->setChecked(twoPass_);
|
ui_->cbTwoPass->setChecked(twoPass_);
|
||||||
ui_->cbx2ToneSpacing->setChecked(x2ToneSpacing_);
|
ui_->cbx2ToneSpacing->setChecked(x2ToneSpacing_);
|
||||||
ui_->cbContestMode->setChecked(contestMode_);
|
|
||||||
ui_->cbRealTime->setChecked(realTimeDecode_);
|
ui_->cbRealTime->setChecked(realTimeDecode_);
|
||||||
ui_->cbRealTime->setVisible(false); //Tempoary -- probably will remove this control
|
ui_->cbRealTime->setVisible(false); //Tempoary -- probably will remove this control
|
||||||
ui_->type_2_msg_gen_combo_box->setCurrentIndex (type_2_msg_gen_);
|
ui_->type_2_msg_gen_combo_box->setCurrentIndex (type_2_msg_gen_);
|
||||||
@ -1128,8 +1138,8 @@ void Configuration::impl::initialize_models ()
|
|||||||
ui_->accept_udp_requests_check_box->setChecked (accept_udp_requests_);
|
ui_->accept_udp_requests_check_box->setChecked (accept_udp_requests_);
|
||||||
ui_->udpWindowToFront->setChecked(udpWindowToFront_);
|
ui_->udpWindowToFront->setChecked(udpWindowToFront_);
|
||||||
ui_->udpWindowRestore->setChecked(udpWindowRestore_);
|
ui_->udpWindowRestore->setChecked(udpWindowRestore_);
|
||||||
ui_->calibration_intercept_spin_box->setValue (frequency_calibration_intercept_);
|
ui_->calibration_intercept_spin_box->setValue (calibration_.intercept);
|
||||||
ui_->calibration_slope_ppm_spin_box->setValue (frequency_calibration_slope_ppm_);
|
ui_->calibration_slope_ppm_spin_box->setValue (calibration_.slope_ppm);
|
||||||
|
|
||||||
if (rig_params_.ptt_port.isEmpty ())
|
if (rig_params_.ptt_port.isEmpty ())
|
||||||
{
|
{
|
||||||
@ -1323,7 +1333,6 @@ void Configuration::impl::read_settings ()
|
|||||||
single_decode_ = settings_->value("SingleDecode",false).toBool ();
|
single_decode_ = settings_->value("SingleDecode",false).toBool ();
|
||||||
twoPass_ = settings_->value("TwoPass",true).toBool ();
|
twoPass_ = settings_->value("TwoPass",true).toBool ();
|
||||||
x2ToneSpacing_ = settings_->value("x2ToneSpacing",false).toBool ();
|
x2ToneSpacing_ = settings_->value("x2ToneSpacing",false).toBool ();
|
||||||
contestMode_ = settings_->value("ContestMode",false).toBool ();
|
|
||||||
realTimeDecode_ = settings_->value("RealTimeDecode",false).toBool ();
|
realTimeDecode_ = settings_->value("RealTimeDecode",false).toBool ();
|
||||||
rig_params_.poll_interval = settings_->value ("Polling", 0).toInt ();
|
rig_params_.poll_interval = settings_->value ("Polling", 0).toInt ();
|
||||||
rig_params_.split_mode = settings_->value ("SplitMode", QVariant::fromValue (TransceiverFactory::split_mode_none)).value<TransceiverFactory::SplitMode> ();
|
rig_params_.split_mode = settings_->value ("SplitMode", QVariant::fromValue (TransceiverFactory::split_mode_none)).value<TransceiverFactory::SplitMode> ();
|
||||||
@ -1332,8 +1341,8 @@ void Configuration::impl::read_settings ()
|
|||||||
accept_udp_requests_ = settings_->value ("AcceptUDPRequests", false).toBool ();
|
accept_udp_requests_ = settings_->value ("AcceptUDPRequests", false).toBool ();
|
||||||
udpWindowToFront_ = settings_->value ("udpWindowToFront",false).toBool ();
|
udpWindowToFront_ = settings_->value ("udpWindowToFront",false).toBool ();
|
||||||
udpWindowRestore_ = settings_->value ("udpWindowRestore",false).toBool ();
|
udpWindowRestore_ = settings_->value ("udpWindowRestore",false).toBool ();
|
||||||
frequency_calibration_intercept_ = settings_->value ("CalibrationIntercept", 0.).toDouble ();
|
calibration_.intercept = settings_->value ("CalibrationIntercept", 0.).toDouble ();
|
||||||
frequency_calibration_slope_ppm_ = settings_->value ("CalibrationSlopePPM", 0.).toDouble ();
|
calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble ();
|
||||||
pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool ();
|
pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool ();
|
||||||
pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool ();
|
pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool ();
|
||||||
}
|
}
|
||||||
@ -1422,15 +1431,14 @@ void Configuration::impl::write_settings ()
|
|||||||
settings_->setValue ("SingleDecode", single_decode_);
|
settings_->setValue ("SingleDecode", single_decode_);
|
||||||
settings_->setValue ("TwoPass", twoPass_);
|
settings_->setValue ("TwoPass", twoPass_);
|
||||||
settings_->setValue ("x2ToneSpacing", x2ToneSpacing_);
|
settings_->setValue ("x2ToneSpacing", x2ToneSpacing_);
|
||||||
settings_->setValue ("ContestMode", contestMode_);
|
|
||||||
settings_->setValue ("RealTimeDecode", realTimeDecode_);
|
settings_->setValue ("RealTimeDecode", realTimeDecode_);
|
||||||
settings_->setValue ("UDPServer", udp_server_name_);
|
settings_->setValue ("UDPServer", udp_server_name_);
|
||||||
settings_->setValue ("UDPServerPort", udp_server_port_);
|
settings_->setValue ("UDPServerPort", udp_server_port_);
|
||||||
settings_->setValue ("AcceptUDPRequests", accept_udp_requests_);
|
settings_->setValue ("AcceptUDPRequests", accept_udp_requests_);
|
||||||
settings_->setValue ("udpWindowToFront", udpWindowToFront_);
|
settings_->setValue ("udpWindowToFront", udpWindowToFront_);
|
||||||
settings_->setValue ("udpWindowRestore", udpWindowRestore_);
|
settings_->setValue ("udpWindowRestore", udpWindowRestore_);
|
||||||
settings_->setValue ("CalibrationIntercept", frequency_calibration_intercept_);
|
settings_->setValue ("CalibrationIntercept", calibration_.intercept);
|
||||||
settings_->setValue ("CalibrationSlopePPM", frequency_calibration_slope_ppm_);
|
settings_->setValue ("CalibrationSlopePPM", calibration_.slope_ppm);
|
||||||
settings_->setValue ("pwrBandTxMemory", pwrBandTxMemory_);
|
settings_->setValue ("pwrBandTxMemory", pwrBandTxMemory_);
|
||||||
settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_);
|
settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_);
|
||||||
settings_->setValue ("Region", QVariant::fromValue (region_));
|
settings_->setValue ("Region", QVariant::fromValue (region_));
|
||||||
@ -1818,10 +1826,9 @@ void Configuration::impl::accept ()
|
|||||||
single_decode_ = ui_->single_decode_check_box->isChecked ();
|
single_decode_ = ui_->single_decode_check_box->isChecked ();
|
||||||
twoPass_ = ui_->cbTwoPass->isChecked ();
|
twoPass_ = ui_->cbTwoPass->isChecked ();
|
||||||
x2ToneSpacing_ = ui_->cbx2ToneSpacing->isChecked ();
|
x2ToneSpacing_ = ui_->cbx2ToneSpacing->isChecked ();
|
||||||
contestMode_ = ui_->cbContestMode->isChecked ();
|
|
||||||
realTimeDecode_ = ui_->cbRealTime->isChecked ();
|
realTimeDecode_ = ui_->cbRealTime->isChecked ();
|
||||||
frequency_calibration_intercept_ = ui_->calibration_intercept_spin_box->value ();
|
calibration_.intercept = ui_->calibration_intercept_spin_box->value ();
|
||||||
frequency_calibration_slope_ppm_ = ui_->calibration_slope_ppm_spin_box->value ();
|
calibration_.slope_ppm = ui_->calibration_slope_ppm_spin_box->value ();
|
||||||
pwrBandTxMemory_ = ui_->checkBoxPwrBandTxMemory->isChecked ();
|
pwrBandTxMemory_ = ui_->checkBoxPwrBandTxMemory->isChecked ();
|
||||||
pwrBandTuneMemory_ = ui_->checkBoxPwrBandTuneMemory->isChecked ();
|
pwrBandTuneMemory_ = ui_->checkBoxPwrBandTuneMemory->isChecked ();
|
||||||
auto new_server = ui_->udp_server_line_edit->text ();
|
auto new_server = ui_->udp_server_line_edit->text ();
|
||||||
@ -1847,7 +1854,7 @@ void Configuration::impl::accept ()
|
|||||||
macros_.setStringList (next_macros_.stringList ());
|
macros_.setStringList (next_macros_.stringList ());
|
||||||
}
|
}
|
||||||
|
|
||||||
region_ = IARURegions::value (ui_->region_combo_box->currentIndex ());
|
region_ = IARURegions::value (ui_->region_combo_box->currentText ());
|
||||||
|
|
||||||
if (frequencies_.frequency_list () != next_frequencies_.frequency_list ())
|
if (frequencies_.frequency_list () != next_frequencies_.frequency_list ())
|
||||||
{
|
{
|
||||||
@ -2673,14 +2680,16 @@ void Configuration::impl::fill_port_combo_box (QComboBox * cb)
|
|||||||
|
|
||||||
auto Configuration::impl::apply_calibration (Frequency f) const -> Frequency
|
auto Configuration::impl::apply_calibration (Frequency f) const -> Frequency
|
||||||
{
|
{
|
||||||
return std::llround (frequency_calibration_intercept_
|
if (frequency_calibration_disabled_) return f;
|
||||||
+ (1. + frequency_calibration_slope_ppm_ / 1.e6) * f);
|
return std::llround (calibration_.intercept
|
||||||
|
+ (1. + calibration_.slope_ppm / 1.e6) * f);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Configuration::impl::remove_calibration (Frequency f) const -> Frequency
|
auto Configuration::impl::remove_calibration (Frequency f) const -> Frequency
|
||||||
{
|
{
|
||||||
return std::llround ((f - frequency_calibration_intercept_)
|
if (frequency_calibration_disabled_) return f;
|
||||||
/ (1. + frequency_calibration_slope_ppm_ / 1.e6));
|
return std::llround ((f - calibration_.intercept)
|
||||||
|
/ (1. + calibration_.slope_ppm / 1.e6));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined (QT_NO_DEBUG_STREAM)
|
#if !defined (QT_NO_DEBUG_STREAM)
|
||||||
|
@ -159,6 +159,31 @@ public:
|
|||||||
QColor color_NewCall () const;
|
QColor color_NewCall () const;
|
||||||
bool pwrBandTxMemory () const;
|
bool pwrBandTxMemory () const;
|
||||||
bool pwrBandTuneMemory () const;
|
bool pwrBandTuneMemory () const;
|
||||||
|
|
||||||
|
struct CalibrationParams
|
||||||
|
{
|
||||||
|
CalibrationParams ()
|
||||||
|
: intercept {0.}
|
||||||
|
, slope_ppm {0.}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CalibrationParams (double the_intercept, double the_slope_ppm)
|
||||||
|
: intercept {the_intercept}
|
||||||
|
, slope_ppm {the_slope_ppm}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
double intercept; // Hertz
|
||||||
|
double slope_ppm; // Hertz
|
||||||
|
};
|
||||||
|
|
||||||
|
// Temporarily enable or disable calibration adjustments.
|
||||||
|
void enable_calibration (bool = true);
|
||||||
|
|
||||||
|
// Set the calibration parameters and enable calibration corrections.
|
||||||
|
void set_calibration (CalibrationParams);
|
||||||
|
|
||||||
// This method queries if a CAT and PTT connection is operational.
|
// This method queries if a CAT and PTT connection is operational.
|
||||||
bool is_transceiver_online () const;
|
bool is_transceiver_online () const;
|
||||||
|
|
||||||
|
160
Configuration.ui
@ -6,7 +6,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>536</width>
|
<width>521</width>
|
||||||
<height>507</height>
|
<height>507</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@ -120,7 +120,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner my log the wrong callsign.</p><p>None of these options are perfect, message 3 is best but be aware your QSO partner may not log the report you send them.</p></body></html></string>
|
<string><html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.</p><p>None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@ -269,13 +269,52 @@
|
|||||||
<string>Behavior</string>
|
<string>Behavior</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_8">
|
<layout class="QGridLayout" name="gridLayout_8">
|
||||||
<item row="0" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QCheckBox" name="enable_VHF_features_check_box">
|
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_7">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_10">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Enable VHF/UHF/Microwave features</string>
|
<string>Tx watchdog:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>tx_watchdog_spin_box</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="tx_watchdog_spin_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="specialValueText">
|
||||||
|
<string>Disabled</string>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> minutes</string>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="monitor_off_check_box">
|
<widget class="QCheckBox" name="monitor_off_check_box">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -289,6 +328,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QCheckBox" name="enable_VHF_features_check_box">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable VHF/UHF/Microwave features</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QCheckBox" name="decode_at_52s_check_box">
|
<widget class="QCheckBox" name="decode_at_52s_check_box">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -296,6 +342,23 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QCheckBox" name="single_decode_check_box">
|
||||||
|
<property name="text">
|
||||||
|
<string>Single decode</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QCheckBox" name="tx_QSY_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Allow Tx frequency changes while transmitting</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="6" column="0" colspan="2">
|
<item row="6" column="0" colspan="2">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||||
<item>
|
<item>
|
||||||
@ -355,69 +418,6 @@ quiet period when decoding is done.</string>
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QCheckBox" name="single_decode_check_box">
|
|
||||||
<property name="text">
|
|
||||||
<string>Single decode</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QCheckBox" name="tx_QSY_check_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Allow Tx frequency changes while transmitting</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_10">
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx watchdog:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>tx_watchdog_spin_box</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QSpinBox" name="tx_watchdog_spin_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="specialValueText">
|
|
||||||
<string>Disabled</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string> minutes</string>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_7">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="monitor_last_used_check_box">
|
<widget class="QCheckBox" name="monitor_last_used_check_box">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -1820,7 +1820,7 @@ for assessing propagation and system performance.</string>
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_3">
|
<widget class="QGroupBox" name="groupBox_3">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>See WSPR documentation Appendix C for details of how to determine these factors for your radio.</string>
|
<string><html><head/><body><p>See &quot;Frequency Calibration&quot; in the WSJT-X User Guide for details of how to determine these parameters for your radio.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Frequency Calibration</string>
|
<string>Frequency Calibration</string>
|
||||||
@ -2337,16 +2337,6 @@ Right click for insert and delete options.</string>
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QCheckBox" name="cbContestMode">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Exchange 4-character grid locators instead of reports. See User Guide for details.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>FT8 and MSK144: NA VHF Contest Mode</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QCheckBox" name="cbx2ToneSpacing">
|
<widget class="QCheckBox" name="cbx2ToneSpacing">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html></string>
|
<string><html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html></string>
|
||||||
@ -2356,7 +2346,7 @@ Right click for insert and delete options.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QCheckBox" name="cbRealTime">
|
<widget class="QCheckBox" name="cbRealTime">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@ -2489,7 +2479,6 @@ soundcard changes</string>
|
|||||||
<tabstop>monitor_off_check_box</tabstop>
|
<tabstop>monitor_off_check_box</tabstop>
|
||||||
<tabstop>monitor_last_used_check_box</tabstop>
|
<tabstop>monitor_last_used_check_box</tabstop>
|
||||||
<tabstop>quick_call_check_box</tabstop>
|
<tabstop>quick_call_check_box</tabstop>
|
||||||
<tabstop>disable_TX_on_73_check_box</tabstop>
|
|
||||||
<tabstop>tx_watchdog_spin_box</tabstop>
|
<tabstop>tx_watchdog_spin_box</tabstop>
|
||||||
<tabstop>CW_id_after_73_check_box</tabstop>
|
<tabstop>CW_id_after_73_check_box</tabstop>
|
||||||
<tabstop>enable_VHF_features_check_box</tabstop>
|
<tabstop>enable_VHF_features_check_box</tabstop>
|
||||||
@ -2562,7 +2551,6 @@ soundcard changes</string>
|
|||||||
<tabstop>sbDegrade</tabstop>
|
<tabstop>sbDegrade</tabstop>
|
||||||
<tabstop>sbBandwidth</tabstop>
|
<tabstop>sbBandwidth</tabstop>
|
||||||
<tabstop>sbTxDelay</tabstop>
|
<tabstop>sbTxDelay</tabstop>
|
||||||
<tabstop>cbContestMode</tabstop>
|
|
||||||
<tabstop>cbx2ToneSpacing</tabstop>
|
<tabstop>cbx2ToneSpacing</tabstop>
|
||||||
<tabstop>cbRealTime</tabstop>
|
<tabstop>cbRealTime</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
@ -2634,12 +2622,12 @@ soundcard changes</string>
|
|||||||
</connection>
|
</connection>
|
||||||
</connections>
|
</connections>
|
||||||
<buttongroups>
|
<buttongroups>
|
||||||
<buttongroup name="split_mode_button_group"/>
|
<buttongroup name="CAT_handshake_button_group"/>
|
||||||
<buttongroup name="TX_audio_source_button_group"/>
|
|
||||||
<buttongroup name="CAT_stop_bits_button_group"/>
|
<buttongroup name="CAT_stop_bits_button_group"/>
|
||||||
|
<buttongroup name="TX_audio_source_button_group"/>
|
||||||
|
<buttongroup name="split_mode_button_group"/>
|
||||||
|
<buttongroup name="PTT_method_button_group"/>
|
||||||
<buttongroup name="TX_mode_button_group"/>
|
<buttongroup name="TX_mode_button_group"/>
|
||||||
<buttongroup name="CAT_data_bits_button_group"/>
|
<buttongroup name="CAT_data_bits_button_group"/>
|
||||||
<buttongroup name="CAT_handshake_button_group"/>
|
|
||||||
<buttongroup name="PTT_method_button_group"/>
|
|
||||||
</buttongroups>
|
</buttongroups>
|
||||||
</ui>
|
</ui>
|
||||||
|
@ -610,9 +610,8 @@ bool FrequencyList_v2::impl::setData (QModelIndex const& model_index, QVariant c
|
|||||||
switch (model_index.column ())
|
switch (model_index.column ())
|
||||||
{
|
{
|
||||||
case region_column:
|
case region_column:
|
||||||
if (value.canConvert<Region> ())
|
|
||||||
{
|
{
|
||||||
auto region = static_cast<Region> (value.toUInt ());
|
auto region = IARURegions::value (value.toString ());
|
||||||
if (region != item.region_)
|
if (region != item.region_)
|
||||||
{
|
{
|
||||||
item.region_ = region;
|
item.region_ = region;
|
||||||
@ -623,7 +622,6 @@ bool FrequencyList_v2::impl::setData (QModelIndex const& model_index, QVariant c
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case mode_column:
|
case mode_column:
|
||||||
if (value.canConvert<Mode> ())
|
|
||||||
{
|
{
|
||||||
auto mode = Modes::value (value.toString ());
|
auto mode = Modes::value (value.toString ());
|
||||||
if (mode != item.mode_)
|
if (mode != item.mode_)
|
||||||
|
@ -34,10 +34,14 @@ char const * IARURegions::name (Region r)
|
|||||||
return region_names[static_cast<int> (r)];
|
return region_names[static_cast<int> (r)];
|
||||||
}
|
}
|
||||||
|
|
||||||
auto IARURegions::value (int r) -> Region
|
auto IARURegions::value (QString const& s) -> Region
|
||||||
{
|
{
|
||||||
if (r < 0 || r + 1 >= SENTINAL) return ALL;
|
auto end = region_names + region_names_size;
|
||||||
return static_cast<Region> (r);
|
auto p = std::find_if (region_names, end
|
||||||
|
, [&s] (char const * const name) {
|
||||||
|
return name == s;
|
||||||
|
});
|
||||||
|
return p != end ? static_cast<Region> (p - region_names) : ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant IARURegions::data (QModelIndex const& index, int role) const
|
QVariant IARURegions::data (QModelIndex const& index, int role) const
|
||||||
|
@ -51,7 +51,7 @@ public:
|
|||||||
|
|
||||||
// translate between enumeration and human readable strings
|
// translate between enumeration and human readable strings
|
||||||
static char const * name (Region);
|
static char const * name (Region);
|
||||||
static Region value (int);
|
static Region value (QString const&);
|
||||||
|
|
||||||
// Implement the QAbstractListModel interface
|
// Implement the QAbstractListModel interface
|
||||||
int rowCount (QModelIndex const& parent = QModelIndex {}) const override
|
int rowCount (QModelIndex const& parent = QModelIndex {}) const override
|
||||||
|
@ -152,12 +152,14 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
|
|||||||
QByteArray mode;
|
QByteArray mode;
|
||||||
QByteArray message;
|
QByteArray message;
|
||||||
bool low_confidence {false};
|
bool low_confidence {false};
|
||||||
in >> time >> snr >> delta_time >> delta_frequency >> mode >> message >> low_confidence;
|
quint8 modifiers {0};
|
||||||
|
in >> time >> snr >> delta_time >> delta_frequency >> mode >> message
|
||||||
|
>> low_confidence >> modifiers;
|
||||||
if (check_status (in) != Fail)
|
if (check_status (in) != Fail)
|
||||||
{
|
{
|
||||||
Q_EMIT self_->reply (time, snr, delta_time, delta_frequency
|
Q_EMIT self_->reply (time, snr, delta_time, delta_frequency
|
||||||
, QString::fromUtf8 (mode), QString::fromUtf8 (message)
|
, QString::fromUtf8 (mode), QString::fromUtf8 (message)
|
||||||
, low_confidence);
|
, low_confidence, modifiers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -368,27 +370,29 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MessageClient::decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
void MessageClient::decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
||||||
, QString const& mode, QString const& message_text, bool low_confidence)
|
, QString const& mode, QString const& message_text, bool low_confidence
|
||||||
|
, bool off_air)
|
||||||
{
|
{
|
||||||
if (m_->server_port_ && !m_->server_string_.isEmpty ())
|
if (m_->server_port_ && !m_->server_string_.isEmpty ())
|
||||||
{
|
{
|
||||||
QByteArray message;
|
QByteArray message;
|
||||||
NetworkMessage::Builder out {&message, NetworkMessage::Decode, m_->id_, m_->schema_};
|
NetworkMessage::Builder out {&message, NetworkMessage::Decode, m_->id_, m_->schema_};
|
||||||
out << is_new << time << snr << delta_time << delta_frequency << mode.toUtf8 ()
|
out << is_new << time << snr << delta_time << delta_frequency << mode.toUtf8 ()
|
||||||
<< message_text.toUtf8 () << low_confidence;
|
<< message_text.toUtf8 () << low_confidence << off_air;
|
||||||
m_->send_message (out, message);
|
m_->send_message (out, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageClient::WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency frequency
|
void MessageClient::WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency frequency
|
||||||
, qint32 drift, QString const& callsign, QString const& grid, qint32 power)
|
, qint32 drift, QString const& callsign, QString const& grid, qint32 power
|
||||||
|
, bool off_air)
|
||||||
{
|
{
|
||||||
if (m_->server_port_ && !m_->server_string_.isEmpty ())
|
if (m_->server_port_ && !m_->server_string_.isEmpty ())
|
||||||
{
|
{
|
||||||
QByteArray message;
|
QByteArray message;
|
||||||
NetworkMessage::Builder out {&message, NetworkMessage::WSPRDecode, m_->id_, m_->schema_};
|
NetworkMessage::Builder out {&message, NetworkMessage::WSPRDecode, m_->id_, m_->schema_};
|
||||||
out << is_new << time << snr << delta_time << frequency << drift << callsign.toUtf8 ()
|
out << is_new << time << snr << delta_time << frequency << drift << callsign.toUtf8 ()
|
||||||
<< grid.toUtf8 () << power;
|
<< grid.toUtf8 () << power << off_air;
|
||||||
m_->send_message (out, message);
|
m_->send_message (out, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -403,17 +407,18 @@ void MessageClient::clear_decodes ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageClient::qso_logged (QDateTime timeOff, QString const& dx_call, QString const& dx_grid
|
void MessageClient::qso_logged (QDateTime time_off, QString const& dx_call, QString const& dx_grid
|
||||||
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
||||||
, QString const& report_received, QString const& tx_power
|
, QString const& report_received, QString const& tx_power
|
||||||
, QString const& comments, QString const& name, QDateTime timeOn)
|
, QString const& comments, QString const& name, QDateTime time_on)
|
||||||
{
|
{
|
||||||
if (m_->server_port_ && !m_->server_string_.isEmpty ())
|
if (m_->server_port_ && !m_->server_string_.isEmpty ())
|
||||||
{
|
{
|
||||||
QByteArray message;
|
QByteArray message;
|
||||||
NetworkMessage::Builder out {&message, NetworkMessage::QSOLogged, m_->id_, m_->schema_};
|
NetworkMessage::Builder out {&message, NetworkMessage::QSOLogged, m_->id_, m_->schema_};
|
||||||
out << timeOff << dx_call.toUtf8 () << dx_grid.toUtf8 () << dial_frequency << mode.toUtf8 ()
|
out << time_off << dx_call.toUtf8 () << dx_grid.toUtf8 () << dial_frequency << mode.toUtf8 ()
|
||||||
<< report_sent.toUtf8 () << report_received.toUtf8 () << tx_power.toUtf8 () << comments.toUtf8 () << name.toUtf8 () << timeOn;
|
<< report_sent.toUtf8 () << report_received.toUtf8 () << tx_power.toUtf8 () << comments.toUtf8 ()
|
||||||
|
<< name.toUtf8 () << time_on;
|
||||||
m_->send_message (out, message);
|
m_->send_message (out, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,14 +53,16 @@ public:
|
|||||||
, QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode
|
, QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode
|
||||||
, bool fast_mode);
|
, bool fast_mode);
|
||||||
Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
||||||
, QString const& mode, QString const& message, bool low_confidence);
|
, QString const& mode, QString const& message, bool low_confidence
|
||||||
|
, bool off_air);
|
||||||
Q_SLOT void WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency
|
Q_SLOT void WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency
|
||||||
, qint32 drift, QString const& callsign, QString const& grid, qint32 power);
|
, qint32 drift, QString const& callsign, QString const& grid, qint32 power
|
||||||
|
, bool off_air);
|
||||||
Q_SLOT void clear_decodes ();
|
Q_SLOT void clear_decodes ();
|
||||||
Q_SLOT void qso_logged (QDateTime timeOff, QString const& dx_call, QString const& dx_grid
|
Q_SLOT void qso_logged (QDateTime time_off, QString const& dx_call, QString const& dx_grid
|
||||||
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
||||||
, QString const& report_received, QString const& tx_power, QString const& comments
|
, QString const& report_received, QString const& tx_power, QString const& comments
|
||||||
, QString const& name, QDateTime timeOn);
|
, QString const& name, QDateTime time_on);
|
||||||
|
|
||||||
// this slot may be used to send arbitrary UDP datagrams to and
|
// this slot may be used to send arbitrary UDP datagrams to and
|
||||||
// destination allowing the underlying socket to be used for general
|
// destination allowing the underlying socket to be used for general
|
||||||
@ -70,7 +72,7 @@ public:
|
|||||||
// this signal is emitted if the server sends us a reply, the only
|
// this signal is emitted if the server sends us a reply, the only
|
||||||
// reply supported is reply to a prior CQ or QRZ message
|
// reply supported is reply to a prior CQ or QRZ message
|
||||||
Q_SIGNAL void reply (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode
|
Q_SIGNAL void reply (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode
|
||||||
, QString const& message_text, bool low_confidence);
|
, QString const& message_text, bool low_confidence, quint8 modifiers);
|
||||||
|
|
||||||
// this signal is emitted if the server has requested a replay of
|
// this signal is emitted if the server has requested a replay of
|
||||||
// all decodes
|
// all decodes
|
||||||
|
@ -241,14 +241,15 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
|
|||||||
quint32 delta_frequency;
|
quint32 delta_frequency;
|
||||||
QByteArray mode;
|
QByteArray mode;
|
||||||
QByteArray message;
|
QByteArray message;
|
||||||
bool low_confidence;
|
bool low_confidence {false};
|
||||||
|
bool off_air {false};
|
||||||
in >> is_new >> time >> snr >> delta_time >> delta_frequency >> mode
|
in >> is_new >> time >> snr >> delta_time >> delta_frequency >> mode
|
||||||
>> message >> low_confidence;
|
>> message >> low_confidence >> off_air;
|
||||||
if (check_status (in) != Fail)
|
if (check_status (in) != Fail)
|
||||||
{
|
{
|
||||||
Q_EMIT self_->decode (is_new, id, time, snr, delta_time, delta_frequency
|
Q_EMIT self_->decode (is_new, id, time, snr, delta_time, delta_frequency
|
||||||
, QString::fromUtf8 (mode), QString::fromUtf8 (message)
|
, QString::fromUtf8 (mode), QString::fromUtf8 (message)
|
||||||
, low_confidence);
|
, low_confidence, off_air);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -265,18 +266,21 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
|
|||||||
QByteArray callsign;
|
QByteArray callsign;
|
||||||
QByteArray grid;
|
QByteArray grid;
|
||||||
qint32 power;
|
qint32 power;
|
||||||
in >> is_new >> time >> snr >> delta_time >> frequency >> drift >> callsign >> grid >> power;
|
bool off_air {false};
|
||||||
|
in >> is_new >> time >> snr >> delta_time >> frequency >> drift >> callsign >> grid >> power
|
||||||
|
>> off_air;
|
||||||
if (check_status (in) != Fail)
|
if (check_status (in) != Fail)
|
||||||
{
|
{
|
||||||
Q_EMIT self_->WSPR_decode (is_new, id, time, snr, delta_time, frequency, drift
|
Q_EMIT self_->WSPR_decode (is_new, id, time, snr, delta_time, frequency, drift
|
||||||
, QString::fromUtf8 (callsign), QString::fromUtf8 (grid), power);
|
, QString::fromUtf8 (callsign), QString::fromUtf8 (grid)
|
||||||
|
, power, off_air);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NetworkMessage::QSOLogged:
|
case NetworkMessage::QSOLogged:
|
||||||
{
|
{
|
||||||
QDateTime timeOff;
|
QDateTime time_off;
|
||||||
QByteArray dx_call;
|
QByteArray dx_call;
|
||||||
QByteArray dx_grid;
|
QByteArray dx_grid;
|
||||||
Frequency dial_frequency;
|
Frequency dial_frequency;
|
||||||
@ -286,15 +290,15 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
|
|||||||
QByteArray tx_power;
|
QByteArray tx_power;
|
||||||
QByteArray comments;
|
QByteArray comments;
|
||||||
QByteArray name;
|
QByteArray name;
|
||||||
QDateTime timeOn; // Note: LOTW uses TIME_ON for their +/- 30-minute time window
|
QDateTime time_on; // Note: LOTW uses TIME_ON for their +/- 30-minute time window
|
||||||
in >> timeOff >> dx_call >> dx_grid >> dial_frequency >> mode >> report_sent >> report_received
|
in >> time_off >> dx_call >> dx_grid >> dial_frequency >> mode >> report_sent >> report_received
|
||||||
>> tx_power >> comments >> name >> timeOn;
|
>> tx_power >> comments >> name >> time_on;
|
||||||
if (check_status (in) != Fail)
|
if (check_status (in) != Fail)
|
||||||
{
|
{
|
||||||
Q_EMIT self_->qso_logged (id, timeOff, QString::fromUtf8 (dx_call), QString::fromUtf8 (dx_grid)
|
Q_EMIT self_->qso_logged (id, time_off, QString::fromUtf8 (dx_call), QString::fromUtf8 (dx_grid)
|
||||||
, dial_frequency, QString::fromUtf8 (mode), QString::fromUtf8 (report_sent)
|
, dial_frequency, QString::fromUtf8 (mode), QString::fromUtf8 (report_sent)
|
||||||
, QString::fromUtf8 (report_received), QString::fromUtf8 (tx_power)
|
, QString::fromUtf8 (report_received), QString::fromUtf8 (tx_power)
|
||||||
, QString::fromUtf8 (comments), QString::fromUtf8 (name), timeOn);
|
, QString::fromUtf8 (comments), QString::fromUtf8 (name), time_on);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -399,7 +403,9 @@ void MessageServer::start (port_type port, QHostAddress const& multicast_group_a
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageServer::reply (QString const& id, QTime time, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence)
|
void MessageServer::reply (QString const& id, QTime time, qint32 snr, float delta_time
|
||||||
|
, quint32 delta_frequency, QString const& mode
|
||||||
|
, QString const& message_text, bool low_confidence, quint8 modifiers)
|
||||||
{
|
{
|
||||||
auto iter = m_->clients_.find (id);
|
auto iter = m_->clients_.find (id);
|
||||||
if (iter != std::end (m_->clients_))
|
if (iter != std::end (m_->clients_))
|
||||||
@ -407,7 +413,7 @@ void MessageServer::reply (QString const& id, QTime time, qint32 snr, float delt
|
|||||||
QByteArray message;
|
QByteArray message;
|
||||||
NetworkMessage::Builder out {&message, NetworkMessage::Reply, id, (*iter).negotiated_schema_number_};
|
NetworkMessage::Builder out {&message, NetworkMessage::Reply, id, (*iter).negotiated_schema_number_};
|
||||||
out << time << snr << delta_time << delta_frequency << mode.toUtf8 ()
|
out << time << snr << delta_time << delta_frequency << mode.toUtf8 ()
|
||||||
<< message_text.toUtf8 () << low_confidence;
|
<< message_text.toUtf8 () << low_confidence << modifiers;
|
||||||
m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_);
|
m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
// note that the client is not obliged to take any action and only
|
// note that the client is not obliged to take any action and only
|
||||||
// takes any action if the decode is present and is a CQ or QRZ message
|
// takes any action if the decode is present and is a CQ or QRZ message
|
||||||
Q_SLOT void reply (QString const& id, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
Q_SLOT void reply (QString const& id, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
||||||
, QString const& mode, QString const& message, bool low_confidence);
|
, QString const& mode, QString const& message, bool low_confidence, quint8 modifiers);
|
||||||
|
|
||||||
// ask the client with identification 'id' to replay all decodes
|
// ask the client with identification 'id' to replay all decodes
|
||||||
Q_SLOT void replay (QString const& id);
|
Q_SLOT void replay (QString const& id);
|
||||||
@ -70,13 +70,14 @@ public:
|
|||||||
Q_SIGNAL void client_closed (QString const& id);
|
Q_SIGNAL void client_closed (QString const& id);
|
||||||
Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time
|
Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time
|
||||||
, quint32 delta_frequency, QString const& mode, QString const& message
|
, quint32 delta_frequency, QString const& mode, QString const& message
|
||||||
, bool low_confidence);
|
, bool low_confidence, bool off_air);
|
||||||
Q_SIGNAL void WSPR_decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time, Frequency
|
Q_SIGNAL void WSPR_decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time, Frequency
|
||||||
, qint32 drift, QString const& callsign, QString const& grid, qint32 power);
|
, qint32 drift, QString const& callsign, QString const& grid, qint32 power
|
||||||
Q_SIGNAL void qso_logged (QString const& id, QDateTime timeOff, QString const& dx_call, QString const& dx_grid
|
, bool off_air);
|
||||||
|
Q_SIGNAL void qso_logged (QString const& id, QDateTime time_off, QString const& dx_call, QString const& dx_grid
|
||||||
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
||||||
, QString const& report_received, QString const& tx_power, QString const& comments
|
, QString const& report_received, QString const& tx_power, QString const& comments
|
||||||
, QString const& name, QDateTime timeOn);
|
, QString const& name, QDateTime time_on);
|
||||||
Q_SIGNAL void clear_decodes (QString const& id);
|
Q_SIGNAL void clear_decodes (QString const& id);
|
||||||
|
|
||||||
// this signal is emitted when a network error occurs
|
// this signal is emitted when a network error occurs
|
||||||
|
@ -157,6 +157,7 @@
|
|||||||
* Mode utf8
|
* Mode utf8
|
||||||
* Message utf8
|
* Message utf8
|
||||||
* Low confidence bool
|
* Low confidence bool
|
||||||
|
* Off air bool
|
||||||
*
|
*
|
||||||
* The decode message is sent when a new decode is completed, in
|
* The decode message is sent when a new decode is completed, in
|
||||||
* this case the 'New' field is true. It is also used in response
|
* this case the 'New' field is true. It is also used in response
|
||||||
@ -168,7 +169,8 @@
|
|||||||
* has knows that a decode has a higher than normal probability
|
* has knows that a decode has a higher than normal probability
|
||||||
* of being false, they should not be reported on publicly
|
* of being false, they should not be reported on publicly
|
||||||
* accessible services without some attached warning or further
|
* accessible services without some attached warning or further
|
||||||
* validation.
|
* validation. Off air decodes are those that result from playing
|
||||||
|
* back a .WAV file.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Clear Out 3 quint32
|
* Clear Out 3 quint32
|
||||||
@ -191,6 +193,7 @@
|
|||||||
* Mode utf8
|
* Mode utf8
|
||||||
* Message utf8
|
* Message utf8
|
||||||
* Low confidence bool
|
* Low confidence bool
|
||||||
|
* Modifiers quint8
|
||||||
*
|
*
|
||||||
* In order for a server to provide a useful cooperative service
|
* In order for a server to provide a useful cooperative service
|
||||||
* to WSJT-X it is possible for it to initiate a QSO by sending
|
* to WSJT-X it is possible for it to initiate a QSO by sending
|
||||||
@ -207,6 +210,19 @@
|
|||||||
* initiation the rest of the QSO is carried out manually using
|
* initiation the rest of the QSO is carried out manually using
|
||||||
* the normal WSJT-X user interface.
|
* the normal WSJT-X user interface.
|
||||||
*
|
*
|
||||||
|
* The Modifiers field allows the equivalent of keyboard
|
||||||
|
* modifiers to be sent "as if" those modifier keys where pressed
|
||||||
|
* while double-clicking the specified decoded message. The
|
||||||
|
* modifier values (hexadecimal) are as follows:
|
||||||
|
*
|
||||||
|
* no modifier 0x00
|
||||||
|
* SHIFT 0x02
|
||||||
|
* CTRL 0x04 CMD on Mac
|
||||||
|
* ALT 0x08
|
||||||
|
* META 0x10 Windows key on MS Windows
|
||||||
|
* KEYPAD 0x20 Keypad or arrows
|
||||||
|
* Group switch 0x40 X11 only
|
||||||
|
*
|
||||||
*
|
*
|
||||||
* QSO Logged Out 5 quint32
|
* QSO Logged Out 5 quint32
|
||||||
* Id (unique key) utf8
|
* Id (unique key) utf8
|
||||||
@ -299,13 +315,16 @@
|
|||||||
* Callsign utf8
|
* Callsign utf8
|
||||||
* Grid utf8
|
* Grid utf8
|
||||||
* Power (dBm) qint32
|
* Power (dBm) qint32
|
||||||
|
* Off air bool
|
||||||
*
|
*
|
||||||
* The decode message is sent when a new decode is completed, in
|
* The decode message is sent when a new decode is completed, in
|
||||||
* this case the 'New' field is true. It is also used in response
|
* this case the 'New' field is true. It is also used in response
|
||||||
* to a "Replay" message where each old decode in the "Band
|
* to a "Replay" message where each old decode in the "Band
|
||||||
* activity" window, that has not been erased, is sent in order
|
* activity" window, that has not been erased, is sent in order
|
||||||
* as a one of these messages with the 'New' field set to
|
* as a one of these messages with the 'New' field set to
|
||||||
* false. See the "Replay" message below for details of usage.
|
* false. See the "Replay" message below for details of
|
||||||
|
* usage. The off air field indicates that the decode was decoded
|
||||||
|
* from a played back recording.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -12,16 +12,22 @@ namespace
|
|||||||
QT_TRANSLATE_NOOP ("BeaconsModel", "DT"),
|
QT_TRANSLATE_NOOP ("BeaconsModel", "DT"),
|
||||||
QT_TRANSLATE_NOOP ("BeaconsModel", "Frequency"),
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Frequency"),
|
||||||
QT_TRANSLATE_NOOP ("BeaconsModel", "Drift"),
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Drift"),
|
||||||
QT_TRANSLATE_NOOP ("BeaconsModel", "Callsign"),
|
|
||||||
QT_TRANSLATE_NOOP ("BeaconsModel", "Grid"),
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Grid"),
|
||||||
QT_TRANSLATE_NOOP ("BeaconsModel", "Power"),
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Power"),
|
||||||
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Live"),
|
||||||
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Callsign"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QString live_string (bool off_air)
|
||||||
|
{
|
||||||
|
return off_air ? QT_TRANSLATE_NOOP ("BeaconsModel", "no") : QT_TRANSLATE_NOOP ("BeaconsModel", "yes");
|
||||||
|
}
|
||||||
|
|
||||||
QFont text_font {"Courier", 10};
|
QFont text_font {"Courier", 10};
|
||||||
|
|
||||||
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
|
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
|
||||||
, Frequency frequency, qint32 drift, QString const& callsign
|
, Frequency frequency, qint32 drift, QString const& callsign
|
||||||
, QString const& grid, qint32 power)
|
, QString const& grid, qint32 power, bool off_air)
|
||||||
{
|
{
|
||||||
auto time_item = new QStandardItem {time.toString ("hh:mm")};
|
auto time_item = new QStandardItem {time.toString ("hh:mm")};
|
||||||
time_item->setData (time);
|
time_item->setData (time);
|
||||||
@ -50,8 +56,11 @@ namespace
|
|||||||
pwr->setData (power);
|
pwr->setData (power);
|
||||||
pwr->setTextAlignment (Qt::AlignRight);
|
pwr->setTextAlignment (Qt::AlignRight);
|
||||||
|
|
||||||
|
auto live = new QStandardItem {live_string (off_air)};
|
||||||
|
live->setTextAlignment (Qt::AlignHCenter);
|
||||||
|
|
||||||
QList<QStandardItem *> row {
|
QList<QStandardItem *> row {
|
||||||
new QStandardItem {client_id}, time_item, snr_item, dt, freq, dri, new QStandardItem {callsign}, gd, pwr};
|
new QStandardItem {client_id}, time_item, snr_item, dt, freq, dri, gd, pwr, live, new QStandardItem {callsign}};
|
||||||
Q_FOREACH (auto& item, row)
|
Q_FOREACH (auto& item, row)
|
||||||
{
|
{
|
||||||
item->setEditable (false);
|
item->setEditable (false);
|
||||||
@ -63,7 +72,7 @@ namespace
|
|||||||
}
|
}
|
||||||
|
|
||||||
BeaconsModel::BeaconsModel (QObject * parent)
|
BeaconsModel::BeaconsModel (QObject * parent)
|
||||||
: QStandardItemModel {0, 9, parent}
|
: QStandardItemModel {0, sizeof (headings) / sizeof (headings[0]), parent}
|
||||||
{
|
{
|
||||||
int column {0};
|
int column {0};
|
||||||
for (auto const& heading : headings)
|
for (auto const& heading : headings)
|
||||||
@ -74,7 +83,7 @@ BeaconsModel::BeaconsModel (QObject * parent)
|
|||||||
|
|
||||||
void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
||||||
, Frequency frequency, qint32 drift, QString const& callsign
|
, Frequency frequency, qint32 drift, QString const& callsign
|
||||||
, QString const& grid, qint32 power)
|
, QString const& grid, qint32 power, bool off_air)
|
||||||
{
|
{
|
||||||
if (!is_new)
|
if (!is_new)
|
||||||
{
|
{
|
||||||
@ -89,9 +98,10 @@ void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime
|
|||||||
&& item (row, 3)->data ().toFloat () == delta_time
|
&& item (row, 3)->data ().toFloat () == delta_time
|
||||||
&& item (row, 4)->data ().value<Frequency> () == frequency
|
&& item (row, 4)->data ().value<Frequency> () == frequency
|
||||||
&& data (index (row, 5)).toInt () == drift
|
&& data (index (row, 5)).toInt () == drift
|
||||||
&& data (index (row, 6)).toString () == callsign
|
|
||||||
&& data (index (row, 7)).toString () == grid
|
&& data (index (row, 7)).toString () == grid
|
||||||
&& data (index (row, 8)).toInt () == power)
|
&& data (index (row, 8)).toInt () == power
|
||||||
|
&& data (index (row, 6)).toString () == live_string (off_air)
|
||||||
|
&& data (index (row, 9)).toString () == callsign)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -103,12 +113,12 @@ void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime
|
|||||||
}
|
}
|
||||||
if (target_row >= 0)
|
if (target_row >= 0)
|
||||||
{
|
{
|
||||||
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power));
|
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power, off_air));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
appendRow (make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power));
|
appendRow (make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power, off_air));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BeaconsModel::clear_decodes (QString const& client_id)
|
void BeaconsModel::clear_decodes (QString const& client_id)
|
||||||
|
@ -31,7 +31,7 @@ public:
|
|||||||
|
|
||||||
Q_SLOT void add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
Q_SLOT void add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
||||||
, Frequency frequency, qint32 drift, QString const& callsign, QString const& grid
|
, Frequency frequency, qint32 drift, QString const& callsign, QString const& grid
|
||||||
, qint32 power);
|
, qint32 power, bool off_air);
|
||||||
Q_SLOT void clear_decodes (QString const& client_id);
|
Q_SLOT void clear_decodes (QString const& client_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ QVariant ClientWidget::IdFilterModel::data (QModelIndex const& proxy_index, int
|
|||||||
{
|
{
|
||||||
switch (proxy_index.column ())
|
switch (proxy_index.column ())
|
||||||
{
|
{
|
||||||
case 6: // message
|
case 8: // message
|
||||||
{
|
{
|
||||||
auto message = QSortFilterProxyModel::data (proxy_index).toString ();
|
auto message = QSortFilterProxyModel::data (proxy_index).toString ();
|
||||||
if (base_call_re_.pattern ().size ()
|
if (base_call_re_.pattern ().size ()
|
||||||
@ -130,6 +130,7 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod
|
|||||||
, rx_df_label_ {new QLabel}
|
, rx_df_label_ {new QLabel}
|
||||||
, tx_df_label_ {new QLabel}
|
, tx_df_label_ {new QLabel}
|
||||||
, report_label_ {new QLabel}
|
, report_label_ {new QLabel}
|
||||||
|
, columns_resized_ {false}
|
||||||
{
|
{
|
||||||
// set up widgets
|
// set up widgets
|
||||||
decodes_proxy_model_.setSourceModel (decodes_model);
|
decodes_proxy_model_.setSourceModel (decodes_model);
|
||||||
@ -208,7 +209,7 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod
|
|||||||
|
|
||||||
// connect up table view signals
|
// connect up table view signals
|
||||||
connect (decodes_table_view_, &QTableView::doubleClicked, this, [this] (QModelIndex const& index) {
|
connect (decodes_table_view_, &QTableView::doubleClicked, this, [this] (QModelIndex const& index) {
|
||||||
Q_EMIT do_reply (decodes_proxy_model_.mapToSource (index));
|
Q_EMIT do_reply (decodes_proxy_model_.mapToSource (index), QApplication::keyboardModifiers () >> 24);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,25 +245,36 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const&
|
|||||||
|
|
||||||
void ClientWidget::decode_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/
|
void ClientWidget::decode_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/
|
||||||
, float /*delta_time*/, quint32 /*delta_frequency*/, QString const& /*mode*/
|
, float /*delta_time*/, quint32 /*delta_frequency*/, QString const& /*mode*/
|
||||||
, QString const& /*message*/, bool /*low_confidence*/)
|
, QString const& /*message*/, bool /*low_confidence*/, bool /*off_air*/)
|
||||||
{
|
{
|
||||||
if (client_id == id_)
|
if (client_id == id_ && !columns_resized_)
|
||||||
{
|
{
|
||||||
decodes_stack_->setCurrentIndex (0);
|
decodes_stack_->setCurrentIndex (0);
|
||||||
decodes_table_view_->resizeColumnsToContents ();
|
decodes_table_view_->resizeColumnsToContents ();
|
||||||
decodes_table_view_->scrollToBottom ();
|
columns_resized_ = true;
|
||||||
}
|
}
|
||||||
|
decodes_table_view_->scrollToBottom ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientWidget::beacon_spot_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/
|
void ClientWidget::beacon_spot_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/
|
||||||
, float /*delta_time*/, Frequency /*delta_frequency*/, qint32 /*drift*/
|
, float /*delta_time*/, Frequency /*delta_frequency*/, qint32 /*drift*/
|
||||||
, QString const& /*callsign*/, QString const& /*grid*/, qint32 /*power*/)
|
, QString const& /*callsign*/, QString const& /*grid*/, qint32 /*power*/
|
||||||
|
, bool /*off_air*/)
|
||||||
{
|
{
|
||||||
if (client_id == id_)
|
if (client_id == id_ && !columns_resized_)
|
||||||
{
|
{
|
||||||
decodes_stack_->setCurrentIndex (1);
|
decodes_stack_->setCurrentIndex (1);
|
||||||
beacons_table_view_->resizeColumnsToContents ();
|
beacons_table_view_->resizeColumnsToContents ();
|
||||||
|
columns_resized_ = true;
|
||||||
|
}
|
||||||
beacons_table_view_->scrollToBottom ();
|
beacons_table_view_->scrollToBottom ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientWidget::clear_decodes (QString const& client_id)
|
||||||
|
{
|
||||||
|
if (client_id == id_)
|
||||||
|
{
|
||||||
|
columns_resized_ = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,12 +33,14 @@ public:
|
|||||||
, bool watchdog_timeout, QString const& sub_mode, bool fast_mode);
|
, bool watchdog_timeout, QString const& sub_mode, bool fast_mode);
|
||||||
Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr
|
Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr
|
||||||
, float delta_time, quint32 delta_frequency, QString const& mode
|
, float delta_time, quint32 delta_frequency, QString const& mode
|
||||||
, QString const& message, bool low_confidence);
|
, QString const& message, bool low_confidence, bool off_air);
|
||||||
Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime, qint32 snr
|
Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime, qint32 snr
|
||||||
, float delta_time, Frequency delta_frequency, qint32 drift
|
, float delta_time, Frequency delta_frequency, qint32 drift
|
||||||
, QString const& callsign, QString const& grid, qint32 power);
|
, QString const& callsign, QString const& grid, qint32 power
|
||||||
|
, bool off_air);
|
||||||
|
Q_SLOT void clear_decodes (QString const& client_id);
|
||||||
|
|
||||||
Q_SIGNAL void do_reply (QModelIndex const&);
|
Q_SIGNAL void do_reply (QModelIndex const&, quint8 modifier);
|
||||||
Q_SIGNAL void do_halt_tx (QString const& id, bool auto_only);
|
Q_SIGNAL void do_halt_tx (QString const& id, bool auto_only);
|
||||||
Q_SIGNAL void do_free_text (QString const& id, QString const& text, bool);
|
Q_SIGNAL void do_free_text (QString const& id, QString const& text, bool);
|
||||||
|
|
||||||
@ -77,6 +79,7 @@ private:
|
|||||||
QLabel * rx_df_label_;
|
QLabel * rx_df_label_;
|
||||||
QLabel * tx_df_label_;
|
QLabel * tx_df_label_;
|
||||||
QLabel * report_label_;
|
QLabel * report_label_;
|
||||||
|
bool columns_resized_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,8 +16,9 @@ namespace
|
|||||||
QT_TRANSLATE_NOOP ("DecodesModel", "DT"),
|
QT_TRANSLATE_NOOP ("DecodesModel", "DT"),
|
||||||
QT_TRANSLATE_NOOP ("DecodesModel", "DF"),
|
QT_TRANSLATE_NOOP ("DecodesModel", "DF"),
|
||||||
QT_TRANSLATE_NOOP ("DecodesModel", "Md"),
|
QT_TRANSLATE_NOOP ("DecodesModel", "Md"),
|
||||||
QT_TRANSLATE_NOOP ("DecodesModel", "Message"),
|
|
||||||
QT_TRANSLATE_NOOP ("DecodesModel", "Confidence"),
|
QT_TRANSLATE_NOOP ("DecodesModel", "Confidence"),
|
||||||
|
QT_TRANSLATE_NOOP ("DecodesModel", "Live"),
|
||||||
|
QT_TRANSLATE_NOOP ("DecodesModel", "Message"),
|
||||||
};
|
};
|
||||||
|
|
||||||
QString confidence_string (bool low_confidence)
|
QString confidence_string (bool low_confidence)
|
||||||
@ -25,11 +26,16 @@ namespace
|
|||||||
return low_confidence ? QT_TRANSLATE_NOOP ("DecodesModel", "low") : QT_TRANSLATE_NOOP ("DecodesModel", "high");
|
return low_confidence ? QT_TRANSLATE_NOOP ("DecodesModel", "low") : QT_TRANSLATE_NOOP ("DecodesModel", "high");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString live_string (bool off_air)
|
||||||
|
{
|
||||||
|
return off_air ? QT_TRANSLATE_NOOP ("DecodesModel", "no") : QT_TRANSLATE_NOOP ("DecodesModel", "yes");
|
||||||
|
}
|
||||||
|
|
||||||
QFont text_font {"Courier", 10};
|
QFont text_font {"Courier", 10};
|
||||||
|
|
||||||
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
|
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
|
||||||
, quint32 delta_frequency, QString const& mode, QString const& message
|
, quint32 delta_frequency, QString const& mode, QString const& message
|
||||||
, bool low_confidence, bool is_fast)
|
, bool low_confidence, bool off_air, bool is_fast)
|
||||||
{
|
{
|
||||||
auto time_item = new QStandardItem {time.toString (is_fast || "~" == mode ? "hh:mm:ss" : "hh:mm")};
|
auto time_item = new QStandardItem {time.toString (is_fast || "~" == mode ? "hh:mm:ss" : "hh:mm")};
|
||||||
time_item->setData (time);
|
time_item->setData (time);
|
||||||
@ -53,8 +59,11 @@ namespace
|
|||||||
auto confidence = new QStandardItem {confidence_string (low_confidence)};
|
auto confidence = new QStandardItem {confidence_string (low_confidence)};
|
||||||
confidence->setTextAlignment (Qt::AlignHCenter);
|
confidence->setTextAlignment (Qt::AlignHCenter);
|
||||||
|
|
||||||
|
auto live = new QStandardItem {live_string (off_air)};
|
||||||
|
live->setTextAlignment (Qt::AlignHCenter);
|
||||||
|
|
||||||
QList<QStandardItem *> row {
|
QList<QStandardItem *> row {
|
||||||
new QStandardItem {client_id}, time_item, snr_item, dt, df, md, new QStandardItem {message}, confidence};
|
new QStandardItem {client_id}, time_item, snr_item, dt, df, md, confidence, live, new QStandardItem {message}};
|
||||||
Q_FOREACH (auto& item, row)
|
Q_FOREACH (auto& item, row)
|
||||||
{
|
{
|
||||||
item->setEditable (false);
|
item->setEditable (false);
|
||||||
@ -77,7 +86,7 @@ DecodesModel::DecodesModel (QObject * parent)
|
|||||||
|
|
||||||
void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
||||||
, quint32 delta_frequency, QString const& mode, QString const& message
|
, quint32 delta_frequency, QString const& mode, QString const& message
|
||||||
, bool low_confidence, bool is_fast)
|
, bool low_confidence, bool off_air, bool is_fast)
|
||||||
{
|
{
|
||||||
if (!is_new)
|
if (!is_new)
|
||||||
{
|
{
|
||||||
@ -92,8 +101,9 @@ void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time
|
|||||||
&& item (row, 3)->data ().toFloat () == delta_time
|
&& item (row, 3)->data ().toFloat () == delta_time
|
||||||
&& item (row, 4)->data ().toUInt () == delta_frequency
|
&& item (row, 4)->data ().toUInt () == delta_frequency
|
||||||
&& data (index (row, 5)).toString () == mode
|
&& data (index (row, 5)).toString () == mode
|
||||||
&& data (index (row, 6)).toString () == message
|
&& data (index (row, 7)).toString () == confidence_string (low_confidence)
|
||||||
&& data (index (row, 7)).toString () == confidence_string (low_confidence))
|
&& data (index (row, 6)).toString () == live_string (off_air)
|
||||||
|
&& data (index (row, 8)).toString () == message)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -106,12 +116,13 @@ void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time
|
|||||||
if (target_row >= 0)
|
if (target_row >= 0)
|
||||||
{
|
{
|
||||||
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, delta_frequency, mode
|
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, delta_frequency, mode
|
||||||
, message, low_confidence, is_fast));
|
, message, low_confidence, off_air, is_fast));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
appendRow (make_row (client_id, time, snr, delta_time, delta_frequency, mode, message, low_confidence, is_fast));
|
appendRow (make_row (client_id, time, snr, delta_time, delta_frequency, mode, message, low_confidence
|
||||||
|
, off_air, is_fast));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecodesModel::clear_decodes (QString const& client_id)
|
void DecodesModel::clear_decodes (QString const& client_id)
|
||||||
@ -125,7 +136,7 @@ void DecodesModel::clear_decodes (QString const& client_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecodesModel::do_reply (QModelIndex const& source)
|
void DecodesModel::do_reply (QModelIndex const& source, quint8 modifiers)
|
||||||
{
|
{
|
||||||
auto row = source.row ();
|
auto row = source.row ();
|
||||||
Q_EMIT reply (data (index (row, 0)).toString ()
|
Q_EMIT reply (data (index (row, 0)).toString ()
|
||||||
@ -134,8 +145,9 @@ void DecodesModel::do_reply (QModelIndex const& source)
|
|||||||
, item (row, 3)->data ().toFloat ()
|
, item (row, 3)->data ().toFloat ()
|
||||||
, item (row, 4)->data ().toInt ()
|
, item (row, 4)->data ().toInt ()
|
||||||
, data (index (row, 5)).toString ()
|
, data (index (row, 5)).toString ()
|
||||||
, data (index (row, 6)).toString ()
|
, data (index (row, 8)).toString ()
|
||||||
, confidence_string (true) == data (index (row, 7)).toString ());
|
, confidence_string (true) == data (index (row, 7)).toString ()
|
||||||
|
, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "moc_DecodesModel.cpp"
|
#include "moc_DecodesModel.cpp"
|
||||||
|
@ -33,12 +33,12 @@ public:
|
|||||||
|
|
||||||
Q_SLOT void add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
Q_SLOT void add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
||||||
, quint32 delta_frequency, QString const& mode, QString const& message
|
, quint32 delta_frequency, QString const& mode, QString const& message
|
||||||
, bool low_confidence, bool is_fast);
|
, bool low_confidence, bool off_air, bool is_fast);
|
||||||
Q_SLOT void clear_decodes (QString const& client_id);
|
Q_SLOT void clear_decodes (QString const& client_id);
|
||||||
Q_SLOT void do_reply (QModelIndex const& source);
|
Q_SLOT void do_reply (QModelIndex const& source, quint8 modifiers);
|
||||||
|
|
||||||
Q_SIGNAL void reply (QString const& id, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
Q_SIGNAL void reply (QString const& id, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
||||||
, QString const& mode, QString const& message, bool low_confidence);
|
, QString const& mode, QString const& message, bool low_confidence, quint8 modifiers);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -91,9 +91,10 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
|
|||||||
connect (server_, &MessageServer::decode, [this] (bool is_new, QString const& id, QTime time
|
connect (server_, &MessageServer::decode, [this] (bool is_new, QString const& id, QTime time
|
||||||
, qint32 snr, float delta_time
|
, qint32 snr, float delta_time
|
||||||
, quint32 delta_frequency, QString const& mode
|
, quint32 delta_frequency, QString const& mode
|
||||||
, QString const& message, bool low_confidence) {
|
, QString const& message, bool low_confidence
|
||||||
|
, bool off_air) {
|
||||||
decodes_model_->add_decode (is_new, id, time, snr, delta_time, delta_frequency, mode, message
|
decodes_model_->add_decode (is_new, id, time, snr, delta_time, delta_frequency, mode, message
|
||||||
, low_confidence, dock_widgets_[id]->fast_mode ());});
|
, low_confidence, off_air, dock_widgets_[id]->fast_mode ());});
|
||||||
connect (server_, &MessageServer::WSPR_decode, beacons_model_, &BeaconsModel::add_beacon_spot);
|
connect (server_, &MessageServer::WSPR_decode, beacons_model_, &BeaconsModel::add_beacon_spot);
|
||||||
connect (server_, &MessageServer::clear_decodes, decodes_model_, &DecodesModel::clear_decodes);
|
connect (server_, &MessageServer::clear_decodes, decodes_model_, &DecodesModel::clear_decodes);
|
||||||
connect (server_, &MessageServer::clear_decodes, beacons_model_, &BeaconsModel::clear_decodes);
|
connect (server_, &MessageServer::clear_decodes, beacons_model_, &BeaconsModel::clear_decodes);
|
||||||
@ -110,14 +111,14 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
|
|||||||
show ();
|
show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageAggregatorMainWindow::log_qso (QString const& /*id*/, QDateTime timeOff, QString const& dx_call, QString const& dx_grid
|
void MessageAggregatorMainWindow::log_qso (QString const& /*id*/, QDateTime time_off, QString const& dx_call, QString const& dx_grid
|
||||||
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
||||||
, QString const& report_received, QString const& tx_power, QString const& comments
|
, QString const& report_received, QString const& tx_power, QString const& comments
|
||||||
, QString const& name, QDateTime timeOn)
|
, QString const& name, QDateTime time_on)
|
||||||
{
|
{
|
||||||
QList<QStandardItem *> row;
|
QList<QStandardItem *> row;
|
||||||
row << new QStandardItem {timeOn.toString ("dd-MMM-yyyy hh:mm:ss")}
|
row << new QStandardItem {time_on.toString ("dd-MMM-yyyy hh:mm:ss")}
|
||||||
<< new QStandardItem {timeOff.toString ("dd-MMM-yyyy hh:mm:ss")}
|
<< new QStandardItem {time_off.toString ("dd-MMM-yyyy hh:mm:ss")}
|
||||||
<< new QStandardItem {dx_call}
|
<< new QStandardItem {dx_call}
|
||||||
<< new QStandardItem {dx_grid}
|
<< new QStandardItem {dx_grid}
|
||||||
<< new QStandardItem {name}
|
<< new QStandardItem {name}
|
||||||
@ -144,6 +145,7 @@ void MessageAggregatorMainWindow::add_client (QString const& id, QString const&
|
|||||||
connect (server_, &MessageServer::status_update, dock, &ClientWidget::update_status);
|
connect (server_, &MessageServer::status_update, dock, &ClientWidget::update_status);
|
||||||
connect (server_, &MessageServer::decode, dock, &ClientWidget::decode_added);
|
connect (server_, &MessageServer::decode, dock, &ClientWidget::decode_added);
|
||||||
connect (server_, &MessageServer::WSPR_decode, dock, &ClientWidget::beacon_spot_added);
|
connect (server_, &MessageServer::WSPR_decode, dock, &ClientWidget::beacon_spot_added);
|
||||||
|
connect (server_, &MessageServer::clear_decodes, dock, &ClientWidget::clear_decodes);
|
||||||
connect (dock, &ClientWidget::do_reply, decodes_model_, &DecodesModel::do_reply);
|
connect (dock, &ClientWidget::do_reply, decodes_model_, &DecodesModel::do_reply);
|
||||||
connect (dock, &ClientWidget::do_halt_tx, server_, &MessageServer::halt_tx);
|
connect (dock, &ClientWidget::do_halt_tx, server_, &MessageServer::halt_tx);
|
||||||
connect (dock, &ClientWidget::do_free_text, server_, &MessageServer::free_text);
|
connect (dock, &ClientWidget::do_free_text, server_, &MessageServer::free_text);
|
||||||
|
@ -26,10 +26,10 @@ class MessageAggregatorMainWindow
|
|||||||
public:
|
public:
|
||||||
MessageAggregatorMainWindow ();
|
MessageAggregatorMainWindow ();
|
||||||
|
|
||||||
Q_SLOT void log_qso (QString const& /*id*/, QDateTime timeOff, QString const& dx_call, QString const& dx_grid
|
Q_SLOT void log_qso (QString const& /*id*/, QDateTime time_off, QString const& dx_call, QString const& dx_grid
|
||||||
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
, Frequency dial_frequency, QString const& mode, QString const& report_sent
|
||||||
, QString const& report_received, QString const& tx_power, QString const& comments
|
, QString const& report_received, QString const& tx_power, QString const& comments
|
||||||
, QString const& name, QDateTime timeOn);
|
, QString const& name, QDateTime time_on);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void add_client (QString const& id, QString const& version, QString const& revision);
|
void add_client (QString const& id, QString const& version, QString const& revision);
|
||||||
|
@ -69,27 +69,29 @@ public:
|
|||||||
|
|
||||||
Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime time, qint32 snr
|
Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime time, qint32 snr
|
||||||
, float delta_time, quint32 delta_frequency, QString const& mode
|
, float delta_time, quint32 delta_frequency, QString const& mode
|
||||||
, QString const& message, bool low_confidence)
|
, QString const& message, bool low_confidence, bool off_air)
|
||||||
{
|
{
|
||||||
if (client_id == id_)
|
if (client_id == id_)
|
||||||
{
|
{
|
||||||
qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr
|
qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr
|
||||||
<< "Dt:" << delta_time << "Df:" << delta_frequency
|
<< "Dt:" << delta_time << "Df:" << delta_frequency
|
||||||
<< "mode:" << mode << "Confidence:" << (low_confidence ? "low" : "high");
|
<< "mode:" << mode << "Confidence:" << (low_confidence ? "low" : "high")
|
||||||
|
<< "On air:" << !off_air;
|
||||||
std::cout << tr ("%1: Decoded %2").arg (id_).arg (message).toStdString () << std::endl;
|
std::cout << tr ("%1: Decoded %2").arg (id_).arg (message).toStdString () << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime time, qint32 snr
|
Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime time, qint32 snr
|
||||||
, float delta_time, Frequency delta_frequency, qint32 drift, QString const& callsign
|
, float delta_time, Frequency delta_frequency, qint32 drift, QString const& callsign
|
||||||
, QString const& grid, qint32 power)
|
, QString const& grid, qint32 power, bool off_air)
|
||||||
{
|
{
|
||||||
if (client_id == id_)
|
if (client_id == id_)
|
||||||
{
|
{
|
||||||
qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr
|
qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr
|
||||||
<< "Dt:" << delta_time << "Df:" << delta_frequency
|
<< "Dt:" << delta_time << "Df:" << delta_frequency
|
||||||
<< "drift:" << drift;
|
<< "drift:" << drift;
|
||||||
std::cout << tr ("%1: WSPR decode %2 grid %3 power: %4").arg (id_).arg (callsign).arg (grid).arg (power).toStdString () << std::endl;
|
std::cout << tr ("%1: WSPR decode %2 grid %3 power: %4").arg (id_).arg (callsign).arg (grid).arg (power).toStdString ()
|
||||||
|
<< "On air:" << !off_air << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QCloseEvent>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
#include "commons.h"
|
#include "commons.h"
|
||||||
@ -56,7 +57,7 @@ Astro::~Astro ()
|
|||||||
void Astro::closeEvent (QCloseEvent * e)
|
void Astro::closeEvent (QCloseEvent * e)
|
||||||
{
|
{
|
||||||
write_settings ();
|
write_settings ();
|
||||||
QWidget::closeEvent (e);
|
e->ignore (); // do not allow closure by the window system
|
||||||
}
|
}
|
||||||
|
|
||||||
void Astro::read_settings ()
|
void Astro::read_settings ()
|
||||||
|
@ -14,14 +14,13 @@ namespace
|
|||||||
}
|
}
|
||||||
|
|
||||||
DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString const& my_grid)
|
DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString const& my_grid)
|
||||||
: string_ {the_string}
|
: string_ {the_string.left (the_string.indexOf (QChar::Nbsp))} // discard appended info
|
||||||
, padding_ {the_string.indexOf (" ") > 4 ? 2 : 0} // allow for
|
, padding_ {string_.indexOf (" ") > 4 ? 2 : 0} // allow for
|
||||||
// seconds
|
// seconds
|
||||||
, contest_mode_ {contest_mode}
|
, contest_mode_ {contest_mode}
|
||||||
, message_ {string_.mid (column_qsoText + padding_).trimmed ()}
|
, message_ {string_.mid (column_qsoText + padding_).trimmed ()}
|
||||||
, is_standard_ {false}
|
, is_standard_ {false}
|
||||||
{
|
{
|
||||||
string_ = string_.left (column_qsoText + padding_ + 25);
|
|
||||||
if (message_.length() >= 1)
|
if (message_.length() >= 1)
|
||||||
{
|
{
|
||||||
message_ = message_.left (21).remove (QRegularExpression {"[<>]"});
|
message_ = message_.left (21).remove (QRegularExpression {"[<>]"});
|
||||||
|
@ -5,18 +5,39 @@
|
|||||||
#include <QTextCharFormat>
|
#include <QTextCharFormat>
|
||||||
#include <QTextCursor>
|
#include <QTextCursor>
|
||||||
#include <QTextBlock>
|
#include <QTextBlock>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QAction>
|
||||||
|
|
||||||
#include "qt_helpers.hpp"
|
#include "qt_helpers.hpp"
|
||||||
|
|
||||||
#include "moc_displaytext.cpp"
|
#include "moc_displaytext.cpp"
|
||||||
|
|
||||||
DisplayText::DisplayText(QWidget *parent) :
|
DisplayText::DisplayText(QWidget *parent)
|
||||||
QTextEdit(parent)
|
: QTextEdit(parent)
|
||||||
|
, erase_action_ {new QAction {tr ("&Erase"), this}}
|
||||||
{
|
{
|
||||||
setReadOnly (true);
|
setReadOnly (true);
|
||||||
viewport ()->setCursor (Qt::ArrowCursor);
|
viewport ()->setCursor (Qt::ArrowCursor);
|
||||||
setWordWrapMode (QTextOption::NoWrap);
|
setWordWrapMode (QTextOption::NoWrap);
|
||||||
document ()->setMaximumBlockCount (5000); // max lines to limit heap usage
|
|
||||||
|
// max lines to limit heap usage
|
||||||
|
document ()->setMaximumBlockCount (5000);
|
||||||
|
|
||||||
|
// context menu erase action
|
||||||
|
setContextMenuPolicy (Qt::CustomContextMenu);
|
||||||
|
connect (this, &DisplayText::customContextMenuRequested, [this] (QPoint const& position) {
|
||||||
|
auto * menu = createStandardContextMenu (position);
|
||||||
|
menu->addAction (erase_action_);
|
||||||
|
menu->exec (mapToGlobal (position));
|
||||||
|
delete menu;
|
||||||
|
});
|
||||||
|
connect (erase_action_, &QAction::triggered, this, &DisplayText::erase);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayText::erase ()
|
||||||
|
{
|
||||||
|
clear ();
|
||||||
|
Q_EMIT erased ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayText::setContentFont(QFont const& font)
|
void DisplayText::setContentFont(QFont const& font)
|
||||||
@ -42,9 +63,7 @@ void DisplayText::setContentFont(QFont const& font)
|
|||||||
|
|
||||||
void DisplayText::mouseDoubleClickEvent(QMouseEvent *e)
|
void DisplayText::mouseDoubleClickEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
bool ctrl = (e->modifiers() & Qt::ControlModifier);
|
Q_EMIT selectCallsign(e->modifiers ());
|
||||||
bool alt = (e->modifiers() & Qt::AltModifier);
|
|
||||||
emit(selectCallsign(alt,ctrl));
|
|
||||||
QTextEdit::mouseDoubleClickEvent(e);
|
QTextEdit::mouseDoubleClickEvent(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +105,7 @@ QString DisplayText::appendDXCCWorkedB4(QString message, QString const& callsign
|
|||||||
QColor color_NewCall)
|
QColor color_NewCall)
|
||||||
{
|
{
|
||||||
// allow for seconds
|
// allow for seconds
|
||||||
unsigned padding {message.indexOf (" ") > 4 ? 2U : 0U};
|
int padding {message.indexOf (" ") > 4 ? 2 : 0};
|
||||||
QString call = callsign;
|
QString call = callsign;
|
||||||
QString countryName;
|
QString countryName;
|
||||||
bool callWorkedBefore;
|
bool callWorkedBefore;
|
||||||
@ -102,41 +121,27 @@ QString DisplayText::appendDXCCWorkedB4(QString message, QString const& callsign
|
|||||||
if(!call.contains(QRegExp("[0-9]|[A-Z]"))) return message;
|
if(!call.contains(QRegExp("[0-9]|[A-Z]"))) return message;
|
||||||
|
|
||||||
logBook.match(/*in*/call,/*out*/countryName,callWorkedBefore,countryWorkedBefore);
|
logBook.match(/*in*/call,/*out*/countryName,callWorkedBefore,countryWorkedBefore);
|
||||||
int charsAvail = 52 + padding;
|
|
||||||
|
|
||||||
// the decoder (seems) to always generate 41 chars. For a normal CQ
|
message = message.trimmed ();
|
||||||
// call, the last five are spaces
|
QString appendage;
|
||||||
//
|
|
||||||
// A maximum length call is "QRZ VP2X/GM4WJS IO91" "CQ AA ..." or CQ
|
|
||||||
// nnn ..." don't allow grid squares so are not longer. Here we align
|
|
||||||
// the added info at least after the longest CQ/QRZ message plus one
|
|
||||||
// space so that it can be stripped off algorithmically later.
|
|
||||||
//
|
|
||||||
int nmin = 46 + padding;
|
|
||||||
int s3 = message.indexOf (" ", nmin);
|
|
||||||
if (s3 < nmin) s3 = nmin; // always want at least the characters to position 45
|
|
||||||
s3 += 1; // convert the index into a character count
|
|
||||||
message = message.left(s3); // reduce trailing white space
|
|
||||||
charsAvail -= s3;
|
|
||||||
if (charsAvail > 4)
|
|
||||||
{
|
|
||||||
if (!countryWorkedBefore) // therefore not worked call either
|
if (!countryWorkedBefore) // therefore not worked call either
|
||||||
{
|
{
|
||||||
message += "!";
|
appendage += "!";
|
||||||
*bg = color_DXCC;
|
*bg = color_DXCC;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
if (!callWorkedBefore) // but have worked the country
|
if (!callWorkedBefore) // but have worked the country
|
||||||
{
|
{
|
||||||
message += "~";
|
appendage += "~";
|
||||||
*bg = color_NewCall;
|
*bg = color_NewCall;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
message += " "; // have worked this call before
|
appendage += " "; // have worked this call before
|
||||||
*bg = color_CQ;
|
*bg = color_CQ;
|
||||||
}
|
}
|
||||||
charsAvail -= 1;
|
}
|
||||||
|
|
||||||
// do some obvious abbreviations
|
// do some obvious abbreviations
|
||||||
countryName.replace ("Islands", "Is.");
|
countryName.replace ("Islands", "Is.");
|
||||||
@ -158,8 +163,18 @@ QString DisplayText::appendDXCCWorkedB4(QString message, QString const& callsign
|
|||||||
countryName.replace ("European", "EU");
|
countryName.replace ("European", "EU");
|
||||||
countryName.replace ("African", "AF");
|
countryName.replace ("African", "AF");
|
||||||
|
|
||||||
message += countryName;
|
appendage += countryName;
|
||||||
|
|
||||||
|
// use a nbsp to save the start of appended text so we can find
|
||||||
|
// it again later, align appended data at a fixed column if
|
||||||
|
// there is space otherwise let it float to the right
|
||||||
|
int space_count {40 + padding - message.size ()};
|
||||||
|
if (space_count > 0)
|
||||||
|
{
|
||||||
|
message += QString {space_count, QChar {' '}};
|
||||||
}
|
}
|
||||||
|
message += QChar::Nbsp + appendage;
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,13 +200,14 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
|
|||||||
or decodedText.indexOf (" " + myCall + ">") >= 0)) {
|
or decodedText.indexOf (" " + myCall + ">") >= 0)) {
|
||||||
bg = color_MyCall;
|
bg = color_MyCall;
|
||||||
}
|
}
|
||||||
|
auto message = decodedText.string ();
|
||||||
|
message = message.left (message.indexOf (QChar::Nbsp)); // strip appended info
|
||||||
|
if (displayDXCCEntity && CQcall)
|
||||||
// if enabled add the DXCC entity and B4 status to the end of the
|
// if enabled add the DXCC entity and B4 status to the end of the
|
||||||
// preformated text line t1
|
// preformated text line t1
|
||||||
auto message = decodedText.string ();
|
|
||||||
if (displayDXCCEntity && CQcall)
|
|
||||||
message = appendDXCCWorkedB4 (message, decodedText.CQersCall (), &bg, logBook, color_CQ,
|
message = appendDXCCWorkedB4 (message, decodedText.CQersCall (), &bg, logBook, color_CQ,
|
||||||
color_DXCC, color_NewCall);
|
color_DXCC, color_NewCall);
|
||||||
appendText (message, bg);
|
appendText (message.trimmed (), bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include "logbook/logbook.h"
|
#include "logbook/logbook.h"
|
||||||
#include "decodedtext.h"
|
#include "decodedtext.h"
|
||||||
|
|
||||||
|
class QAction;
|
||||||
|
|
||||||
class DisplayText
|
class DisplayText
|
||||||
: public QTextEdit
|
: public QTextEdit
|
||||||
{
|
{
|
||||||
@ -24,9 +26,11 @@ public:
|
|||||||
QColor color_TxMsg, bool bFastMode);
|
QColor color_TxMsg, bool bFastMode);
|
||||||
void displayQSY(QString text);
|
void displayQSY(QString text);
|
||||||
|
|
||||||
Q_SIGNAL void selectCallsign (bool alt, bool ctrl);
|
Q_SIGNAL void selectCallsign (Qt::KeyboardModifiers);
|
||||||
|
Q_SIGNAL void erased ();
|
||||||
|
|
||||||
Q_SLOT void appendText (QString const& text, QColor bg = Qt::white);
|
Q_SLOT void appendText (QString const& text, QColor bg = Qt::white);
|
||||||
|
Q_SLOT void erase ();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mouseDoubleClickEvent(QMouseEvent *e);
|
void mouseDoubleClickEvent(QMouseEvent *e);
|
||||||
@ -36,6 +40,7 @@ private:
|
|||||||
QColor color_CQ, QColor color_DXCC, QColor color_NewCall);
|
QColor color_CQ, QColor color_DXCC, QColor color_NewCall);
|
||||||
|
|
||||||
QFont char_font_;
|
QFont char_font_;
|
||||||
|
QAction * erase_action_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DISPLAYTEXT_H
|
#endif // DISPLAYTEXT_H
|
||||||
|
@ -34,6 +34,7 @@ set (UG_SRCS
|
|||||||
protocols.adoc
|
protocols.adoc
|
||||||
logging.adoc
|
logging.adoc
|
||||||
make-qso.adoc
|
make-qso.adoc
|
||||||
|
measurement_tools.adoc
|
||||||
new_features.adoc
|
new_features.adoc
|
||||||
platform-dependencies.adoc
|
platform-dependencies.adoc
|
||||||
protocols.adoc
|
protocols.adoc
|
||||||
@ -72,11 +73,15 @@ set (UG_IMGS
|
|||||||
images/decodes.png
|
images/decodes.png
|
||||||
images/download_samples.png
|
images/download_samples.png
|
||||||
images/file-menu.png
|
images/file-menu.png
|
||||||
|
images/FreqCal.png
|
||||||
|
images/FreqCal_Graph.png
|
||||||
|
images/FreqCal_Results.png
|
||||||
images/freemsg.png
|
images/freemsg.png
|
||||||
images/ft8_decodes.png
|
images/ft8_decodes.png
|
||||||
images/help-menu.png
|
images/help-menu.png
|
||||||
images/JT4F.png
|
images/JT4F.png
|
||||||
images/JT65B.png
|
images/JT65B.png
|
||||||
|
images/keyboard-shortcuts.png
|
||||||
images/MSK144.png
|
images/MSK144.png
|
||||||
images/QRA64.png
|
images/QRA64.png
|
||||||
images/WSPR_WideGraphControls.png
|
images/WSPR_WideGraphControls.png
|
||||||
@ -109,6 +114,7 @@ set (UG_IMGS
|
|||||||
images/tools-menu.png
|
images/tools-menu.png
|
||||||
images/traditional-msg-box.png
|
images/traditional-msg-box.png
|
||||||
images/tx-macros.png
|
images/tx-macros.png
|
||||||
|
images/VHF_controls.png
|
||||||
images/view-menu.png
|
images/view-menu.png
|
||||||
images/wide-graph-controls.png
|
images/wide-graph-controls.png
|
||||||
|
|
||||||
|
@ -12,4 +12,18 @@ GNU General Public License for more details.
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this documentation. If not, see {gnu_gpl}.
|
along with this documentation. If not, see {gnu_gpl}.
|
||||||
|
|
||||||
Copyright (C) 2001-2017 Joseph H Taylor, Jr., K1JT.
|
Except where otherwise noted, all algorithms, protocol designs, source
|
||||||
|
code, and supporting files contained in the _{prog}_ package are the
|
||||||
|
intellectual property of the program's authors. The authors assert
|
||||||
|
*Copyright ownership* of this material, whether or not such copyright
|
||||||
|
notice appears in each individual file. Others who make fair use of
|
||||||
|
our work under terms of the GNU General Public License must display
|
||||||
|
the following copyright notice prominently:
|
||||||
|
|
||||||
|
*The algorithms, source code, look-and-feel of _{prog}_ and related
|
||||||
|
programs, and protocol specifications for the modes FSK441, FT8, JT4,
|
||||||
|
JT6M, JT9, JT65, JTMS, QRA64, ISCAT, and MSK144 are Copyright (C)
|
||||||
|
2001-2017 by one or more of the following authors: Joseph Taylor,
|
||||||
|
K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo,
|
||||||
|
IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR;
|
||||||
|
Philip Karn, KA9Q; and other members of the WSJT Development Group.*
|
||||||
|
@ -67,6 +67,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
|||||||
:fmt_group: https://groups.yahoo.com/neo/groups/FMT-nuts/info[FMT Group]
|
:fmt_group: https://groups.yahoo.com/neo/groups/FMT-nuts/info[FMT Group]
|
||||||
:fmt_k5cm: http://www.k5cm.com/[FMT Event Info]
|
:fmt_k5cm: http://www.k5cm.com/[FMT Event Info]
|
||||||
:fmt_wspr: http://www.physics.princeton.edu/pulsar/K1JT/FMT_User.pdf[Accurate Frequency Measurements with your WSPR Setup]
|
:fmt_wspr: http://www.physics.princeton.edu/pulsar/K1JT/FMT_User.pdf[Accurate Frequency Measurements with your WSPR Setup]
|
||||||
|
:ft8_tips: http://www.physics.princeton.edu/pulsar/K1JT/FT8_Operating_Tips.pdf[here]
|
||||||
:gnu_gpl: http://www.gnu.org/licenses/gpl-3.0.txt[GNU General Public License]
|
:gnu_gpl: http://www.gnu.org/licenses/gpl-3.0.txt[GNU General Public License]
|
||||||
:homepage: http://physics.princeton.edu/pulsar/K1JT/[WSJT Home Page]
|
:homepage: http://physics.princeton.edu/pulsar/K1JT/[WSJT Home Page]
|
||||||
:hrd: http://www.hrdsoftwarellc.com/[Ham Radio Deluxe]
|
:hrd: http://www.hrdsoftwarellc.com/[Ham Radio Deluxe]
|
||||||
@ -76,6 +77,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
|||||||
:launchpadki7mt: https://launchpad.net/~ki7mt[KI7MT PPA's]
|
:launchpadki7mt: https://launchpad.net/~ki7mt[KI7MT PPA's]
|
||||||
:log4om: http://www.log4om.com[Log4OM]
|
:log4om: http://www.log4om.com[Log4OM]
|
||||||
:lunarEchoes: http://physics.princeton.edu/pulsar/K1JT/LunarEchoes_QEX.pdf[QEX]
|
:lunarEchoes: http://physics.princeton.edu/pulsar/K1JT/LunarEchoes_QEX.pdf[QEX]
|
||||||
|
:msk144: http://physics.princeton.edu/pulsar/k1jt/MSK144_Protocol_QEX.pdf[QEX]
|
||||||
:msys_url: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/[MSYS Download]
|
:msys_url: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/[MSYS Download]
|
||||||
:ntpsetup: http://www.satsignal.eu/ntp/setup.html[Network Time Protocol Setup]
|
:ntpsetup: http://www.satsignal.eu/ntp/setup.html[Network Time Protocol Setup]
|
||||||
:osx_instructions: http://physics.princeton.edu/pulsar/K1JT/OSX_Readme[Mac OS X Install Instructions]
|
:osx_instructions: http://physics.princeton.edu/pulsar/K1JT/OSX_Readme[Mac OS X Install Instructions]
|
||||||
@ -107,6 +109,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
|||||||
:QRA64_EME: http://physics.princeton.edu/pulsar/K1JT/QRA64_EME.pdf[QRA64 for microwave EME]
|
:QRA64_EME: http://physics.princeton.edu/pulsar/K1JT/QRA64_EME.pdf[QRA64 for microwave EME]
|
||||||
:svn: http://subversion.apache.org/packages.html#windows[Subversion]
|
:svn: http://subversion.apache.org/packages.html#windows[Subversion]
|
||||||
:win32: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
|
:win32: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
|
||||||
|
:wsjt-devel: https://lists.sourceforge.net/lists/listinfo/wsjt-devel[here]
|
||||||
:wsjt_svn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/[WSJT Source Repository]
|
:wsjt_svn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/[WSJT Source Repository]
|
||||||
:wspr_code: http://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
|
:wspr_code: http://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
|
||||||
:wspr_svn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/branches/wspr/[WSPR Source Repository]
|
:wspr_svn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/branches/wspr/[WSPR Source Repository]
|
||||||
|
@ -5,7 +5,7 @@ and operation. Most of the items are self-explanatory; a few
|
|||||||
additional details are provided below. Keyboard shortcuts for some
|
additional details are provided below. Keyboard shortcuts for some
|
||||||
frequently used menu items are listed at the right edge of the menu.
|
frequently used menu items are listed at the right edge of the menu.
|
||||||
|
|
||||||
==== WSJT-X menu
|
==== _WSJT-X_ menu
|
||||||
image::MacAppMenu.png[align="left",alt="Mac App Menu"]
|
image::MacAppMenu.png[align="left",alt="Mac App Menu"]
|
||||||
|
|
||||||
This menu appears on the Macintosh only. *Settings* appears here,
|
This menu appears on the Macintosh only. *Settings* appears here,
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
// Status=review
|
// Status=review
|
||||||
|
|
||||||
The following controls appear at the bottom of the Wide Graph window.
|
The following controls appear at the bottom of the Wide Graph window.
|
||||||
With the exception of *JT65 nnnn JT9* (when operating in JT9+JT65
|
Decoding occurs only in the displayed frequency range; otherwise, with
|
||||||
mode), they affect only the graphical displays. They have no effect
|
the exceptions of *Start NNN Hz* and of *JT65 nnnn JT9* when operating
|
||||||
on the decoding process.
|
in JT9+JT65 mode, controls on the Wide Graph window have no effect on
|
||||||
|
the decoding process.
|
||||||
|
|
||||||
image::wide-graph-controls.png[align="center",alt="Wide Graph Controls"]
|
image::wide-graph-controls.png[align="center",alt="Wide Graph Controls"]
|
||||||
|
|
||||||
|
@ -44,10 +44,11 @@ successful decode used MyCall as hypothetically known information.
|
|||||||
|===============================================
|
|===============================================
|
||||||
|
|
||||||
Table 2 lists the six possible QSO states that are tracked by the
|
Table 2 lists the six possible QSO states that are tracked by the
|
||||||
WSJT-X auto-sequencer, along with the type of AP decoding that would
|
_WSJT-X_ auto-sequencer, along with the type of AP decoding that would
|
||||||
be attempted in each state.
|
be attempted in each state.
|
||||||
|
|
||||||
[[AP decoding types for each QSO state]]
|
[[AP_DECODING_TYPES_TABLE]]
|
||||||
|
.AP decoding types for each QSO state
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
||||||
|===========================================
|
|===========================================
|
||||||
|State |AP type
|
|State |AP type
|
||||||
|
@ -69,6 +69,9 @@ command-prompt window:
|
|||||||
sudo apt remove appmenu-qt5
|
sudo apt remove appmenu-qt5
|
||||||
|
|
||||||
+
|
+
|
||||||
Alternatively, you can disable the common menu bar for just WSJT-X by starting the application with the environment variable QT_QPA_PLATFORMTHEME set to empty (the space after the '=' character is necessary):
|
Alternatively, you can disable the common menu bar for just _WSJT-X_
|
||||||
|
by starting the application with the environment variable
|
||||||
|
QT_QPA_PLATFORMTHEME set to empty (the space after the '=' character
|
||||||
|
is necessary):
|
||||||
|
|
||||||
QT_QPA_PLATFORMTHEME= wsjtx
|
QT_QPA_PLATFORMTHEME= wsjtx
|
||||||
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 32 KiB |
BIN
doc/user_guide/en/images/FreqCal_Results.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 170 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 153 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.8 KiB |
@ -76,11 +76,11 @@ fully automated QSOs.
|
|||||||
|
|
||||||
=== VHF Contest Mode
|
=== VHF Contest Mode
|
||||||
|
|
||||||
A special *VHF Contest Mode* can be activated for FT8 and MSK144 modes
|
A special *NA VHF Contest* mode can be activated for FT8 and MSK144
|
||||||
by checking a box on the *Settings | Advanced* tab. This mode is
|
modes by checking a box on the main window. This mode is configured
|
||||||
configured especially for VHF contests in which four-character grid
|
especially for contests in which four-character grid locators are the
|
||||||
locators are the required exchange. When *Contest Mode* is active,
|
required exchange. When *NA VHF Contest* mode is active, the standard
|
||||||
the standard QSO sequence looks like this:
|
QSO sequence looks like this:
|
||||||
|
|
||||||
CQ K1ABC FN42
|
CQ K1ABC FN42
|
||||||
K1ABC W9XYZ EN37
|
K1ABC W9XYZ EN37
|
||||||
|
@ -27,10 +27,27 @@ of WWV at 2.500, 5.000, 10.000, 15.000, and 20.000 MHz, and CHU at
|
|||||||
3.330, 7.850, and 14.670 MHz. Similar shortwave signals are available
|
3.330, 7.850, and 14.670 MHz. Similar shortwave signals are available
|
||||||
in other parts of the world.
|
in other parts of the world.
|
||||||
|
|
||||||
|
- In most cases you will want to start by deleting any existing file
|
||||||
|
`fmt.all` in the directory where your log files are kept.
|
||||||
|
|
||||||
|
- To cycle automatically through your chosen list of calibration
|
||||||
|
frequencies, check *Execute frequency calibration cycle* on the
|
||||||
|
*Tools* menu. _WSJT-X_ will spend 30 seconds at each
|
||||||
|
frequency. Initially no measurement data is saved to the `fmt.all`
|
||||||
|
file although it is displayed on screen, this allows you to check you
|
||||||
|
current calibration parameters.
|
||||||
|
|
||||||
- During the calibration procedure, the radio's USB dial frequency is
|
- During the calibration procedure, the radio's USB dial frequency is
|
||||||
offset 1500 Hz below each *FreqCal* entry in the default frequencies
|
offset 1500 Hz below each *FreqCal* entry in the default frequencies
|
||||||
list. As shown in the screen shot below, detected signal carriers
|
list. As shown in the screen shot below, detected signal carriers
|
||||||
therefore appear at about 1500 Hz in the WSJT-X waterfall.
|
therefore appear at about 1500 Hz in the _WSJT-X_ waterfall.
|
||||||
|
|
||||||
|
- To start a measurement session check the *Measure* option and let
|
||||||
|
the calibration cycle run for at least one complete sequence. Note
|
||||||
|
that, while measuring, any existing calibration parameters are
|
||||||
|
automatically disabled so you may have to increase the *FTol* range if
|
||||||
|
your rig is off freqeuncy by more than a few Hertz in order to capture
|
||||||
|
valid measurements.
|
||||||
|
|
||||||
image::FreqCal.png[align="left",alt="FreqCal"]
|
image::FreqCal.png[align="left",alt="FreqCal"]
|
||||||
|
|
||||||
@ -50,6 +67,7 @@ measurements, as shown for these measurements in the graph plotted
|
|||||||
below. Software tools for completing this task are included with the
|
below. Software tools for completing this task are included with the
|
||||||
_WSJT-X_ installation, and detailed instructions for their use are
|
_WSJT-X_ installation, and detailed instructions for their use are
|
||||||
available at https://physics.princeton.edu/pulsar/k1jt/FMT_User.pdf.
|
available at https://physics.princeton.edu/pulsar/k1jt/FMT_User.pdf.
|
||||||
|
|
||||||
Using these tools and no specialized hardware beyond your
|
Using these tools and no specialized hardware beyond your
|
||||||
CAT-interfaced radio, you can calibrate the radio to better than 1 Hz
|
CAT-interfaced radio, you can calibrate the radio to better than 1 Hz
|
||||||
and compete very effectively in the ARRL's periodic Frequency
|
and compete very effectively in the ARRL's periodic Frequency
|
||||||
@ -57,18 +75,152 @@ Measuring Tests.
|
|||||||
|
|
||||||
image::FreqCal_Graph.png[align="left",alt="FreqCal_Graph"]
|
image::FreqCal_Graph.png[align="left",alt="FreqCal_Graph"]
|
||||||
|
|
||||||
|
After running *Execute frequency calibration cycle* at least once with
|
||||||
|
good results, check and edit the file `fmt.all` in the log directory
|
||||||
|
and delete any spurious or outlier measurements. The line-fitting
|
||||||
|
procedure can then be carried out automatically by clicking *Solve for
|
||||||
|
calibration parameters* on the *Tools* menu. The results will be
|
||||||
|
displayed as in the following screen shot. Estimated uncertainties
|
||||||
|
are included for slope and intercept; `N` is the number of averaged
|
||||||
|
frequency measurements included in the fit, and `StdDev` is the root
|
||||||
|
mean square deviation of averaged measurements from the fitted
|
||||||
|
straight line. If the solution seems valid you will be offered an
|
||||||
|
*Apply* button to push that will automatically set the calibration
|
||||||
|
parameters in *Settings -> Frequencies -> Frequency Calibration*.
|
||||||
|
|
||||||
|
image::FreqCal_Results.png[align="center",alt="FreqCal_Results"]
|
||||||
|
|
||||||
|
For a quick visual check of the resulting calibration, stay in
|
||||||
|
*FreqCal* mode with the *Measure* option cleared. _WSJT-X_ will show
|
||||||
|
the adjusted results directly on the waterfall and the displayed
|
||||||
|
records.
|
||||||
|
|
||||||
=== Reference Spectrum
|
=== Reference Spectrum
|
||||||
|
|
||||||
WSJT-X provides a tool that can be used to determine the detailed
|
_WSJT-X_ provides a tool that can be used to determine the detailed
|
||||||
shape of your receiver's passband. Disconnect your antenna or tune to
|
shape of your receiver's passband. Disconnect your antenna or tune to
|
||||||
a quiet frequency with no signals. With WSJT-X running in one of the
|
a quiet frequency with no signals. With _WSJT-X_ running in one of
|
||||||
slow modes, select *Measure reference spectrum* from the *Tools* menu.
|
the slow modes, select *Measure reference spectrum* from the *Tools*
|
||||||
Wait for about a minute and then hit the *Stop* button. A file named
|
menu. Wait for about a minute and then hit the *Stop* button. A file
|
||||||
`refspec.dat` will appear in your log directory.
|
named `refspec.dat` will appear in your log directory.
|
||||||
|
|
||||||
[ ... TBD ... ]
|
[ ... more to come ... ]
|
||||||
|
|
||||||
=== Equalization
|
=== Phase Equalization
|
||||||
|
|
||||||
[ ... TBD ... ]
|
*Measure phase response* under the *Tools* menu is for advanced MSK144
|
||||||
|
users. Phase equalization is used to compensate for group-delay
|
||||||
|
variation across your receiver passband. Careful application of this
|
||||||
|
facility can reduce intersymbol interference, resulting in improved
|
||||||
|
decoding sensitivity. If you use a software-defined receiver with
|
||||||
|
linear-phase filters there is no need to apply phase equalization.
|
||||||
|
|
||||||
|
After a frame of received data has been decoded, *Measure phase
|
||||||
|
response* generates an undistorted audio waveform equal to the one
|
||||||
|
generated by the transmitting station. Its Fourier transform is then
|
||||||
|
used as a frequency-dependent phase reference to compare with the
|
||||||
|
phase of the received frame's Fourier coefficients. Phase differences
|
||||||
|
between the reference spectrum and received spectrum will include
|
||||||
|
contributions from the originating station's transmit filter, the
|
||||||
|
propagation channel, and filters in the receiver. If the received
|
||||||
|
frame originates from a station known to transmit signals having
|
||||||
|
little phase distortion (say, a station known to use a properly
|
||||||
|
adjusted software-defined-transceiver) and if the received signal is
|
||||||
|
relatively free from multipath distortion so that the channel phase is
|
||||||
|
close to linear, the measured phase differences will be representative
|
||||||
|
of the local receiver's phase response.
|
||||||
|
|
||||||
|
Complete the following steps to generate a phase equalization curve:
|
||||||
|
|
||||||
|
- Record a number of wav files that contain decodable signals from
|
||||||
|
your chosen reference station. Best results will be obtained when the
|
||||||
|
signal-to-noise ratio of the reference signals is 10 dB or greater.
|
||||||
|
|
||||||
|
- Enter the callsign of the reference station in the DX Call box.
|
||||||
|
|
||||||
|
- Select *Measure phase response* from the *Tools* menu, and open each
|
||||||
|
of the wav files in turn. The mode character on decoded text lines
|
||||||
|
will change from `&` to `^` while _WSJT-X_ is measuring the phase
|
||||||
|
response, and it will change back to `&` after the measurement is
|
||||||
|
completed. The program needs to average a number of high-SNR frames to
|
||||||
|
accurately estimate the phase, so it may be necessary to process
|
||||||
|
several wav files. The measurement can be aborted at any time by
|
||||||
|
selecting *Measure phase response* again to toggle the phase
|
||||||
|
measurement off.
|
||||||
|
|
||||||
|
+
|
||||||
|
|
||||||
|
When the measurement is complete _WSJT-X_ will save the measured
|
||||||
|
phase response in the *Log directory*, in a file with suffix
|
||||||
|
".pcoeff". The filename will contain the callsign of the reference
|
||||||
|
station and a timestamp, for example `K0TPP_170923_112027.pcoeff`.
|
||||||
|
|
||||||
|
- Select *Equalization tools ...* under the *Tools* menu and click the
|
||||||
|
*Phase ...* button to view the contents of the *Log directory*. Select
|
||||||
|
the desired pcoeff file. The measured phase values will be plotted as
|
||||||
|
filled circles along with a fitted red curve labeled "Proposed". This is
|
||||||
|
the proposed phase equalization curve. It's a good idea to repeat the
|
||||||
|
phase measurement several times, using different wav files for each
|
||||||
|
measurement, to ensure that your measurements are repeatable.
|
||||||
|
|
||||||
|
- Once you are satisfied with a fitted curve, push the *Apply* button
|
||||||
|
to save the proposed response. The red curve will be replaced with a
|
||||||
|
light green curve labeled "Current" to indicate that the phase
|
||||||
|
equalization curve is now being applied to the received data. Another
|
||||||
|
curve labeled "Group Delay" will appear. The "Group Delay" curve shows
|
||||||
|
the group delay variation across the passband, in ms. Click the
|
||||||
|
*Discard* button to remove the captured data, leaving only the applied
|
||||||
|
phase equalization curve and corresponding group delay curve.
|
||||||
|
|
||||||
|
- To revert to no phase equalization, push the *Restore Defaults*
|
||||||
|
button followed by the *Apply* button.
|
||||||
|
|
||||||
|
The three numbers printed at the end of each MSK144 decode line can be
|
||||||
|
used to assess the improvement provided by equalization. These numbers
|
||||||
|
are: `N` = Number of frames averaged, `H` = Number of hard bit errors
|
||||||
|
corrected, `E` = Size of MSK eye diagram opening.
|
||||||
|
|
||||||
|
Here is a decode of K0TPP obtained while *Measure phase response* was measuring
|
||||||
|
the phase response:
|
||||||
|
|
||||||
|
103900 17 6.5 1493 ^ WA8CLT K0TPP +07 1 0 1.2
|
||||||
|
|
||||||
|
The "^" symbol indicates that a phase measurement is being accumulated
|
||||||
|
but is not yet finished. The three numbers at the end of the line
|
||||||
|
indicate that one frame was used to obtain the decode, there were no
|
||||||
|
hard bit errors, and the eye-opening was 1.2 on a -2 to +2
|
||||||
|
scale. Here's how the same decode looks after phase equalization:
|
||||||
|
|
||||||
|
103900 17 6.5 1493 & WA8CLT K0TPP +07 1 0 1.6
|
||||||
|
|
||||||
|
In this case, equalization has increased the eye opening from 1.2 to
|
||||||
|
1.6. Larger positive eye openings are associated with reduced
|
||||||
|
likelihood of bit errors and higher likelihood that a frame will be
|
||||||
|
successfully decoded. In this case, the larger eye-opening tells us
|
||||||
|
that phase equalization was successful, but it is important to note
|
||||||
|
that this test does not by itself tell us whether the applied phase
|
||||||
|
equalization curve is going to improve decoding of signals other than
|
||||||
|
those from the reference station, K0TPP.
|
||||||
|
|
||||||
|
It's a good idea to carry out before and after comparisons using a
|
||||||
|
large number of saved wav files with signals from many different
|
||||||
|
stations, to help decide whether your equalization curve improves
|
||||||
|
decoding for most signals. When doing such comparisons, keep in mind
|
||||||
|
that equalization may cause _WSJT-X_ to successfully decode a frame
|
||||||
|
that was not decoded before equalization was applied. For this
|
||||||
|
reason, be sure that the time "T" of the two decodes are the same
|
||||||
|
before comparing their end-of-line quality numbers.
|
||||||
|
|
||||||
|
When comparing before and after decodes having the same "T", keep in
|
||||||
|
mind that a smaller first number means that decoding has improved,
|
||||||
|
even if the second and third numbers appear to be "worse". For
|
||||||
|
example, suppose that the end-of-line quality numbers before
|
||||||
|
equalization are `2 0 0.2` and after equalization `1 5 -0.5`. These
|
||||||
|
numbers show improved decoding because the decode was obtained using
|
||||||
|
only a single frame after equalization whereas a 2-frame average was
|
||||||
|
needed before equalization. This implies that shorter and/or weaker
|
||||||
|
pings could be decodable.
|
||||||
|
|
||||||
|
NOTE: Further details on phase equalization and examples of fitted
|
||||||
|
phase curves and eye diagrams can be found in the article on MSK144 by
|
||||||
|
K9AN and K1JT published in {msk144}.
|
||||||
|
@ -11,7 +11,7 @@ added to _WSJT-X_ since Version 1.7.0:
|
|||||||
|
|
||||||
- *SWL* option for third-party decoding short-format MSK144 messages
|
- *SWL* option for third-party decoding short-format MSK144 messages
|
||||||
|
|
||||||
- Experimental amplitude and phase equalization for MSK144
|
- Experimental phase equalization for MSK144
|
||||||
|
|
||||||
- Options to minimize screen space used by *Main* and *Wide Graph*
|
- Options to minimize screen space used by *Main* and *Wide Graph*
|
||||||
windows
|
windows
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Status=review
|
// Status=review
|
||||||
|
|
||||||
image::settings-audio.png[align="center",alt="WSJT-X Audio Configuration Screen"]
|
image::settings-audio.png[align="center",alt="_WSJT-X_ Audio Configuration Screen"]
|
||||||
|
|
||||||
Select the *Audio* tab to configure your sound system.
|
Select the *Audio* tab to configure your sound system.
|
||||||
|
|
||||||
|
@ -14,8 +14,10 @@ volunteer programmers to make the program better. Bugs may be
|
|||||||
reported to {wsjt_yahoo_group} (email address
|
reported to {wsjt_yahoo_group} (email address
|
||||||
wsjtgroup@yahoogroups.com) or the WSJT Developers list
|
wsjtgroup@yahoogroups.com) or the WSJT Developers list
|
||||||
(wsjt-devel@lists.sourceforge.net). Again, you will need to join the
|
(wsjt-devel@lists.sourceforge.net). Again, you will need to join the
|
||||||
group or subscribe to the list. To be useful, bug reports should
|
group or subscribe to the list. You can register for the list {wsjt-devel}.
|
||||||
include at least the following information:
|
|
||||||
|
To be useful, bug reports should include at least the following
|
||||||
|
information:
|
||||||
|
|
||||||
- Program version
|
- Program version
|
||||||
- Operating system
|
- Operating system
|
||||||
|
@ -16,10 +16,10 @@ image::main-ui.png[align="center",alt="Main UI and Wide Graph"]
|
|||||||
|
|
||||||
Decoding takes place at the end of a receive sequence and proceeds in
|
Decoding takes place at the end of a receive sequence and proceeds in
|
||||||
two steps. The first decode is done at the selected Rx frequency,
|
two steps. The first decode is done at the selected Rx frequency,
|
||||||
indicated by the U-shaped green marker on the waterfall scale.
|
indicated by the U-shaped green marker on the waterfall frequency
|
||||||
Results appear in both the left (*Band Activity*) and right (*Rx
|
scale. Results appear in both the left (*Band Activity*) and right
|
||||||
Frequency*) text windows on the main screen. The program then finds
|
(*Rx Frequency*) text windows on the main screen. The program then
|
||||||
and decodes all signals in the selected mode over the displayed
|
finds and decodes all signals in the selected mode over the displayed
|
||||||
frequency range. The red marker on the waterfall scale indicates your
|
frequency range. The red marker on the waterfall scale indicates your
|
||||||
Tx frequency.
|
Tx frequency.
|
||||||
|
|
||||||
@ -51,8 +51,8 @@ Call* and *DX Grid* entry fields.
|
|||||||
** The *Tx even* box is checked or cleared appropriately, so that you
|
** The *Tx even* box is checked or cleared appropriately, so that you
|
||||||
will transmit in the proper (odd or even) minutes.
|
will transmit in the proper (odd or even) minutes.
|
||||||
|
|
||||||
** The Rx and Tx frequency markers are moved to the frequency of the
|
** The Rx frequency marker is moved to the frequency of the CQing
|
||||||
CQing station.
|
station.
|
||||||
|
|
||||||
** The *Gen Msg* ("`generated message`") radio button at bottom right
|
** The *Gen Msg* ("`generated message`") radio button at bottom right
|
||||||
of the main window is selected.
|
of the main window is selected.
|
||||||
@ -61,23 +61,23 @@ of the main window is selected.
|
|||||||
*Setup* menu, *Enable Tx* would be activated and a transmission would
|
*Setup* menu, *Enable Tx* would be activated and a transmission would
|
||||||
start automatically at the proper time.
|
start automatically at the proper time.
|
||||||
|
|
||||||
- Double-click on the decoded message `K1JT N5KDV EM41`,
|
** You can modify the double-click behavior by holding down the
|
||||||
highlighted in red. Results will be similar to those in the
|
*Shift* key to move only the Tx frequency or the *Ctrl* key to move
|
||||||
previous step, except the Tx frequency (red marker) is not
|
both Rx and Tx frequencies.
|
||||||
moved. Such messages are usually in response to your own CQ, or from
|
|
||||||
a tail-ender, and you probably want your Tx frequency to stay where it
|
|
||||||
was.
|
|
||||||
|
|
||||||
- By holding down the *Ctrl* key when double-clicking on a decoded
|
- Double-click on the decoded message `K1JT N5KDV EM41`, highlighted
|
||||||
line you can cause both Tx and Rx frequencies to be moved. This
|
in red. Results will be similar to those in the previous step. The Tx
|
||||||
behavior can also be forced by checking *Lock Tx=Rx*.
|
frequency (red marker) is not moved unless *Shift* or *Ctrl* is held
|
||||||
|
down. Messages highlighted in red are usually in response to your own
|
||||||
|
CQ or from a tail-ender, and you probably want your Tx frequency to
|
||||||
|
stay where it was.
|
||||||
|
|
||||||
- Double-click on the message from KF4RWA in either window. He is
|
NOTE: Double-clicking on decoded messages can be defaulted to simplex
|
||||||
sending `73` to K1JT, signifying that the QSO is over. Most likely
|
operation by checking *Double click on call sets Tx and Rx freqs* on
|
||||||
you want to send 73 to him, so the message `KF4RWA K1JT 73` is
|
the *Settings -> General* tab.
|
||||||
automatically generated and selected for your next transmission.
|
|
||||||
(Alternatively, you might choose to send a free-text message or to
|
NOTE: You can prevent your Tx frequency from being changed by checking the
|
||||||
call CQ again.)
|
box *Lock Tx Freq*.
|
||||||
|
|
||||||
- Click somewhere on the waterfall to set Rx frequency (green marker
|
- Click somewhere on the waterfall to set Rx frequency (green marker
|
||||||
on waterfall scale).
|
on waterfall scale).
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Status=review
|
// Status=review
|
||||||
.Main Window:
|
.Main Window:
|
||||||
- Select *JT9+JT65* on the *Mode* menu.
|
- Select *JT9+JT65* on the *Mode* menu.
|
||||||
- Toggle the *Tx mode* button to read *Tx JT65*, and set the Tx and Rx
|
- Toggle the *Tx mode* button to read *Tx JT65 #*, and set the Tx and Rx
|
||||||
frequencies to 1718 Hz.
|
frequencies to 1718 Hz.
|
||||||
- Double-click on *Erase* to clear both text windows.
|
- Double-click on *Erase* to clear both text windows.
|
||||||
|
|
||||||
@ -75,18 +75,21 @@ JT9 message from IZ0MIT:
|
|||||||
[width="80%",align="center",cols="^10,2*^8,2*^10,54",options="header"]
|
[width="80%",align="center",cols="^10,2*^8,2*^10,54",options="header"]
|
||||||
|===
|
|===
|
||||||
|UTC|dB|DT|Freq|Mode|Message
|
|UTC|dB|DT|Freq|Mode|Message
|
||||||
|+2343+|+-7+|+0.3+|+3196+|+@+|+WB8QPG IZ0MIT -11+
|
|+2343+|+-8+|+0.3+|+3196+|+@+|+WB8QPG IZ0MIT -11+
|
||||||
|===
|
|===
|
||||||
|
|
||||||
- Scroll back in the *Band Activity* window and double-click on the
|
- Scroll back in the *Band Activity* window and double-click on the
|
||||||
message `CQ DL7ACA JO40`. The program will set *Tx mode* to JT65 and Tx
|
message `CQ DL7ACA JO40`. The program will set *Tx mode* to JT65 and
|
||||||
and Rx frequencies to that of DL7ACA, 975 Hz. If you had checked
|
the Rx frequency to that of DL7ACA, 975 Hz. If you hold down the
|
||||||
*Double-click on call sets Tx Enable* on the *Setup* menu, the program
|
*Ctrl* key, both Rx and Tx frequencies will be moved. If you had
|
||||||
would configure itself to start a QSO with DL7ACA.
|
checked *Double-click on call sets Tx Enable* on the *Setup* menu, the
|
||||||
|
program would configure itself to begin a transmission and start a QSO
|
||||||
|
with DL7ACA.
|
||||||
|
|
||||||
- Double-click on the decoded JT65 message `CQ TA4A KM37`. The program
|
- Hold *Ctrl* down and double-click on the decoded JT65 message `CQ
|
||||||
will set Tx mode to JT9 and the Rx and Tx frequencies to 3567 Hz. The
|
TA4A KM37`. The program will set Tx mode to JT9 and the Rx and Tx
|
||||||
program is now configured properly for a JT9 QSO with TA4A.
|
frequencies to 3567 Hz. The program is now configured properly for a
|
||||||
|
JT9 QSO with TA4A.
|
||||||
|
|
||||||
.Reopen the First Sample File:
|
.Reopen the First Sample File:
|
||||||
- Select *File | Open* and navigate to `...\save\samples\130418_1742.wav`.
|
- Select *File | Open* and navigate to `...\save\samples\130418_1742.wav`.
|
||||||
|
@ -25,34 +25,36 @@ image::ft8_decodes.png[align="left"]
|
|||||||
frequency marker will jump to your selected frequency, and the Rx
|
frequency marker will jump to your selected frequency, and the Rx
|
||||||
frequency control on the main window will be updated accordingly.
|
frequency control on the main window will be updated accordingly.
|
||||||
|
|
||||||
- Do the same thing with the Shift key held down. Now the red Tx
|
- Do the same thing with the *Shift* key held down. Now the red Tx
|
||||||
frequency marker and its associated control on the main window will
|
frequency marker and its associated control on the main window will
|
||||||
follow your frequency selections.
|
follow your frequency selections.
|
||||||
|
|
||||||
- Do the same thing with the Ctrl key held down. Now the both colored
|
- Do the same thing with the *Ctrl* key held down. Now the both colored
|
||||||
markers and both spinner controls will follow your selections.
|
markers and both spinner controls will follow your selections.
|
||||||
|
|
||||||
- Double-clicking at any frequency on the waterfall does all the
|
- Double-clicking at any frequency on the waterfall does all the
|
||||||
things just described and also invokes the decoder in a small range
|
things just described and also invokes the decoder in a small range
|
||||||
around that frequency. To decode a particular signal, double-click
|
around the Rx frequency. To decode a particular signal, double-click
|
||||||
near the left edge of its waterfall trace.
|
near the left edge of its waterfall trace.
|
||||||
|
|
||||||
- Now double-click on any of the the lines of decoded text in the main
|
- Now double-click on any of the the lines of decoded text in the main
|
||||||
window. Unless you have *My Call* set to K1JT or KY7M on the
|
window. All three lines will show the same behavior, setting Rx
|
||||||
*Settings -> General* tab, all three lines will show the same
|
frequency to that of the selected message and leaving Tx frequency
|
||||||
behavior, setting both RxFreq and TxFreq to the frequency of the
|
unchanged. To change both Rx and Tx frequencies, hold *Ctrl* down
|
||||||
selected message. However, if MyCall is set to K1JT then clicking on
|
when double-clicking.
|
||||||
a message directed to K1JT will move only the Rx frequency setting.
|
|
||||||
This behavior is desirable so that you will not inadvertently change
|
NOTE: To avoid QRM from competing callers, it is frequently desirable
|
||||||
your Tx frequency to that of a tail-ender who called you somewhere
|
to answer a CQ on a different frequency from that of the CQing
|
||||||
else in the FT8 subband.
|
station. Choose a Tx frequency that appears to be not in use. The
|
||||||
|
same is true when you tail-end another QSO.
|
||||||
|
|
||||||
NOTE: The FT8 decoder can often copy several overlapping signals at
|
NOTE: The FT8 decoder can often copy several overlapping signals at
|
||||||
nearly the same frequency. However, in crowded band conditions you
|
nearly the same frequency. Keyboard shortcuts *Shift+F11* and
|
||||||
will often find it advantageous to move off the frequency of the
|
*Shift+F12* provide an easy way to move your Tx frequency down or up
|
||||||
station you are calling. Keyboard shortcuts *Shift+F11* and
|
in 60 Hz steps.
|
||||||
*Shift+F12* provide an easy way to move your Tx frequency in 60 Hz
|
|
||||||
steps.
|
NOTE: Further helpful tips on FT8 operating procedures are available
|
||||||
|
{ft8_tips}. Thanks to ZL2IFB!
|
||||||
|
|
||||||
IMPORTANT: When finished with this Tutorial, don't forget to re-enter
|
IMPORTANT: When finished with this Tutorial, don't forget to re-enter
|
||||||
your own callsign as *My Call* on the *Settings | General* tab.
|
your own callsign as *My Call* on the *Settings | General* tab.
|
||||||
|
@ -9,5 +9,5 @@
|
|||||||
- *Gain* and *Zero* sliders for waterfall and spectrum set near midscale
|
- *Gain* and *Zero* sliders for waterfall and spectrum set near midscale
|
||||||
- *Spec* = 25%
|
- *Spec* = 25%
|
||||||
|
|
||||||
- Use the mouse to adjust the width of the *Wide Graph* so that its
|
- Use the mouse to grab the left or right edge of the *Wide Graph*, and
|
||||||
upper frequency limit is about 2400 Hz.
|
adjust its width so that the upper frequency limit is about 2400 Hz.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// This is a comment line, anything with // is ignored at process time.
|
// This is a comment line, anything with // is ignored at process time.
|
||||||
= WSJT-X User Guide
|
= _WSJT-X_ User Guide
|
||||||
Joseph H Taylor, Jr, K1JT
|
Joseph H Taylor, Jr, K1JT
|
||||||
:revnumber: {VERSION}
|
:revnumber: {VERSION}
|
||||||
// For web-pages, adding :badges: is ok, but is a security issue for
|
// For web-pages, adding :badges: is ok, but is a security issue for
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Auto-Sequencing algorithm for DXpedition station:
|
Auto-Sequencing algorithm for DXpedition station:
|
||||||
|
|
||||||
Start:
|
Start:
|
||||||
CQMsg = "CQ VK9MA" (or "CQ UP VK9MA", "CQ 116 VK9MA", etc.)
|
CQMsg = "CQ KH1DX" (or "CQ UP KH1DX", "CQ 116 KH1DX", etc.)
|
||||||
TxMsg = CQMsg
|
TxMsg = CQMsg
|
||||||
Ntry = 0
|
Ntry = 0
|
||||||
QCALL = "" # Callsign of current QSO partner
|
QCALL = "" # Callsign of current QSO partner
|
||||||
@ -16,7 +16,7 @@ Receive:
|
|||||||
N = number of decodes # RxMsg[i], i=1,N
|
N = number of decodes # RxMsg[i], i=1,N
|
||||||
if(N == 0)
|
if(N == 0)
|
||||||
go to Transmit
|
go to Transmit
|
||||||
J = index of a reply from current QCALL # RxMsg[J] = "VK9MA QCALL R<rpt>"
|
J = index of a reply from current QCALL # RxMsg[J] = "KH1DX QCALL R<rpt>"
|
||||||
|
|
||||||
if(QCALL == "") # No QSO in progress
|
if(QCALL == "") # No QSO in progress
|
||||||
Select new QCALL # Op chooses a caller
|
Select new QCALL # Op chooses a caller
|
||||||
@ -48,7 +48,7 @@ Receive:
|
|||||||
Auto-Sequencing algorithm for those calling the DXpedition:
|
Auto-Sequencing algorithm for those calling the DXpedition:
|
||||||
|
|
||||||
Start:
|
Start:
|
||||||
TxMsg = "VK9MA MyCall"
|
TxMsg = "KH1DX MyCall"
|
||||||
InQSO = false
|
InQSO = false
|
||||||
|
|
||||||
Transmit:
|
Transmit:
|
||||||
@ -59,13 +59,13 @@ Receive:
|
|||||||
RX # (... takes ~14 s)
|
RX # (... takes ~14 s)
|
||||||
if(RxMsg[i] contains "MyCall <rpt>")
|
if(RxMsg[i] contains "MyCall <rpt>")
|
||||||
InQSO = true
|
InQSO = true
|
||||||
TxMsg = "VK9MA MyCall R<rpt>"
|
TxMsg = "KH1DX MyCall R<rpt>"
|
||||||
go to Transmit
|
go to Transmit
|
||||||
|
|
||||||
if(RxMsg[i] contains "<rpt>")
|
if(RxMsg[i] contains "<rpt>")
|
||||||
TxEnable = false
|
TxEnable = false
|
||||||
go to Receive
|
go to Receive
|
||||||
|
|
||||||
if(RxMsg[i] contains "CQ VK9MA")
|
if(RxMsg[i] contains "CQ KH1DX")
|
||||||
TxEnable = true
|
TxEnable = true
|
||||||
go to Transmit
|
go to Transmit
|
||||||
|
@ -60,7 +60,8 @@ program allsim
|
|||||||
call gen4(message,0,msgsent,itone,itype)
|
call gen4(message,0,msgsent,itone,itype)
|
||||||
call addit(itone,11025,206,2520,1200,sig,dat) !JT4
|
call addit(itone,11025,206,2520,1200,sig,dat) !JT4
|
||||||
|
|
||||||
call genft8(message,mygrid,bcontest,msgsent,msgbits,itone)
|
i3bit=0 ! ### TEMPORARY ??? ###
|
||||||
|
call genft8(message,mygrid,bcontest,i3bit,msgsent,msgbits,itone)
|
||||||
call addit(itone,12000,79,1920,1400,sig,dat) !FT8
|
call addit(itone,12000,79,1920,1400,sig,dat) !FT8
|
||||||
|
|
||||||
call genqra64(message,0,msgsent,itone,itype)
|
call genqra64(message,0,msgsent,itone,itype)
|
||||||
|
96
lib/calibrate.f90
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
subroutine calibrate(data_dir,iz,a,b,rms,sigmaa,sigmab,irc)
|
||||||
|
|
||||||
|
! Average groups of frequency-calibration measurements, then fit a
|
||||||
|
! straight line for slope and intercept.
|
||||||
|
|
||||||
|
parameter (NZ=1000)
|
||||||
|
implicit real*8 (a-h,o-z)
|
||||||
|
character*(*) data_dir
|
||||||
|
character*256 infile,outfile
|
||||||
|
character*8 cutc,cutc1
|
||||||
|
character*1 c1
|
||||||
|
real*8 fd(NZ),deltaf(NZ),r(NZ),rmsd(NZ)
|
||||||
|
integer nn(NZ)
|
||||||
|
|
||||||
|
infile=trim(data_dir)//'fmt.all'
|
||||||
|
outfile=trim(data_dir)//'fcal2.out'
|
||||||
|
|
||||||
|
open(10,file=trim(infile),status='old',err=996)
|
||||||
|
open(12,file=trim(outfile),status='unknown',err=997)
|
||||||
|
|
||||||
|
nkhz0=0
|
||||||
|
sum=0.d0
|
||||||
|
sumsq=0.d0
|
||||||
|
n=0
|
||||||
|
j=0
|
||||||
|
do i=1,99999
|
||||||
|
read(10,*,end=10,err=995) cutc,nkHz,ncal,noffset,faudio,df,dblevel,snr
|
||||||
|
if((nkHz.ne.nkHz0) .and. i.ne.1) then
|
||||||
|
ave=sum/n
|
||||||
|
rms=0.d0
|
||||||
|
if(n.gt.1) then
|
||||||
|
rms=sqrt(abs(sumsq - sum*sum/n)/(n-1.d0))
|
||||||
|
endif
|
||||||
|
fMHz=0.001d0*nkHz0
|
||||||
|
j=j+1
|
||||||
|
fd(j)=fMHz
|
||||||
|
deltaf(j)=ave
|
||||||
|
r(j)=0.d0
|
||||||
|
rmsd(j)=rms
|
||||||
|
nn(j)=n
|
||||||
|
sum=0.d0
|
||||||
|
sumsq=0.d0
|
||||||
|
n=0
|
||||||
|
endif
|
||||||
|
dial_error=faudio-noffset
|
||||||
|
sum=sum + dial_error
|
||||||
|
sumsq=sumsq + dial_error**2
|
||||||
|
n=n+1
|
||||||
|
if(n.eq.1) then
|
||||||
|
cutc1=cutc
|
||||||
|
ncal0=ncal
|
||||||
|
endif
|
||||||
|
nkHz0=nkHz
|
||||||
|
enddo
|
||||||
|
|
||||||
|
10 ave=sum/n
|
||||||
|
rms=0.d0
|
||||||
|
if(n.gt.0) then
|
||||||
|
rms=sqrt((sumsq - sum*sum/n)/(n-1.d0))
|
||||||
|
endif
|
||||||
|
fMHz=0.001d0*nkHz
|
||||||
|
j=j+1
|
||||||
|
fd(j)=fMHz
|
||||||
|
deltaf(j)=ave
|
||||||
|
r(j)=0.d0
|
||||||
|
rmsd(j)=rms
|
||||||
|
nn(j)=n
|
||||||
|
iz=j
|
||||||
|
if(iz.lt.2) go to 998
|
||||||
|
|
||||||
|
call fitcal(fd,deltaf,r,iz,a,b,sigmaa,sigmab,rms)
|
||||||
|
|
||||||
|
write(12,1002)
|
||||||
|
1002 format(' Freq DF Meas Freq N rms Resid'/ &
|
||||||
|
' (MHz) (Hz) (MHz) (Hz) (Hz)'/ &
|
||||||
|
'----------------------------------------------------')
|
||||||
|
irc=0
|
||||||
|
do i=1,iz
|
||||||
|
fm=fd(i) + 1.d-6*deltaf(i)
|
||||||
|
c1=' '
|
||||||
|
if(rmsd(i).gt.1.0d0) c1='*'
|
||||||
|
write(12,1012) fd(i),deltaf(i),fm,nn(i),rmsd(i),r(i),c1
|
||||||
|
1012 format(f8.3,f9.3,f14.9,i4,f7.2,f9.3,1x,a1)
|
||||||
|
enddo
|
||||||
|
go to 999
|
||||||
|
|
||||||
|
995 irc=-4; iz=i; go to 999
|
||||||
|
996 irc=-1; go to 999
|
||||||
|
997 irc=-2; go to 999
|
||||||
|
998 irc=-3
|
||||||
|
999 continue
|
||||||
|
close(10)
|
||||||
|
close(12)
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine calibrate
|
34
lib/fitcal.f90
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
subroutine fitcal(x,y,r,iz,a,b,sigmaa,sigmab,rms)
|
||||||
|
implicit real*8 (a-h,o-z)
|
||||||
|
real*8 x(iz),y(iz),r(iz)
|
||||||
|
|
||||||
|
sx=0.d0
|
||||||
|
sy=0.d0
|
||||||
|
sxy=0.d0
|
||||||
|
sx2=0.d0
|
||||||
|
do i=1,iz
|
||||||
|
sx=sx + x(i)
|
||||||
|
sy=sy + y(i)
|
||||||
|
sxy=sxy + x(i)*y(i)
|
||||||
|
sx2=sx2 + x(i)*x(i)
|
||||||
|
enddo
|
||||||
|
delta=iz*sx2 - sx*sx
|
||||||
|
a=(sx2*sy - sx*sxy)/delta
|
||||||
|
b=(iz*sxy - sx*sy)/delta
|
||||||
|
|
||||||
|
sq=0.d0
|
||||||
|
do i=1,iz
|
||||||
|
r(i)=y(i) - (a + b*x(i))
|
||||||
|
sq=sq + r(i)**2
|
||||||
|
enddo
|
||||||
|
rms=0.
|
||||||
|
sigmaa=0.
|
||||||
|
sigmab=0.
|
||||||
|
if(iz.ge.3) then
|
||||||
|
rms=sqrt(sq/(iz-2))
|
||||||
|
sigmaa=sqrt(rms*rms*sx2/delta)
|
||||||
|
sigmab=sqrt(iz*rms*rms/delta)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine fitcal
|
@ -27,7 +27,6 @@ program fmeasure
|
|||||||
|
|
||||||
parameter(NZ=1000)
|
parameter(NZ=1000)
|
||||||
implicit real*8 (a-h,o-z)
|
implicit real*8 (a-h,o-z)
|
||||||
real*8 fd(NZ),deltaf(NZ),r(NZ)
|
|
||||||
character infile*50
|
character infile*50
|
||||||
character line*80
|
character line*80
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ subroutine ft8apset(mycall12,mygrid6,hiscall12,hisgrid6,bcontest,apsym,iaptype)
|
|||||||
! if(len_trim(hisgrid).eq.0) hisgrid="EN50"
|
! if(len_trim(hisgrid).eq.0) hisgrid="EN50"
|
||||||
if(index(hisgrid," ").eq.0) hisgrid="EN50"
|
if(index(hisgrid," ").eq.0) hisgrid="EN50"
|
||||||
msg=mycall//' '//hiscall//' '//hisgrid
|
msg=mycall//' '//hiscall//' '//hisgrid
|
||||||
call genft8(msg,mygrid6,bcontest,msgsent,msgbits,itone)
|
i3bit=0 ! ### TEMPORARY ??? ###
|
||||||
|
call genft8(msg,mygrid6,bcontest,i3bit,msgsent,msgbits,itone)
|
||||||
apsym=2*msgbits-1
|
apsym=2*msgbits-1
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -10,16 +10,17 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
character*6 mygrid6
|
character*6 mygrid6
|
||||||
logical bcontest
|
logical bcontest
|
||||||
real a(5)
|
real a(5)
|
||||||
real s1(0:7,ND),s2(0:7,NN)
|
real s1(0:7,ND),s2(0:7,NN),s1sort(8*ND)
|
||||||
real ps(0:7)
|
real ps(0:7),psl(0:7)
|
||||||
real bmeta(3*ND),bmetap(3*ND)
|
real bmeta(3*ND),bmetb(3*ND),bmetap(3*ND)
|
||||||
real llr(3*ND),llra(3*ND),llr0(3*ND),llrap(3*ND) !Soft symbols
|
real llr(3*ND),llra(3*ND),llr0(3*ND),llr1(3*ND),llrap(3*ND) !Soft symbols
|
||||||
real dd0(15*12000)
|
real dd0(15*12000)
|
||||||
integer*1 decoded(KK),apmask(3*ND),cw(3*ND)
|
integer*1 decoded(KK),apmask(3*ND),cw(3*ND)
|
||||||
integer*1 msgbits(KK)
|
integer*1 msgbits(KK)
|
||||||
integer apsym(KK)
|
integer apsym(KK)
|
||||||
integer mcq(28),mde(28),mrrr(16),m73(16),mrr73(16)
|
integer mcq(28),mde(28),mrrr(16),m73(16),mrr73(16)
|
||||||
integer itone(NN)
|
integer itone(NN)
|
||||||
|
integer indxs1(8*ND)
|
||||||
integer icos7(0:6),ip(1)
|
integer icos7(0:6),ip(1)
|
||||||
integer nappasses(0:5) ! the number of decoding passes to use for each QSO state
|
integer nappasses(0:5) ! the number of decoding passes to use for each QSO state
|
||||||
integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now
|
integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now
|
||||||
@ -27,6 +28,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
complex ctwk(32)
|
complex ctwk(32)
|
||||||
complex csymb(32)
|
complex csymb(32)
|
||||||
logical first,newdat,lsubtract,lapon,nagain
|
logical first,newdat,lsubtract,lapon,nagain
|
||||||
|
equivalence (s1,s1sort)
|
||||||
data icos7/2,5,6,0,4,1,3/
|
data icos7/2,5,6,0,4,1,3/
|
||||||
data mcq/1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,0,1/
|
data mcq/1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,0,1/
|
||||||
data mrrr/0,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1/
|
data mrrr/0,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1/
|
||||||
@ -153,10 +155,15 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
s1(0:7,j)=s2(0:7,k)
|
s1(0:7,j)=s2(0:7,k)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
call indexx(s1sort,8*ND,indxs1)
|
||||||
|
xmeds1=s1sort(indxs1(nint(0.5*8*ND)))
|
||||||
|
s1=s1/xmeds1
|
||||||
|
|
||||||
do j=1,ND
|
do j=1,ND
|
||||||
i4=3*j-2
|
i4=3*j-2
|
||||||
i2=3*j-1
|
i2=3*j-1
|
||||||
i1=3*j
|
i1=3*j
|
||||||
|
! Max amplitude
|
||||||
ps=s1(0:7,j)
|
ps=s1(0:7,j)
|
||||||
r1=max(ps(1),ps(3),ps(5),ps(7))-max(ps(0),ps(2),ps(4),ps(6))
|
r1=max(ps(1),ps(3),ps(5),ps(7))-max(ps(0),ps(2),ps(4),ps(6))
|
||||||
r2=max(ps(2),ps(3),ps(6),ps(7))-max(ps(0),ps(1),ps(4),ps(5))
|
r2=max(ps(2),ps(3),ps(6),ps(7))-max(ps(0),ps(1),ps(4),ps(5))
|
||||||
@ -167,6 +174,35 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
bmetap(i4)=r4
|
bmetap(i4)=r4
|
||||||
bmetap(i2)=r2
|
bmetap(i2)=r2
|
||||||
bmetap(i1)=r1
|
bmetap(i1)=r1
|
||||||
|
! Max log metric
|
||||||
|
psl=log(ps)
|
||||||
|
r1=max(psl(1),psl(3),psl(5),psl(7))-max(psl(0),psl(2),psl(4),psl(6))
|
||||||
|
r2=max(psl(2),psl(3),psl(6),psl(7))-max(psl(0),psl(1),psl(4),psl(5))
|
||||||
|
r4=max(psl(4),psl(5),psl(6),psl(7))-max(psl(0),psl(1),psl(2),psl(3))
|
||||||
|
bmetb(i4)=r4
|
||||||
|
bmetb(i2)=r2
|
||||||
|
bmetb(i1)=r1
|
||||||
|
|
||||||
|
! Metric for Cauchy noise
|
||||||
|
! r1=log(ps(1)**3+ps(3)**3+ps(5)**3+ps(7)**3)- &
|
||||||
|
! log(ps(0)**3+ps(2)**3+ps(4)**3+ps(6)**3)
|
||||||
|
! r2=log(ps(2)**3+ps(3)**3+ps(6)**3+ps(7)**3)- &
|
||||||
|
! log(ps(0)**3+ps(1)**3+ps(4)**3+ps(5)**3)
|
||||||
|
! r4=log(ps(4)**3+ps(5)**3+ps(6)**3+ps(7)**3)- &
|
||||||
|
! log(ps(0)**3+ps(1)**3+ps(2)**3+ps(3)**3)
|
||||||
|
! Metric for AWGN, no fading
|
||||||
|
! bscale=2.5
|
||||||
|
! b0=bessi0(bscale*ps(0))
|
||||||
|
! b1=bessi0(bscale*ps(1))
|
||||||
|
! b2=bessi0(bscale*ps(2))
|
||||||
|
! b3=bessi0(bscale*ps(3))
|
||||||
|
! b4=bessi0(bscale*ps(4))
|
||||||
|
! b5=bessi0(bscale*ps(5))
|
||||||
|
! b6=bessi0(bscale*ps(6))
|
||||||
|
! b7=bessi0(bscale*ps(7))
|
||||||
|
! r1=log(b1+b3+b5+b7)-log(b0+b2+b4+b6)
|
||||||
|
! r2=log(b2+b3+b6+b7)-log(b0+b1+b4+b5)
|
||||||
|
! r4=log(b4+b5+b6+b7)-log(b0+b1+b2+b3)
|
||||||
|
|
||||||
if(nQSOProgress .eq. 0 .or. nQSOProgress .eq. 5) then
|
if(nQSOProgress .eq. 0 .or. nQSOProgress .eq. 5) then
|
||||||
! When bits 88:115 are set as ap bits, bit 115 lives in symbol 39 along
|
! When bits 88:115 are set as ap bits, bit 115 lives in symbol 39 along
|
||||||
@ -209,12 +245,14 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
enddo
|
enddo
|
||||||
|
|
||||||
call normalizebmet(bmeta,3*ND)
|
call normalizebmet(bmeta,3*ND)
|
||||||
|
call normalizebmet(bmetb,3*ND)
|
||||||
call normalizebmet(bmetap,3*ND)
|
call normalizebmet(bmetap,3*ND)
|
||||||
|
|
||||||
ss=0.84
|
scalefac=2.83
|
||||||
llr0=2.0*bmeta/(ss*ss)
|
llr0=scalefac*bmeta
|
||||||
llra=2.0*bmetap/(ss*ss) ! llr's for use with ap
|
llr1=scalefac*bmetb
|
||||||
apmag=4.0
|
llra=scalefac*bmetap ! llr's for use with ap
|
||||||
|
apmag=scalefac*(maxval(abs(bmetap))*1.01)
|
||||||
|
|
||||||
! pass #
|
! pass #
|
||||||
!------------------------------
|
!------------------------------
|
||||||
@ -227,35 +265,36 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
! 7 ap pass 4, etc.
|
! 7 ap pass 4, etc.
|
||||||
|
|
||||||
if(lapon) then
|
if(lapon) then
|
||||||
npasses=3+nappasses(nQSOProgress)
|
npasses=4+nappasses(nQSOProgress)
|
||||||
else
|
else
|
||||||
npasses=3
|
npasses=4
|
||||||
endif
|
endif
|
||||||
|
|
||||||
do ipass=1,npasses
|
do ipass=1,npasses
|
||||||
|
|
||||||
llr=llr0
|
llr=llr0
|
||||||
if(ipass.eq.2) llr(1:24)=0.
|
if(ipass.eq.2) llr=llr1
|
||||||
if(ipass.eq.3) llr(1:48)=0.
|
if(ipass.eq.3) llr(1:24)=0.
|
||||||
if(ipass.le.3) then
|
if(ipass.eq.4) llr(1:48)=0.
|
||||||
|
if(ipass.le.4) then
|
||||||
apmask=0
|
apmask=0
|
||||||
llrap=llr
|
llrap=llr
|
||||||
iaptype=0
|
iaptype=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if(ipass .gt. 3) then
|
if(ipass .gt. 4) then
|
||||||
iaptype=naptypes(nQSOProgress,ipass-3)
|
iaptype=naptypes(nQSOProgress,ipass-4)
|
||||||
if(iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid .and. abs(f1-nftx).gt.napwid) ) cycle
|
if(iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid .and. abs(f1-nftx).gt.napwid) ) cycle
|
||||||
if(iaptype.eq.1 .or. iaptype.eq.2 ) then ! AP,???,???
|
if(iaptype.eq.1 .or. iaptype.eq.2 ) then ! AP,???,???
|
||||||
apmask=0
|
apmask=0
|
||||||
apmask(88:115)=1 ! first 28 bits are AP
|
apmask(88:115)=1 ! first 28 bits are AP
|
||||||
apmask(144)=1 ! not free text
|
apmask(144)=1 ! not free text
|
||||||
llrap=llr
|
llrap=llr
|
||||||
if(iaptype.eq.1) llrap(88:115)=apmag*mcq/ss
|
if(iaptype.eq.1) llrap(88:115)=apmag*mcq
|
||||||
if(iaptype.eq.2) llrap(88:115)=apmag*apsym(1:28)/ss
|
if(iaptype.eq.2) llrap(88:115)=apmag*apsym(1:28)
|
||||||
llrap(116:117)=llra(116:117)
|
llrap(116:117)=llra(116:117)
|
||||||
llrap(142:143)=llra(142:143)
|
llrap(142:143)=llra(142:143)
|
||||||
llrap(144)=-apmag/ss
|
llrap(144)=-apmag
|
||||||
endif
|
endif
|
||||||
if(iaptype.eq.3) then ! mycall, dxcall, ???
|
if(iaptype.eq.3) then ! mycall, dxcall, ???
|
||||||
apmask=0
|
apmask=0
|
||||||
@ -263,8 +302,8 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
apmask(116:143)=1 ! hiscall
|
apmask(116:143)=1 ! hiscall
|
||||||
apmask(144)=1 ! not free text
|
apmask(144)=1 ! not free text
|
||||||
llrap=llr
|
llrap=llr
|
||||||
llrap(88:143)=apmag*apsym(1:56)/ss
|
llrap(88:143)=apmag*apsym(1:56)
|
||||||
llrap(144)=-apmag/ss
|
llrap(144)=-apmag
|
||||||
endif
|
endif
|
||||||
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then
|
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then
|
||||||
apmask=0
|
apmask=0
|
||||||
@ -272,10 +311,10 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
apmask(116:143)=1 ! hiscall
|
apmask(116:143)=1 ! hiscall
|
||||||
apmask(144:159)=1 ! RRR or 73 or RR73
|
apmask(144:159)=1 ! RRR or 73 or RR73
|
||||||
llrap=llr
|
llrap=llr
|
||||||
llrap(88:143)=apmag*apsym(1:56)/ss
|
llrap(88:143)=apmag*apsym(1:56)
|
||||||
if(iaptype.eq.4) llrap(144:159)=apmag*mrrr/ss
|
if(iaptype.eq.4) llrap(144:159)=apmag*mrrr
|
||||||
if(iaptype.eq.5) llrap(144:159)=apmag*m73/ss
|
if(iaptype.eq.5) llrap(144:159)=apmag*m73
|
||||||
if(iaptype.eq.6) llrap(144:159)=apmag*mrr73/ss
|
if(iaptype.eq.6) llrap(144:159)=apmag*mrr73
|
||||||
endif
|
endif
|
||||||
if(iaptype.eq.7) then ! ???, dxcall, ???
|
if(iaptype.eq.7) then ! ???, dxcall, ???
|
||||||
apmask=0
|
apmask=0
|
||||||
@ -283,8 +322,8 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
apmask(144)=1 ! not free text
|
apmask(144)=1 ! not free text
|
||||||
llrap=llr
|
llrap=llr
|
||||||
llrap(115)=llra(115)
|
llrap(115)=llra(115)
|
||||||
llrap(116:143)=apmag*apsym(29:56)/ss
|
llrap(116:143)=apmag*apsym(29:56)
|
||||||
llrap(144)=-apmag/ss
|
llrap(144)=-apmag
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -297,7 +336,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
if(ndepth.eq.3 .and. nharderrors.lt.0) then
|
if(ndepth.eq.3 .and. nharderrors.lt.0) then
|
||||||
ndeep=3
|
ndeep=3
|
||||||
if(abs(nfqso-f1).le.napwid .or. abs(nftx-f1).le.napwid) then
|
if(abs(nfqso-f1).le.napwid .or. abs(nftx-f1).le.napwid) then
|
||||||
if((ipass.eq.2 .or. ipass.eq.3) .and. .not.nagain) then
|
if((ipass.eq.3 .or. ipass.eq.4) .and. .not.nagain) then
|
||||||
ndeep=3
|
ndeep=3
|
||||||
else
|
else
|
||||||
ndeep=4
|
ndeep=4
|
||||||
@ -312,20 +351,28 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,napwid, &
|
|||||||
message=' '
|
message=' '
|
||||||
xsnr=-99.0
|
xsnr=-99.0
|
||||||
if(count(cw.eq.0).eq.174) cycle !Reject the all-zero codeword
|
if(count(cw.eq.0).eq.174) cycle !Reject the all-zero codeword
|
||||||
if(any(decoded(73:75).ne.0)) cycle !Reject if any of the 3 extra bits are nonzero
|
!### if(any(decoded(73:75).ne.0)) cycle !Reject if any of the 3 extra bits is nonzero
|
||||||
if(nharderrors.ge.0 .and. nharderrors+dmin.lt.60.0 .and. &
|
if(nharderrors.ge.0 .and. nharderrors+dmin.lt.60.0 .and. &
|
||||||
.not.(sync.lt.2.0 .and. nharderrors.gt.35) .and. &
|
.not.(sync.lt.2.0 .and. nharderrors.gt.35) .and. &
|
||||||
.not.(ipass.gt.1 .and. nharderrors.gt.39) .and. &
|
.not.(ipass.gt.2 .and. nharderrors.gt.39) .and. &
|
||||||
.not.(ipass.eq.3 .and. nharderrors.gt.30) &
|
.not.(ipass.eq.4 .and. nharderrors.gt.30) &
|
||||||
) then
|
) then
|
||||||
call chkcrc12a(decoded,nbadcrc)
|
call chkcrc12a(decoded,nbadcrc)
|
||||||
else
|
else
|
||||||
nharderrors=-1
|
nharderrors=-1
|
||||||
cycle
|
cycle
|
||||||
endif
|
endif
|
||||||
|
!###
|
||||||
|
i3bit=4*decoded(73) + 2*decoded(74) + decoded(75)
|
||||||
|
iFreeText=decoded(57)
|
||||||
|
! if(nbadcrc.eq.0) write(*,3001) nharderrors,nbadcrc,i3bit
|
||||||
|
!3001 format('A',3i5)
|
||||||
|
!###
|
||||||
if(nbadcrc.eq.0) then
|
if(nbadcrc.eq.0) then
|
||||||
call extractmessage174(decoded,message,ncrcflag,recent_calls,nrecent)
|
call extractmessage174(decoded,message,ncrcflag,recent_calls,nrecent)
|
||||||
call genft8(message,mygrid6,bcontest,msgsent,msgbits,itone)
|
call genft8(message,mygrid6,bcontest,i3bit,msgsent,msgbits,itone)
|
||||||
|
if(i3bit.eq.1 .and. iFreeText.eq.0) message(21:21)='1'
|
||||||
|
if(i3bit.eq.2 .and. iFreeText.eq.0) message(21:21)='2'
|
||||||
if(lsubtract) call subtractft8(dd0,itone,f1,xdt2)
|
if(lsubtract) call subtractft8(dd0,itone,f1,xdt2)
|
||||||
xsig=0.0
|
xsig=0.0
|
||||||
xnoi=0.0
|
xnoi=0.0
|
||||||
@ -363,3 +410,28 @@ subroutine normalizebmet(bmet,n)
|
|||||||
bmet=bmet/bmetsig
|
bmet=bmet/bmetsig
|
||||||
return
|
return
|
||||||
end subroutine normalizebmet
|
end subroutine normalizebmet
|
||||||
|
|
||||||
|
|
||||||
|
function bessi0(x)
|
||||||
|
! From Numerical Recipes
|
||||||
|
real bessi0,x
|
||||||
|
double precision p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,q8,q9,y
|
||||||
|
save p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,q8,q9
|
||||||
|
data p1,p2,p3,p4,p5,p6,p7/1.0d0,3.5156229d0,3.0899424d0,1.2067492d0, &
|
||||||
|
0.2659732d0,0.360768d-1,0.45813d-2/
|
||||||
|
data q1,q2,q3,q4,q5,q6,q7,q8,q9/0.39894228d0,0.1328592d-1, &
|
||||||
|
0.225319d-2,-0.157565d-2,0.916281d-2,-0.2057706d-1, &
|
||||||
|
0.2635537d-1,-0.1647633d-1,0.392377d-2/
|
||||||
|
|
||||||
|
if (abs(x).lt.3.75) then
|
||||||
|
y=(x/3.75)**2
|
||||||
|
bessi0=p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7)))))
|
||||||
|
else
|
||||||
|
ax=abs(x)
|
||||||
|
y=3.75/ax
|
||||||
|
bessi0=(exp(ax)/sqrt(ax))*(q1+y*(q2+y*(q3+y*(q4 &
|
||||||
|
+y*(q5+y*(q6+y*(q7+y*(q8+y*q9))))))))
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
end function bessi0
|
||||||
|
|
||||||
|
@ -65,9 +65,10 @@ program ft8sim
|
|||||||
sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb)
|
sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb)
|
||||||
if(snrdb.gt.90.0) sig=1.0
|
if(snrdb.gt.90.0) sig=1.0
|
||||||
txt=NN*NSPS/12000.0
|
txt=NN*NSPS/12000.0
|
||||||
|
i3bit=0 ! ### TEMPORARY ??? ###
|
||||||
|
|
||||||
! Source-encode, then get itone()
|
! Source-encode, then get itone()
|
||||||
call genft8(msg,mygrid6,bcontest,msgsent,msgbits,itone)
|
call genft8(msg,mygrid6,bcontest,i3bit,msgsent,msgbits,itone)
|
||||||
write(*,1000) f0,xdt,txt,snrdb,bw,msgsent
|
write(*,1000) f0,xdt,txt,snrdb,bw,msgsent
|
||||||
1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1, &
|
1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1, &
|
||||||
' BW:',f4.1,2x,a22)
|
' BW:',f4.1,2x,a22)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine genft8(msg,mygrid,bcontest,msgsent,msgbits,itone)
|
subroutine genft8(msg,mygrid,bcontest,i3bit,msgsent,msgbits,itone)
|
||||||
|
|
||||||
! Encode an FT8 message, producing array itone().
|
! Encode an FT8 message, producing array itone().
|
||||||
|
|
||||||
@ -19,7 +19,6 @@ subroutine genft8(msg,mygrid,bcontest,msgsent,msgbits,itone)
|
|||||||
call packmsg(msg,i4Msg6BitWords,itype,bcontest) !Pack into 12 6-bit bytes
|
call packmsg(msg,i4Msg6BitWords,itype,bcontest) !Pack into 12 6-bit bytes
|
||||||
call unpackmsg(i4Msg6BitWords,msgsent,bcontest,mygrid) !Unpack to get msgsent
|
call unpackmsg(i4Msg6BitWords,msgsent,bcontest,mygrid) !Unpack to get msgsent
|
||||||
|
|
||||||
i3bit=0 !### temporary ###
|
|
||||||
write(cbits,1000) i4Msg6BitWords,32*i3bit
|
write(cbits,1000) i4Msg6BitWords,32*i3bit
|
||||||
1000 format(12b6.6,b8.8)
|
1000 format(12b6.6,b8.8)
|
||||||
read(cbits,1001) i1Msg8BitBytes(1:10)
|
read(cbits,1001) i1Msg8BitBytes(1:10)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
||||||
|
|
||||||
include 'ft8_params.f90'
|
include 'ft8_params.f90'
|
||||||
! Search over +/- 1.5s relative to 0.5s TX start time.
|
! Search over +/- 2.5s relative to 0.5s TX start time.
|
||||||
parameter (JZ=38)
|
parameter (JZ=62)
|
||||||
complex cx(0:NH1)
|
complex cx(0:NH1)
|
||||||
real s(NH1,NHSYM)
|
real s(NH1,NHSYM)
|
||||||
real savg(NH1)
|
real savg(NH1)
|
||||||
@ -138,7 +138,8 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
|||||||
! do i=ncand,1,-1
|
! do i=ncand,1,-1
|
||||||
do i=1,ncand
|
do i=1,ncand
|
||||||
j=indx(i)
|
j=indx(i)
|
||||||
if( candidate0(3,j) .ge. syncmin .and. candidate0(2,j).ge.-1.5 ) then
|
! if( candidate0(3,j) .ge. syncmin .and. candidate0(2,j).ge.-1.5 ) then
|
||||||
|
if( candidate0(3,j) .ge. syncmin ) then
|
||||||
candidate(1,k)=abs(candidate0(1,j))
|
candidate(1,k)=abs(candidate0(1,j))
|
||||||
candidate(2,k)=candidate0(2,j)
|
candidate(2,k)=candidate0(2,j)
|
||||||
candidate(3,k)=candidate0(3,j)
|
candidate(3,k)=candidate0(3,j)
|
||||||
|
@ -161,8 +161,6 @@ program jt9
|
|||||||
! Import FFTW wisdom, if available
|
! Import FFTW wisdom, if available
|
||||||
wisfile=trim(data_dir)//'/jt9_wisdom.dat'// C_NULL_CHAR
|
wisfile=trim(data_dir)//'/jt9_wisdom.dat'// C_NULL_CHAR
|
||||||
iret=fftwf_import_wisdom_from_filename(wisfile)
|
iret=fftwf_import_wisdom_from_filename(wisfile)
|
||||||
open(19,file=trim(data_dir)//'/false_decodes.txt',status='unknown', &
|
|
||||||
position='append')
|
|
||||||
|
|
||||||
ntry65a=0
|
ntry65a=0
|
||||||
ntry65b=0
|
ntry65b=0
|
||||||
|
@ -66,7 +66,7 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
|
|||||||
currently_training=.false.
|
currently_training=.false.
|
||||||
training_dxcall(1:12)=' '
|
training_dxcall(1:12)=' '
|
||||||
trained_dxcall(1:12)=' '
|
trained_dxcall(1:12)=' '
|
||||||
write(*,*) 'reset to untrained state '
|
!write(*,*) 'reset to untrained state '
|
||||||
endif
|
endif
|
||||||
|
|
||||||
indx_dxcall=index(msg,trim(dxcall))
|
indx_dxcall=index(msg,trim(dxcall))
|
||||||
@ -76,7 +76,7 @@ write(*,*) 'reset to untrained state '
|
|||||||
currently_training=.true.
|
currently_training=.true.
|
||||||
training_dxcall=trim(dxcall)
|
training_dxcall=trim(dxcall)
|
||||||
trained_dxcall(1:12)=' '
|
trained_dxcall(1:12)=' '
|
||||||
write(*,*) 'start training on call ',training_dxcall
|
!write(*,*) 'start training on call ',training_dxcall
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if( msg_has_dxcall .and. currently_training ) then
|
if( msg_has_dxcall .and. currently_training ) then
|
||||||
@ -188,7 +188,7 @@ write(*,*) 'start training on call ',training_dxcall
|
|||||||
call polyfit(x,y,sigmay,npts,nterms,mode,a,chisqr)
|
call polyfit(x,y,sigmay,npts,nterms,mode,a,chisqr)
|
||||||
pp=a(1)+x*(a(2)+x*(a(3)+x*(a(4)+x*a(5))))
|
pp=a(1)+x*(a(2)+x*(a(3)+x*(a(4)+x*a(5))))
|
||||||
rmsdiff=sum( (pp-phase((864/2-nm/2):(864/2+nm/2)))**2 )/145.0
|
rmsdiff=sum( (pp-phase((864/2-nm/2):(864/2+nm/2)))**2 )/145.0
|
||||||
write(*,*) 'training ',navg,sqrt(chisqr),rmsdiff
|
!write(*,*) 'training ',navg,sqrt(chisqr),rmsdiff
|
||||||
if( (sqrt(chisqr).lt.1.8) .and. (rmsdiff.lt.0.5) .and. (navg.ge.5) ) then
|
if( (sqrt(chisqr).lt.1.8) .and. (rmsdiff.lt.0.5) .and. (navg.ge.5) ) then
|
||||||
trained_dxcall=dxcall
|
trained_dxcall=dxcall
|
||||||
call date_and_time(date,time,zone,values)
|
call date_and_time(date,time,zone,values)
|
||||||
@ -198,7 +198,7 @@ write(*,*) 'training ',navg,sqrt(chisqr),rmsdiff
|
|||||||
l1=index(datadir,char(0))-1
|
l1=index(datadir,char(0))-1
|
||||||
datadir(l1+1:l1+1)="/"
|
datadir(l1+1:l1+1)="/"
|
||||||
pcoeff_filename=datadir(1:l1+1)//trim(pcoeff_filename)
|
pcoeff_filename=datadir(1:l1+1)//trim(pcoeff_filename)
|
||||||
write(*,*) 'trained - writing coefficients to: ',pcoeff_filename
|
!write(*,*) 'trained - writing coefficients to: ',pcoeff_filename
|
||||||
open(17,file=pcoeff_filename,status='new')
|
open(17,file=pcoeff_filename,status='new')
|
||||||
write(17,'(i4,2f10.2,3i5,5e25.16)') navg,sqrt(chisqr),rmsdiff,NFREQLOW,NFREQHIGH,nterms,a
|
write(17,'(i4,2f10.2,3i5,5e25.16)') navg,sqrt(chisqr),rmsdiff,NFREQLOW,NFREQHIGH,nterms,a
|
||||||
do i=1, 145
|
do i=1, 145
|
||||||
|
@ -506,8 +506,8 @@ subroutine packbits(dbits,nsymd,m0,sym)
|
|||||||
20 continue
|
20 continue
|
||||||
if(itype.ne.6) itype=max(nv2a,nv2b)
|
if(itype.ne.6) itype=max(nv2a,nv2b)
|
||||||
jt_itype=itype
|
jt_itype=itype
|
||||||
jt_c1=c1
|
jt_c1=c1(1:6)
|
||||||
jt_c2=c2
|
jt_c2=c2(1:6)
|
||||||
jt_c3=c3
|
jt_c3=c3
|
||||||
jt_k1=k1
|
jt_k1=k1
|
||||||
jt_k2=k2
|
jt_k2=k2
|
||||||
|
@ -1,16 +1,21 @@
|
|||||||
function stdmsg(msg0,bcontest,mygrid)
|
function stdmsg(msg0,bcontest,mygrid)
|
||||||
|
|
||||||
|
! Is msg0 a standard "JT-style" message?
|
||||||
|
|
||||||
use iso_c_binding, only: c_bool
|
use iso_c_binding, only: c_bool
|
||||||
use packjt
|
use packjt
|
||||||
character*22 msg0,msg
|
character*22 msg0,msg1,msg
|
||||||
character*6 mygrid
|
character*6 mygrid
|
||||||
integer dat(12)
|
integer dat(12)
|
||||||
logical(c_bool), value :: bcontest
|
logical(c_bool), value :: bcontest
|
||||||
logical(c_bool) :: stdmsg
|
logical(c_bool) :: stdmsg
|
||||||
|
|
||||||
|
msg1=msg0
|
||||||
|
i0=index(msg1,' OOO ')
|
||||||
|
if(i0.gt.10) msg1=msg0(1:i0)
|
||||||
call packmsg(msg0,dat,itype,logical(bcontest))
|
call packmsg(msg0,dat,itype,logical(bcontest))
|
||||||
call unpackmsg(dat,msg,logical(bcontest),mygrid)
|
call unpackmsg(dat,msg,logical(bcontest),mygrid)
|
||||||
stdmsg=(msg.eq.msg0) .and. (itype.ge.0) .and. itype.ne.6
|
stdmsg=(msg.eq.msg1) .and. (itype.ge.0) .and. itype.ne.6
|
||||||
|
|
||||||
return
|
return
|
||||||
end function stdmsg
|
end function stdmsg
|
||||||
|
106
logbook/adif.cpp
@ -18,17 +18,17 @@ void ADIF::init(QString const& filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QString ADIF::_extractField(QString const& line, QString const& fieldName) const
|
QString ADIF::extractField(QString const& record, QString const& fieldName) const
|
||||||
{
|
{
|
||||||
int fieldNameIndex = line.indexOf(fieldName,0,Qt::CaseInsensitive);
|
int fieldNameIndex = record.indexOf (fieldName + ':', 0, Qt::CaseInsensitive);
|
||||||
if (fieldNameIndex >=0)
|
if (fieldNameIndex >=0)
|
||||||
{
|
{
|
||||||
int closingBracketIndex = line.indexOf('>',fieldNameIndex);
|
int closingBracketIndex = record.indexOf('>',fieldNameIndex);
|
||||||
int fieldLengthIndex = line.indexOf(':',fieldNameIndex); // find the size delimiter
|
int fieldLengthIndex = record.indexOf(':',fieldNameIndex); // find the size delimiter
|
||||||
int dataTypeIndex = -1;
|
int dataTypeIndex = -1;
|
||||||
if (fieldLengthIndex >= 0)
|
if (fieldLengthIndex >= 0)
|
||||||
{
|
{
|
||||||
dataTypeIndex = line.indexOf(':',fieldLengthIndex+1); // check for a second : indicating there is a data type
|
dataTypeIndex = record.indexOf(':',fieldLengthIndex+1); // check for a second : indicating there is a data type
|
||||||
if (dataTypeIndex > closingBracketIndex)
|
if (dataTypeIndex > closingBracketIndex)
|
||||||
dataTypeIndex = -1; // second : was found but it was beyond the closing >
|
dataTypeIndex = -1; // second : was found but it was beyond the closing >
|
||||||
}
|
}
|
||||||
@ -38,11 +38,11 @@ QString ADIF::_extractField(QString const& line, QString const& fieldName) const
|
|||||||
int fieldLengthCharCount = closingBracketIndex - fieldLengthIndex -1;
|
int fieldLengthCharCount = closingBracketIndex - fieldLengthIndex -1;
|
||||||
if (dataTypeIndex >= 0)
|
if (dataTypeIndex >= 0)
|
||||||
fieldLengthCharCount -= 2; // data type indicator is always a colon followed by a single character
|
fieldLengthCharCount -= 2; // data type indicator is always a colon followed by a single character
|
||||||
QString fieldLengthString = line.mid(fieldLengthIndex+1,fieldLengthCharCount);
|
QString fieldLengthString = record.mid(fieldLengthIndex+1,fieldLengthCharCount);
|
||||||
int fieldLength = fieldLengthString.toInt();
|
int fieldLength = fieldLengthString.toInt();
|
||||||
if (fieldLength > 0)
|
if (fieldLength > 0)
|
||||||
{
|
{
|
||||||
QString field = line.mid(closingBracketIndex+1,fieldLength);
|
QString field = record.mid(closingBracketIndex+1,fieldLength);
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -59,29 +59,50 @@ void ADIF::load()
|
|||||||
if (inputFile.open(QIODevice::ReadOnly))
|
if (inputFile.open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
QTextStream in(&inputFile);
|
QTextStream in(&inputFile);
|
||||||
QString record;
|
QString buffer;
|
||||||
|
bool pre_read {false};
|
||||||
|
int end_position {-1};
|
||||||
|
|
||||||
// skip header record
|
// skip optional header record
|
||||||
while (!in.atEnd () && !record.contains ("<EOH>", Qt::CaseInsensitive))
|
do
|
||||||
{
|
{
|
||||||
record += in.readLine ();
|
buffer += in.readLine () + '\n';
|
||||||
}
|
if (buffer.startsWith (QChar {'<'})) // denotes no header
|
||||||
while ( !in.atEnd() )
|
|
||||||
{
|
{
|
||||||
record.clear ();
|
pre_read = true;
|
||||||
while (!in.atEnd () && !record.contains ("<EOR>", Qt::CaseInsensitive))
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
record += in.readLine ();
|
end_position = buffer.indexOf ("<EOH>", 0, Qt::CaseInsensitive);
|
||||||
}
|
}
|
||||||
QSO q;
|
|
||||||
q.call = _extractField(record,"CALL:");
|
|
||||||
q.band = _extractField(record,"BAND:");
|
|
||||||
q.mode = _extractField(record,"MODE:");
|
|
||||||
q.date = _extractField(record,"QSO_DATE:");
|
|
||||||
if (q.call != "")
|
|
||||||
_data.insert(q.call,q);
|
|
||||||
}
|
}
|
||||||
inputFile.close();
|
while (!in.atEnd () && !pre_read && end_position < 0);
|
||||||
|
if (!pre_read) // found header
|
||||||
|
{
|
||||||
|
buffer.remove (0, end_position + 5);
|
||||||
|
}
|
||||||
|
while (buffer.size () || !in.atEnd ())
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
end_position = buffer.indexOf ("<EOR>", 0, Qt::CaseInsensitive);
|
||||||
|
if (!in.atEnd () && end_position < 0)
|
||||||
|
{
|
||||||
|
buffer += in.readLine () + '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!in.atEnd () && end_position < 0);
|
||||||
|
int record_length {end_position >= 0 ? end_position + 5 : -1};
|
||||||
|
auto record = buffer.left (record_length).trimmed ();
|
||||||
|
auto next_record = buffer.indexOf (QChar {'<'}, record_length);
|
||||||
|
buffer.remove (0, next_record >=0 ? next_record : buffer.size ());
|
||||||
|
record = record.mid (record.indexOf (QChar {'<'}));
|
||||||
|
add (extractField (record, "CALL")
|
||||||
|
, extractField (record, "BAND")
|
||||||
|
, extractField (record, "MODE")
|
||||||
|
, extractField (record, "QSO_DATE"));
|
||||||
|
}
|
||||||
|
inputFile.close ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,8 +114,11 @@ void ADIF::add(QString const& call, QString const& band, QString const& mode, QS
|
|||||||
q.band = band;
|
q.band = band;
|
||||||
q.mode = mode;
|
q.mode = mode;
|
||||||
q.date = date;
|
q.date = date;
|
||||||
|
if (q.call.size ())
|
||||||
|
{
|
||||||
_data.insert(q.call,q);
|
_data.insert(q.call,q);
|
||||||
//qDebug() << "Added as worked:" << call << band << mode << date;
|
// qDebug() << "Added as worked:" << call << band << mode << date;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true if in the log same band and mode (where JT65 == JT9)
|
// return true if in the log same band and mode (where JT65 == JT9)
|
||||||
@ -190,35 +214,3 @@ bool ADIF::addQSOToFile(QString const& hisCall, QString const& hisGrid, QString
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ADIF::bandFromFrequency(double dialFreq)
|
|
||||||
{
|
|
||||||
QString band="";
|
|
||||||
if(dialFreq>0.135 and dialFreq<0.139) band="2200m";
|
|
||||||
else if(dialFreq>0.45 and dialFreq<0.55) band="630m";
|
|
||||||
else if(dialFreq>1.8 and dialFreq<2.0) band="160m";
|
|
||||||
else if(dialFreq>3.5 and dialFreq<4.0) band="80m";
|
|
||||||
else if(dialFreq>5.1 and dialFreq<5.45) band="60m";
|
|
||||||
else if(dialFreq>7.0 and dialFreq<7.3) band="40m";
|
|
||||||
else if(dialFreq>10.0 and dialFreq<10.15) band="30m";
|
|
||||||
else if(dialFreq>14.0 and dialFreq<14.35) band="20m";
|
|
||||||
else if(dialFreq>18.068 and dialFreq<18.168) band="17m";
|
|
||||||
else if(dialFreq>21.0 and dialFreq<21.45) band="15m";
|
|
||||||
else if(dialFreq>24.890 and dialFreq<24.990) band="12m";
|
|
||||||
else if(dialFreq>28.0 and dialFreq<29.7) band="10m";
|
|
||||||
else if(dialFreq>50.0 and dialFreq<54.0) band="6m";
|
|
||||||
else if(dialFreq>70.0 and dialFreq<71.0) band="4m";
|
|
||||||
else if(dialFreq>144.0 and dialFreq<148.0) band="2m";
|
|
||||||
else if(dialFreq>222.0 and dialFreq<225.0) band="1.25m";
|
|
||||||
else if(dialFreq>420.0 and dialFreq<450.0) band="70cm";
|
|
||||||
else if(dialFreq>902.0 and dialFreq<928.0) band="33cm";
|
|
||||||
else if(dialFreq>1240.0 and dialFreq<1300.0) band="23cm";
|
|
||||||
else if(dialFreq>2300.0 and dialFreq<2450.0) band="13cm";
|
|
||||||
else if(dialFreq>3300.0 and dialFreq<3500.0) band="9cm";
|
|
||||||
else if(dialFreq>5650.0 and dialFreq<5925.0) band="6cm";
|
|
||||||
else if(dialFreq>10000.0 and dialFreq<10500.0) band="3cm";
|
|
||||||
else if(dialFreq>24000.0 and dialFreq<24250.0) band="1.25cm";
|
|
||||||
else if(dialFreq>47000.0 and dialFreq<47200.0) band="6mm";
|
|
||||||
else if(dialFreq>75500.0 and dialFreq<81000.0) band="4mm";
|
|
||||||
return band;
|
|
||||||
}
|
|
||||||
|
@ -32,8 +32,6 @@ class ADIF
|
|||||||
bool addQSOToFile(QString const& hisCall, QString const& hisGrid, QString const& mode, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, QString const& band,
|
bool addQSOToFile(QString const& hisCall, QString const& hisGrid, QString const& mode, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, QString const& band,
|
||||||
QString const& comments, QString const& name, QString const& strDialFreq, QString const& m_myCall, QString const& m_myGrid, QString const& m_txPower);
|
QString const& comments, QString const& name, QString const& strDialFreq, QString const& m_myCall, QString const& m_myGrid, QString const& m_txPower);
|
||||||
|
|
||||||
static QString bandFromFrequency(double dialFreq);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct QSO
|
struct QSO
|
||||||
{
|
{
|
||||||
@ -43,7 +41,7 @@ class ADIF
|
|||||||
QMultiHash<QString, QSO> _data;
|
QMultiHash<QString, QSO> _data;
|
||||||
QString _filename;
|
QString _filename;
|
||||||
|
|
||||||
QString _extractField(QString const& line, QString const& fieldName) const;
|
QString extractField(QString const& line, QString const& fieldName) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,7 +51,6 @@ void CountryDat::_removeBrackets(QString &line, const QString a, const QString b
|
|||||||
QStringList CountryDat::_extractPrefix(QString &line, bool &more) const
|
QStringList CountryDat::_extractPrefix(QString &line, bool &more) const
|
||||||
{
|
{
|
||||||
line = line.remove(" \n");
|
line = line.remove(" \n");
|
||||||
line = line.replace("=","");
|
|
||||||
line = line.replace(" ","");
|
line = line.replace(" ","");
|
||||||
|
|
||||||
_removeBrackets(line,"(",")");
|
_removeBrackets(line,"(",")");
|
||||||
@ -117,29 +116,38 @@ void CountryDat::load()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// return country name else ""
|
// return country name else ""
|
||||||
QString CountryDat::find(QString prefix) const
|
QString CountryDat::find(QString call) const
|
||||||
{
|
{
|
||||||
prefix = prefix.toUpper ();
|
call = call.toUpper ();
|
||||||
auto pf = prefix;
|
|
||||||
while (pf.size () >= 1)
|
|
||||||
{
|
|
||||||
if (_data.contains (pf))
|
|
||||||
{
|
|
||||||
QString country {_data.value (pf)};
|
|
||||||
|
|
||||||
|
// check for exact match first
|
||||||
|
if (_data.contains ("=" + call))
|
||||||
|
{
|
||||||
|
return fixup (_data.value ("=" + call), call);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto prefix = call;
|
||||||
|
while (prefix.size () >= 1)
|
||||||
|
{
|
||||||
|
if (_data.contains (prefix))
|
||||||
|
{
|
||||||
|
return fixup (_data.value (prefix), call);
|
||||||
|
}
|
||||||
|
prefix = prefix.left (prefix.size () - 1);
|
||||||
|
}
|
||||||
|
return QString {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CountryDat::fixup (QString country, QString const& call) const
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// deal with special rules that cty.dat does not cope with
|
// deal with special rules that cty.dat does not cope with
|
||||||
//
|
//
|
||||||
|
|
||||||
// KG4 2x1 and 2x3 calls that map to Gitmo are mainland US not Gitmo
|
// KG4 2x1 and 2x3 calls that map to Gitmo are mainland US not Gitmo
|
||||||
if (prefix.startsWith ("KG4") && prefix.size () != 5)
|
if (call.startsWith ("KG4") && call.size () != 5)
|
||||||
{
|
{
|
||||||
country.replace ("Guantanamo Bay", "United States");
|
country.replace ("Guantanamo Bay", "United States");
|
||||||
}
|
}
|
||||||
|
|
||||||
return country;
|
return country;
|
||||||
}
|
|
||||||
pf = pf.left (pf.size () - 1);
|
|
||||||
}
|
|
||||||
return QString {};
|
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ private:
|
|||||||
QString _extractName(const QString line) const;
|
QString _extractName(const QString line) const;
|
||||||
void _removeBrackets(QString &line, const QString a, const QString b) const;
|
void _removeBrackets(QString &line, const QString a, const QString b) const;
|
||||||
QStringList _extractPrefix(QString &line, bool &more) const;
|
QStringList _extractPrefix(QString &line, bool &more) const;
|
||||||
|
QString fixup (QString country, QString const& call) const;
|
||||||
|
|
||||||
QString _filename;
|
QString _filename;
|
||||||
QStringList _countryNames;
|
QStringList _countryNames;
|
||||||
|
@ -8,14 +8,18 @@
|
|||||||
|
|
||||||
#include "logbook/adif.h"
|
#include "logbook/adif.h"
|
||||||
#include "MessageBox.hpp"
|
#include "MessageBox.hpp"
|
||||||
|
#include "Configuration.hpp"
|
||||||
|
#include "Bands.hpp"
|
||||||
|
|
||||||
#include "ui_logqso.h"
|
#include "ui_logqso.h"
|
||||||
#include "moc_logqso.cpp"
|
#include "moc_logqso.cpp"
|
||||||
|
|
||||||
LogQSO::LogQSO(QString const& programTitle, QSettings * settings, QWidget *parent)
|
LogQSO::LogQSO(QString const& programTitle, QSettings * settings
|
||||||
|
, Configuration const * config, QWidget *parent)
|
||||||
: QDialog(parent)
|
: QDialog(parent)
|
||||||
, ui(new Ui::LogQSO)
|
, ui(new Ui::LogQSO)
|
||||||
, m_settings (settings)
|
, m_settings (settings)
|
||||||
|
, m_config {config}
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setWindowTitle(programTitle + " - Log QSO");
|
setWindowTitle(programTitle + " - Log QSO");
|
||||||
@ -78,8 +82,7 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString
|
|||||||
m_dialFreq=dialFreq;
|
m_dialFreq=dialFreq;
|
||||||
m_myCall=myCall;
|
m_myCall=myCall;
|
||||||
m_myGrid=myGrid;
|
m_myGrid=myGrid;
|
||||||
QString band= ADIF::bandFromFrequency(dialFreq / 1.e6);
|
ui->band->setText (m_config->bands ()->find (dialFreq));
|
||||||
ui->band->setText(band);
|
|
||||||
|
|
||||||
show ();
|
show ();
|
||||||
}
|
}
|
||||||
|
4
logqso.h
@ -17,13 +17,14 @@ namespace Ui {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class QSettings;
|
class QSettings;
|
||||||
|
class Configuration;
|
||||||
|
|
||||||
class LogQSO : public QDialog
|
class LogQSO : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit LogQSO(QString const& programTitle, QSettings *, QWidget *parent = 0);
|
explicit LogQSO(QString const& programTitle, QSettings *, Configuration const *, QWidget *parent = 0);
|
||||||
~LogQSO();
|
~LogQSO();
|
||||||
void initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode,
|
void initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode,
|
||||||
QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn,
|
QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn,
|
||||||
@ -50,6 +51,7 @@ private:
|
|||||||
|
|
||||||
QScopedPointer<Ui::LogQSO> ui;
|
QScopedPointer<Ui::LogQSO> ui;
|
||||||
QSettings * m_settings;
|
QSettings * m_settings;
|
||||||
|
Configuration const * m_config;
|
||||||
QString m_txPower;
|
QString m_txPower;
|
||||||
QString m_comments;
|
QString m_comments;
|
||||||
Radio::Frequency m_dialFreq;
|
Radio::Frequency m_dialFreq;
|
||||||
|
411
mainwindow.cpp
@ -76,7 +76,7 @@ extern "C" {
|
|||||||
int len1, int len2, int len3, int len4, int len5);
|
int len1, int len2, int len3, int len4, int len5);
|
||||||
// float s[], int* jh, char line[], char mygrid[],
|
// float s[], int* jh, char line[], char mygrid[],
|
||||||
|
|
||||||
void genft8_(char* msg, char* MyGrid, bool* bcontest, char* msgsent,
|
void genft8_(char* msg, char* MyGrid, bool* bcontest, int* i3bit, char* msgsent,
|
||||||
char ft8msgbits[], int itone[], int len1, int len2, int len3);
|
char ft8msgbits[], int itone[], int len1, int len2, int len3);
|
||||||
|
|
||||||
void gen4_(char* msg, int* ichk, char* msgsent, int itone[],
|
void gen4_(char* msg, int* ichk, char* msgsent, int itone[],
|
||||||
@ -129,6 +129,11 @@ extern "C" {
|
|||||||
|
|
||||||
void freqcal_(short d2[], int* k, int* nkhz,int* noffset, int* ntol,
|
void freqcal_(short d2[], int* k, int* nkhz,int* noffset, int* ntol,
|
||||||
char line[], int len);
|
char line[], int len);
|
||||||
|
|
||||||
|
void fix_contest_msg_(char* MyGrid, char* msg, int len1, int len2);
|
||||||
|
|
||||||
|
void calibrate_(char data_dir[], int* iz, double* a, double* b, double* rms,
|
||||||
|
double* sigmaa, double* sigmab, int* irc, int len1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols
|
int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols
|
||||||
@ -197,7 +202,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
m_wideGraph (new WideGraph(m_settings)),
|
m_wideGraph (new WideGraph(m_settings)),
|
||||||
m_echoGraph (new EchoGraph(m_settings)),
|
m_echoGraph (new EchoGraph(m_settings)),
|
||||||
m_fastGraph (new FastGraph(m_settings)),
|
m_fastGraph (new FastGraph(m_settings)),
|
||||||
m_logDlg (new LogQSO (program_title (), m_settings, this)),
|
m_logDlg (new LogQSO (program_title (), m_settings, &m_config, this)),
|
||||||
m_lastDialFreq {0},
|
m_lastDialFreq {0},
|
||||||
m_dialFreqRxWSPR {0},
|
m_dialFreqRxWSPR {0},
|
||||||
m_detector {new Detector {RX_SAMPLE_RATE, NTMAX, downSampleFactor}},
|
m_detector {new Detector {RX_SAMPLE_RATE, NTMAX, downSampleFactor}},
|
||||||
@ -252,7 +257,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
m_sentFirst73 {false},
|
m_sentFirst73 {false},
|
||||||
m_currentMessageType {-1},
|
m_currentMessageType {-1},
|
||||||
m_lastMessageType {-1},
|
m_lastMessageType {-1},
|
||||||
m_lockTxFreq {false},
|
m_holdTxFreq {false},
|
||||||
m_bShMsgs {false},
|
m_bShMsgs {false},
|
||||||
m_bSWL {false},
|
m_bSWL {false},
|
||||||
m_uploading {false},
|
m_uploading {false},
|
||||||
@ -546,10 +551,10 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
txMsgButtonGroup->addButton(ui->txrb6,6);
|
txMsgButtonGroup->addButton(ui->txrb6,6);
|
||||||
set_dateTimeQSO(-1);
|
set_dateTimeQSO(-1);
|
||||||
connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int)));
|
connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int)));
|
||||||
connect(ui->decodedTextBrowser2,SIGNAL(selectCallsign(bool,bool)),this,
|
connect (ui->decodedTextBrowser2, &DisplayText::selectCallsign, this, &MainWindow::doubleClickOnCall);
|
||||||
SLOT(doubleClickOnCall(bool,bool)));
|
connect (ui->decodedTextBrowser, &DisplayText::selectCallsign, this, &MainWindow::doubleClickOnCall2);
|
||||||
connect(ui->decodedTextBrowser,SIGNAL(selectCallsign(bool,bool)),this,
|
connect (ui->decodedTextBrowser, &DisplayText::erased, this, &MainWindow::band_activity_cleared);
|
||||||
SLOT(doubleClickOnCall2(bool,bool)));
|
connect (ui->decodedTextBrowser2, &DisplayText::erased, this, &MainWindow::rx_frequency_activity_cleared);
|
||||||
|
|
||||||
// initialize decoded text font and hook up font change signals
|
// initialize decoded text font and hook up font change signals
|
||||||
// defer initialization until after construction otherwise menu
|
// defer initialization until after construction otherwise menu
|
||||||
@ -811,7 +816,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
morse_(const_cast<char *> (m_config.my_callsign ().toLatin1().constData()),
|
morse_(const_cast<char *> (m_config.my_callsign ().toLatin1().constData()),
|
||||||
const_cast<int *> (icw), &m_ncw, m_config.my_callsign ().length());
|
const_cast<int *> (icw), &m_ncw, m_config.my_callsign ().length());
|
||||||
on_actionWide_Waterfall_triggered();
|
on_actionWide_Waterfall_triggered();
|
||||||
m_wideGraph->setLockTxFreq(m_lockTxFreq);
|
|
||||||
ui->cbShMsgs->setChecked(m_bShMsgs);
|
ui->cbShMsgs->setChecked(m_bShMsgs);
|
||||||
ui->cbSWL->setChecked(m_bSWL);
|
ui->cbSWL->setChecked(m_bSWL);
|
||||||
if(m_bFast9) m_bFastMode=true;
|
if(m_bFast9) m_bFastMode=true;
|
||||||
@ -842,7 +846,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
ui->sbTxPercent->setValue(m_pctx);
|
ui->sbTxPercent->setValue(m_pctx);
|
||||||
ui->TxPowerComboBox->setCurrentIndex(int(0.3*(m_dBm + 30.0)+0.2));
|
ui->TxPowerComboBox->setCurrentIndex(int(0.3*(m_dBm + 30.0)+0.2));
|
||||||
ui->cbUploadWSPR_Spots->setChecked(m_uploadSpots);
|
ui->cbUploadWSPR_Spots->setChecked(m_uploadSpots);
|
||||||
ui->cbTxLock->setChecked(m_lockTxFreq);
|
ui->cbHoldTxFreq->setChecked(m_holdTxFreq);
|
||||||
if((m_ndepth&7)==1) ui->actionQuickDecode->setChecked(true);
|
if((m_ndepth&7)==1) ui->actionQuickDecode->setChecked(true);
|
||||||
if((m_ndepth&7)==2) ui->actionMediumDecode->setChecked(true);
|
if((m_ndepth&7)==2) ui->actionMediumDecode->setChecked(true);
|
||||||
if((m_ndepth&7)==3) ui->actionDeepestDecode->setChecked(true);
|
if((m_ndepth&7)==3) ui->actionDeepestDecode->setChecked(true);
|
||||||
@ -858,6 +862,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
m_bVHFwarned=false;
|
m_bVHFwarned=false;
|
||||||
m_bDoubleClicked=false;
|
m_bDoubleClicked=false;
|
||||||
m_bCallingCQ=false;
|
m_bCallingCQ=false;
|
||||||
|
m_bCheckedContest=false;
|
||||||
m_wait=0;
|
m_wait=0;
|
||||||
m_CQtype="CQ";
|
m_CQtype="CQ";
|
||||||
|
|
||||||
@ -886,8 +891,10 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
splashTimer.setSingleShot (true);
|
splashTimer.setSingleShot (true);
|
||||||
splashTimer.start (20 * 1000);
|
splashTimer.start (20 * 1000);
|
||||||
|
|
||||||
|
m_bDXped=false;
|
||||||
if(m_config.my_callsign()=="K1JT" or m_config.my_callsign()=="K9AN" or
|
if(m_config.my_callsign()=="K1JT" or m_config.my_callsign()=="K9AN" or
|
||||||
m_config.my_callsign()=="G4WJS" || m_config.my_callsign () == "G3PQA") {
|
m_config.my_callsign()=="G4WJS" || m_config.my_callsign () == "G3PQA") {
|
||||||
|
m_bDXped=true;
|
||||||
ui->actionWSPR_LF->setEnabled(true);
|
ui->actionWSPR_LF->setEnabled(true);
|
||||||
}
|
}
|
||||||
if(!ui->cbMenus->isChecked()) {
|
if(!ui->cbMenus->isChecked()) {
|
||||||
@ -983,6 +990,7 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue("Ftol", ui->sbFtol->value ());
|
m_settings->setValue("Ftol", ui->sbFtol->value ());
|
||||||
m_settings->setValue("MinSync",m_minSync);
|
m_settings->setValue("MinSync",m_minSync);
|
||||||
m_settings->setValue ("AutoSeq", ui->cbAutoSeq->isChecked ());
|
m_settings->setValue ("AutoSeq", ui->cbAutoSeq->isChecked ());
|
||||||
|
m_settings->setValue ("VHFcontest", ui->cbVHFcontest->isChecked ());
|
||||||
m_settings->setValue("ShMsgs",m_bShMsgs);
|
m_settings->setValue("ShMsgs",m_bShMsgs);
|
||||||
m_settings->setValue("SWL",ui->cbSWL->isChecked());
|
m_settings->setValue("SWL",ui->cbSWL->isChecked());
|
||||||
m_settings->setValue ("DialFreq", QVariant::fromValue(m_lastMonitoredFrequency));
|
m_settings->setValue ("DialFreq", QVariant::fromValue(m_lastMonitoredFrequency));
|
||||||
@ -990,7 +998,7 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue("NoSuffix",m_noSuffix);
|
m_settings->setValue("NoSuffix",m_noSuffix);
|
||||||
m_settings->setValue("GUItab",ui->tabWidget->currentIndex());
|
m_settings->setValue("GUItab",ui->tabWidget->currentIndex());
|
||||||
m_settings->setValue("OutBufSize",outBufSize);
|
m_settings->setValue("OutBufSize",outBufSize);
|
||||||
m_settings->setValue("LockTxFreq",m_lockTxFreq);
|
m_settings->setValue("HoldTxFreq",m_holdTxFreq);
|
||||||
m_settings->setValue("PctTx",m_pctx);
|
m_settings->setValue("PctTx",m_pctx);
|
||||||
m_settings->setValue("dBm",m_dBm);
|
m_settings->setValue("dBm",m_dBm);
|
||||||
m_settings->setValue ("WSPRPreferType1", ui->WSPR_prefer_type_1_check_box->isChecked ());
|
m_settings->setValue ("WSPRPreferType1", ui->WSPR_prefer_type_1_check_box->isChecked ());
|
||||||
@ -1051,6 +1059,7 @@ void MainWindow::readSettings()
|
|||||||
m_minSync=m_settings->value("MinSync",0).toInt();
|
m_minSync=m_settings->value("MinSync",0).toInt();
|
||||||
ui->syncSpinBox->setValue(m_minSync);
|
ui->syncSpinBox->setValue(m_minSync);
|
||||||
ui->cbAutoSeq->setChecked (m_settings->value ("AutoSeq", false).toBool());
|
ui->cbAutoSeq->setChecked (m_settings->value ("AutoSeq", false).toBool());
|
||||||
|
ui->cbVHFcontest->setChecked (m_settings->value ("VHFcontest", false).toBool());
|
||||||
m_bShMsgs=m_settings->value("ShMsgs",false).toBool();
|
m_bShMsgs=m_settings->value("ShMsgs",false).toBool();
|
||||||
m_bSWL=m_settings->value("SWL",false).toBool();
|
m_bSWL=m_settings->value("SWL",false).toBool();
|
||||||
m_bFast9=m_settings->value("Fast9",false).toBool();
|
m_bFast9=m_settings->value("Fast9",false).toBool();
|
||||||
@ -1078,7 +1087,7 @@ void MainWindow::readSettings()
|
|||||||
int n=m_settings->value("GUItab",0).toInt();
|
int n=m_settings->value("GUItab",0).toInt();
|
||||||
ui->tabWidget->setCurrentIndex(n);
|
ui->tabWidget->setCurrentIndex(n);
|
||||||
outBufSize=m_settings->value("OutBufSize",4096).toInt();
|
outBufSize=m_settings->value("OutBufSize",4096).toInt();
|
||||||
m_lockTxFreq=m_settings->value("LockTxFreq",false).toBool();
|
m_holdTxFreq=m_settings->value("HoldTxFreq",false).toBool();
|
||||||
m_pwrBandTxMemory=m_settings->value("pwrBandTxMemory").toHash();
|
m_pwrBandTxMemory=m_settings->value("pwrBandTxMemory").toHash();
|
||||||
m_pwrBandTuneMemory=m_settings->value("pwrBandTuneMemory").toHash();
|
m_pwrBandTuneMemory=m_settings->value("pwrBandTuneMemory").toHash();
|
||||||
ui->actionEnable_AP->setChecked (m_settings->value ("FT8AP", false).toBool());
|
ui->actionEnable_AP->setChecked (m_settings->value ("FT8AP", false).toBool());
|
||||||
@ -1216,7 +1225,8 @@ void MainWindow::dataSink(qint64 frames)
|
|||||||
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_config.DXCC(),
|
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_config.DXCC(),
|
||||||
m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(),
|
m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(),
|
||||||
m_config.color_NewCall());
|
m_config.color_NewCall());
|
||||||
// Append results text to file "fmt.all".
|
if (ui->measure_check_box->isChecked ()) {
|
||||||
|
// Append results text to file "fmt.all".
|
||||||
QFile f {m_config.writeable_data_dir ().absoluteFilePath ("fmt.all")};
|
QFile f {m_config.writeable_data_dir ().absoluteFilePath ("fmt.all")};
|
||||||
if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
|
if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
|
||||||
QTextStream out(&f);
|
QTextStream out(&f);
|
||||||
@ -1227,6 +1237,7 @@ void MainWindow::dataSink(qint64 frames)
|
|||||||
, tr ("Cannot open \"%1\" for append: %2")
|
, tr ("Cannot open \"%1\" for append: %2")
|
||||||
.arg (f.fileName ()).arg (f.errorString ()));
|
.arg (f.fileName ()).arg (f.errorString ()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(m_ihsym==m_hsymStop && ui->actionFrequency_calibration->isChecked()) {
|
if(m_ihsym==m_hsymStop && ui->actionFrequency_calibration->isChecked()) {
|
||||||
freqCalStep();
|
freqCalStep();
|
||||||
}
|
}
|
||||||
@ -1423,7 +1434,7 @@ void MainWindow::fastSink(qint64 frames)
|
|||||||
strncpy(dec_data.params.mycall, (m_baseCall+" ").toLatin1(),12);
|
strncpy(dec_data.params.mycall, (m_baseCall+" ").toLatin1(),12);
|
||||||
QString hisCall {ui->dxCallEntry->text ()};
|
QString hisCall {ui->dxCallEntry->text ()};
|
||||||
bool bshmsg=ui->cbShMsgs->isChecked();
|
bool bshmsg=ui->cbShMsgs->isChecked();
|
||||||
bool bcontest=m_config.contestMode();
|
bool bcontest=ui->cbVHFcontest->isChecked();
|
||||||
bool bswl=ui->cbSWL->isChecked();
|
bool bswl=ui->cbSWL->isChecked();
|
||||||
strncpy(dec_data.params.hiscall,(Radio::base_callsign (hisCall) + " ").toLatin1 ().constData (), 12);
|
strncpy(dec_data.params.hiscall,(Radio::base_callsign (hisCall) + " ").toLatin1 ().constData (), 12);
|
||||||
strncpy(dec_data.params.mygrid, (m_config.my_grid()+" ").toLatin1(),6);
|
strncpy(dec_data.params.mygrid, (m_config.my_grid()+" ").toLatin1(),6);
|
||||||
@ -1531,8 +1542,6 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
|
|||||||
{
|
{
|
||||||
// things that might change that we need know about
|
// things that might change that we need know about
|
||||||
auto callsign = m_config.my_callsign ();
|
auto callsign = m_config.my_callsign ();
|
||||||
//bool bvhf0=m_config.enable_VHF_features();
|
|
||||||
//bool bcontest0=m_config.contestMode();
|
|
||||||
if (QDialog::Accepted == m_config.exec ()) {
|
if (QDialog::Accepted == m_config.exec ()) {
|
||||||
if (m_config.my_callsign () != callsign) {
|
if (m_config.my_callsign () != callsign) {
|
||||||
m_baseCall = Radio::base_callsign (m_config.my_callsign ());
|
m_baseCall = Radio::base_callsign (m_config.my_callsign ());
|
||||||
@ -1572,14 +1581,12 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
|
|||||||
if(m_mode=="JT9+JT65") on_actionJT9_JT65_triggered();
|
if(m_mode=="JT9+JT65") on_actionJT9_JT65_triggered();
|
||||||
if(m_mode=="JT65") {
|
if(m_mode=="JT65") {
|
||||||
on_actionJT65_triggered();
|
on_actionJT65_triggered();
|
||||||
//if(m_config.enable_VHF_features() != bvhf0) genStdMsgs(m_rpt);
|
|
||||||
}
|
}
|
||||||
if(m_mode=="QRA64") on_actionQRA64_triggered();
|
if(m_mode=="QRA64") on_actionQRA64_triggered();
|
||||||
if(m_mode=="FreqCal") on_actionFreqCal_triggered();
|
if(m_mode=="FreqCal") on_actionFreqCal_triggered();
|
||||||
if(m_mode=="ISCAT") on_actionISCAT_triggered();
|
if(m_mode=="ISCAT") on_actionISCAT_triggered();
|
||||||
if(m_mode=="MSK144") {
|
if(m_mode=="MSK144") {
|
||||||
on_actionMSK144_triggered();
|
on_actionMSK144_triggered();
|
||||||
//if(m_config.contestMode() != bcontest0) genStdMsgs(m_rpt);
|
|
||||||
}
|
}
|
||||||
if(m_mode=="WSPR") on_actionWSPR_triggered();
|
if(m_mode=="WSPR") on_actionWSPR_triggered();
|
||||||
if(m_mode=="WSPR-LF") on_actionWSPR_LF_triggered();
|
if(m_mode=="WSPR-LF") on_actionWSPR_LF_triggered();
|
||||||
@ -1608,15 +1615,11 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
|
|||||||
|
|
||||||
void MainWindow::on_monitorButton_clicked (bool checked)
|
void MainWindow::on_monitorButton_clicked (bool checked)
|
||||||
{
|
{
|
||||||
if (!m_transmitting)
|
if (!m_transmitting) {
|
||||||
{
|
|
||||||
auto prior = m_monitoring;
|
auto prior = m_monitoring;
|
||||||
monitor (checked);
|
monitor (checked);
|
||||||
|
if (checked && !prior) {
|
||||||
if (checked && !prior)
|
if (m_config.monitor_last_used ()) {
|
||||||
{
|
|
||||||
if (m_config.monitor_last_used ())
|
|
||||||
{
|
|
||||||
// put rig back where it was when last in control
|
// put rig back where it was when last in control
|
||||||
setRig (m_lastMonitoredFrequency);
|
setRig (m_lastMonitoredFrequency);
|
||||||
setXIT (ui->TxFreqSpinBox->value ());
|
setXIT (ui->TxFreqSpinBox->value ());
|
||||||
@ -1624,12 +1627,9 @@ void MainWindow::on_monitorButton_clicked (bool checked)
|
|||||||
// ensure FreqCal triggers
|
// ensure FreqCal triggers
|
||||||
on_RxFreqSpinBox_valueChanged (ui->RxFreqSpinBox->value ());
|
on_RxFreqSpinBox_valueChanged (ui->RxFreqSpinBox->value ());
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get Configuration in/out of strict split and mode checking
|
//Get Configuration in/out of strict split and mode checking
|
||||||
Q_EMIT m_config.sync_transceiver (true, checked);
|
Q_EMIT m_config.sync_transceiver (true, checked);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ui->monitorButton->setChecked (false); // disallow
|
ui->monitorButton->setChecked (false); // disallow
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1726,18 +1726,10 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
|
|||||||
}
|
}
|
||||||
on_actionOpen_next_in_directory_triggered();
|
on_actionOpen_next_in_directory_triggered();
|
||||||
return;
|
return;
|
||||||
case Qt::Key_F10:
|
|
||||||
if(e->modifiers() & Qt::ControlModifier) freqCalStep();
|
|
||||||
break;
|
|
||||||
case Qt::Key_F11:
|
case Qt::Key_F11:
|
||||||
n=11;
|
n=11;
|
||||||
if(e->modifiers() & Qt::ControlModifier) n+=100;
|
if(e->modifiers() & Qt::ControlModifier) n+=100;
|
||||||
if(e->modifiers() & Qt::ShiftModifier) {
|
if(e->modifiers() & Qt::ShiftModifier) {
|
||||||
/*
|
|
||||||
int f=ui->TxFreqSpinBox->value()/50;
|
|
||||||
if((ui->TxFreqSpinBox->value() % 50) == 0) f=f-1;
|
|
||||||
ui->TxFreqSpinBox->setValue(50*f);
|
|
||||||
*/
|
|
||||||
ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()-60);
|
ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()-60);
|
||||||
} else{
|
} else{
|
||||||
bumpFqso(n);
|
bumpFqso(n);
|
||||||
@ -1747,12 +1739,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
|
|||||||
n=12;
|
n=12;
|
||||||
if(e->modifiers() & Qt::ControlModifier) n+=100;
|
if(e->modifiers() & Qt::ControlModifier) n+=100;
|
||||||
if(e->modifiers() & Qt::ShiftModifier) {
|
if(e->modifiers() & Qt::ShiftModifier) {
|
||||||
/*
|
|
||||||
int f=ui->TxFreqSpinBox->value()/50;
|
|
||||||
ui->TxFreqSpinBox->setValue(50*(f+1));
|
|
||||||
*/
|
|
||||||
ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()+60);
|
ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()+60);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
bumpFqso(n);
|
bumpFqso(n);
|
||||||
}
|
}
|
||||||
@ -1824,14 +1811,13 @@ void MainWindow::bumpFqso(int n) //bumpFqso()
|
|||||||
i=ui->RxFreqSpinBox->value ();
|
i=ui->RxFreqSpinBox->value ();
|
||||||
if(n==11) i--;
|
if(n==11) i--;
|
||||||
if(n==12) i++;
|
if(n==12) i++;
|
||||||
if (ui->RxFreqSpinBox->isEnabled ())
|
if (ui->RxFreqSpinBox->isEnabled ()) {
|
||||||
{
|
|
||||||
ui->RxFreqSpinBox->setValue (i);
|
ui->RxFreqSpinBox->setValue (i);
|
||||||
}
|
}
|
||||||
if(ctrl and m_mode.startsWith ("WSPR")) {
|
if(ctrl and m_mode.startsWith ("WSPR")) {
|
||||||
ui->WSPRfreqSpinBox->setValue(i);
|
ui->WSPRfreqSpinBox->setValue(i);
|
||||||
} else {
|
} else {
|
||||||
if(ctrl && ui->TxFreqSpinBox->isEnabled ()) {
|
if(ctrl) {
|
||||||
ui->TxFreqSpinBox->setValue (i);
|
ui->TxFreqSpinBox->setValue (i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2051,6 +2037,7 @@ void MainWindow::closeEvent(QCloseEvent * e)
|
|||||||
m_valid = false; // suppresses subprocess errors
|
m_valid = false; // suppresses subprocess errors
|
||||||
m_config.transceiver_offline ();
|
m_config.transceiver_offline ();
|
||||||
writeSettings ();
|
writeSettings ();
|
||||||
|
m_astroWidget.reset ();
|
||||||
m_guiTimer.stop ();
|
m_guiTimer.stop ();
|
||||||
m_prefixes.reset ();
|
m_prefixes.reset ();
|
||||||
m_shortcuts.reset ();
|
m_shortcuts.reset ();
|
||||||
@ -2114,6 +2101,66 @@ void MainWindow::on_actionFast_Graph_triggered()
|
|||||||
m_fastGraph->show();
|
m_fastGraph->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionSolve_FreqCal_triggered()
|
||||||
|
{
|
||||||
|
QString dpath{QDir::toNativeSeparators(m_config.writeable_data_dir().absolutePath()+"/")};
|
||||||
|
char data_dir[512];
|
||||||
|
int len=dpath.length();
|
||||||
|
int iz,irc;
|
||||||
|
double a,b,rms,sigmaa,sigmab;
|
||||||
|
strncpy(data_dir,dpath.toLatin1(),len);
|
||||||
|
calibrate_(data_dir,&iz,&a,&b,&rms,&sigmaa,&sigmab,&irc,len);
|
||||||
|
QString t2;
|
||||||
|
if(irc==-1) t2="Cannot open " + dpath + "fmt.all";
|
||||||
|
if(irc==-2) t2="Cannot open " + dpath + "fcal2.out";
|
||||||
|
if(irc==-3) t2="Insufficient data in fmt.all";
|
||||||
|
if(irc==-4) t2 = tr ("Invalid data in fmt.all at line %1").arg (iz);
|
||||||
|
if(irc>0 or rms>1.0) t2="Check fmt.all for possible bad data.";
|
||||||
|
if (irc < 0 || irc > 0 || rms > 1.) {
|
||||||
|
MessageBox::warning_message (this, "Calibration Error", t2);
|
||||||
|
}
|
||||||
|
else if (MessageBox::Apply == MessageBox::query_message (this
|
||||||
|
, tr ("Good Calibration Solution")
|
||||||
|
, tr ("<pre>"
|
||||||
|
"%1%L2 ±%L3 ppm\n"
|
||||||
|
"%4%L5 ±%L6 Hz\n\n"
|
||||||
|
"%7%L8\n"
|
||||||
|
"%9%L10 Hz"
|
||||||
|
"</pre>")
|
||||||
|
.arg ("Slope: ", 12).arg (b, 0, 'f', 3).arg (sigmab, 0, 'f', 3)
|
||||||
|
.arg ("Intercept: ", 12).arg (a, 0, 'f', 2).arg (sigmaa, 0, 'f', 2)
|
||||||
|
.arg ("N: ", 12).arg (iz)
|
||||||
|
.arg ("StdDev: ", 12).arg (rms, 0, 'f', 2)
|
||||||
|
, QString {}
|
||||||
|
, MessageBox::Cancel | MessageBox::Apply)) {
|
||||||
|
m_config.set_calibration (Configuration::CalibrationParams {a, b});
|
||||||
|
if (MessageBox::Yes == MessageBox::query_message (this
|
||||||
|
, tr ("Delete Calibration Measurements")
|
||||||
|
, tr ("The \"fmt.all\" file will be renamed as \"fmt.bak\""))) {
|
||||||
|
// rename fmt.all as we have consumed the resulting calibration
|
||||||
|
// solution
|
||||||
|
auto const& backup_file_name = m_config.writeable_data_dir ().absoluteFilePath ("fmt.bak");
|
||||||
|
QFile::remove (backup_file_name);
|
||||||
|
QFile::rename (m_config.writeable_data_dir ().absoluteFilePath ("fmt.all"), backup_file_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionCopyright_Notice_triggered()
|
||||||
|
{
|
||||||
|
auto const& message = tr("If you make fair use of any part of WSJT-X under terms of the GNU "
|
||||||
|
"General Public License, you must display the following copyright "
|
||||||
|
"notice prominently in your derivative work:\n\n"
|
||||||
|
"\"The algorithms, source code, look-and-feel of WSJT-X and related "
|
||||||
|
"programs, and protocol specifications for the modes FSK441, FT8, JT4, "
|
||||||
|
"JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) "
|
||||||
|
"2001-2017 by one or more of the following authors: Joseph Taylor, "
|
||||||
|
"K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, "
|
||||||
|
"IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; "
|
||||||
|
"Philip Karn, KA9Q; and other members of the WSJT Development Group.\"");
|
||||||
|
MessageBox::warning_message(this, message);
|
||||||
|
}
|
||||||
|
|
||||||
// This allows the window to shrink by removing certain things
|
// This allows the window to shrink by removing certain things
|
||||||
// and reducing space used by controls
|
// and reducing space used by controls
|
||||||
void MainWindow::hideMenus(bool checked)
|
void MainWindow::hideMenus(bool checked)
|
||||||
@ -2507,7 +2554,7 @@ void MainWindow::decode() //decode()
|
|||||||
dec_data.params.nexp_decode=0;
|
dec_data.params.nexp_decode=0;
|
||||||
if(m_config.single_decode()) dec_data.params.nexp_decode += 32;
|
if(m_config.single_decode()) dec_data.params.nexp_decode += 32;
|
||||||
if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64;
|
if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64;
|
||||||
if(m_config.contestMode()) dec_data.params.nexp_decode += 128;
|
if(ui->cbVHFcontest->isChecked()) dec_data.params.nexp_decode += 128;
|
||||||
|
|
||||||
strncpy(dec_data.params.datetime, m_dateTime.toLatin1(), 20);
|
strncpy(dec_data.params.datetime, m_dateTime.toLatin1(), 20);
|
||||||
strncpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(),12);
|
strncpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(),12);
|
||||||
@ -2584,7 +2631,8 @@ void::MainWindow::fast_decode_done()
|
|||||||
if(narg[13]/8==narg[12]) message=message.trimmed().replace("<...>",m_calls);
|
if(narg[13]/8==narg[12]) message=message.trimmed().replace("<...>",m_calls);
|
||||||
|
|
||||||
//Left (Band activity) window
|
//Left (Band activity) window
|
||||||
DecodedText decodedtext {message.replace (QChar::LineFeed, ""), "FT8" == m_mode && m_config.contestMode (), m_config.my_grid ()};
|
DecodedText decodedtext {message.replace (QChar::LineFeed, ""), "FT8" == m_mode &&
|
||||||
|
ui->cbVHFcontest->isChecked(), m_config.my_grid ()};
|
||||||
if(!m_bFastDone) {
|
if(!m_bFastDone) {
|
||||||
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_config.DXCC(),
|
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_config.DXCC(),
|
||||||
m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(),
|
m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(),
|
||||||
@ -2700,6 +2748,12 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
if(navg>1 or t.indexOf("f*")>0) bAvgMsg=true;
|
if(navg>1 or t.indexOf("f*")>0) bAvgMsg=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(m_mode=="FT8" and m_bDXped) {
|
||||||
|
int i3bit=t.mid(44,1).toInt();
|
||||||
|
t=t.mid(0,44) + " " + t.mid(45);
|
||||||
|
if(i3bit==1) t=t.mid(0,24) + "RR73 NOW " + t.mid(24);
|
||||||
|
if(i3bit==2) t=t.mid(0,24) + "NIL NOW " + t.mid(24);
|
||||||
|
}
|
||||||
QFile f {m_config.writeable_data_dir ().absoluteFilePath ("ALL.TXT")};
|
QFile f {m_config.writeable_data_dir ().absoluteFilePath ("ALL.TXT")};
|
||||||
if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
|
if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
|
||||||
QTextStream out(&f);
|
QTextStream out(&f);
|
||||||
@ -2721,15 +2775,15 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
if (m_config.insert_blank () && m_blankLine)
|
if (m_config.insert_blank () && m_blankLine)
|
||||||
{
|
{
|
||||||
QString band;
|
QString band;
|
||||||
if (QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged > 50)
|
if((QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged) > 4*m_TRperiod/4) {
|
||||||
{
|
|
||||||
band = ' ' + m_config.bands ()->find (m_freqNominal);
|
band = ' ' + m_config.bands ()->find (m_freqNominal);
|
||||||
}
|
}
|
||||||
ui->decodedTextBrowser->insertLineSpacer (band.rightJustified (40, '-'));
|
ui->decodedTextBrowser->insertLineSpacer (band.rightJustified (40, '-'));
|
||||||
m_blankLine = false;
|
m_blankLine = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DecodedText decodedtext {QString::fromUtf8 (t.constData ()).remove (QRegularExpression {"\r|\n"}), "FT8" == m_mode && m_config.contestMode (), m_config.my_grid ()};
|
DecodedText decodedtext {QString::fromUtf8 (t.constData ()).remove (QRegularExpression {"\r|\n"}), "FT8" == m_mode &&
|
||||||
|
ui->cbVHFcontest->isChecked(), m_config.my_grid ()};
|
||||||
|
|
||||||
//Left (Band activity) window
|
//Left (Band activity) window
|
||||||
if(!bAvgMsg) {
|
if(!bAvgMsg) {
|
||||||
@ -2747,6 +2801,7 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
if (parts.size () > 6) {
|
if (parts.size () > 6) {
|
||||||
auto for_us = parts[5].contains (m_baseCall)
|
auto for_us = parts[5].contains (m_baseCall)
|
||||||
|| ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= 10);
|
|| ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= 10);
|
||||||
|
if(m_baseCall==m_config.my_callsign() and m_baseCall!=parts[5]) for_us=false;
|
||||||
if(m_bCallingCQ && !m_bAutoReply && for_us && ui->cbFirst->isChecked()) {
|
if(m_bCallingCQ && !m_bAutoReply && for_us && ui->cbFirst->isChecked()) {
|
||||||
// int snr=decodedtext.string().mid(6,4).toInt();
|
// int snr=decodedtext.string().mid(6,4).toInt();
|
||||||
m_bDoubleClicked=true;
|
m_bDoubleClicked=true;
|
||||||
@ -2812,7 +2867,9 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
|
|||||||
{
|
{
|
||||||
auto const& message_words = message.messageWords ();
|
auto const& message_words = message.messageWords ();
|
||||||
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size ();
|
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size ();
|
||||||
if (message_words.size () > 2 && (message.isStandardMessage () || is_73)) {
|
bool is_OK=false;
|
||||||
|
if(m_mode=="MSK144" and message.string().indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true;
|
||||||
|
if (message_words.size () > 2 && (message.isStandardMessage () || (is_73 or is_OK))) {
|
||||||
auto df = message.frequencyOffset ();
|
auto df = message.frequencyOffset ();
|
||||||
auto within_tolerance =
|
auto within_tolerance =
|
||||||
(qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance)
|
(qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance)
|
||||||
@ -2850,8 +2907,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
|
|||||||
|| (m_bCallingCQ && m_bAutoReply
|
|| (m_bCallingCQ && m_bAutoReply
|
||||||
// look for type 2 compound call replies on our Tx and Rx offsets
|
// look for type 2 compound call replies on our Tx and Rx offsets
|
||||||
&& ((within_tolerance && "DE" == message_words.at (1))
|
&& ((within_tolerance && "DE" == message_words.at (1))
|
||||||
|| message_words.at (1).contains (m_baseCall)))))
|
|| message_words.at (1).contains (m_baseCall))))) {
|
||||||
{
|
|
||||||
processMessage (message);
|
processMessage (message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2896,23 +2952,31 @@ void MainWindow::killFile ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_EraseButton_clicked() //Erase
|
void MainWindow::on_EraseButton_clicked ()
|
||||||
{
|
{
|
||||||
qint64 ms=QDateTime::currentMSecsSinceEpoch();
|
qint64 ms=QDateTime::currentMSecsSinceEpoch();
|
||||||
ui->decodedTextBrowser2->clear();
|
ui->decodedTextBrowser2->erase ();
|
||||||
if(m_mode.startsWith ("WSPR") or m_mode=="Echo" or m_mode=="ISCAT") {
|
if(m_mode.startsWith ("WSPR") or m_mode=="Echo" or m_mode=="ISCAT") {
|
||||||
ui->decodedTextBrowser->clear();
|
ui->decodedTextBrowser->erase ();
|
||||||
} else {
|
} else {
|
||||||
m_QSOText.clear();
|
|
||||||
if((ms-m_msErase)<500) {
|
if((ms-m_msErase)<500) {
|
||||||
ui->decodedTextBrowser->clear();
|
ui->decodedTextBrowser->erase ();
|
||||||
m_messageClient->clear_decodes ();
|
|
||||||
QFile f(m_config.temp_dir ().absoluteFilePath ("decoded.txt"));
|
|
||||||
if(f.exists()) f.remove();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_msErase=ms;
|
m_msErase=ms;
|
||||||
set_dateTimeQSO(-1);
|
}
|
||||||
|
|
||||||
|
void MainWindow::band_activity_cleared ()
|
||||||
|
{
|
||||||
|
m_messageClient->clear_decodes ();
|
||||||
|
QFile f(m_config.temp_dir ().absoluteFilePath ("decoded.txt"));
|
||||||
|
if(f.exists()) f.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::rx_frequency_activity_cleared ()
|
||||||
|
{
|
||||||
|
m_QSOText.clear();
|
||||||
|
set_dateTimeQSO(-1); // G4WJS: why do we do this?
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::decodeBusy(bool b) //decodeBusy()
|
void MainWindow::decodeBusy(bool b) //decodeBusy()
|
||||||
@ -3070,6 +3134,7 @@ void MainWindow::guiUpdate()
|
|||||||
if((g_iptt==1 && m_iptt0==0) || m_restart) {
|
if((g_iptt==1 && m_iptt0==0) || m_restart) {
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
|
QByteArray ba0;
|
||||||
|
|
||||||
if(m_mode.startsWith ("WSPR")) {
|
if(m_mode.startsWith ("WSPR")) {
|
||||||
QString sdBm,msg0,msg1,msg2;
|
QString sdBm,msg0,msg1,msg2;
|
||||||
@ -3102,6 +3167,21 @@ void MainWindow::guiUpdate()
|
|||||||
if(m_ntx == 8) ba=ui->freeTextMsg->currentText().toLocal8Bit();
|
if(m_ntx == 8) ba=ui->freeTextMsg->currentText().toLocal8Bit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_i3bit=0;
|
||||||
|
if(m_mode=="FT8" and m_bDXped) {
|
||||||
|
ba0=ba;
|
||||||
|
QString t=QString::fromUtf8(ba0);
|
||||||
|
if(t.startsWith("RR73 NOW ")) {
|
||||||
|
t=t.mid(9);
|
||||||
|
m_i3bit=1;
|
||||||
|
}
|
||||||
|
if(t.startsWith("NIL NOW ")) {
|
||||||
|
t=t.mid(8);
|
||||||
|
m_i3bit=2;
|
||||||
|
}
|
||||||
|
ba=t.toLocal8Bit();
|
||||||
|
}
|
||||||
|
|
||||||
ba2msg(ba,message);
|
ba2msg(ba,message);
|
||||||
int ichk=0;
|
int ichk=0;
|
||||||
if (m_lastMessageSent != m_currentMessage
|
if (m_lastMessageSent != m_currentMessage
|
||||||
@ -3131,7 +3211,7 @@ void MainWindow::guiUpdate()
|
|||||||
if(m_modeTx=="WSPR-LF") genwspr_fsk8_(message, msgsent, const_cast<int *> (itone),
|
if(m_modeTx=="WSPR-LF") genwspr_fsk8_(message, msgsent, const_cast<int *> (itone),
|
||||||
22, 22);
|
22, 22);
|
||||||
if(m_modeTx=="MSK144" or m_modeTx=="FT8") {
|
if(m_modeTx=="MSK144" or m_modeTx=="FT8") {
|
||||||
bool bcontest=m_config.contestMode();
|
bool bcontest=ui->cbVHFcontest->isChecked();
|
||||||
char MyGrid[6];
|
char MyGrid[6];
|
||||||
strncpy(MyGrid, (m_config.my_grid()+" ").toLatin1(),6);
|
strncpy(MyGrid, (m_config.my_grid()+" ").toLatin1(),6);
|
||||||
if(m_modeTx=="MSK144") {
|
if(m_modeTx=="MSK144") {
|
||||||
@ -3144,7 +3224,7 @@ void MainWindow::guiUpdate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(m_modeTx=="FT8") {
|
if(m_modeTx=="FT8") {
|
||||||
genft8_(message, MyGrid, &bcontest, msgsent, const_cast<char *> (ft8msgbits),
|
genft8_(message, MyGrid, &bcontest, &m_i3bit, msgsent, const_cast<char *> (ft8msgbits),
|
||||||
const_cast<int *> (itone), 22, 6, 22);
|
const_cast<int *> (itone), 22, 6, 22);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3349,7 +3429,10 @@ void MainWindow::guiUpdate()
|
|||||||
if(m_mode=="Echo") {
|
if(m_mode=="Echo") {
|
||||||
tx_status_label.setText("Tx: ECHO");
|
tx_status_label.setText("Tx: ECHO");
|
||||||
} else {
|
} else {
|
||||||
tx_status_label.setText(s);
|
QString t{QString::fromLatin1(s)};
|
||||||
|
if(m_mode=="FT8" and m_i3bit==1) t="Tx: RR73 NOW " + t.mid(4);
|
||||||
|
if(m_mode=="FT8" and m_i3bit==2) t="Tx: NIL NOW " + t.mid(4);
|
||||||
|
tx_status_label.setText(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(m_monitoring) {
|
} else if(m_monitoring) {
|
||||||
@ -3644,15 +3727,15 @@ void MainWindow::on_txb6_clicked()
|
|||||||
if (m_transmitting) m_restart=true;
|
if (m_transmitting) m_restart=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::doubleClickOnCall2(bool alt, bool ctrl)
|
void MainWindow::doubleClickOnCall2(Qt::KeyboardModifiers modifiers)
|
||||||
{
|
{
|
||||||
set_dateTimeQSO(-1); // reset our QSO start time
|
set_dateTimeQSO(-1); // reset our QSO start time
|
||||||
m_decodedText2=true;
|
m_decodedText2=true;
|
||||||
doubleClickOnCall(alt,ctrl);
|
doubleClickOnCall(modifiers);
|
||||||
m_decodedText2=false;
|
m_decodedText2=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::doubleClickOnCall(bool alt, bool ctrl)
|
void MainWindow::doubleClickOnCall(Qt::KeyboardModifiers modifiers)
|
||||||
{
|
{
|
||||||
QTextCursor cursor;
|
QTextCursor cursor;
|
||||||
if(m_mode=="ISCAT") {
|
if(m_mode=="ISCAT") {
|
||||||
@ -3666,13 +3749,19 @@ void MainWindow::doubleClickOnCall(bool alt, bool ctrl)
|
|||||||
cursor=ui->decodedTextBrowser2->textCursor();
|
cursor=ui->decodedTextBrowser2->textCursor();
|
||||||
}
|
}
|
||||||
cursor.setPosition (cursor.selectionStart ());
|
cursor.setPosition (cursor.selectionStart ());
|
||||||
DecodedText message {cursor.block ().text (), ("MSK144" == m_mode || "FT8" == m_mode) && m_config.contestMode (), m_config.my_grid ()};
|
DecodedText message {cursor.block ().text (), ("MSK144" == m_mode || "FT8" == m_mode) &&
|
||||||
|
ui->cbVHFcontest->isChecked(), m_config.my_grid ()};
|
||||||
m_bDoubleClicked = true;
|
m_bDoubleClicked = true;
|
||||||
processMessage (message, ctrl, alt);
|
processMessage (message, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifiers modifiers)
|
||||||
{
|
{
|
||||||
|
// decode keyboard modifiers we are interested in
|
||||||
|
auto shift = modifiers.testFlag (Qt::ShiftModifier);
|
||||||
|
auto ctrl = modifiers.testFlag (Qt::ControlModifier);
|
||||||
|
// auto alt = modifiers.testFlag (Qt::AltModifier);
|
||||||
|
|
||||||
// basic mode sanity checks
|
// basic mode sanity checks
|
||||||
auto const& parts = message.string ().split (' ', QString::SkipEmptyParts);
|
auto const& parts = message.string ().split (' ', QString::SkipEmptyParts);
|
||||||
if (parts.size () < 5) return;
|
if (parts.size () < 5) return;
|
||||||
@ -3703,8 +3792,9 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
//Skip the rest if no decoded text extracted
|
//Skip the rest if no decoded text extracted
|
||||||
int frequency = message.frequencyOffset();
|
int frequency = message.frequencyOffset();
|
||||||
if (message.isTX()) {
|
if (message.isTX()) {
|
||||||
if (!m_config.enable_VHF_features() && ctrl && ui->TxFreqSpinBox->isEnabled()) {
|
if (!m_config.enable_VHF_features()) {
|
||||||
ui->TxFreqSpinBox->setValue(frequency); //Set Tx freq
|
if(!shift) ui->RxFreqSpinBox->setValue(frequency); //Set Rx freq
|
||||||
|
if((ctrl or shift) and !m_holdTxFreq) ui->TxFreqSpinBox->setValue(frequency); //Set Tx freq
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3719,9 +3809,49 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
QString hiscall;
|
QString hiscall;
|
||||||
QString hisgrid;
|
QString hisgrid;
|
||||||
message.deCallAndGrid(/*out*/hiscall,hisgrid);
|
message.deCallAndGrid(/*out*/hiscall,hisgrid);
|
||||||
|
int nWarn=0;
|
||||||
|
QString warnMsg;
|
||||||
|
|
||||||
|
if(m_mode=="MSK144" and message.string().indexOf(hiscall+" R ")>0 and
|
||||||
|
!ui->cbVHFcontest->isChecked()) {
|
||||||
|
warnMsg=tr("Should you be operating in NA VHF Contest mode?");
|
||||||
|
nWarn=1;
|
||||||
|
}
|
||||||
|
if((m_mode=="FT8" or m_mode=="MSK144") and hisgrid.length()==4 and
|
||||||
|
m_rigState.frequency()>50000000 and !m_bCheckedContest) {
|
||||||
|
double utch=0.0;
|
||||||
|
int nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter;
|
||||||
|
azdist_(const_cast <char *> (m_config.my_grid().toLatin1().constData()),
|
||||||
|
const_cast <char *> (hisgrid.toLatin1().constData()),&utch,
|
||||||
|
&nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6);
|
||||||
|
if(nDkm>10000) {
|
||||||
|
warnMsg=tr("Locator in decoded message seems to imply\n"
|
||||||
|
"a distance greater than 10,000 km. Should\n"
|
||||||
|
"you be operating in NA VHF Contest mode?");
|
||||||
|
nWarn=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(nWarn>0) {
|
||||||
|
QMessageBox msgBox;
|
||||||
|
msgBox.setWindowTitle("Contest mode?");
|
||||||
|
msgBox.setText(warnMsg);
|
||||||
|
msgBox.setStandardButtons(QMessageBox::Yes);
|
||||||
|
msgBox.addButton(QMessageBox::No);
|
||||||
|
msgBox.setDefaultButton(QMessageBox::Yes);
|
||||||
|
if(msgBox.exec() == QMessageBox::Yes){
|
||||||
|
ui->cbVHFcontest->setChecked(true);
|
||||||
|
if(nWarn==2) {
|
||||||
|
on_DecodeButton_clicked (true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ui->cbVHFcontest->setChecked(false);
|
||||||
|
}
|
||||||
|
m_bCheckedContest=true;
|
||||||
|
}
|
||||||
|
|
||||||
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size ();
|
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size ();
|
||||||
if (!is_73 && !message.isStandardMessage ())
|
if (!is_73 and !message.isStandardMessage() and (nWarn==0)) {
|
||||||
{
|
|
||||||
qDebug () << "Not processing message - hiscall:" << hiscall << "hisgrid:" << hisgrid;
|
qDebug () << "Not processing message - hiscall:" << hiscall << "hisgrid:" << hisgrid;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3743,17 +3873,18 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QString firstcall = message.call();
|
QString firstcall = message.call();
|
||||||
|
if(firstcall.length()==5 and firstcall.mid(0,3)=="CQ ") firstcall="CQ";
|
||||||
if(!m_bFastMode and (!m_config.enable_VHF_features() or m_mode=="FT8")) {
|
if(!m_bFastMode and (!m_config.enable_VHF_features() or m_mode=="FT8")) {
|
||||||
// Don't change Tx freq if in a fast mode, or VHF features enabled; also not if a
|
// Don't change Tx freq if in a fast mode, or VHF features enabled; also not if a
|
||||||
// station is calling me, unless m_lockTxFreq is true or CTRL is held down.
|
// station is calling me, unless CTRL or SHIFT is held down.
|
||||||
if ((firstcall != m_config.my_callsign () && firstcall != m_baseCall && firstcall != "DE")
|
if ((Radio::is_callsign (firstcall)
|
||||||
|| m_lockTxFreq || ctrl) {
|
&& firstcall != m_config.my_callsign () && firstcall != m_baseCall
|
||||||
if (ui->TxFreqSpinBox->isEnabled ()) {
|
&& firstcall != "DE")
|
||||||
if(!m_bFastMode && !alt) ui->TxFreqSpinBox->setValue(frequency);
|
|| "CQ" == firstcall || "QRZ" == firstcall || ctrl || shift) {
|
||||||
} else if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") &&
|
if (!m_holdTxFreq or shift or ctrl) ui->TxFreqSpinBox->setValue(frequency);
|
||||||
m_mode != "QRA64") {
|
if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") &&
|
||||||
|
m_mode != "QRA64" && m_mode!="FT8") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3791,7 +3922,7 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
m_QSOProgress = SIGNOFF;
|
m_QSOProgress = SIGNOFF;
|
||||||
} else if((m_QSOProgress >= REPORT
|
} else if((m_QSOProgress >= REPORT
|
||||||
|| (m_QSOProgress >= REPLYING && (m_mode=="MSK144" or m_mode=="FT8")
|
|| (m_QSOProgress >= REPLYING && (m_mode=="MSK144" or m_mode=="FT8")
|
||||||
&& m_config.contestMode ())) && r.mid(0,1)=="R") {
|
&& ui->cbVHFcontest->isChecked())) && r.mid(0,1)=="R") {
|
||||||
m_ntx=4;
|
m_ntx=4;
|
||||||
m_QSOProgress = ROGERS;
|
m_QSOProgress = ROGERS;
|
||||||
ui->txrb4->setChecked(true);
|
ui->txrb4->setChecked(true);
|
||||||
@ -3830,7 +3961,7 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
}
|
}
|
||||||
else if (!(m_bAutoReply && m_QSOProgress > CALLING)) {
|
else if (!(m_bAutoReply && m_QSOProgress > CALLING)) {
|
||||||
if ((message_words.size () > 4 && message_words.at (1).contains (m_baseCall) && message_words.at (4) == "OOO")
|
if ((message_words.size () > 4 && message_words.at (1).contains (m_baseCall) && message_words.at (4) == "OOO")
|
||||||
|| ((m_mode=="MSK144" or m_mode=="FT8") && m_config.contestMode())) {
|
|| ((m_mode=="MSK144" or m_mode=="FT8") && ui->cbVHFcontest->isChecked())) {
|
||||||
// EME short code report or MSK144/FT8 contest mode reply, send back Tx3
|
// EME short code report or MSK144/FT8 contest mode reply, send back Tx3
|
||||||
m_ntx = 3;
|
m_ntx = 3;
|
||||||
m_QSOProgress = ROGER_REPORT;
|
m_QSOProgress = ROGER_REPORT;
|
||||||
@ -3927,8 +4058,7 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
|
|
||||||
// if we get here then we are reacting to the message
|
// if we get here then we are reacting to the message
|
||||||
if (m_bAutoReply) m_bCallingCQ = CALLING == m_QSOProgress;
|
if (m_bAutoReply) m_bCallingCQ = CALLING == m_QSOProgress;
|
||||||
|
if (ui->RxFreqSpinBox->isEnabled () and m_mode != "MSK144" and !shift) {
|
||||||
if (ui->RxFreqSpinBox->isEnabled () and m_mode != "MSK144") {
|
|
||||||
ui->RxFreqSpinBox->setValue (frequency); //Set Rx freq
|
ui->RxFreqSpinBox->setValue (frequency); //Set Rx freq
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3941,9 +4071,8 @@ void MainWindow::processMessage(DecodedText const& message, bool ctrl, bool alt)
|
|||||||
m_QSOText = s2;
|
m_QSOText = s2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hiscall != "73"
|
if (Radio::is_callsign (hiscall)
|
||||||
&& (base_call != qso_partner_base_call || base_call != hiscall))
|
&& (base_call != qso_partner_base_call || base_call != hiscall)) {
|
||||||
{
|
|
||||||
if (qso_partner_base_call != base_call) {
|
if (qso_partner_base_call != base_call) {
|
||||||
// clear the DX grid if the base call of his call is different
|
// clear the DX grid if the base call of his call is different
|
||||||
// from the current DX call
|
// from the current DX call
|
||||||
@ -4062,7 +4191,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
rpt.sprintf("%+2.2d",n);
|
rpt.sprintf("%+2.2d",n);
|
||||||
|
|
||||||
if(m_mode=="MSK144" or m_mode=="FT8") {
|
if(m_mode=="MSK144" or m_mode=="FT8") {
|
||||||
if(m_config.contestMode()) {
|
if(ui->cbVHFcontest->isChecked()) {
|
||||||
t=t0 + my_grid;
|
t=t0 + my_grid;
|
||||||
msgtype(t, ui->tx2);
|
msgtype(t, ui->tx2);
|
||||||
t=t0 + "R " + my_grid;
|
t=t0 + "R " + my_grid;
|
||||||
@ -4072,7 +4201,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
if(m_mode=="MSK144" and m_bShMsgs) {
|
if(m_mode=="MSK144" and m_bShMsgs) {
|
||||||
int i=t0.length()-1;
|
int i=t0.length()-1;
|
||||||
t0="<" + t0.mid(0,i) + "> ";
|
t0="<" + t0.mid(0,i) + "> ";
|
||||||
if(!m_config.contestMode()) {
|
if(!ui->cbVHFcontest->isChecked()) {
|
||||||
if(n<=-2) n=-3;
|
if(n<=-2) n=-3;
|
||||||
if(n>=-1 and n<=1) n=0;
|
if(n>=-1 and n<=1) n=0;
|
||||||
if(n>=2 and n<=4) n=3;
|
if(n>=2 and n<=4) n=3;
|
||||||
@ -4083,7 +4212,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
rpt.sprintf("%+2.2d",n);
|
rpt.sprintf("%+2.2d",n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((m_mode!="MSK144" and m_mode!="FT8") or !m_config.contestMode()) {
|
if((m_mode!="MSK144" and m_mode!="FT8") or !ui->cbVHFcontest->isChecked()) {
|
||||||
t=t00 + rpt;
|
t=t00 + rpt;
|
||||||
msgtype(t, ui->tx2);
|
msgtype(t, ui->tx2);
|
||||||
t=t0 + "R" + rpt;
|
t=t0 + "R" + rpt;
|
||||||
@ -4119,7 +4248,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
msgtype(t + my_grid, ui->tx1);
|
msgtype(t + my_grid, ui->tx1);
|
||||||
if (!eme_short_codes) {
|
if (!eme_short_codes) {
|
||||||
if ((m_mode=="MSK144" || m_mode=="FT8")
|
if ((m_mode=="MSK144" || m_mode=="FT8")
|
||||||
&& m_config.contestMode()) {
|
&& ui->cbVHFcontest->isChecked()) {
|
||||||
msgtype(t + "R " + my_grid, ui->tx3);
|
msgtype(t + "R " + my_grid, ui->tx3);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -4133,7 +4262,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
|
|
||||||
case Configuration::type_2_msg_3_full:
|
case Configuration::type_2_msg_3_full:
|
||||||
if ((m_mode=="MSK144" || m_mode=="FT8")
|
if ((m_mode=="MSK144" || m_mode=="FT8")
|
||||||
&& m_config.contestMode()) {
|
&& ui->cbVHFcontest->isChecked()) {
|
||||||
msgtype(t + "R " + my_grid, ui->tx3);
|
msgtype(t + "R " + my_grid, ui->tx3);
|
||||||
msgtype(t + "RRR", ui->tx4);
|
msgtype(t + "RRR", ui->tx4);
|
||||||
}
|
}
|
||||||
@ -4150,7 +4279,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
msgtype(t00 + my_grid, ui->tx1);
|
msgtype(t00 + my_grid, ui->tx1);
|
||||||
if (!eme_short_codes) {
|
if (!eme_short_codes) {
|
||||||
if ((m_mode=="MSK144" || m_mode=="FT8")
|
if ((m_mode=="MSK144" || m_mode=="FT8")
|
||||||
&& m_config.contestMode()) {
|
&& ui->cbVHFcontest->isChecked()) {
|
||||||
msgtype(t + "R " + my_grid, ui->tx3);
|
msgtype(t + "R " + my_grid, ui->tx3);
|
||||||
msgtype(t + "RRR", ui->tx4);
|
msgtype(t + "RRR", ui->tx4);
|
||||||
}
|
}
|
||||||
@ -4361,7 +4490,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype()
|
|||||||
if(itype==7 and m_config.enable_VHF_features() and
|
if(itype==7 and m_config.enable_VHF_features() and
|
||||||
m_mode=="JT65") shortMsg=true;
|
m_mode=="JT65") shortMsg=true;
|
||||||
if(m_mode=="MSK144" and t.mid(0,1)=="<") text=false;
|
if(m_mode=="MSK144" and t.mid(0,1)=="<") text=false;
|
||||||
if((m_mode=="MSK144" or m_mode=="FT8") and m_config.contestMode()) {
|
if((m_mode=="MSK144" or m_mode=="FT8") and ui->cbVHFcontest->isChecked()) {
|
||||||
int i0=t.trimmed().length()-7;
|
int i0=t.trimmed().length()-7;
|
||||||
if(t.mid(i0,3)==" R ") text=false;
|
if(t.mid(i0,3)==" R ") text=false;
|
||||||
}
|
}
|
||||||
@ -4540,8 +4669,8 @@ void MainWindow::displayWidgets(int n)
|
|||||||
if(i==11) ui->pbTxMode->setVisible(b);
|
if(i==11) ui->pbTxMode->setVisible(b);
|
||||||
if(i==12) ui->pbR2T->setVisible(b);
|
if(i==12) ui->pbR2T->setVisible(b);
|
||||||
if(i==13) ui->pbT2R->setVisible(b);
|
if(i==13) ui->pbT2R->setVisible(b);
|
||||||
if(i==14) ui->cbTxLock->setVisible(b);
|
if(i==14) ui->cbHoldTxFreq->setVisible(b);
|
||||||
if(i==14 and (!b)) ui->cbTxLock->setChecked(false);
|
if(i==14 and (!b)) ui->cbHoldTxFreq->setChecked(false);
|
||||||
if(i==15) ui->sbSubmode->setVisible(b);
|
if(i==15) ui->sbSubmode->setVisible(b);
|
||||||
if(i==16) ui->syncSpinBox->setVisible(b);
|
if(i==16) ui->syncSpinBox->setVisible(b);
|
||||||
if(i==17) ui->WSPR_controls_widget->setVisible(b);
|
if(i==17) ui->WSPR_controls_widget->setVisible(b);
|
||||||
@ -4552,11 +4681,7 @@ void MainWindow::displayWidgets(int n)
|
|||||||
if(i==20) ui->actionInclude_averaging->setVisible (b);
|
if(i==20) ui->actionInclude_averaging->setVisible (b);
|
||||||
if(i==21) ui->actionInclude_correlation->setVisible (b);
|
if(i==21) ui->actionInclude_correlation->setVisible (b);
|
||||||
if(i==22) {
|
if(i==22) {
|
||||||
if(b && !m_echoGraph->isVisible()) {
|
if(!b && m_echoGraph->isVisible()) m_echoGraph->hide();
|
||||||
m_echoGraph->show();
|
|
||||||
} else {
|
|
||||||
if(m_echoGraph->isVisible()) m_echoGraph->hide();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(i==23) {
|
if(i==23) {
|
||||||
ui->cbSWL->setVisible(b);
|
ui->cbSWL->setVisible(b);
|
||||||
@ -4565,6 +4690,8 @@ void MainWindow::displayWidgets(int n)
|
|||||||
}
|
}
|
||||||
ui->cbFirst->setVisible ("FT8" == m_mode);
|
ui->cbFirst->setVisible ("FT8" == m_mode);
|
||||||
ui->actionEnable_AP->setVisible ("FT8" == m_mode);
|
ui->actionEnable_AP->setVisible ("FT8" == m_mode);
|
||||||
|
ui->cbVHFcontest->setVisible(m_mode=="FT8" or m_mode=="MSK144");
|
||||||
|
ui->measure_check_box->setVisible ("FreqCal" == m_mode);
|
||||||
m_lastCallsign.clear (); // ensures Tx5 is updated for new modes
|
m_lastCallsign.clear (); // ensures Tx5 is updated for new modes
|
||||||
genStdMsgs (m_rpt, true);
|
genStdMsgs (m_rpt, true);
|
||||||
}
|
}
|
||||||
@ -5004,6 +5131,7 @@ void MainWindow::on_actionFreqCal_triggered()
|
|||||||
setup_status_bar (true);
|
setup_status_bar (true);
|
||||||
// 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2
|
// 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2
|
||||||
ui->decodedTextLabel->setText(" UTC Freq CAL Offset fMeas DF Level S/N");
|
ui->decodedTextLabel->setText(" UTC Freq CAL Offset fMeas DF Level S/N");
|
||||||
|
ui->measure_check_box->setChecked (false);
|
||||||
displayWidgets(nWidgets("001101000000000000000000"));
|
displayWidgets(nWidgets("001101000000000000000000"));
|
||||||
statusChanged();
|
statusChanged();
|
||||||
}
|
}
|
||||||
@ -5087,7 +5215,7 @@ void MainWindow::fast_config(bool b)
|
|||||||
void MainWindow::on_TxFreqSpinBox_valueChanged(int n)
|
void MainWindow::on_TxFreqSpinBox_valueChanged(int n)
|
||||||
{
|
{
|
||||||
m_wideGraph->setTxFreq(n);
|
m_wideGraph->setTxFreq(n);
|
||||||
if(m_lockTxFreq) ui->RxFreqSpinBox->setValue(n);
|
// if(m_holdTxFreq) ui->RxFreqSpinBox->setValue(n);
|
||||||
if(m_mode!="MSK144") {
|
if(m_mode!="MSK144") {
|
||||||
Q_EMIT transmitFrequency (n - m_XIT);
|
Q_EMIT transmitFrequency (n - m_XIT);
|
||||||
}
|
}
|
||||||
@ -5097,19 +5225,10 @@ void MainWindow::on_TxFreqSpinBox_valueChanged(int n)
|
|||||||
void MainWindow::on_RxFreqSpinBox_valueChanged(int n)
|
void MainWindow::on_RxFreqSpinBox_valueChanged(int n)
|
||||||
{
|
{
|
||||||
m_wideGraph->setRxFreq(n);
|
m_wideGraph->setRxFreq(n);
|
||||||
if (m_mode == "FreqCal"
|
if (m_mode == "FreqCal") {
|
||||||
&& m_frequency_list_fcal_iter != m_config.frequencies ()->end ())
|
setRig ();
|
||||||
{
|
|
||||||
setRig (m_frequency_list_fcal_iter->frequency_ - n);
|
|
||||||
}
|
}
|
||||||
if (m_lockTxFreq && ui->TxFreqSpinBox->isEnabled ())
|
|
||||||
{
|
|
||||||
ui->TxFreqSpinBox->setValue (n);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
statusUpdate ();
|
statusUpdate ();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionQuickDecode_toggled (bool checked)
|
void MainWindow::on_actionQuickDecode_toggled (bool checked)
|
||||||
@ -5240,15 +5359,11 @@ void MainWindow::band_changed (Frequency f)
|
|||||||
if ("FreqCal" == m_mode)
|
if ("FreqCal" == m_mode)
|
||||||
{
|
{
|
||||||
m_frequency_list_fcal_iter = m_config.frequencies ()->find (f);
|
m_frequency_list_fcal_iter = m_config.frequencies ()->find (f);
|
||||||
setRig (f - ui->RxFreqSpinBox->value ());
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
float r=m_freqNominal/(f+0.0001);
|
float r=m_freqNominal/(f+0.0001);
|
||||||
if(r<0.9 or r>1.1) m_bVHFwarned=false;
|
if(r<0.9 or r>1.1) m_bVHFwarned=false;
|
||||||
setRig (f);
|
setRig (f);
|
||||||
setXIT (ui->TxFreqSpinBox->value ());
|
setXIT (ui->TxFreqSpinBox->value ());
|
||||||
}
|
|
||||||
if(monitor_off) monitor(false);
|
if(monitor_off) monitor(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5468,7 +5583,7 @@ void MainWindow::rigOpen ()
|
|||||||
|
|
||||||
void MainWindow::on_pbR2T_clicked()
|
void MainWindow::on_pbR2T_clicked()
|
||||||
{
|
{
|
||||||
if (ui->TxFreqSpinBox->isEnabled ()) ui->TxFreqSpinBox->setValue(ui->RxFreqSpinBox->value ());
|
ui->TxFreqSpinBox->setValue(ui->RxFreqSpinBox->value ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_pbT2R_clicked()
|
void MainWindow::on_pbT2R_clicked()
|
||||||
@ -5542,11 +5657,7 @@ void MainWindow::setXIT(int n, Frequency base)
|
|||||||
|
|
||||||
void MainWindow::setFreq4(int rxFreq, int txFreq)
|
void MainWindow::setFreq4(int rxFreq, int txFreq)
|
||||||
{
|
{
|
||||||
if (ui->RxFreqSpinBox->isEnabled ())
|
if (ui->RxFreqSpinBox->isEnabled ()) ui->RxFreqSpinBox->setValue(rxFreq);
|
||||||
{
|
|
||||||
ui->RxFreqSpinBox->setValue(rxFreq);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_mode.startsWith ("WSPR")) {
|
if(m_mode.startsWith ("WSPR")) {
|
||||||
ui->WSPRfreqSpinBox->setValue(txFreq);
|
ui->WSPRfreqSpinBox->setValue(txFreq);
|
||||||
} else {
|
} else {
|
||||||
@ -5565,11 +5676,9 @@ void MainWindow::setFreq4(int rxFreq, int txFreq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_cbTxLock_clicked(bool checked)
|
void MainWindow::on_cbHoldTxFreq_clicked(bool checked)
|
||||||
{
|
{
|
||||||
m_lockTxFreq=checked;
|
m_holdTxFreq=checked;
|
||||||
m_wideGraph->setLockTxFreq(m_lockTxFreq);
|
|
||||||
if(m_lockTxFreq) on_pbR2T_clicked();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& s)
|
void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& s)
|
||||||
@ -5723,6 +5832,7 @@ void MainWindow::transmit (double snr)
|
|||||||
|
|
||||||
if (m_modeTx == "FT8") {
|
if (m_modeTx == "FT8") {
|
||||||
toneSpacing=12000.0/1920.0;
|
toneSpacing=12000.0/1920.0;
|
||||||
|
if(m_config.x2ToneSpacing()) toneSpacing=2*12000.0/1920.0;
|
||||||
Q_EMIT sendMessage (NUM_FT8_SYMBOLS,
|
Q_EMIT sendMessage (NUM_FT8_SYMBOLS,
|
||||||
1920.0, ui->TxFreqSpinBox->value () - m_XIT,
|
1920.0, ui->TxFreqSpinBox->value () - m_XIT,
|
||||||
toneSpacing, m_soundOutput, m_config.audio_output_channel (),
|
toneSpacing, m_soundOutput, m_config.audio_output_channel (),
|
||||||
@ -5746,6 +5856,7 @@ void MainWindow::transmit (double snr)
|
|||||||
int nsps[]={480,240,120,60};
|
int nsps[]={480,240,120,60};
|
||||||
double sps=m_nsps;
|
double sps=m_nsps;
|
||||||
m_toneSpacing=nsub*12000.0/6912.0;
|
m_toneSpacing=nsub*12000.0/6912.0;
|
||||||
|
if(m_config.x2ToneSpacing()) m_toneSpacing=2.0*m_toneSpacing;
|
||||||
bool fastmode=false;
|
bool fastmode=false;
|
||||||
if(m_bFast9 and (m_nSubMode>=4)) {
|
if(m_bFast9 and (m_nSubMode>=4)) {
|
||||||
fastmode=true;
|
fastmode=true;
|
||||||
@ -5914,7 +6025,7 @@ void MainWindow::transmitDisplay (bool transmitting)
|
|||||||
|
|
||||||
auto QSY_allowed = !transmitting or m_config.tx_QSY_allowed () or
|
auto QSY_allowed = !transmitting or m_config.tx_QSY_allowed () or
|
||||||
!m_config.split_mode ();
|
!m_config.split_mode ();
|
||||||
if (ui->cbTxLock->isChecked ()) {
|
if (ui->cbHoldTxFreq->isChecked ()) {
|
||||||
ui->RxFreqSpinBox->setEnabled (QSY_allowed);
|
ui->RxFreqSpinBox->setEnabled (QSY_allowed);
|
||||||
ui->pbT2R->setEnabled (QSY_allowed);
|
ui->pbT2R->setEnabled (QSY_allowed);
|
||||||
}
|
}
|
||||||
@ -5930,7 +6041,7 @@ void MainWindow::transmitDisplay (bool transmitting)
|
|||||||
} else {
|
} else {
|
||||||
ui->TxFreqSpinBox->setEnabled (QSY_allowed and !m_bFastMode);
|
ui->TxFreqSpinBox->setEnabled (QSY_allowed and !m_bFastMode);
|
||||||
ui->pbR2T->setEnabled (QSY_allowed);
|
ui->pbR2T->setEnabled (QSY_allowed);
|
||||||
ui->cbTxLock->setEnabled (QSY_allowed);
|
ui->cbHoldTxFreq->setEnabled (QSY_allowed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6084,7 +6195,9 @@ void MainWindow::on_cbTx6_toggled(bool)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Takes a decoded CQ line and sets it up for reply
|
// Takes a decoded CQ line and sets it up for reply
|
||||||
void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text)
|
void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 delta_frequency
|
||||||
|
, QString const& mode, QString const& message_text
|
||||||
|
, bool /*low_confidence*/, quint8 modifiers)
|
||||||
{
|
{
|
||||||
if (!m_config.accept_udp_requests ())
|
if (!m_config.accept_udp_requests ())
|
||||||
{
|
{
|
||||||
@ -6101,7 +6214,7 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
|
|||||||
.arg (snr, 3)
|
.arg (snr, 3)
|
||||||
.arg (delta_time, 4, 'f', 1)
|
.arg (delta_time, 4, 'f', 1)
|
||||||
.arg (delta_frequency, 4)
|
.arg (delta_frequency, 4)
|
||||||
.arg (mode)
|
.arg (mode, -2)
|
||||||
.arg (message_text);
|
.arg (message_text);
|
||||||
auto messages = ui->decodedTextBrowser->toPlainText ();
|
auto messages = ui->decodedTextBrowser->toPlainText ();
|
||||||
auto position = messages.lastIndexOf (cqtext);
|
auto position = messages.lastIndexOf (cqtext);
|
||||||
@ -6113,7 +6226,7 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
|
|||||||
.arg (snr, 3)
|
.arg (snr, 3)
|
||||||
.arg ('-' + QString::number (delta_time, 'f', 1), 4)
|
.arg ('-' + QString::number (delta_time, 'f', 1), 4)
|
||||||
.arg (delta_frequency, 4)
|
.arg (delta_frequency, 4)
|
||||||
.arg (mode)
|
.arg (mode, -2)
|
||||||
.arg (message_text));
|
.arg (message_text));
|
||||||
}
|
}
|
||||||
if (position >= 0)
|
if (position >= 0)
|
||||||
@ -6133,8 +6246,10 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
|
|||||||
position = ui->decodedTextBrowser->toPlainText().indexOf(QChar::LineFeed,position);
|
position = ui->decodedTextBrowser->toPlainText().indexOf(QChar::LineFeed,position);
|
||||||
m_bDoubleClicked = true;
|
m_bDoubleClicked = true;
|
||||||
auto start = messages.left (position).lastIndexOf (QChar::LineFeed) + 1;
|
auto start = messages.left (position).lastIndexOf (QChar::LineFeed) + 1;
|
||||||
DecodedText message {messages.mid (start, position - start), ("MSK144" == m_mode || "FT8" == m_mode) && m_config.contestMode (), m_config.my_grid ()};
|
DecodedText message {messages.mid (start, position - start), ("MSK144" == m_mode || "FT8" == m_mode) &&
|
||||||
processMessage (message);
|
ui->cbVHFcontest->isChecked(), m_config.my_grid ()};
|
||||||
|
Qt::KeyboardModifiers kbmod {modifiers << 24};
|
||||||
|
processMessage (message, kbmod);
|
||||||
tx_watchdog (false);
|
tx_watchdog (false);
|
||||||
QApplication::alert (this);
|
QApplication::alert (this);
|
||||||
}
|
}
|
||||||
@ -6186,15 +6301,16 @@ void MainWindow::postDecode (bool is_new, QString const& message)
|
|||||||
{
|
{
|
||||||
auto const& decode = message.trimmed ();
|
auto const& decode = message.trimmed ();
|
||||||
auto const& parts = decode.left (22).split (' ', QString::SkipEmptyParts);
|
auto const& parts = decode.left (22).split (' ', QString::SkipEmptyParts);
|
||||||
if (!m_diskData && parts.size () >= 5)
|
if (parts.size () >= 5)
|
||||||
{
|
{
|
||||||
auto has_seconds = parts[0].size () > 4;
|
auto has_seconds = parts[0].size () > 4;
|
||||||
m_messageClient->decode (is_new
|
m_messageClient->decode (is_new
|
||||||
, QTime::fromString (parts[0], has_seconds ? "hhmmss" : "hhmm")
|
, QTime::fromString (parts[0], has_seconds ? "hhmmss" : "hhmm")
|
||||||
, parts[1].toInt ()
|
, parts[1].toInt ()
|
||||||
, parts[2].toFloat (), parts[3].toUInt (), parts[4][0]
|
, parts[2].toFloat (), parts[3].toUInt (), parts[4]
|
||||||
, decode.mid (has_seconds ? 24 : 22, 21)
|
, decode.mid (has_seconds ? 24 : 22, 21)
|
||||||
, QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1));
|
, QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1)
|
||||||
|
, m_diskData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6206,7 +6322,8 @@ void MainWindow::postWSPRDecode (bool is_new, QStringList parts)
|
|||||||
}
|
}
|
||||||
m_messageClient->WSPR_decode (is_new, QTime::fromString (parts[0], "hhmm"), parts[1].toInt ()
|
m_messageClient->WSPR_decode (is_new, QTime::fromString (parts[0], "hhmm"), parts[1].toInt ()
|
||||||
, parts[2].toFloat (), Radio::frequency (parts[3].toFloat (), 6)
|
, parts[2].toFloat (), Radio::frequency (parts[3].toFloat (), 6)
|
||||||
, parts[4].toInt (), parts[5], parts[6], parts[7].toInt ());
|
, parts[4].toInt (), parts[5], parts[6], parts[7].toInt ()
|
||||||
|
, m_diskData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::networkError (QString const& e)
|
void MainWindow::networkError (QString const& e)
|
||||||
@ -6545,6 +6662,10 @@ void MainWindow::setRig (Frequency f)
|
|||||||
m_freqTxNominal = m_freqNominal;
|
m_freqTxNominal = m_freqNominal;
|
||||||
if (m_astroWidget) m_astroWidget->nominal_frequency (m_freqNominal, m_freqTxNominal);
|
if (m_astroWidget) m_astroWidget->nominal_frequency (m_freqNominal, m_freqTxNominal);
|
||||||
}
|
}
|
||||||
|
if (m_mode == "FreqCal"
|
||||||
|
&& m_frequency_list_fcal_iter != m_config.frequencies ()->end ()) {
|
||||||
|
m_freqNominal = m_frequency_list_fcal_iter->frequency_ - ui->RxFreqSpinBox->value ();
|
||||||
|
}
|
||||||
if(m_transmitting && !m_config.tx_QSY_allowed ()) return;
|
if(m_transmitting && !m_config.tx_QSY_allowed ()) return;
|
||||||
if ((m_monitoring || m_transmitting) && m_config.transceiver_online ())
|
if ((m_monitoring || m_transmitting) && m_config.transceiver_online ())
|
||||||
{
|
{
|
||||||
@ -6601,7 +6722,8 @@ void MainWindow::on_actionErase_reference_spectrum_triggered()
|
|||||||
|
|
||||||
void MainWindow::freqCalStep()
|
void MainWindow::freqCalStep()
|
||||||
{
|
{
|
||||||
if (++m_frequency_list_fcal_iter == m_config.frequencies ()->end ()) {
|
if (m_frequency_list_fcal_iter == m_config.frequencies ()->end ()
|
||||||
|
|| ++m_frequency_list_fcal_iter == m_config.frequencies ()->end ()) {
|
||||||
m_frequency_list_fcal_iter = m_config.frequencies ()->begin ();
|
m_frequency_list_fcal_iter = m_config.frequencies ()->begin ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6743,6 +6865,13 @@ void MainWindow::on_cbAutoSeq_toggled(bool b)
|
|||||||
ui->cbFirst->setVisible((m_mode=="FT8") and b);
|
ui->cbFirst->setVisible((m_mode=="FT8") and b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_measure_check_box_stateChanged (int state)
|
||||||
|
{
|
||||||
|
if ("FreqCal" == m_mode) {
|
||||||
|
m_config.enable_calibration (Qt::Checked != state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::write_transmit_entry (QString const& file_name)
|
void MainWindow::write_transmit_entry (QString const& file_name)
|
||||||
{
|
{
|
||||||
QFile f {m_config.writeable_data_dir ().absoluteFilePath (file_name)};
|
QFile f {m_config.writeable_data_dir ().absoluteFilePath (file_name)};
|
||||||
|
21
mainwindow.h
@ -107,8 +107,8 @@ public slots:
|
|||||||
void diskDat();
|
void diskDat();
|
||||||
void freezeDecode(int n);
|
void freezeDecode(int n);
|
||||||
void guiUpdate();
|
void guiUpdate();
|
||||||
void doubleClickOnCall(bool shift, bool ctrl);
|
void doubleClickOnCall (Qt::KeyboardModifiers);
|
||||||
void doubleClickOnCall2(bool shift, bool ctrl);
|
void doubleClickOnCall2(Qt::KeyboardModifiers);
|
||||||
void readFromStdout();
|
void readFromStdout();
|
||||||
void p1ReadFromStdout();
|
void p1ReadFromStdout();
|
||||||
void setXIT(int n, Frequency base = 0u);
|
void setXIT(int n, Frequency base = 0u);
|
||||||
@ -149,10 +149,14 @@ private slots:
|
|||||||
void on_actionSave_all_triggered();
|
void on_actionSave_all_triggered();
|
||||||
void on_actionKeyboard_shortcuts_triggered();
|
void on_actionKeyboard_shortcuts_triggered();
|
||||||
void on_actionSpecial_mouse_commands_triggered();
|
void on_actionSpecial_mouse_commands_triggered();
|
||||||
|
void on_actionSolve_FreqCal_triggered();
|
||||||
|
void on_actionCopyright_Notice_triggered();
|
||||||
void on_DecodeButton_clicked (bool);
|
void on_DecodeButton_clicked (bool);
|
||||||
void decode();
|
void decode();
|
||||||
void decodeBusy(bool b);
|
void decodeBusy(bool b);
|
||||||
void on_EraseButton_clicked();
|
void on_EraseButton_clicked();
|
||||||
|
void band_activity_cleared ();
|
||||||
|
void rx_frequency_activity_cleared ();
|
||||||
void on_txFirstCheckBox_stateChanged(int arg1);
|
void on_txFirstCheckBox_stateChanged(int arg1);
|
||||||
void set_dateTimeQSO(int m_ntx);
|
void set_dateTimeQSO(int m_ntx);
|
||||||
void set_ntx(int n);
|
void set_ntx(int n);
|
||||||
@ -222,7 +226,7 @@ private slots:
|
|||||||
void on_readFreq_clicked();
|
void on_readFreq_clicked();
|
||||||
void on_pbTxMode_clicked();
|
void on_pbTxMode_clicked();
|
||||||
void on_RxFreqSpinBox_valueChanged(int n);
|
void on_RxFreqSpinBox_valueChanged(int n);
|
||||||
void on_cbTxLock_clicked(bool checked);
|
void on_cbHoldTxFreq_clicked(bool checked);
|
||||||
void on_outAttenuation_valueChanged (int);
|
void on_outAttenuation_valueChanged (int);
|
||||||
void rigOpen ();
|
void rigOpen ();
|
||||||
void handle_transceiver_update (Transceiver::TransceiverState const&);
|
void handle_transceiver_update (Transceiver::TransceiverState const&);
|
||||||
@ -277,6 +281,7 @@ private slots:
|
|||||||
void on_actionQRA64_triggered();
|
void on_actionQRA64_triggered();
|
||||||
void on_actionFreqCal_triggered();
|
void on_actionFreqCal_triggered();
|
||||||
void splash_done ();
|
void splash_done ();
|
||||||
|
void on_measure_check_box_stateChanged (int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
|
Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
|
||||||
@ -401,6 +406,7 @@ private:
|
|||||||
qint32 m_nTx73;
|
qint32 m_nTx73;
|
||||||
qint32 m_UTCdisk;
|
qint32 m_UTCdisk;
|
||||||
qint32 m_wait;
|
qint32 m_wait;
|
||||||
|
qint32 m_i3bit;
|
||||||
|
|
||||||
bool m_btxok; //True if OK to transmit
|
bool m_btxok; //True if OK to transmit
|
||||||
bool m_diskData;
|
bool m_diskData;
|
||||||
@ -425,7 +431,7 @@ private:
|
|||||||
QString m_currentMessage;
|
QString m_currentMessage;
|
||||||
int m_lastMessageType;
|
int m_lastMessageType;
|
||||||
QString m_lastMessageSent;
|
QString m_lastMessageSent;
|
||||||
bool m_lockTxFreq;
|
bool m_holdTxFreq;
|
||||||
bool m_bShMsgs;
|
bool m_bShMsgs;
|
||||||
bool m_bSWL;
|
bool m_bSWL;
|
||||||
bool m_uploadSpots;
|
bool m_uploadSpots;
|
||||||
@ -454,6 +460,9 @@ private:
|
|||||||
bool m_bDoubleClicked;
|
bool m_bDoubleClicked;
|
||||||
bool m_bCallingCQ;
|
bool m_bCallingCQ;
|
||||||
bool m_bAutoReply;
|
bool m_bAutoReply;
|
||||||
|
bool m_bCheckedContest;
|
||||||
|
bool m_bDXped;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CALLING,
|
CALLING,
|
||||||
@ -593,8 +602,8 @@ private:
|
|||||||
void pskPost(DecodedText const& decodedtext);
|
void pskPost(DecodedText const& decodedtext);
|
||||||
void displayDialFrequency ();
|
void displayDialFrequency ();
|
||||||
void transmitDisplay (bool);
|
void transmitDisplay (bool);
|
||||||
void processMessage(DecodedText const&, bool ctrl = false, bool alt = false);
|
void processMessage(DecodedText const&, Qt::KeyboardModifiers = 0);
|
||||||
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text);
|
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence, quint8 modifiers);
|
||||||
void replayDecodes ();
|
void replayDecodes ();
|
||||||
void postDecode (bool is_new, QString const& message);
|
void postDecode (bool is_new, QString const& message);
|
||||||
void postWSPRDecode (bool is_new, QStringList message_parts);
|
void postWSPRDecode (bool is_new, QStringList message_parts);
|
||||||
|
747
mainwindow.ui
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>815</width>
|
<width>815</width>
|
||||||
<height>548</height>
|
<height>555</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -21,7 +21,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0,0">
|
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0,0">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0">
|
<layout class="QGridLayout" name="gridLayout" columnstretch="2,1">
|
||||||
<property name="horizontalSpacing">
|
<property name="horizontalSpacing">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
@ -334,7 +334,7 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="2,2,2,2,2,2,2,2,2,1">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="logQSOButton">
|
<widget class="QPushButton" name="logQSOButton">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@ -531,12 +531,6 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="cbMenus">
|
<widget class="QCheckBox" name="cbMenus">
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>60</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Menus</string>
|
<string>Menus</string>
|
||||||
</property>
|
</property>
|
||||||
@ -622,7 +616,10 @@ QLabel[oob="true"] {
|
|||||||
<item row="7" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QSpinBox" name="rptSpinBox">
|
<widget class="QSpinBox" name="rptSpinBox">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Signal report (dB)</p></body></html></string>
|
<string><html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefix">
|
<property name="prefix">
|
||||||
<string> Report </string>
|
<string> Report </string>
|
||||||
@ -638,6 +635,22 @@ QLabel[oob="true"] {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QPushButton" name="pbR2T">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Set Tx frequency to Rx Frequency</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx ← Rx</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="HintedSpinBox" name="sbFtol">
|
<widget class="HintedSpinBox" name="sbFtol">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -685,22 +698,6 @@ QLabel[oob="true"] {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QPushButton" name="pbR2T">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Set Tx frequency to Rx Frequency</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx ← Rx</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="0" rowspan="2" colspan="2">
|
<item row="13" column="0" rowspan="2" colspan="2">
|
||||||
<widget class="QWidget" name="VHFControls_widget" native="true">
|
<widget class="QWidget" name="VHFControls_widget" native="true">
|
||||||
<layout class="QGridLayout" name="gridLayout_8">
|
<layout class="QGridLayout" name="gridLayout_8">
|
||||||
@ -751,14 +748,11 @@ QLabel[oob="true"] {
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="cbFirst">
|
<widget class="QCheckBox" name="cbFirst">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Call the first decoded responder to my CQ.</p></body></html></string>
|
<string><html><head/><body><p>Chect to call the first decoded responder to my CQ.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Call 1st</string>
|
<string>Call 1st</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -779,6 +773,80 @@ QLabel[oob="true"] {
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QPushButton" name="pbTxMode">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Toggle Tx mode</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx JT9 @</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbHoldTxFreq">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Hold Tx Freq</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QPushButton" name="pbT2R">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Set Rx frequency to Tx Frequency</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Rx ← Tx</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QSpinBox" name="syncSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Sync </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QSpinBox" name="RxFreqSpinBox">
|
<widget class="QSpinBox" name="RxFreqSpinBox">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -804,53 +872,7 @@ QLabel[oob="true"] {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="17" column="0">
|
||||||
<widget class="QPushButton" name="pbT2R">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Set Rx frequency to Tx Frequency</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Rx ← Tx</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>5</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbTxLock">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Tx frequency tracks Rx frequency. </p><p>Not recommended for general use!</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Lock Tx=Rx</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QPushButton" name="pbTxMode">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Toggle Tx mode</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx JT9 @</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="16" column="0">
|
|
||||||
<spacer name="verticalSpacer_4">
|
<spacer name="verticalSpacer_4">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -863,28 +885,6 @@ QLabel[oob="true"] {
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
|
||||||
<widget class="QSpinBox" name="syncSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Sync </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>-1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>10</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QSpinBox" name="TxFreqSpinBox">
|
<widget class="QSpinBox" name="TxFreqSpinBox">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -923,7 +923,70 @@ QLabel[oob="true"] {
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="txFirstCheckBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx even/1st</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="LettersSpinBox" name="sbSubmode">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Submode </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>7</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="15" column="0" colspan="2">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_15">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbSWL">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to monitor Sh messages.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>SWL</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbVHFcontest">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to exchange grid locators instead of signal reports. DO NOT USE when propagation supports making world-wide contacts!</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>NA VHF Contest</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="measure_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Measure</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="0" colspan="2">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSpinBox" name="sbCQTxFreq">
|
<widget class="QSpinBox" name="sbCQTxFreq">
|
||||||
@ -962,48 +1025,6 @@ QLabel[oob="true"] {
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QCheckBox" name="txFirstCheckBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx even/1st</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="1">
|
|
||||||
<widget class="LettersSpinBox" name="sbSubmode">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Submode </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>7</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="15" column="0">
|
|
||||||
<widget class="QCheckBox" name="cbSWL">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to monitor Sh messages.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SWL</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -1021,146 +1042,17 @@ QLabel[oob="true"] {
|
|||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="gridLayout_6">
|
<layout class="QGridLayout" name="gridLayout_7">
|
||||||
<property name="leftMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QPushButton" name="genStdMsgsPushButton">
|
<layout class="QGridLayout" name="gridLayout_6">
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate standard messages for minimal QSO</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Generate Std Msgs</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
|
||||||
<widget class="QLabel" name="label_5">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Queue up the next Tx message</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Next</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="2" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Switch to this Tx message NOW</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Now</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLineEdit" name="tx1">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
|
||||||
<widget class="DoubleClickableRadioButton" name="txrb1">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>Ctrl+1</string>
|
|
||||||
</property>
|
|
||||||
<attribute name="buttonGroup">
|
|
||||||
<string notr="true">buttonGroup</string>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="DoubleClickablePushButton" name="txb1">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compund call holders)</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="layoutDirection">
|
|
||||||
<enum>Qt::LeftToRight</enum>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx &1</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>Alt+1</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLineEdit" name="tx2">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
|
||||||
<widget class="QRadioButton" name="txrb2">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Send this message in next Tx interval</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>Ctrl+2</string>
|
|
||||||
</property>
|
|
||||||
<attribute name="buttonGroup">
|
|
||||||
<string notr="true">buttonGroup</string>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
<item row="2" column="2">
|
||||||
<widget class="QPushButton" name="txb2">
|
<widget class="QPushButton" name="txb2">
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Switch to this Tx message NOW</string>
|
<string>Switch to this Tx message NOW</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Tx &2</string>
|
<string>Tx &2</string>
|
||||||
</property>
|
</property>
|
||||||
@ -1170,20 +1062,16 @@ QLabel[oob="true"] {
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QLineEdit" name="tx3">
|
<widget class="QLineEdit" name="tx3"/>
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
<item row="3" column="1">
|
||||||
<widget class="QRadioButton" name="txrb3">
|
<widget class="QRadioButton" name="txrb3">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Send this message in next Tx interval</string>
|
<string>Send this message in next Tx interval</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">margin-left: 10%; margin-right: 0%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@ -1195,40 +1083,14 @@ QLabel[oob="true"] {
|
|||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
<item row="4" column="1">
|
||||||
<widget class="QPushButton" name="txb3">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Switch to this Tx message NOW</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx &3</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>Alt+3</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QLineEdit" name="tx4">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
|
||||||
<widget class="DoubleClickableRadioButton" name="txrb4">
|
<widget class="DoubleClickableRadioButton" name="txrb4">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html></string>
|
<string><html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">margin-left: 10%; margin-right: 0%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@ -1240,52 +1102,14 @@ QLabel[oob="true"] {
|
|||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="2">
|
<item row="5" column="1">
|
||||||
<widget class="DoubleClickablePushButton" name="txb4">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx &4</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>Alt+4</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QComboBox" name="tx5">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Enter a free text message (maximum 13 characters)
|
|
||||||
or select a predefined macro from the dropdown list.
|
|
||||||
Press ENTER to add the current text to the predefined
|
|
||||||
list. The list can be maintained in Settings (F2).</string>
|
|
||||||
</property>
|
|
||||||
<property name="editable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="insertPolicy">
|
|
||||||
<enum>QComboBox::InsertAtBottom</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
|
||||||
<widget class="DoubleClickableRadioButton" name="txrb5">
|
<widget class="DoubleClickableRadioButton" name="txrb5">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html></string>
|
<string><html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">margin-left: 10%; margin-right: 0%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@ -1299,15 +1123,12 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</item>
|
</item>
|
||||||
<item row="5" column="2">
|
<item row="5" column="2">
|
||||||
<widget class="DoubleClickablePushButton" name="txb5">
|
<widget class="DoubleClickablePushButton" name="txb5">
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html></string>
|
<string><html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Tx &5</string>
|
<string>Tx &5</string>
|
||||||
</property>
|
</property>
|
||||||
@ -1316,24 +1137,175 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="4" column="2">
|
||||||
<widget class="QLineEdit" name="tx6">
|
<widget class="DoubleClickablePushButton" name="txb4">
|
||||||
<property name="sizePolicy">
|
<property name="toolTip">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
<string><html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html></string>
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3%</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx &4</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Alt+4</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QComboBox" name="tx5">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Enter a free text message (maximum 13 characters)
|
||||||
|
or select a predefined macro from the dropdown list.
|
||||||
|
Press ENTER to add the current text to the predefined
|
||||||
|
list. The list can be maintained in Settings (F2).</string>
|
||||||
|
</property>
|
||||||
|
<property name="editable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="insertPolicy">
|
||||||
|
<enum>QComboBox::InsertAtBottom</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLineEdit" name="tx1">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
|
<item row="0" column="2">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Switch to this Tx message NOW</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Now</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="DoubleClickablePushButton" name="txb1">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compund call holders)</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="layoutDirection">
|
||||||
|
<enum>Qt::LeftToRight</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3%</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx &1</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Alt+1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Queue up the next Tx message</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Next</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="DoubleClickableRadioButton" name="txrb1">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">margin-left: 10%; margin-right: 0%</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Ctrl+1</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="buttonGroup">
|
||||||
|
<string notr="true">buttonGroup</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLineEdit" name="tx2"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QRadioButton" name="txrb2">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Send this message in next Tx interval</string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">margin-left: 10%; margin-right: 0%</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Ctrl+2</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="buttonGroup">
|
||||||
|
<string notr="true">buttonGroup</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QPushButton" name="genStdMsgsPushButton">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Generate standard messages for minimal QSO</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Generate Std Msgs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLineEdit" name="tx4"/>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<widget class="QPushButton" name="txb3">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Switch to this Tx message NOW</string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3%</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx &3</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Alt+3</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLineEdit" name="tx6">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
<widget class="QRadioButton" name="txrb6">
|
<widget class="QRadioButton" name="txrb6">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Send this message in next Tx interval</string>
|
<string>Send this message in next Tx interval</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">margin-left: 10%; margin-right: 0%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@ -1350,15 +1322,12 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</item>
|
</item>
|
||||||
<item row="6" column="2">
|
<item row="6" column="2">
|
||||||
<widget class="QPushButton" name="txb6">
|
<widget class="QPushButton" name="txb6">
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Switch to this Tx message NOW</string>
|
<string>Switch to this Tx message NOW</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3%</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Tx &6</string>
|
<string>Tx &6</string>
|
||||||
</property>
|
</property>
|
||||||
@ -1368,6 +1337,8 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab_2">
|
<widget class="QWidget" name="tab_2">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
@ -1388,8 +1359,8 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
<property name="spacing">
|
<property name="horizontalSpacing">
|
||||||
<number>2</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label_9">
|
<widget class="QLabel" name="label_9">
|
||||||
@ -2401,6 +2372,8 @@ QPushButton[state="ok"] {
|
|||||||
<addaction name="actionSpecial_mouse_commands"/>
|
<addaction name="actionSpecial_mouse_commands"/>
|
||||||
<addaction name="actionShort_list_of_add_on_prefixes_and_suffixes"/>
|
<addaction name="actionShort_list_of_add_on_prefixes_and_suffixes"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionCopyright_Notice"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
<addaction name="actionAbout"/>
|
<addaction name="actionAbout"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuMode">
|
<widget class="QMenu" name="menuMode">
|
||||||
@ -2440,6 +2413,7 @@ QPushButton[state="ok"] {
|
|||||||
<addaction name="view_phase_response_action"/>
|
<addaction name="view_phase_response_action"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionFrequency_calibration"/>
|
<addaction name="actionFrequency_calibration"/>
|
||||||
|
<addaction name="actionSolve_FreqCal"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menuFile"/>
|
<addaction name="menuFile"/>
|
||||||
<addaction name="menuConfig"/>
|
<addaction name="menuConfig"/>
|
||||||
@ -2985,6 +2959,19 @@ QPushButton[state="ok"] {
|
|||||||
<string>Enable AP</string>
|
<string>Enable AP</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionSolve_FreqCal">
|
||||||
|
<property name="text">
|
||||||
|
<string>Solve for calibration parameters</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionCopyright_Notice">
|
||||||
|
<property name="text">
|
||||||
|
<string>Copyright notice</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Shift+F1</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
@ -3054,7 +3041,7 @@ QPushButton[state="ok"] {
|
|||||||
<tabstop>pbTxMode</tabstop>
|
<tabstop>pbTxMode</tabstop>
|
||||||
<tabstop>pbR2T</tabstop>
|
<tabstop>pbR2T</tabstop>
|
||||||
<tabstop>pbT2R</tabstop>
|
<tabstop>pbT2R</tabstop>
|
||||||
<tabstop>cbTxLock</tabstop>
|
<tabstop>cbHoldTxFreq</tabstop>
|
||||||
<tabstop>sbSubmode</tabstop>
|
<tabstop>sbSubmode</tabstop>
|
||||||
<tabstop>syncSpinBox</tabstop>
|
<tabstop>syncSpinBox</tabstop>
|
||||||
<tabstop>tabWidget</tabstop>
|
<tabstop>tabWidget</tabstop>
|
||||||
|
@ -8,20 +8,18 @@
|
|||||||
<td><b>Click</b> to set the Rx frequency.<br/>
|
<td><b>Click</b> to set the Rx frequency.<br/>
|
||||||
<b>Shift-click</b> to set Tx frequency.<br/>
|
<b>Shift-click</b> to set Tx frequency.<br/>
|
||||||
<b>Ctrl-click</b> to set Rx and Tx frequencies.<br/>
|
<b>Ctrl-click</b> to set Rx and Tx frequencies.<br/>
|
||||||
<b>Double-click</b> to decode at resulting Rx frequency.<br/>
|
<b>Double-click</b> to also decode at Rx frequency.<br/>
|
||||||
If <b>Lock Tx=Rx</b> is checked all actions set Tx/Rx.
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="right">Decoded text:</td>
|
<td align="right">Decoded text:</td>
|
||||||
<td><b>Double-click</b> to copy second callsign to Dx Call,<br/>
|
<td><b>Double-click</b> to copy second callsign to Dx Call,<br/>
|
||||||
locator to Dx Grid; change Rx and Tx frequencies to<br/>
|
locator to Dx Grid, change Rx and Tx frequency to<br/>
|
||||||
decoded signal's frequency; generate standard messages.<br/>
|
decoded signal's frequency, and generate standard<br/>
|
||||||
If first callsign is your own, Tx frequency is not<br/>
|
messages.<br/>
|
||||||
changed unless <b>Ctrl</b> is held down when double-clicking.<br/>
|
If <b>Hold Tx Freq</b> is checked or first callsign in message<br/>
|
||||||
<br/>
|
is your own call, Tx frequency is not changed unless <br/>
|
||||||
<b>Alt-Double-click</b> to move only Rx frequency when<br/>
|
<b>Ctrl</b> is held down.<br/>
|
||||||
replying to a CQ or QRZ caller.
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
11
plotter.cpp
@ -355,9 +355,11 @@ void CPlotter::DrawOverlay() //DrawOverlay()
|
|||||||
//draw frequency values
|
//draw frequency values
|
||||||
for( int i=0; i<=m_hdivs; i++) {
|
for( int i=0; i<=m_hdivs; i++) {
|
||||||
x = (int)((m_xOffset+i)*pixperdiv - pixperdiv/2);
|
x = (int)((m_xOffset+i)*pixperdiv - pixperdiv/2);
|
||||||
|
if(int(x+pixperdiv/2) > 70) {
|
||||||
rect0.setRect(x,0, (int)pixperdiv, 20);
|
rect0.setRect(x,0, (int)pixperdiv, 20);
|
||||||
painter0.drawText(rect0, Qt::AlignHCenter|Qt::AlignVCenter,m_HDivText[i]);
|
painter0.drawText(rect0, Qt::AlignHCenter|Qt::AlignVCenter,m_HDivText[i]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float bw=9.0*12000.0/m_nsps; //JT9
|
float bw=9.0*12000.0/m_nsps; //JT9
|
||||||
|
|
||||||
@ -637,14 +639,11 @@ void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent
|
|||||||
int newFreq = int(FreqfromX(x)+0.5);
|
int newFreq = int(FreqfromX(x)+0.5);
|
||||||
int oldTxFreq = m_txFreq;
|
int oldTxFreq = m_txFreq;
|
||||||
int oldRxFreq = m_rxFreq;
|
int oldRxFreq = m_rxFreq;
|
||||||
|
if (ctrl) {
|
||||||
if (ctrl or m_lockTxFreq) {
|
|
||||||
emit setFreq1 (newFreq, newFreq);
|
emit setFreq1 (newFreq, newFreq);
|
||||||
}
|
} else if (shift) {
|
||||||
else if (shift) {
|
|
||||||
emit setFreq1 (oldRxFreq, newFreq);
|
emit setFreq1 (oldRxFreq, newFreq);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
emit setFreq1(newFreq,oldTxFreq);
|
emit setFreq1(newFreq,oldTxFreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +75,6 @@ public:
|
|||||||
void setBreadth(qint32 w) {m_w = w;}
|
void setBreadth(qint32 w) {m_w = w;}
|
||||||
qint32 breadth() const {return m_w;}
|
qint32 breadth() const {return m_w;}
|
||||||
float fSpan() const {return m_fSpan;}
|
float fSpan() const {return m_fSpan;}
|
||||||
void setLockTxFreq(bool b) {m_lockTxFreq = b;}
|
|
||||||
void setColours(QVector<QColor> const& cl);
|
void setColours(QVector<QColor> const& cl);
|
||||||
void setFlatten(bool b1, bool b2);
|
void setFlatten(bool b1, bool b2);
|
||||||
void setTol(int n);
|
void setTol(int n);
|
||||||
@ -106,7 +105,6 @@ private:
|
|||||||
bool m_bLinearAvg;
|
bool m_bLinearAvg;
|
||||||
bool m_bReference;
|
bool m_bReference;
|
||||||
bool m_bReference0;
|
bool m_bReference0;
|
||||||
bool m_lockTxFreq;
|
|
||||||
bool m_bVHF;
|
bool m_bVHF;
|
||||||
|
|
||||||
float m_fSpan;
|
float m_fSpan;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<table cellspacing=1>
|
<table cellspacing=1>
|
||||||
<tr><td><b>F1 </b></td><td>Online User's Guide</td></tr>
|
<tr><td><b>F1 </b></td><td>Online User's Guide</td></tr>
|
||||||
|
<tr><td><b>Shift+F1 </b></td><td>Copyright Notice</td></tr>
|
||||||
<tr><td><b>Ctrl+F1 </b></td><td>About WSJT-X</td></tr>
|
<tr><td><b>Ctrl+F1 </b></td><td>About WSJT-X</td></tr>
|
||||||
<tr><td><b>F2 </b></td><td>Open settings window</td></tr>
|
<tr><td><b>F2 </b></td><td>Open settings window</td></tr>
|
||||||
<tr><td><b>F3 </b></td><td>Display keyboard shortcuts</td></tr>
|
<tr><td><b>F3 </b></td><td>Display keyboard shortcuts</td></tr>
|
||||||
|
@ -22,7 +22,6 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
|
|||||||
m_settings (settings),
|
m_settings (settings),
|
||||||
m_palettes_path {":/Palettes"},
|
m_palettes_path {":/Palettes"},
|
||||||
m_ntr0 {0},
|
m_ntr0 {0},
|
||||||
m_lockTxFreq {false},
|
|
||||||
m_bHaveTransmitted {false},
|
m_bHaveTransmitted {false},
|
||||||
m_n {0}
|
m_n {0}
|
||||||
{
|
{
|
||||||
@ -230,7 +229,6 @@ void WideGraph::setRxFreq(int n) //set
|
|||||||
{
|
{
|
||||||
ui->widePlot->setRxFreq(n);
|
ui->widePlot->setRxFreq(n);
|
||||||
ui->widePlot->draw(swide,false,false);
|
ui->widePlot->draw(swide,false,false);
|
||||||
if(m_lockTxFreq) setTxFreq(n);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int WideGraph::rxFreq() //rxFreq
|
int WideGraph::rxFreq() //rxFreq
|
||||||
@ -333,12 +331,6 @@ void WideGraph::on_fSplitSpinBox_valueChanged(int n) //fSplit
|
|||||||
setRxRange ();
|
setRxRange ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WideGraph::setLockTxFreq(bool b) //LockTxFreq
|
|
||||||
{
|
|
||||||
m_lockTxFreq=b;
|
|
||||||
ui->widePlot->setLockTxFreq(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WideGraph::setFreq2(int rxFreq, int txFreq) //setFreq2
|
void WideGraph::setFreq2(int rxFreq, int txFreq) //setFreq2
|
||||||
{
|
{
|
||||||
emit setFreq3(rxFreq,txFreq);
|
emit setFreq3(rxFreq,txFreq);
|
||||||
|
@ -40,7 +40,6 @@ public:
|
|||||||
void setMode(QString mode);
|
void setMode(QString mode);
|
||||||
void setSubMode(int n);
|
void setSubMode(int n);
|
||||||
void setModeTx(QString modeTx);
|
void setModeTx(QString modeTx);
|
||||||
void setLockTxFreq(bool b);
|
|
||||||
bool flatten();
|
bool flatten();
|
||||||
bool useRef();
|
bool useRef();
|
||||||
void setTol(int n);
|
void setTol(int n);
|
||||||
@ -104,7 +103,6 @@ private:
|
|||||||
qint32 m_nSubMode;
|
qint32 m_nSubMode;
|
||||||
qint32 m_nsmo;
|
qint32 m_nsmo;
|
||||||
qint32 m_Percent2DScreen;
|
qint32 m_Percent2DScreen;
|
||||||
bool m_lockTxFreq;
|
|
||||||
bool m_bFlatten;
|
bool m_bFlatten;
|
||||||
bool m_bRef;
|
bool m_bRef;
|
||||||
bool m_bHaveTransmitted; //Set true at end of a WSPR transmission
|
bool m_bHaveTransmitted; //Set true at end of a WSPR transmission
|
||||||
|
22
widegraph.ui
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>799</width>
|
<width>799</width>
|
||||||
<height>395</height>
|
<height>337</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -34,6 +34,12 @@
|
|||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>400</width>
|
<width>400</width>
|
||||||
@ -52,18 +58,12 @@
|
|||||||
<widget class="QCheckBox" name="cbControls">
|
<widget class="QCheckBox" name="cbControls">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>9</x>
|
<x>5</x>
|
||||||
<y>10</y>
|
<y>0</y>
|
||||||
<width>60</width>
|
<width>63</width>
|
||||||
<height>17</height>
|
<height>17</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>65</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Controls</string>
|
<string>Controls</string>
|
||||||
</property>
|
</property>
|
||||||
@ -76,7 +76,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="controls_widget" native="true">
|
<widget class="QWidget" name="controls_widget" native="true">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
|
@ -66,7 +66,8 @@ SOURCES += \
|
|||||||
main.cpp decodedtext.cpp wsprnet.cpp messageaveraging.cpp \
|
main.cpp decodedtext.cpp wsprnet.cpp messageaveraging.cpp \
|
||||||
echoplot.cpp echograph.cpp fastgraph.cpp fastplot.cpp Modes.cpp \
|
echoplot.cpp echograph.cpp fastgraph.cpp fastplot.cpp Modes.cpp \
|
||||||
WSPRBandHopping.cpp MessageAggregator.cpp SampleDownloader.cpp qt_helpers.cpp\
|
WSPRBandHopping.cpp MessageAggregator.cpp SampleDownloader.cpp qt_helpers.cpp\
|
||||||
MultiSettings.cpp PhaseEqualizationDialog.cpp IARURegions.cpp
|
MultiSettings.cpp PhaseEqualizationDialog.cpp IARURegions.cpp MessageBox.cpp \
|
||||||
|
EqualizationToolsDialog.cpp
|
||||||
|
|
||||||
HEADERS += qt_helpers.hpp \
|
HEADERS += qt_helpers.hpp \
|
||||||
pimpl_h.hpp pimpl_impl.hpp \
|
pimpl_h.hpp pimpl_impl.hpp \
|
||||||
@ -82,7 +83,8 @@ HEADERS += qt_helpers.hpp \
|
|||||||
logbook/logbook.h logbook/countrydat.h logbook/countriesworked.h logbook/adif.h \
|
logbook/logbook.h logbook/countrydat.h logbook/countriesworked.h logbook/adif.h \
|
||||||
messageaveraging.h echoplot.h echograph.h fastgraph.h fastplot.h Modes.hpp WSPRBandHopping.hpp \
|
messageaveraging.h echoplot.h echograph.h fastgraph.h fastplot.h Modes.hpp WSPRBandHopping.hpp \
|
||||||
WsprTxScheduler.h SampleDownloader.hpp MultiSettings.hpp PhaseEqualizationDialog.hpp \
|
WsprTxScheduler.h SampleDownloader.hpp MultiSettings.hpp PhaseEqualizationDialog.hpp \
|
||||||
IARURegions.hpp
|
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp
|
||||||
|
|
||||||
|
|
||||||
INCLUDEPATH += qmake_only
|
INCLUDEPATH += qmake_only
|
||||||
|
|
||||||
|