From b41db624a2d162f691cbf7957feca2a0162a8367 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 10 Feb 2018 18:17:14 +0100 Subject: Properly initialise UHD GPSDO --- src/output/UHD.cpp | 4 ++-- src/output/USRPTime.cpp | 31 ++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/output/UHD.cpp b/src/output/UHD.cpp index 2c571fd..6838338 100644 --- a/src/output/UHD.cpp +++ b/src/output/UHD.cpp @@ -136,8 +136,6 @@ UHD::UHD(SDRDeviceConfig& config) : } m_usrp->set_time_source(m_conf.pps_src); - m_device_time = std::make_shared(m_usrp, m_conf); - if (m_conf.subDevice != "") { m_usrp->set_tx_subdev_spec(uhd::usrp::subdev_spec_t(m_conf.subDevice), uhd::usrp::multi_usrp::ALL_MBOARDS); @@ -147,6 +145,8 @@ UHD::UHD(SDRDeviceConfig& config) : etiLog.level(debug) << "UHD time source is " << m_usrp->get_time_source(0); + m_device_time = std::make_shared(m_usrp, m_conf); + m_usrp->set_tx_rate(m_conf.sampleRate); etiLog.log(debug, "OutputUHD:Set rate to %d. Actual TX Rate: %f sps...", m_conf.sampleRate, m_usrp->get_tx_rate()); diff --git a/src/output/USRPTime.cpp b/src/output/USRPTime.cpp index 935d56b..8de86fb 100644 --- a/src/output/USRPTime.cpp +++ b/src/output/USRPTime.cpp @@ -88,6 +88,26 @@ USRPTime::USRPTime( m_conf(conf), time_last_check(timepoint_t::clock::now()) { + + if (m_conf.pps_src == "gpsdo") { + using namespace std::chrono; + auto now = system_clock::now(); + auto expiry = now + seconds(m_conf.maxGPSHoldoverTime); + auto checkfunc = gpsdo_is_ettus() ? check_gps_locked : check_gps_timelock; + while (now < expiry) { + if (checkfunc(m_usrp)) { + break; + } + + now = system_clock::now(); + this_thread::sleep_for(seconds(1)); + } + + if (not checkfunc(m_usrp)) { + throw runtime_error("GPSDO did not lock during startup"); + } + } + if (m_conf.pps_src == "none") { if (m_conf.enableSync) { etiLog.level(warn) << @@ -266,16 +286,21 @@ void USRPTime::set_usrp_time_from_pps() * Wait 200ms to ensure the PPS comes later. */ this_thread::sleep_for(milliseconds(200)); - const auto time_set = uhd::time_spec_t(secs_since_epoch + 2); + const auto time_set = uhd::time_spec_t(secs_since_epoch + 3, 0.0); etiLog.level(info) << "OutputUHD: Setting USRP time next pps to " << std::fixed << time_set.get_real_secs(); - m_usrp->set_time_next_pps(time_set); + m_usrp->set_time_unknown_pps(time_set); // The UHD doc says we need to give the USRP one second to update // all the internal registers. this_thread::sleep_for(seconds(1)); + const auto time_usrp = m_usrp->get_time_now(); etiLog.level(info) << "OutputUHD: USRP time " << - std::fixed << m_usrp->get_time_now().get_real_secs(); + std::fixed << time_usrp.get_real_secs(); + + if (std::abs(time_usrp.get_real_secs() - time_set.get_real_secs()) > 10.0) { + throw runtime_error("OutputUHD: Unable to set USRP time!"); + } } } // namespace Output -- cgit v1.2.3