From fd2d94cc7e84efe078c582ff6337efd6cec5f66b Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 16 Jul 2017 14:38:24 +0000 Subject: [PATCH] Merging from trunk: ------------------------------------------------------------------------ r7896 | bsomervi | 2017-07-16 15:32:28 +0100 (Sun, 16 Jul 2017) | 5 lines Improve support for older C++ compilers Some current Linux distributions are still using GCC 4.6 which has no/poor C++11 support. probably more of this needed if we are to support such compilers. ------------------------------------------------------------------------ r7897 | bsomervi | 2017-07-16 15:32:48 +0100 (Sun, 16 Jul 2017) | 3 lines Improved rig control start up behavour Avoid trying to set bogus uninitialized frequency values. ------------------------------------------------------------------------ git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx-1.8@7898 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- HamlibTransceiver.cpp | 58 +++++++++++++++++++++---------------------- TransceiverBase.cpp | 4 ++- lib/crc10.cpp | 55 ++++++++++++++++++++++------------------ lib/crc12.cpp | 13 +++++++--- mainwindow.cpp | 6 ++--- 5 files changed, 76 insertions(+), 60 deletions(-) diff --git a/HamlibTransceiver.cpp b/HamlibTransceiver.cpp index 6b70069b7..473f761d3 100644 --- a/HamlibTransceiver.cpp +++ b/HamlibTransceiver.cpp @@ -919,6 +919,35 @@ void HamlibTransceiver::poll () reversed_ = RIG_VFO_B == v; } + if ((WSJT_RIG_NONE_CAN_SPLIT || !is_dummy_) + && rig_->caps->get_split_vfo && split_query_works_) + { + vfo_t v {RIG_VFO_NONE}; // so we can tell if it doesn't get updated :( + auto rc = rig_get_split_vfo (rig_.data (), RIG_VFO_CURR, &s, &v); + if (-RIG_OK == rc && RIG_SPLIT_ON == s) + { + TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_split_vfo split = " << s << " VFO = " << rig_strvfo (v)); + update_split (true); + // if (RIG_VFO_A == v) + // { + // reversed_ = true; // not sure if this helps us here + // } + } + else if (-RIG_OK == rc) // not split + { + TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_split_vfo split = " << s << " VFO = " << rig_strvfo (v)); + update_split (false); + } + else + { + // Some rigs (Icom) don't have a way of reporting SPLIT + // mode + TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_split_vfo can't do on this rig"); + // just report how we see it based on prior commands + split_query_works_ = false; + } + } + if (freq_query_works_) { // only read if possible and when receiving or simplex @@ -974,35 +1003,6 @@ void HamlibTransceiver::poll () } } - if ((WSJT_RIG_NONE_CAN_SPLIT || !is_dummy_) - && rig_->caps->get_split_vfo && split_query_works_) - { - vfo_t v {RIG_VFO_NONE}; // so we can tell if it doesn't get updated :( - auto rc = rig_get_split_vfo (rig_.data (), RIG_VFO_CURR, &s, &v); - if (-RIG_OK == rc && RIG_SPLIT_ON == s) - { - TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_split_vfo split = " << s << " VFO = " << rig_strvfo (v)); - update_split (true); - // if (RIG_VFO_A == v) - // { - // reversed_ = true; // not sure if this helps us here - // } - } - else if (-RIG_OK == rc) // not split - { - TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_split_vfo split = " << s << " VFO = " << rig_strvfo (v)); - update_split (false); - } - else - { - // Some rigs (Icom) don't have a way of reporting SPLIT - // mode - TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_split_vfo can't do on this rig"); - // just report how we see it based on prior commands - split_query_works_ = false; - } - } - if (RIG_PTT_NONE != rig_->state.pttport.type.ptt && rig_->caps->get_ptt) { ptt_t p; diff --git a/TransceiverBase.cpp b/TransceiverBase.cpp index 7e2483652..ef77d51e4 100644 --- a/TransceiverBase.cpp +++ b/TransceiverBase.cpp @@ -86,7 +86,9 @@ void TransceiverBase::set (TransceiverState const& s, requested_.frequency (actual_.frequency ()); requested_.mode (actual_.mode ()); } - if (!s.tx_frequency () || s.tx_frequency () > 10000) // ignore bogus startup values + if (!s.tx_frequency () + || (s.tx_frequency () > 10000 // ignore bogus startup values + && s.tx_frequency () < std::numeric_limits::max () - 10000)) { if ((s.tx_frequency () != requested_.tx_frequency () // and QSY || (s.mode () != UNK && s.mode () != requested_.mode ())) // or mode change diff --git a/lib/crc10.cpp b/lib/crc10.cpp index 9ebf42ed7..93f664930 100644 --- a/lib/crc10.cpp +++ b/lib/crc10.cpp @@ -1,24 +1,31 @@ -#include - -extern "C" -{ - short crc10 (unsigned char const * data, int length); - bool crc10_check (unsigned char const * data, int length); -} - -namespace -{ - unsigned long constexpr truncated_polynomial = 0x08f; -} - -// assumes CRC is last 16 bits of the data and is set to zero -// caller should assign the returned CRC into the message in big endian byte order -short crc10 (unsigned char const * data, int length) -{ - return boost::augmented_crc<10, truncated_polynomial> (data, length); -} - -bool crc10_check (unsigned char const * data, int length) -{ - return !boost::augmented_crc<10, truncated_polynomial> (data, length); -} +#include +#include + +extern "C" +{ + short crc10 (unsigned char const * data, int length); + bool crc10_check (unsigned char const * data, int length); +} + +#define POLY 0x08f + +#ifdef BOOST_NO_CXX11_CONSTEXPR +#define TRUNCATED_POLYNOMIAL POLY +#else +namespace +{ + unsigned long constexpr TRUNCATED_POLYNOMIAL = POLY; +} +#endif + +// assumes CRC is last 16 bits of the data and is set to zero +// caller should assign the returned CRC into the message in big endian byte order +short crc10 (unsigned char const * data, int length) +{ + return boost::augmented_crc<10, TRUNCATED_POLYNOMIAL> (data, length); +} + +bool crc10_check (unsigned char const * data, int length) +{ + return !boost::augmented_crc<10, TRUNCATED_POLYNOMIAL> (data, length); +} diff --git a/lib/crc12.cpp b/lib/crc12.cpp index e7d0a80ee..44e50fe71 100644 --- a/lib/crc12.cpp +++ b/lib/crc12.cpp @@ -1,4 +1,5 @@ #include +#include extern "C" { @@ -6,19 +7,25 @@ extern "C" bool crc12_check (unsigned char const * data, int length); } +#define POLY 0xc06 + +#ifdef BOOST_NO_CXX11_CONSTEXPR +#define TRUNCATED_POLYNOMIAL POLY +#else namespace { - unsigned long constexpr truncated_polynomial = 0xc06; + unsigned long constexpr TRUNCATED_POLYNOMIAL = POLY; } +#endif // assumes CRC is last 16 bits of the data and is set to zero // caller should assign the returned CRC into the message in big endian byte order short crc12 (unsigned char const * data, int length) { - return boost::augmented_crc<12, truncated_polynomial> (data, length); + return boost::augmented_crc<12, TRUNCATED_POLYNOMIAL> (data, length); } bool crc12_check (unsigned char const * data, int length) { - return !boost::augmented_crc<12, truncated_polynomial> (data, length); + return !boost::augmented_crc<12, TRUNCATED_POLYNOMIAL> (data, length); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 1875a7c3b..d4c25547e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -5344,6 +5344,8 @@ void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& m_tx_when_ready = false; } m_rigState = s; + auto old_freqNominal = m_freqNominal; + m_freqNominal = s.frequency () - m_astroCorrection.rx; if (old_state.online () == false && s.online () == true) { // initializing @@ -5354,9 +5356,7 @@ void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& m_splitMode = s.split (); if (!s.ptt ()) //!m_transmitting) { - auto temp = m_freqNominal; - m_freqNominal = s.frequency () - m_astroCorrection.rx; - if (temp != m_freqNominal) + if (old_freqNominal != m_freqNominal) { m_freqTxNominal = m_freqNominal; genCQMsg ();