aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp2/gps_ctrl.cpp
diff options
context:
space:
mode:
authorNick Foster <nick@nerdnetworks.org>2010-08-13 11:34:07 -0700
committerNick Foster <nick@nerdnetworks.org>2010-08-13 11:34:07 -0700
commitf09d9820ed40371f552d3a910bc2d8170d290653 (patch)
treed0a2d1b5d807aea51717be881cbfd27fbd45fe20 /host/lib/usrp/usrp2/gps_ctrl.cpp
parent3fe2744e7aef9f6989b161be3af63a24392ed18a (diff)
downloaduhd-f09d9820ed40371f552d3a910bc2d8170d290653.tar.gz
uhd-f09d9820ed40371f552d3a910bc2d8170d290653.tar.bz2
uhd-f09d9820ed40371f552d3a910bc2d8170d290653.zip
first stab at a GPS driver in gps_ctrl.cpp. not the most expandable thing in the world but there's only so many GPS interfaces out there.
Diffstat (limited to 'host/lib/usrp/usrp2/gps_ctrl.cpp')
-rw-r--r--host/lib/usrp/usrp2/gps_ctrl.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/host/lib/usrp/usrp2/gps_ctrl.cpp b/host/lib/usrp/usrp2/gps_ctrl.cpp
new file mode 100644
index 000000000..5c015be14
--- /dev/null
+++ b/host/lib/usrp/usrp2/gps_ctrl.cpp
@@ -0,0 +1,140 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "gps_ctrl.hpp"
+#include <uhd/utils/assert.hpp>
+#include <boost/cstdint.hpp>
+#include <string>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+using namespace uhd;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+/*!
+ * A usrp2 GPS control for Jackson Labs devices
+ */
+
+//TODO: multiple baud rate support (requires mboard_impl changes for poking UART registers), NMEA support, better autodetection
+class usrp2_gps_ctrl_impl : public usrp2_gps_ctrl{
+public:
+ usrp2_gps_ctrl_impl(usrp2_iface::sptr iface){
+ _iface = iface;
+ //do init here
+ //so the Jackson Labs Firefly (and Fury) don't acknowledge successful commands -- only invalid ones.
+ //first we test to see if there's a Firefly/Fury connected by sending an invalid packet and listening for the response
+
+ std::string reply;
+
+ //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->write_uart(GPS_UART, "HAAAY GUYYYYS\n");
+ try {
+ reply = _iface->read_uart(GPS_UART, 20);
+ } catch (std::runtime_error err) {
+ if(err.what() != std::string("usrp2 no control response")) throw; //sorry can't cope with that
+ else { //we don't actually have a GPS installed
+ gps_type = GPS_TYPE_NONE;
+ }
+ }
+
+ if(reply == "Command Error") gps_type = GPS_TYPE_JACKSON_LABS;
+ else gps_type = GPS_TYPE_NONE; //we'll add NMEA support later
+
+ switch(gps_type) {
+ case GPS_TYPE_JACKSON_LABS:
+ //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");
+ _iface->write_uart(GPS_UART, "GPS:GPGGA 0\n");
+ _iface->write_uart(GPS_UART, "GPS:GGAST 0\n");
+ break;
+
+ case GPS_TYPE_GENERIC_NMEA:
+ case GPS_TYPE_NONE:
+ default:
+
+ break;
+ }
+ }
+
+ ~usrp2_gps_ctrl_impl(void){
+
+ }
+
+ ptime get_time(void) {
+ std::string reply;
+ ptime now;
+ 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_GENERIC_NMEA:
+ case GPS_TYPE_NONE:
+ default:
+ throw std::runtime_error("get_time(): Unsupported GPS or no GPS detected\n");
+ break;
+ }
+ 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);
+ }
+
+private:
+ usrp2_iface::sptr _iface;
+
+ enum {
+ GPS_TYPE_JACKSON_LABS,
+ GPS_TYPE_GENERIC_NMEA,
+ GPS_TYPE_NONE
+ } gps_type;
+
+ static const int GPS_UART = 2; //TODO: this should be plucked from fw_common.h or memory_map.h or somewhere in common with the firmware
+
+};
+
+/***********************************************************************
+ * Public make function for the GPS control
+ **********************************************************************/
+usrp2_gps_ctrl::sptr usrp2_gps_ctrl::make(usrp2_iface::sptr iface){
+ return sptr(new usrp2_gps_ctrl_impl(iface));
+}