diff options
author | michael-west <michael.west@ettus.com> | 2017-01-26 12:53:36 -0800 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2017-01-30 09:36:38 +0100 |
commit | c613c7edb41de76a667e106c0b31684ac890da03 (patch) | |
tree | 170346cf5e09ab5adf2d0eb194e352d822f6a408 /host | |
parent | 7e11bd090058685c1477e4439e53eefe42979451 (diff) | |
download | uhd-c613c7edb41de76a667e106c0b31684ac890da03.tar.gz uhd-c613c7edb41de76a667e106c0b31684ac890da03.tar.bz2 uhd-c613c7edb41de76a667e106c0b31684ac890da03.zip |
GPS: Improvements to query_gpsdo_sensor
- Reordered operations to make sure setting clock and time sources is first
- Reduced delay waiting for ref lock
- Added wait for GPSDO warm up
- Made warning messages in gps_ctrl function into log messages to prevent unnecessary output
Diffstat (limited to 'host')
-rw-r--r-- | host/lib/usrp/gps_ctrl.cpp | 10 | ||||
-rw-r--r-- | host/utils/query_gpsdo_sensors.cpp | 99 |
2 files changed, 62 insertions, 47 deletions
diff --git a/host/lib/usrp/gps_ctrl.cpp b/host/lib/usrp/gps_ctrl.cpp index 28f5a28cd..f4a42af34 100644 --- a/host/lib/usrp/gps_ctrl.cpp +++ b/host/lib/usrp/gps_ctrl.cpp @@ -92,7 +92,7 @@ private: sentences[which].get<2>() = true; } } catch(std::exception &e) { - UHD_MSG(warning) << "get_sentence: " << e.what(); + UHD_LOGV(often) << "get_sentence: " << e.what(); } if (not sentence.empty() or now > exit_time) @@ -134,7 +134,7 @@ private: } void update_cache() { - if(not gps_detected() or (_gps_type != GPS_TYPE_INTERNAL_GPSDO)) { + if(not gps_detected()) { return; } @@ -352,11 +352,11 @@ private: return gps_time; } catch(std::exception &e) { - UHD_MSG(warning) << "get_time: " << e.what(); + UHD_LOGV(often) << "get_time: " << e.what(); error_cnt++; } } - throw uhd::value_error("Timeout after no valid message found"); + throw uhd::value_error("get_time: Timeout after no valid message found"); return gps_time; //keep gcc from complaining } @@ -379,7 +379,7 @@ private: else return (get_token(reply, 6) != "0"); } catch(std::exception &e) { - UHD_MSG(warning) << "locked: " << e.what(); + UHD_LOGV(often) << "locked: " << e.what(); error_cnt++; } } diff --git a/host/utils/query_gpsdo_sensors.cpp b/host/utils/query_gpsdo_sensors.cpp index 7420e62e9..6c2ec0bd1 100644 --- a/host/utils/query_gpsdo_sensors.cpp +++ b/host/utils/query_gpsdo_sensors.cpp @@ -120,67 +120,83 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ return EXIT_FAILURE; } - // Explicitly set time source to gpsdo - boost::this_thread::sleep(boost::posix_time::seconds(1)); + std::cout << "\nSetting the reference clock source to \"gpsdo\"...\n"; try { - usrp->set_time_source("gpsdo"); + usrp->set_clock_source("gpsdo"); } catch (uhd::value_error &e) { - std::cout << "could not set the time source to \"gpsdo\"; error was:" <<std::endl; + std::cout << "could not set the clock source to \"gpsdo\"; error was:" <<std::endl; std::cout << e.what() << std::endl; std::cout << "trying \"external\"..." <<std::endl; - try { - usrp->set_time_source("external"); + try{ + usrp->set_clock_source("external"); } catch (uhd::value_error&) { std::cout << "\"external\" failed, too." << std::endl; } } - std::cout<< std::endl << "Time source is now " << usrp->get_time_source(0) << std::endl; + std::cout<< std::endl << "Clock source is now " << usrp->get_clock_source(0) << std::endl; - //Check for GPS lock - uhd::sensor_value_t gps_locked = usrp->get_mboard_sensor("gps_locked",0); - if(not gps_locked.to_bool()) { - std::cout << boost::format("\nGPS does not have lock. Wait a few minutes and try again.\n"); - std::cout << boost::format("NMEA strings and device time may not be accurate until lock is achieved.\n\n"); + //Check for 10 MHz lock + if(std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end()) { + uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked",0); + for (size_t i = 0; not ref_locked.to_bool() and i < 100; i++) { + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); + ref_locked = usrp->get_mboard_sensor("ref_locked",0); + } + if(not ref_locked.to_bool()) { + std::cout << boost::format("USRP NOT Locked to GPSDO 10 MHz Reference.\n"); + std::cout << boost::format("Double check installation instructions (N2X0/E1X0 only): https://www.ettus.com/content/files/gpsdo-kit_4.pdf\n\n"); + return EXIT_FAILURE; + } else { + std::cout << boost::format("USRP Locked to GPSDO 10 MHz Reference.\n"); + } } else { - std::cout << boost::format("GPS Locked"); + std::cout << boost::format("ref_locked sensor not present on this board.\n"); } - std::cout << "\nSetting the reference clock source to \"gpsdo\"...\n"; + // Explicitly set time source to gpsdo try { - usrp->set_clock_source("gpsdo"); + usrp->set_time_source("gpsdo"); } catch (uhd::value_error &e) { - std::cout << "could not set the clock source to \"gpsdo\"; error was:" <<std::endl; + std::cout << "could not set the time source to \"gpsdo\"; error was:" <<std::endl; std::cout << e.what() << std::endl; std::cout << "trying \"external\"..." <<std::endl; - try{ - usrp->set_clock_source("external"); + try { + usrp->set_time_source("external"); } catch (uhd::value_error&) { std::cout << "\"external\" failed, too." << std::endl; } } - std::cout<< std::endl << "Clock source is now " << usrp->get_clock_source(0) << std::endl; + std::cout << std::endl << "Time source is now " << usrp->get_time_source(0) << std::endl; print_notes(); + // The TCXO has a long warm up time, so wait up to 30 seconds for sensor data to show up + std::cout << "Waiting for the GPSDO to warm up..." << std::endl; + for (size_t i = 0; i < 300; i++) { + try { + usrp->get_mboard_sensor("gps_locked",0); + break; + } catch (std::exception &) {} + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); + } + try { + usrp->get_mboard_sensor("gps_locked",0); + } catch (std::exception &) { + std::cout << "No response from GPSDO in 30 seconds" << std::endl; + return EXIT_FAILURE; + } + std::cout << "The GPSDO is warmed up and talking." << std::endl; - //Check for 10 MHz lock - if(std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end()) { - uhd::sensor_value_t gps_locked = usrp->get_mboard_sensor("ref_locked",0); - if(not gps_locked.to_bool()) { - std::cout << boost::format("USRP NOT Locked to GPSDO 10 MHz Reference.\n"); - std::cout << boost::format("Double check installation instructions (N2X0/E1X0 only): https://www.ettus.com/content/files/gpsdo-kit_4.pdf\n\n"); - std::cout << boost::format("Locking the internal reference to the GPSDO might take a second to reach stability. Retrying in 10 s...\n\n"); - boost::this_thread::sleep(boost::posix_time::seconds(10)); - } - if(usrp->get_mboard_sensor("ref_locked",0).to_bool()) { - std::cout << boost::format("USRP Locked to GPSDO 10 MHz Reference.\n"); - } + //Check for GPS lock + uhd::sensor_value_t gps_locked = usrp->get_mboard_sensor("gps_locked",0);; + if(not gps_locked.to_bool()) { + std::cout << boost::format("\nGPS does not have lock. Wait a few minutes and try again.\n"); + std::cout << boost::format("NMEA strings and device time may not be accurate until lock is achieved.\n\n"); } else { - std::cout << boost::format("ref_locked sensor not present on this board.\n"); + std::cout << boost::format("GPS Locked"); } //Check PPS and compare UHD device time to GPS time - boost::this_thread::sleep(boost::posix_time::seconds(1)); uhd::sensor_value_t gps_time = usrp->get_mboard_sensor("gps_time"); uhd::time_spec_t last_pps_time = usrp->get_time_last_pps(); @@ -189,13 +205,12 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ long long pps_seconds = last_pps_time.to_ticks(1.0); if(pps_seconds != gps_seconds) { - std::cout << boost::format("\nGPS and UHD Device time are NOT aligned;\nlast_pps: %ld vs gps: %ld. Trying to set the device time to GPS time...") - % pps_seconds % gps_seconds + std::cout << "\nTrying to align the device time to GPS time..." << std::endl; - //full next after next second - uhd::time_spec_t next_pps_time(gps_seconds + 2.0); - //instruct the USRP to wait for the next PPS edge, then set the new time on the following PPS - usrp->set_time_unknown_pps(next_pps_time); + //set the device time to the GPS time + //getting the GPS time returns just after the PPS edge, so just add a + //second and set the device time at the next PPS edge + usrp->set_time_next_pps(uhd::time_spec_t(gps_time.to_int() + 1.0)); //allow some time to make sure the PPS has come… boost::this_thread::sleep(boost::posix_time::milliseconds(1100)); //…then ask @@ -203,14 +218,14 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ pps_seconds = usrp->get_time_last_pps().to_ticks(1.0); } - std::cout << boost::format("last_pps: %ld vs gps: %ld.") - % pps_seconds % gps_seconds - << std::endl; if (pps_seconds == gps_seconds) { std::cout << boost::format("GPS and UHD Device time are aligned.\n"); } else { std::cout << boost::format("Could not align UHD Device time to GPS time. Giving up.\n"); } + std::cout << boost::format("last_pps: %ld vs gps: %ld.") + % pps_seconds % gps_seconds + << std::endl; //print NMEA strings try { |