Compare commits

...

47 Commits

Author SHA1 Message Date
Jordan Sherer 9423640e52 Bump v1.0.0-devel 2019-03-31 17:56:13 -04:00
Jordan Sherer 952cc0b844 About URL change 2019-03-31 15:45:09 -04:00
Jordan Sherer 0bd7a74103 Implemented version checking on files.js8call.com, a configuration option for doing that on startup, and a menu item in the Help menu for checking it at will. 2019-03-31 14:36:40 -04:00
Jordan Sherer 82a0cdd0cf Added basic version check stub 2019-03-31 13:39:10 -04:00
Jordan Sherer 7f187f4cf8 Bump to v1.0.0 release 2019-03-31 10:47:14 -04:00
Jordan Sherer f2ba541f09 Bump to v1.0.0 2019-03-30 20:12:03 -04:00
Jordan Sherer e9d2d59842 Label should be JS8NET 2019-03-30 20:11:25 -04:00
Jordan Sherer bda9a5202e Updated icon tooltip in Call Activity 2019-03-30 20:10:16 -04:00
Jordan Sherer 40e1bfab0e Fixed defaults for HB and CQ repeat menus 2019-03-30 20:03:24 -04:00
Jordan Sherer b031a2cdbe Updated copyright 2019-03-30 09:50:11 -04:00
Jordan Sherer a2c6451b47 Added more clear labeling for disabled HB ack 2019-03-30 09:21:30 -04:00
Jordan Sherer 3f6c87b200 Removed expiration and warnings 2019-03-30 08:57:55 -04:00
Jordan Sherer fa4c39495d Fixed #163: Removed DATA from logging 2019-03-29 22:26:23 -04:00
Jordan Sherer 5f3b74338c Fixed QSO start time when you selected a station callsign 2019-03-28 16:37:33 -04:00
Jordan Sherer d1ccbc599b Fixed #160: HB ACKs not stopped during QSO with the new checkmark setting 2019-03-27 11:42:43 -04:00
Jordan Sherer 6e036b7d58 Updated to spot local only once every 15 minutes 2019-03-26 22:55:28 -04:00
Jordan Sherer 1629415dc1 Added spotting of messages directed to @JS8NET 2019-03-25 15:05:13 -04:00
Jordan Sherer 08cf869125 Added by.grid to SpotClient spots 2019-03-25 11:58:23 -04:00
Jordan Sherer 03bd44ae39 Updated SpotClient to send local data at least once every 5 minutes 2019-03-25 09:52:35 -04:00
Jordan Sherer 14626978c0 Updated heartbeat ack labeling 2019-03-24 22:37:18 -04:00
Jordan Sherer dd43f0db84 Changed my mind. HB ACKs should include SNR 2019-03-24 22:25:36 -04:00
Jordan Sherer 5646268faf Updated configuration reporting labeling to include JS8 Network 2019-03-24 22:19:24 -04:00
Jordan Sherer 5d21fdf1dc Added spotting to spot.js8call.com for future network data 2019-03-24 21:01:03 -04:00
Jordan Sherer 5d2ba76c17 Added explicit setting for automatically acknowledging heartbeat messages 2019-03-24 13:41:35 -04:00
Jordan Sherer 7bd86ca177 Fixed #94: swap heard graph on band change 2019-03-24 09:59:24 -04:00
Jordan Sherer 59b1a3b011 A few better tooltips 2019-03-24 09:26:22 -04:00
Jordan Sherer ce2c045458 Added click of callsign to open profile 2019-03-23 22:16:01 -04:00
Jordan Sherer 218c5b3d47 Fixed #142: callsign selected is an indicator for qso start time 2019-03-23 22:03:28 -04:00
Jordan Sherer 27ae28a889 Fixed #148: configuration tab ordering 2019-03-23 21:58:30 -04:00
Jordan Sherer 1a2596224a Bump to RC3 2019-03-23 21:48:15 -04:00
Jordan Sherer 82915540b4 Change SNR for HB ACK. Default to HB hidden 2019-03-23 21:42:51 -04:00
Jordan Sherer 73c6dd50fb Only show CQ icon for 5 minutes 2019-03-23 21:29:26 -04:00
Jordan Sherer ee48d8fd86 Added telephone icon for CQs. Added tooltip for last logged date 2019-03-23 21:19:24 -04:00
Jordan Sherer d8a16f4a42 Removed extraneous logbook debug statements 2019-03-23 11:42:31 -04:00
Jordan Sherer 5ef440faf6 Merged patch to fix #97 2019-03-21 21:14:23 -04:00
Jordan Sherer 9d9ae62526 Moved wsjtx qt creator to js8call 2019-03-21 21:01:58 -04:00
Jordan Sherer 6b9c9b4ceb Bump eol 2019-03-11 19:06:38 -04:00
Jordan Sherer 1febb18495 Added log details to the call activity menu 2019-03-10 23:48:56 -04:00
Jordan Sherer 43401c3c26 Added DIT DIT short message 2019-03-04 23:25:17 -05:00
Jordan Sherer 55928be661 Added log details column to call activity. TODO: add log details :P 2019-03-03 23:43:39 -05:00
Jordan Sherer a5f8593b3d Added NACK command for future implementation 2019-03-03 23:33:30 -05:00
Jordan Sherer 07f1594d0a Fixed #129: relays now use 'VIA' as the intermediate text for relay path computation. Fixed also relays still being ACKed while relay messaging was disabled. 2019-02-25 22:25:04 -05:00
Jordan Sherer b6dd6aadc8 Added a dummy data for testing newlines 2019-02-25 10:31:11 -05:00
Jordan Sherer b9b334c6cf Added tooltip with absolute date for age columns 2019-02-25 09:57:01 -05:00
Jordan Sherer fec45aa0ad Bump to RC2 2019-02-23 22:53:39 -05:00
Jordan Sherer 2ef4e90710 Fixed #135: query commands through relay. Changed the QUERY CALL reply format so as to not fconfuse folks with random ACKs. Cleaned up empty dB formatting in the call and band activity tables. 2019-02-23 22:49:02 -05:00
Jordan Sherer a0dc7bc013 Fixed #76: added tone output to API 2019-02-23 09:50:02 -05:00
24 changed files with 916 additions and 259 deletions
+1
View File
@@ -243,6 +243,7 @@ set (wsjtx_CXXSRCS
messagereplydialog.cpp
keyeater.cpp
APRSISClient.cpp
SpotClient.cpp
Inbox.cpp
messagewindow.cpp
mainwindow.cpp
+7 -1
View File
@@ -628,6 +628,7 @@ private:
qint32 RxBandwidth_;
double degrade_;
double txDelay_;
bool check_for_updates_;
bool id_after_73_;
bool tx_qsy_allowed_;
bool spot_to_reporting_networks_;
@@ -750,6 +751,7 @@ qint32 Configuration::aggressive() const {return m_->aggressive_;}
double Configuration::degrade() const {return m_->degrade_;}
double Configuration::txDelay() const {return m_->txDelay_;}
qint32 Configuration::RxBandwidth() const {return m_->RxBandwidth_;}
bool Configuration::check_for_updates() const { return m_->check_for_updates_; }
bool Configuration::id_after_73 () const {return m_->id_after_73_;}
bool Configuration::tx_qsy_allowed () const {return m_->tx_qsy_allowed_;}
bool Configuration::spot_to_reporting_networks () const
@@ -772,7 +774,7 @@ bool Configuration::heartbeat_qso_pause() const { return m_->heartbeat_qso_pause
bool Configuration::relay_off() const { return m_->relay_disabled_; }
bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;}
bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->monitor_last_used_;}
bool Configuration::log_as_DATA () const {return m_->log_as_DATA_;}
bool Configuration::log_as_DATA () const { return false; }
bool Configuration::report_in_comments () const {return m_->report_in_comments_;}
bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;}
bool Configuration::insert_blank () const {return m_->insert_blank_;}
@@ -1400,6 +1402,7 @@ void Configuration::impl::initialize_models ()
ui_->sound_cq_path_display_label->setText(sound_cq_path_);
ui_->sound_dm_path_display_label->setText(sound_dm_path_);
ui_->sound_am_path_display_label->setText(sound_am_path_);
ui_->checkForUpdates_checkBox->setChecked (check_for_updates_);
ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
ui_->tx_qsy_check_box->setChecked (tx_qsy_allowed_);
ui_->psk_reporter_check_box->setChecked (spot_to_reporting_networks_);
@@ -1677,6 +1680,7 @@ void Configuration::impl::read_settings ()
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
monitor_last_used_ = settings_->value ("MonitorLastUsed", false).toBool ();
spot_to_reporting_networks_ = settings_->value ("PSKReporter", true).toBool ();
check_for_updates_ = settings_->value("CheckForUpdates", true).toBool();
id_after_73_ = settings_->value ("After73", false).toBool ();
tx_qsy_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
use_dynamic_info_ = settings_->value ("AutoGrid", false).toBool ();
@@ -1849,6 +1853,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
settings_->setValue ("PSKReporter", spot_to_reporting_networks_);
settings_->setValue ("CheckForUpdates", check_for_updates_);
settings_->setValue ("After73", id_after_73_);
settings_->setValue ("TxQSYAllowed", tx_qsy_allowed_);
settings_->setValue ("Macros", macros_.stringList ());
@@ -2381,6 +2386,7 @@ void Configuration::impl::accept ()
aggressive_ = ui_->sbAggressive->value ();
degrade_ = ui_->sbDegrade->value ();
RxBandwidth_ = ui_->sbBandwidth->value ();
check_for_updates_ = ui_->checkForUpdates_checkBox->isChecked();
id_after_73_ = ui_->CW_id_after_73_check_box->isChecked ();
tx_qsy_allowed_ = ui_->tx_qsy_check_box->isChecked ();
transmit_directed_ = ui_->transmit_directed_check_box->isChecked();
+1
View File
@@ -118,6 +118,7 @@ public:
qint32 RxBandwidth() const;
double degrade() const;
double txDelay() const;
bool check_for_updates() const;
bool id_after_73 () const;
bool tx_qsy_allowed () const;
bool spot_to_reporting_networks () const;
+138 -59
View File
@@ -63,7 +63,7 @@
<x>0</x>
<y>0</y>
<width>738</width>
<height>453</height>
<height>448</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
@@ -88,6 +88,16 @@
<string>Station Details</string>
</property>
<layout class="QGridLayout" name="gridLayout_13">
<item row="0" column="0">
<widget class="QLabel" name="callsign_label">
<property name="text">
<string>My Callsign:</string>
</property>
<property name="buddy">
<cstring>callsign_line_edit</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="grid_label">
<property name="text">
@@ -121,16 +131,6 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="callsign_label">
<property name="text">
<string>My Callsign:</string>
</property>
<property name="buddy">
<cstring>callsign_line_edit</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="groups_label">
<property name="text">
@@ -278,8 +278,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>724</width>
<height>646</height>
<width>726</width>
<height>631</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_26">
@@ -394,6 +394,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkForUpdates_checkBox">
<property name="text">
<string>Check for software updates at startup</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
@@ -918,8 +925,8 @@ text message.</string>
<rect>
<x>0</x>
<y>0</y>
<width>718</width>
<height>435</height>
<width>285</width>
<height>397</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_27">
@@ -1339,8 +1346,8 @@ a few, particularly some Kenwood rigs, require it).</string>
<rect>
<x>0</x>
<y>0</y>
<width>237</width>
<height>467</height>
<width>257</width>
<height>427</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_28">
@@ -1767,8 +1774,8 @@ radio interface behave as expected.</string>
<rect>
<x>0</x>
<y>0</y>
<width>760</width>
<height>502</height>
<width>267</width>
<height>302</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_29">
@@ -2080,8 +2087,8 @@ both here.</string>
<rect>
<x>0</x>
<y>0</y>
<width>746</width>
<height>525</height>
<width>572</width>
<height>498</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_30">
@@ -2108,7 +2115,7 @@ both here.</string>
<item row="0" column="3">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Op Call:</string>
<string>Operator Callsign (if different than Station Callsign):</string>
</property>
</widget>
</item>
@@ -2153,6 +2160,9 @@ both here.</string>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="log_as_RTTY_check_box">
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Some logging programs will not accept JT-65 or JT9 as a recognized mode.</string>
</property>
@@ -2182,6 +2192,9 @@ comments field.</string>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="visible">
<bool>false</bool>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -2339,7 +2352,7 @@ This is used for reverse ping analysis which is very useful
for assessing propagation and system performance.</string>
</property>
<property name="text">
<string>Enable spotting to reporting networks (PSKReporter &amp;&amp; APRS-IS)</string>
<string>Enable spotting to reporting networks (JS8NET, PSKReporter, APRS-IS, etc)</string>
</property>
<property name="checked">
<bool>true</bool>
@@ -2537,8 +2550,8 @@ for assessing propagation and system performance.</string>
<rect>
<x>0</x>
<y>0</y>
<width>760</width>
<height>502</height>
<width>498</width>
<height>321</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_31">
@@ -3115,8 +3128,8 @@ QListView::item:hover {
<rect>
<x>0</x>
<y>0</y>
<width>738</width>
<height>378</height>
<width>280</width>
<height>201</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_15">
@@ -3370,8 +3383,8 @@ QListView::item:hover {
<rect>
<x>0</x>
<y>0</y>
<width>233</width>
<height>253</height>
<width>236</width>
<height>258</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_5">
@@ -3574,8 +3587,8 @@ QListView::item:hover {
<rect>
<x>0</x>
<y>0</y>
<width>277</width>
<height>93</height>
<width>288</width>
<height>96</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_8">
@@ -3983,71 +3996,137 @@ soundcard changes</string>
</widget>
<tabstops>
<tabstop>configuration_tabs</tabstop>
<tabstop>use_dynamic_grid</tabstop>
<tabstop>type_2_msg_gen_combo_box</tabstop>
<tabstop>monitor_last_used_check_box</tabstop>
<tabstop>quick_call_check_box</tabstop>
<tabstop>CW_id_after_73_check_box</tabstop>
<tabstop>enable_VHF_features_check_box</tabstop>
<tabstop>single_decode_check_box</tabstop>
<tabstop>decode_at_52s_check_box</tabstop>
<tabstop>CW_id_interval_spin_box</tabstop>
<tabstop>tabWidget_2</tabstop>
<tabstop>callsign_line_edit</tabstop>
<tabstop>grid_line_edit</tabstop>
<tabstop>groups_line_edit</tabstop>
<tabstop>avoid_allcall_checkbox</tabstop>
<tabstop>cq_message_line_edit</tabstop>
<tabstop>reply_message_line_edit</tabstop>
<tabstop>info_message_line_edit</tabstop>
<tabstop>scrollArea_2</tabstop>
<tabstop>miles_check_box</tabstop>
<tabstop>monitor_off_check_box</tabstop>
<tabstop>tx_qsy_check_box</tabstop>
<tabstop>transmit_directed_check_box</tabstop>
<tabstop>heartbeat_anywhere_check_box</tabstop>
<tabstop>heartbeat_qso_pause_check_box</tabstop>
<tabstop>spellcheck_check_box</tabstop>
<tabstop>autoreply_off_check_box</tabstop>
<tabstop>relay_disabled_check_box</tabstop>
<tabstop>auto_whitelist_line_edit</tabstop>
<tabstop>auto_blacklist_line_edit</tabstop>
<tabstop>scrollArea</tabstop>
<tabstop>callsign_aging_spin_box</tabstop>
<tabstop>activity_aging_spin_box</tabstop>
<tabstop>tx_watchdog_spin_box</tabstop>
<tabstop>rig_combo_box</tabstop>
<tabstop>CAT_poll_interval_spin_box</tabstop>
<tabstop>tabWidget_3</tabstop>
<tabstop>scrollArea_3</tabstop>
<tabstop>CAT_port_combo_box</tabstop>
<tabstop>CAT_serial_baud_combo_box</tabstop>
<tabstop>CAT_default_bit_radio_button</tabstop>
<tabstop>CAT_7_bit_radio_button</tabstop>
<tabstop>CAT_8_bit_radio_button</tabstop>
<tabstop>CAT_default_stop_bit_radio_button</tabstop>
<tabstop>CAT_one_stop_bit_radio_button</tabstop>
<tabstop>CAT_two_stop_bit_radio_button</tabstop>
<tabstop>CAT_handshake_default_radio_button</tabstop>
<tabstop>CAT_handshake_none_radio_button</tabstop>
<tabstop>CAT_handshake_xon_radio_button</tabstop>
<tabstop>CAT_handshake_hardware_radio_button</tabstop>
<tabstop>force_DTR_combo_box</tabstop>
<tabstop>force_RTS_combo_box</tabstop>
<tabstop>scrollArea_4</tabstop>
<tabstop>PTT_VOX_radio_button</tabstop>
<tabstop>PTT_CAT_radio_button</tabstop>
<tabstop>PTT_DTR_radio_button</tabstop>
<tabstop>PTT_CAT_radio_button</tabstop>
<tabstop>PTT_RTS_radio_button</tabstop>
<tabstop>PTT_port_combo_box</tabstop>
<tabstop>mode_USB_radio_button</tabstop>
<tabstop>mode_none_radio_button</tabstop>
<tabstop>mode_data_radio_button</tabstop>
<tabstop>TX_source_data_radio_button</tabstop>
<tabstop>TX_source_mic_radio_button</tabstop>
<tabstop>mode_none_radio_button</tabstop>
<tabstop>mode_USB_radio_button</tabstop>
<tabstop>mode_data_radio_button</tabstop>
<tabstop>split_none_radio_button</tabstop>
<tabstop>split_rig_radio_button</tabstop>
<tabstop>split_emulate_radio_button</tabstop>
<tabstop>split_rig_radio_button</tabstop>
<tabstop>split_none_radio_button</tabstop>
<tabstop>sbTxDelay</tabstop>
<tabstop>ptt_command_line_edit</tabstop>
<tabstop>test_CAT_push_button</tabstop>
<tabstop>test_PTT_push_button</tabstop>
<tabstop>scrollArea_5</tabstop>
<tabstop>sound_output_combo_box</tabstop>
<tabstop>sound_input_combo_box</tabstop>
<tabstop>sound_input_channel_combo_box</tabstop>
<tabstop>sound_output_combo_box</tabstop>
<tabstop>sound_output_channel_combo_box</tabstop>
<tabstop>save_path_select_push_button</tabstop>
<tabstop>azel_path_select_push_button</tabstop>
<tabstop>checkBoxPwrBandTxMemory</tabstop>
<tabstop>checkBoxPwrBandTuneMemory</tabstop>
<tabstop>add_macro_line_edit</tabstop>
<tabstop>add_macro_push_button</tabstop>
<tabstop>delete_macro_push_button</tabstop>
<tabstop>macros_list_view</tabstop>
<tabstop>prompt_to_log_check_box</tabstop>
<tabstop>scrollArea_6</tabstop>
<tabstop>opCallEntry</tabstop>
<tabstop>log_as_RTTY_check_box</tabstop>
<tabstop>udp_server_line_edit</tabstop>
<tabstop>udp_server_port_spin_box</tabstop>
<tabstop>udpEnable</tabstop>
<tabstop>accept_udp_requests_check_box</tabstop>
<tabstop>udpWindowToFront</tabstop>
<tabstop>udpWindowRestore</tabstop>
<tabstop>use_dynamic_grid</tabstop>
<tabstop>psk_reporter_check_box</tabstop>
<tabstop>aprs_server_line_edit</tabstop>
<tabstop>aprs_server_port_spin_box</tabstop>
<tabstop>aprs_passcode_line_edit</tabstop>
<tabstop>enable_n1mm_broadcast_check_box</tabstop>
<tabstop>n1mm_server_name_line_edit</tabstop>
<tabstop>n1mm_server_port_spin_box</tabstop>
<tabstop>scrollArea_7</tabstop>
<tabstop>calibration_slope_ppm_spin_box</tabstop>
<tabstop>calibration_intercept_spin_box</tabstop>
<tabstop>frequencies_table_view</tabstop>
<tabstop>auto_switch_bands_check_box</tabstop>
<tabstop>stations_table_view</tabstop>
<tabstop>sbNtrials</tabstop>
<tabstop>sbAggressive</tabstop>
<tabstop>cbTwoPass</tabstop>
<tabstop>add_macro_push_button</tabstop>
<tabstop>add_macro_line_edit</tabstop>
<tabstop>delete_macro_push_button</tabstop>
<tabstop>macros_list_view</tabstop>
<tabstop>sound_am_path_test_push_button</tabstop>
<tabstop>sound_dm_path_reset_push_button</tabstop>
<tabstop>sound_am_path_reset_push_button</tabstop>
<tabstop>sound_dm_path_select_push_button</tabstop>
<tabstop>sound_am_path_select_push_button</tabstop>
<tabstop>sound_dm_path_test_push_button</tabstop>
<tabstop>sound_cq_path_select_push_button</tabstop>
<tabstop>sound_cq_path_test_push_button</tabstop>
<tabstop>sound_cq_path_reset_push_button</tabstop>
<tabstop>font_push_button</tabstop>
<tabstop>tabWidget</tabstop>
<tabstop>scrollArea_8</tabstop>
<tabstop>tableForegroundButton</tabstop>
<tabstop>pbCQmsg</tabstop>
<tabstop>tableFontButton</tabstop>
<tabstop>pbMyCall</tabstop>
<tabstop>tableSelectedRowBackgroundButton</tabstop>
<tabstop>tableBackgroundButton</tabstop>
<tabstop>scrollArea_9</tabstop>
<tabstop>txFontButton</tabstop>
<tabstop>rxFontButton</tabstop>
<tabstop>txForegroundButton</tabstop>
<tabstop>rxBackgroundButton</tabstop>
<tabstop>rxForegroundButton</tabstop>
<tabstop>scrollArea_10</tabstop>
<tabstop>composeBackgroundButton</tabstop>
<tabstop>composeForegroundButton</tabstop>
<tabstop>composeFontButton</tabstop>
<tabstop>sbDegrade</tabstop>
<tabstop>sbBandwidth</tabstop>
<tabstop>cbx2ToneSpacing</tabstop>
<tabstop>cbx4ToneSpacing</tabstop>
<tabstop>sbNtrials</tabstop>
<tabstop>sbAggressive</tabstop>
<tabstop>cbTwoPass</tabstop>
<tabstop>cbFox</tabstop>
<tabstop>cbHound</tabstop>
</tabstops>
<resources/>
<connections>
@@ -4117,12 +4196,12 @@ soundcard changes</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
</buttongroups>
</ui>
+124
View File
@@ -0,0 +1,124 @@
#include "SpotClient.h"
#include "Message.h"
#include "moc_SpotClient.cpp"
SpotClient::SpotClient(MessageClient *client, QObject *parent):
QObject(parent),
m_client { client }
{
prepare();
connect(&m_timer, &QTimer::timeout, this, &SpotClient::processSpots);
m_timer.setInterval(60 * 1000);
m_timer.setSingleShot(false);
m_timer.start();
}
void SpotClient::prepare(){
QHostInfo::lookupHost("spot.js8call.com", this, SLOT(dnsLookupResult(QHostInfo)));
}
void SpotClient::dnsLookupResult(QHostInfo info){
if (info.addresses().isEmpty()) {
qDebug() << "SpotClient Error:" << info.errorString();
return;
}
m_address = info.addresses().at(0);
qDebug() << "SpotClient Resolve:" << m_address.toString();
}
void SpotClient::setLocalStation(QString callsign, QString grid, QString info, QString version){
bool changed = false;
if(m_call != callsign){
m_call = callsign;
changed = true;
}
if(m_grid != grid){
m_grid = grid;
changed = true;
}
if(m_info != info){
m_info = info;
changed = true;
}
if(m_version != version){
m_version = version;
changed = true;
}
// send local information to network on change, or once every 15 minutes
if(changed || m_seq % 15 == 0){
enqueueLocalSpot(callsign, grid, info, version);
}
}
void SpotClient::enqueueLocalSpot(QString callsign, QString grid, QString info, QString version){
auto m = Message("RX.LOCAL", "", {
{"CALLSIGN", QVariant(callsign)},
{"GRID", QVariant(grid)},
{"INFO", QVariant(info)},
{"VERSION", QVariant(version)},
});
m_queue.enqueue(m.toJson());
}
void SpotClient::enqueueSpot(QString callsign, QString grid, int frequency, int snr){
auto m = Message("RX.SPOT", "", {
{"BY", QVariant(QMap<QString, QVariant>{
{"CALLSIGN", QVariant(m_call)},
{"GRID", QVariant(m_grid)},
})},
{"CALLSIGN", QVariant(callsign)},
{"GRID", QVariant(grid)},
{"FREQ", QVariant(frequency)},
{"SNR", QVariant(snr)},
});
m_queue.enqueue(m.toJson());
}
void SpotClient::enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int frequency, int snr){
auto m = Message("RX.DIRECTED", "", {
{"BY", QVariant(QMap<QString, QVariant>{
{"CALLSIGN", QVariant(m_call)},
{"GRID", QVariant(m_grid)},
})},
{"CMD", QVariant(cmd)},
{"FROM", QVariant(from)},
{"TO", QVariant(to)},
{"PATH", QVariant(relayPath)},
{"TEXT", QVariant(text)},
{"GRID", QVariant(grid)},
{"EXTRA", QVariant(extra)},
{"FREQ", QVariant(frequency)},
{"SNR", QVariant(snr)},
});
m_queue.enqueue(m.toJson());
}
void SpotClient::processSpots(){
if(m_address.isNull()){
prepare();
return;
}
while(!m_queue.isEmpty()){
sendRawSpot(m_queue.dequeue());
}
m_seq++;
}
void SpotClient::sendRawSpot(QByteArray payload){
if(!m_address.isNull()){
m_client->send_raw_datagram(payload, m_address, 50000);
}
}
+41
View File
@@ -0,0 +1,41 @@
#ifndef JS8SPOTCLIENT_H
#define JS8SPOTCLIENT_H
#include "MessageClient.hpp"
#include <QObject>
#include <QHostInfo>
#include <QQueue>
#include <QTimer>
class SpotClient : public QObject
{
Q_OBJECT
public:
SpotClient(MessageClient *client, QObject *parent = nullptr);
void prepare();
void setLocalStation(QString callsign, QString grid, QString info, QString version);
void enqueueLocalSpot(QString callsign, QString grid, QString info, QString version);
void enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int frequency, int snr);
void enqueueSpot(QString callsign, QString grid, int frequency, int snr);
void sendRawSpot(QByteArray payload);
public slots:
void processSpots();
void dnsLookupResult(QHostInfo);
private:
int m_seq;
QString m_call;
QString m_grid;
QString m_info;
QString m_version;
QHostAddress m_address;
MessageClient *m_client;
QTimer m_timer;
QQueue<QByteArray> m_queue;
};
#endif // JS8SPOTCLIENT_H
+1 -1
View File
@@ -2,5 +2,5 @@
set (WSJTX_VERSION_MAJOR 1)
set (WSJTX_VERSION_MINOR 0)
set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 1) # release candidate number, comment out or zero for development versions
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
+1 -1
View File
@@ -23,7 +23,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
"development group. <br/>JS8Call is "
"licensed under and in accordance with the terms "
"of the <a href=\"https://www.gnu.org/licenses/gpl-3.0.txt\">GPLv3 license</a>.<br/>"
"The source code modifications are public and can be found in <a href=\"https://bitbucket.org/widefido/wsjtx/\">this repository</a>.<br/><br/>"
"The source code modifications are public and can be found in <a href=\"https://bitbucket.org/widefido/js8call/\">this repository</a>.<br/><br/>"
"JS8Call is heavily inspired by WSJT-X, Fldigi, "
"and FSQCall <br/>and would not exist without the hard work and "
+4 -2
View File
@@ -81,7 +81,8 @@ SOURCES += \
jsc_checker.cpp \
Message.cpp \
Inbox.cpp \
messagewindow.cpp
messagewindow.cpp \
SpotClient.cpp
HEADERS += qt_helpers.hpp \
pimpl_h.hpp pimpl_impl.hpp \
@@ -113,7 +114,8 @@ HEADERS += qt_helpers.hpp \
jsc_checker.h \
Message.h \
Inbox.h \
messagewindow.h
messagewindow.h \
SpotClient.h
INCLUDEPATH += qmake_only
+2 -2
View File
@@ -15,7 +15,7 @@ subroutine extractmessage144(decoded,msgreceived,nhashflag,recent_calls,nrecent)
do ibyte=1,10
itmp=0
do ibit=1,8
itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit))
itmp=ishft(itmp,1)+iand(1_1,decoded((ibyte-1)*8+ibit))
enddo
i1Dec8BitBytes(ibyte)=itmp
enddo
@@ -31,7 +31,7 @@ subroutine extractmessage144(decoded,msgreceived,nhashflag,recent_calls,nrecent)
do ibyte=1,12
itmp=0
do ibit=1,6
itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*6+ibit))
itmp=ishft(itmp,1)+iand(1_1,decoded((ibyte-1)*6+ibit))
enddo
i4Dec6BitWords(ibyte)=itmp
enddo
+1 -1
View File
@@ -13,7 +13,7 @@ subroutine chkcrc12a(decoded,nbadcrc)
read(cbits,1002) ncrc12 !Received CRC12
1002 format(75x,b12)
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),128+64+32)
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),transfer(128+64+32,0_1))
i1Dec8BitBytes(11)=0
icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
+2 -2
View File
@@ -19,7 +19,7 @@ subroutine extractmessage174(decoded,msgreceived,ncrcflag)
read(cbits,1002) ncrc12 !Received CRC12
1002 format(75x,b12)
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),128+64+32)
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),transfer(128+64+32,0_1))
i1Dec8BitBytes(11)=0
icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
@@ -29,7 +29,7 @@ subroutine extractmessage174(decoded,msgreceived,ncrcflag)
do ibyte=1,12
itmp=0
do ibit=1,6
itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*6+ibit))
itmp=ishft(itmp,1)+iand(1_1,decoded((ibyte-1)*6+ibit))
enddo
i4Dec6BitWords(ibyte)=itmp
enddo
+1 -1
View File
@@ -35,7 +35,7 @@ subroutine genft8(msg,mygrid,bcontest,i3bit,msgsent,msgbits,itone)
1000 format(12b6.6,b8.8)
read(cbits,1001) i1Msg8BitBytes(1:10)
1001 format(10b8)
i1Msg8BitBytes(10)=iand(i1Msg8BitBytes(10),128+64+32)
i1Msg8BitBytes(10)=iand(i1Msg8BitBytes(10),transfer(128+64+32,0_1))
i1Msg8BitBytes(11)=0
icrc12=crc12(c_loc(i1Msg8BitBytes),11)
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
+1 -1
View File
@@ -94,7 +94,7 @@ allocate ( rxdata(N), llr(N) )
checksum = xor(checksum, 42) ! TODO: jsherer - could change the crc here
! For reference, the next 3 lines show how to check the CRC
i1Msg8BitBytes(10)=checksum/256
i1Msg8BitBytes(11)=iand (checksum,255)
i1Msg8BitBytes(11)=iand(checksum,transfer(255,0_2))
checksumok = crc12_check(c_loc (i1Msg8BitBytes), 11)
if( checksumok ) write(*,*) 'Good checksum'
+1 -1
View File
@@ -95,7 +95,7 @@ do idb = 0, 30
nhashflag=0
imsg=0
do i=1,16
imsg=ishft(imsg,1)+iand(1,decoded(17-i))
imsg=ishft(imsg,1)+iand(1_1,decoded(17-i))
enddo
nrxrpt=iand(imsg,15)
nrxhash=(imsg-nrxrpt)/16
+1 -1
View File
@@ -129,7 +129,7 @@ subroutine msk40decodeframe(c,mycall,hiscall,xsnr,bswl,nhasharray, &
imsg=0
do i=1,16
imsg=ishft(imsg,1)+iand(1,decoded(17-i))
imsg=ishft(imsg,1)+iand(1_1,decoded(17-i))
enddo
nrxrpt=iand(imsg,15)
nrxhash=(imsg-nrxrpt)/16
+15 -6
View File
@@ -101,14 +101,17 @@ void ADIF::load()
, extractField (record, "BAND")
, extractField (record, "MODE")
, extractField (record, "SUBMODE")
, extractField (record, "QSO_DATE"));
, extractField (record, "QSO_DATE")
, extractField (record, "NAME")
, extractField (record, "COMMENT")
);
}
inputFile.close ();
}
}
void ADIF::add(QString const& call, QString const& band, QString const& mode, QString const& submode, QString const& date)
void ADIF::add(QString const& call, QString const& band, QString const& mode, QString const& submode, QString const& date, QString const& name, QString const& comment)
{
QSO q;
q.call = call;
@@ -116,6 +119,9 @@ void ADIF::add(QString const& call, QString const& band, QString const& mode, QS
q.mode = mode;
q.submode = submode;
q.date = date;
q.name = name;
q.comment = comment;
if (q.call.size ())
{
_data.insert(q.call,q);
@@ -135,13 +141,18 @@ bool ADIF::match(QString const& call, QString const& band) const
if ( (band.compare(q.band,Qt::CaseInsensitive) == 0)
|| (band=="")
|| (q.band==""))
{
{
return true;
}
}
}
return false;
}
}
QList<ADIF::QSO> ADIF::find(QString const& call) const
{
return _data.values(call);
}
QList<QString> ADIF::getCallList() const
{
@@ -154,8 +165,6 @@ QList<QString> ADIF::getCallList() const
}
return p;
}
int ADIF::getCount() const
{
+8 -3
View File
@@ -21,10 +21,14 @@ class QDateTime;
class ADIF
{
public:
struct QSO;
void init(QString const& filename);
void load();
void add(QString const& call, QString const& band, QString const& mode, const QString &submode, QString const& date);
void add(QString const& call, QString const& band, QString const& mode, const QString &submode, QString const& date, const QString &name, const QString &comment);
bool match(QString const& call, QString const& band) const;
QList<ADIF::QSO> find(QString const& call) const;
QList<QString> getCallList() const;
int getCount() const;
@@ -38,12 +42,13 @@ class ADIF
, QString const& operator_call);
private:
struct QSO
{
QString call,band,mode,submode,date;
QString call,band,mode,submode,date,name,comment;
};
private:
QMultiHash<QString, QSO> _data;
QString _filename;
+39 -13
View File
@@ -59,25 +59,51 @@ void LogBook::match(/*in*/const QString call,
bool &callWorkedBefore,
bool &countryWorkedBefore) const
{
if (call.length() > 0)
{
QString currentBand = ""; // match any band
callWorkedBefore = _log.match(call,currentBand);
countryName = _countries.find(call);
if(call.isEmpty()){
return;
}
if (countryName.length() > 0) // country was found
QString currentBand = ""; // match any band
callWorkedBefore = _log.match(call, currentBand);
countryName = _countries.find(call);
if (countryName.length() > 0){ // country was found
countryWorkedBefore = _worked.getHasWorked(countryName);
else
{
countryName = "where?"; //error: prefix not found
countryWorkedBefore = false;
}
} else {
countryName = "where?"; //error: prefix not found
countryWorkedBefore = false;
}
}
void LogBook::addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date)
bool LogBook::findCallDetails(
/*in*/
const QString call,
/*out*/
QString &date,
QString &name,
QString &comment) const
{
_log.add(call,band,mode,submode,date);
if(call.isEmpty()){
return false;
}
auto qsos = _log.find(call);
if(qsos.isEmpty()){
return false;
}
foreach(auto qso, qsos){
if(date.isEmpty() && !qso.date.isEmpty()) date = qso.date;
if(name.isEmpty() && !qso.name.isEmpty()) name = qso.name;
if(comment.isEmpty() && !qso.comment.isEmpty()) comment = qso.comment;
}
return true;
}
void LogBook::addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date, const QString name, const QString comment)
{
_log.add(call,band,mode,submode,date,name,comment);
QString countryName = _countries.find(call);
if (countryName.length() > 0)
_worked.setAsWorked(countryName);
+8 -1
View File
@@ -25,7 +25,14 @@ public:
/*out*/ QString &countryName,
bool &callWorkedBefore,
bool &countryWorkedBefore) const;
void addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date);
bool findCallDetails(
/*in*/
const QString call,
/*out*/
QString &date,
QString &name,
QString &comment) const;
void addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date, const QString name, const QString comment);
private:
CountryDat _countries;
+459 -140
View File
File diff suppressed because it is too large Load Diff
+19 -5
View File
@@ -44,6 +44,7 @@
#include "qpriorityqueue.h"
#include "varicode.h"
#include "MessageClient.hpp"
#include "SpotClient.h"
#include "APRSISClient.h"
#include "keyeater.h"
@@ -176,6 +177,7 @@ private slots:
void on_tx5_currentTextChanged (QString const&);
void on_tx6_editingFinished();
void on_menuControl_aboutToShow();
void on_actionCheck_for_Updates_triggered();
void on_actionEnable_Spotting_toggled(bool checked);
void on_actionEnable_Auto_Reply_toggled(bool checked);
void on_menuWindow_aboutToShow();
@@ -282,7 +284,7 @@ private slots:
void buildFrequencyMenu(QMenu *menu);
void buildHeartbeatMenu(QMenu *menu);
void buildCQMenu(QMenu *menu);
void buildRepeatMenu(QMenu *menu, QPushButton * button, int * interval);
void buildRepeatMenu(QMenu *menu, QPushButton * button, bool isLowInterval, int * interval);
void sendHeartbeat();
void sendHeartbeatAck(QString to, int snr, QString extra);
void on_hbMacroButton_toggled(bool checked);
@@ -383,6 +385,7 @@ private slots:
void on_cbFirst_toggled(bool b);
void on_cbAutoSeq_toggled(bool b);
void emitPTT(bool on);
void emitTones();
void networkMessage(Message const &message);
void sendNetworkMessage(QString const &type, QString const &message);
void sendNetworkMessage(QString const &type, QString const &message, const QMap<QString, QVariant> &params);
@@ -411,7 +414,7 @@ private slots:
void on_cbCQTx_toggled(bool b);
void splash_done ();
void on_measure_check_box_stateChanged (int);
void checkExpiryWarningMessage ();
void checkVersion(bool alertOnUpToDate);
void checkStartupWarnings ();
void clearCallsignSelected();
void refreshTextDisplay();
@@ -712,6 +715,7 @@ private:
QString through;
QString grid;
int freq;
QDateTime cqTimestamp;
QDateTime ackTimestamp;
QDateTime utcTimestamp;
int snr;
@@ -759,6 +763,7 @@ private:
QList<ActivityDetail> msgs;
};
QString m_prevSelectedCallsign;
int m_bandActivityWidth;
int m_callActivityWidth;
int m_textActivityWidth;
@@ -826,12 +831,15 @@ private:
QMap<QString, int> m_rxInboxCountCache; // call -> count
QMap<QString, QMap<QString, CallDetail>> m_callActivityCache; // band -> call activity
QMap<QString, QMap<int, QList<ActivityDetail>>> m_bandActivityCache; // band -> band activity
QMap<QString, QString> m_rxTextCache; // band -> rx text
QMap<QString, QMap<QString, CallDetail>> m_callActivityBandCache; // band -> call activity
QMap<QString, QMap<int, QList<ActivityDetail>>> m_bandActivityBandCache; // band -> band activity
QMap<QString, QString> m_rxTextBandCache; // band -> rx text
QMap<QString, QMap<QString, QSet<QString>>> m_heardGraphOutgoingBandCache; // band -> heard in
QMap<QString, QMap<QString, QSet<QString>>> m_heardGraphIncomingBandCache; // band -> heard out
JSCChecker * m_checker;
QMap<QString, QDateTime> m_callSelectedTime; // call -> timestamp when callsign was last selected
QSet<QString> m_callSeenHeartbeat; // call
int m_previousFreq;
bool m_shouldRestoreFreq;
@@ -856,6 +864,7 @@ private:
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
QQueue<qint64> m_foxRateQueue;
bool m_hbAutoAck;
bool m_hbHidden;
int m_hbInterval;
int m_cqInterval;
@@ -891,6 +900,7 @@ private:
QProgressDialog m_optimizingProgress;
MessageClient * m_messageClient;
PSK_Reporter *psk_Reporter;
SpotClient *m_spotClient;
APRSISClient * m_aprsClient;
DisplayManual m_manual;
QHash<QString, QVariant> m_pwrBandTxMemory; // Remembers power level by band
@@ -915,8 +925,11 @@ private:
bool shortList(QString callsign);
void transmit (double snr = 99.);
void rigFailure (QString const& reason);
void spotSetLocal();
void pskSetLocal ();
void aprsSetLocal ();
void spotReport(int offset, int snr, QString callsign, QString grid);
void spotCmd(CommandDetail cmd);
void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid);
void aprsLogReport(int offset, int snr, QString callsign, QString grid);
Radio::Frequency dialFrequency();
@@ -937,6 +950,7 @@ private:
bool isAllCallIncluded(QString const &text);
bool isGroupCallIncluded(const QString &text);
QString callsignSelected(bool useInputText=false);
void callsignSelectedChanged(QString old, QString current);
bool isRecentOffset(int offset);
void markOffsetRecent(int offset);
bool isDirectedOffset(int offset, bool *pIsAllCall);
+33 -11
View File
@@ -203,7 +203,7 @@
</size>
</property>
<property name="toolTip">
<string>Current Frequency</string>
<string>Set Current Frequency</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
@@ -297,7 +297,7 @@ QPushButton[oob=&quot;true&quot;] {
<bool>true</bool>
</property>
<property name="toolTip">
<string>Current frequency offset</string>
<string>Set Current Frequency Offset</string>
</property>
<property name="styleSheet">
<string notr="true">QLabel {
@@ -401,6 +401,12 @@ color : white;
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Set Callsign and Grid</string>
</property>
<property name="styleSheet">
<string notr="true">QLabel {
font-family: MS Shell Dlg 2;
@@ -1242,14 +1248,6 @@ QTextEdit[transmitting=&quot;true&quot;] {
<string>Callsigns</string>
</property>
</column>
<column>
<property name="text">
<string>✓</string>
</property>
<property name="textAlignment">
<set>AlignCenter</set>
</property>
</column>
<column>
<property name="text">
<string>Age</string>
@@ -1280,6 +1278,24 @@ QTextEdit[transmitting=&quot;true&quot;] {
<string>Distance</string>
</property>
</column>
<column>
<property name="text">
<string>✓</string>
</property>
<property name="toolTip">
<string>Worked Before</string>
</property>
</column>
<column>
<property name="text">
<string>Name</string>
</property>
</column>
<column>
<property name="text">
<string>Comment</string>
</property>
</column>
</widget>
</widget>
</widget>
@@ -4597,7 +4613,7 @@ list. The list can be maintained in Settings (F2).</string>
<x>0</x>
<y>0</y>
<width>994</width>
<height>22</height>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -4672,6 +4688,7 @@ list. The list can be maintained in Settings (F2).</string>
<addaction name="actionShort_list_of_add_on_prefixes_and_suffixes"/>
<addaction name="actionCopyright_Notice"/>
<addaction name="separator"/>
<addaction name="actionCheck_for_Updates"/>
<addaction name="actionAbout"/>
</widget>
<widget class="QMenu" name="menuMode">
@@ -5661,6 +5678,11 @@ list. The list can be maintained in Settings (F2).</string>
<string>Show Message Inbox...</string>
</property>
</action>
<action name="actionCheck_for_Updates">
<property name="text">
<string>Check for Updates</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
+8 -7
View File
@@ -50,8 +50,9 @@ QMap<QString, int> directed_cmds = {
{" SNR?", 0 }, // query snr
{"?", 0 }, // compat
//{" ", 1 }, // unused
//{" ", 2 }, // unused
{" DIT DIT", 1 }, // unused
{" NACK", 2 }, // negative acknowledge
{" HEARING?", 3 }, // query station calls heard
@@ -104,7 +105,7 @@ QMap<QString, int> directed_cmds = {
};
// commands allowed to be processed
QSet<int> allowed_cmds = {-1, 0, /*1,*/ /*2,*/ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
QSet<int> allowed_cmds = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
// commands that result in an autoreply (which can be relayed)
QSet<int> autoreply_cmds = {0, 3, 4, 6, 9, 10, 11, 12, 13, 16, 30};
@@ -129,10 +130,10 @@ QMap<int, int> checksum_cmds = {
};
QString callsign_pattern = QString("(?<callsign>[@]?[A-Z0-9/]+)");
QString optional_cmd_pattern = QString("(?<cmd>\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|INFO|GRID)(?=[ ]|$))|[?> ]))?");
QString optional_cmd_pattern = QString("(?<cmd>\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|NACK|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|INFO|GRID|DIT DIT)(?=[ ]|$))|[?> ]))?");
QString optional_grid_pattern = QString("(?<grid>\\s?[A-R]{2}[0-9]{2})?");
QString optional_extended_grid_pattern = QString("^(?<grid>\\s?(?:[A-R]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*))?");
QString optional_num_pattern = QString("(?<num>(?<=SNR|ACK)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?");
QString optional_num_pattern = QString("(?<num>(?<=SNR|\\bACK)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?");
QRegularExpression directed_re("^" +
callsign_pattern +
@@ -1545,8 +1546,8 @@ QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
quint32 packed_to = Varicode::bitsToInt(bits.mid(31, 28));
quint8 packed_cmd = Varicode::bitsToInt(bits.mid(59, 5));
bool portable_from = (extra >> 7) & 1 == 1;
bool portable_to = (extra >> 6) & 1 == 1;
bool portable_from = ((extra >> 7) & 1) == 1;
bool portable_to = ((extra >> 6) & 1) == 1;
extra = extra % 64;
QString from = Varicode::unpackCallsign(packed_from, portable_from);