From c40c824540049b25b033fd86795f916496b0090e Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 14 Apr 2016 19:25:18 +0000 Subject: [PATCH] Round frequencies returned from Hamlib to the nearest Hertz Hamlib can return fractional decimal Hertz for some devices that use internal fixed point binary registers e.g. devices using the Si570 clock generator as a frequency synthesizer. Rounding to the nearest Hertz should ensure accurate round tripping of frequencies. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6622 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- HamlibTransceiver.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/HamlibTransceiver.cpp b/HamlibTransceiver.cpp index 06324b274..6e5ad87e7 100644 --- a/HamlibTransceiver.cpp +++ b/HamlibTransceiver.cpp @@ -1,6 +1,7 @@ #include "HamlibTransceiver.hpp" #include +#include #include #include @@ -439,6 +440,7 @@ int HamlibTransceiver::do_start () // assume it is as when we started by setting at open time right // here. We also gather/set other initial state. error_check (rig_get_freq (rig_.data (), RIG_VFO_CURR, &f1), tr ("getting current frequency")); + f1 = std::round (f1); TRACE_CAT ("HamlibTransceiver", "current frequency =" << f1); error_check (rig_get_mode (rig_.data (), RIG_VFO_CURR, &m, &w), tr ("getting current mode")); @@ -456,6 +458,7 @@ int HamlibTransceiver::do_start () } error_check (rig_get_freq (rig_.data (), RIG_VFO_CURR, &f2), tr ("getting other VFO frequency")); + f2 = std::round (f2); TRACE_CAT ("HamlibTransceiver", "rig_get_freq other frequency =" << f2); error_check (rig_get_mode (rig_.data (), RIG_VFO_CURR, &mb, &wb), tr ("getting other VFO mode")); @@ -481,6 +484,7 @@ int HamlibTransceiver::do_start () else { error_check (rig_get_freq (rig_.data (), RIG_VFO_CURR, &f1), tr ("getting frequency")); + f1 = std::round (f1); TRACE_CAT ("HamlibTransceiver", "rig_get_freq frequency =" << f1); error_check (rig_get_mode (rig_.data (), RIG_VFO_CURR, &m, &w), tr ("getting mode")); @@ -542,6 +546,7 @@ int HamlibTransceiver::do_start () int resolution {0}; freq_t current_frequency; error_check (rig_get_freq (rig_.data (), RIG_VFO_CURR, ¤t_frequency), tr ("getting current VFO frequency")); + current_frequency = std::round (current_frequency); Frequency f = current_frequency; if (f && !(f % 10)) { @@ -549,6 +554,7 @@ int HamlibTransceiver::do_start () error_check (rig_set_freq (rig_.data (), RIG_VFO_CURR, test_frequency), tr ("setting frequency")); freq_t new_frequency; error_check (rig_get_freq (rig_.data (), RIG_VFO_CURR, &new_frequency), tr ("getting current VFO frequency")); + new_frequency = std::round (new_frequency); switch (static_cast (new_frequency - test_frequency)) { case -5: resolution = -1; break; // 10Hz truncated @@ -570,6 +576,7 @@ void HamlibTransceiver::do_stop () if (is_dummy_) { rig_get_freq (rig_.data (), RIG_VFO_CURR, &dummy_frequency_); + dummy_frequency_ = std::round (dummy_frequency_); if (mode_query_works_) { pbwidth_t width; @@ -851,6 +858,7 @@ void HamlibTransceiver::poll () if (!state ().ptt () || !state ().split ()) { error_check (rig_get_freq (rig_.data (), RIG_VFO_CURR, &f), tr ("getting current VFO frequency")); + f = std::round (f); TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_freq frequency =" << f); update_rx_frequency (f); } @@ -871,6 +879,7 @@ void HamlibTransceiver::poll () ? (rig_->state.vfo_list & RIG_VFO_A ? RIG_VFO_A : RIG_VFO_MAIN) : (rig_->state.vfo_list & RIG_VFO_B ? RIG_VFO_B : RIG_VFO_SUB) , &f), tr ("getting other VFO frequency")); + f = std::round (f); TRACE_CAT_POLL ("HamlibTransceiver", "rig_get_freq other VFO =" << f); update_other_frequency (f); }