diff options
author | Nick Foster <nick@nerdnetworks.org> | 2010-08-13 16:16:22 -0700 |
---|---|---|
committer | Nick Foster <nick@nerdnetworks.org> | 2010-08-13 16:16:22 -0700 |
commit | 727d8711f94bf7fe634fc33659b77bc4b4884d9c (patch) | |
tree | 7c0761dbcd0f47d1fd350190ecde1ced5d30f947 /host/lib/usrp/usrp2/gps_ctrl.cpp | |
parent | 5ab3f053529bb8d85a7f1ba9e1dd113c1f6eb813 (diff) | |
download | uhd-727d8711f94bf7fe634fc33659b77bc4b4884d9c.tar.gz uhd-727d8711f94bf7fe634fc33659b77bc4b4884d9c.tar.bz2 uhd-727d8711f94bf7fe634fc33659b77bc4b4884d9c.zip |
Support for NMEA reads. Uses NMEA parsing instead of Jackson Labs parsing.
No multibaud support yet. read/write_uart() now do multiple-packet writes in multiples of 20 bytes (hardcoded).
Diffstat (limited to 'host/lib/usrp/usrp2/gps_ctrl.cpp')
-rw-r--r-- | host/lib/usrp/usrp2/gps_ctrl.cpp | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/host/lib/usrp/usrp2/gps_ctrl.cpp b/host/lib/usrp/usrp2/gps_ctrl.cpp index 7152800aa..20d670f81 100644 --- a/host/lib/usrp/usrp2/gps_ctrl.cpp +++ b/host/lib/usrp/usrp2/gps_ctrl.cpp @@ -20,10 +20,14 @@ #include <boost/cstdint.hpp> #include <string> #include <boost/date_time/posix_time/posix_time.hpp> +#include <boost/thread.hpp> +#include <boost/algorithm/string/trim.hpp> +#include <boost/tokenizer.hpp> using namespace uhd; using namespace boost::gregorian; using namespace boost::posix_time; +using namespace boost::algorithm; /*! * A usrp2 GPS control for Jackson Labs devices @@ -42,9 +46,10 @@ public: //TODO: try multiple baud rates (many GPS's are set up for 4800bps, you're fixed at 115200bps 8N1 right now) //you have to poke registers in order to set baud rate, there's no dude/bro interface for it + _iface->read_uart(GPS_UART); //flush it out _iface->write_uart(GPS_UART, "HAAAY GUYYYYS\n"); try { - reply = _iface->read_uart(GPS_UART, 20); + reply = _iface->read_uart(GPS_UART); //std::cerr << "Got reply from GPS: " << reply.c_str() << " with length = " << reply.length() << std::endl; } catch (std::runtime_error err) { if(err.what() != std::string("usrp2 no control response")) throw; //sorry can't cope with that @@ -53,7 +58,7 @@ public: } } - if(reply == "Command Error") gps_type = GPS_TYPE_JACKSON_LABS; + if(trim_right_copy(reply) == "Command Error") gps_type = GPS_TYPE_JACKSON_LABS; else gps_type = GPS_TYPE_NONE; //we'll add NMEA support later switch(gps_type) { @@ -61,12 +66,18 @@ public: std::cerr << "Found a Jackson Labs GPS" << std::endl; //issue some setup stuff so it quits spewing data out when not asked to //none of these should issue replies so we don't bother looking for it - _iface->write_uart(GPS_UART, "SYST:COMM:SER:"); - _iface->write_uart(GPS_UART, "ECHO OFF\n"); //we split lines before 20 chars right now -- TODO: fix driver to split writes/reads for you - _iface->write_uart(GPS_UART, "SYST:COMM:SER:"); - _iface->write_uart(GPS_UART, "PRO OFF\n"); + //we have to sleep between commands because the JL device, despite not acking, takes considerable time to process each command. + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); + _iface->write_uart(GPS_UART, "SYST:COMM:SER:ECHO OFF\n"); + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); + _iface->write_uart(GPS_UART, "SYST:COMM:SER:PRO OFF\n"); + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); _iface->write_uart(GPS_UART, "GPS:GPGGA 0\n"); + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); _iface->write_uart(GPS_UART, "GPS:GGAST 0\n"); + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); + _iface->write_uart(GPS_UART, "GPS:GPRMC 1\n"); + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); break; case GPS_TYPE_GENERIC_NMEA: @@ -84,13 +95,27 @@ public: ptime get_time(void) { std::string reply; ptime now; + boost::tokenizer<boost::escaped_list_separator<char> > tok(reply); + std::vector<std::string> toked; switch(gps_type) { - case GPS_TYPE_JACKSON_LABS: - _iface->write_uart(GPS_UART, "PTIME:TIME\n"); - reply = _iface->read_uart(GPS_UART, 20); - now = ptime(get_date(), duration_from_string(reply)); - break; + case GPS_TYPE_JACKSON_LABS: //deprecated in favor of a single NMEA parser case GPS_TYPE_GENERIC_NMEA: + while(reply.length() == 0) reply = _iface->read_uart(GPS_UART); //loop until we hear something + tok.assign(reply); + toked.assign(tok.begin(), tok.end()); + + UHD_ASSERT_THROW(toked.size() == 11); //if it's not we got something weird in there + + now = ptime( date( + greg_year(boost::lexical_cast<int>(toked[8].substr(4, 2)) + 2000), //just trust me on this one + greg_month(boost::lexical_cast<int>(toked[8].substr(2, 2))), + greg_day(boost::lexical_cast<int>(toked[8].substr(0, 2))) + ), + hours( boost::lexical_cast<int>(toked[1].substr(0, 2))) + + minutes(boost::lexical_cast<int>(toked[1].substr(2, 2))) + + seconds(boost::lexical_cast<int>(toked[1].substr(4, 2))) + ); + break; case GPS_TYPE_NONE: default: throw std::runtime_error("get_time(): Unsupported GPS or no GPS detected\n"); @@ -99,24 +124,6 @@ public: return now; } - date get_date(void) { - std::string reply; - date today; - switch(gps_type) { - case GPS_TYPE_JACKSON_LABS: - _iface->write_uart(GPS_UART, "PTIME:DATE\n"); - reply = _iface->read_uart(GPS_UART, 20); - today = from_string(reply); - break; - case GPS_TYPE_GENERIC_NMEA: - case GPS_TYPE_NONE: - default: - throw std::runtime_error("get_date(): Unsupported GPS or no GPS detected\n"); - break; - } - return today; - } - bool gps_detected(void) { return (gps_type != GPS_TYPE_NONE); } |