diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/gps_ctrl.cpp | 22 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 20 | 
2 files changed, 38 insertions, 4 deletions
| diff --git a/host/lib/usrp/gps_ctrl.cpp b/host/lib/usrp/gps_ctrl.cpp index 55f46ffb3..2c2843877 100644 --- a/host/lib/usrp/gps_ctrl.cpp +++ b/host/lib/usrp/gps_ctrl.cpp @@ -184,6 +184,24 @@ public:      return (gps_type != GPS_TYPE_NONE);    } +  bool locked(void) { +      std::string reply = get_nmea("GPGGA"); +      if(reply.size() <= 1) return false; + +      boost::tokenizer<boost::escaped_list_separator<char> > tok(reply); +      std::vector<std::string> toked; + +      tok.assign(reply); +      toked.assign(tok.begin(), tok.end()); + +      if(toked.size() != 15) { +        UHD_MSG(error) << "gps_locked: invalid GPGGA response"; +        return false; +      } + +      return (toked[6] != "0"); //sorry, 2d fixes don't count =D +  } +    //return a list of supported sensors    std::vector<std::string> get_sensors(void) {      std::vector<std::string> ret; @@ -191,6 +209,7 @@ public:      ret.push_back("gps_gprmc");      ret.push_back("gps_gpgsa");      ret.push_back("gps_time"); +    ret.push_back("gps_locked");      return ret;    } @@ -206,6 +225,9 @@ public:      else if(key == "gps_time") {          return sensor_value_t("GPS epoch time", int(get_epoch_time()), "seconds");      } +    else if(key == "gps_locked") { +        return sensor_value_t("GPS lock status", locked(), "locked", "unlocked"); +    }      else {          UHD_THROW_PROP_GET_ERROR();      } diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 3733915a2..12fff96d0 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -149,7 +149,13 @@ usrp2_mboard_impl::usrp2_mboard_impl(          (_mimo_clocking_mode_is_master?"master":"slave") << std::endl;      //init the clock config -    _clock_config = clock_config_t::internal(); +    if(_iface->mb_eeprom["gpsdo"] == "internal" or +       _iface->mb_eeprom["gpsdo"] == "external") { +        _clock_config = clock_config_t::external(); +    } +    else { +        _clock_config = clock_config_t::internal(); +    }      update_clock_config();      //init the codec before the dboard @@ -176,9 +182,15 @@ usrp2_mboard_impl::usrp2_mboard_impl(      //------------------------------------------------------------------      //initialize VITA time to GPS time -    if(_gps_ctrl.get() and _gps_ctrl->gps_detected()) { -        UHD_MSG(status) << "Setting device time to GPS time...\n"; -        set_time_spec(time_spec_t(double(_gps_ctrl->get_sensor("gps_time").to_int()+1)), false); +    if( _gps_ctrl.get() +    and _gps_ctrl->gps_detected()) { +        if(_gps_ctrl->get_sensor("gps_locked").to_bool()) { +            UHD_MSG(status) << "Setting device time to GPS time...\n"; +            set_time_spec(time_spec_t(double(_gps_ctrl->get_sensor("gps_time").to_int()+1)), false); +        } +        else { +            UHD_MSG(status) << "GPS not locked to satellites. Not initializing VITA time."; +        }      }  } | 
