aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp2/usrp2_iface.cpp
diff options
context:
space:
mode:
authorNick Foster <nick@nerdnetworks.org>2010-08-13 16:16:22 -0700
committerNick Foster <nick@nerdnetworks.org>2010-08-13 16:16:22 -0700
commit727d8711f94bf7fe634fc33659b77bc4b4884d9c (patch)
tree7c0761dbcd0f47d1fd350190ecde1ced5d30f947 /host/lib/usrp/usrp2/usrp2_iface.cpp
parent5ab3f053529bb8d85a7f1ba9e1dd113c1f6eb813 (diff)
downloaduhd-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/usrp2_iface.cpp')
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp29
1 files changed, 21 insertions, 8 deletions
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index f4d354204..0771c4945 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -24,6 +24,7 @@
#include <boost/asio.hpp> //used for htonl and ntohl
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
+#include <boost/tokenizer.hpp>
#include <stdexcept>
#include <algorithm>
@@ -176,40 +177,52 @@ public:
* UART
**********************************************************************/
void write_uart(boost::uint8_t dev, const std::string &buf){
+ //first tokenize the string into 20-byte substrings
+ boost::offset_separator f(20, 1, true, true);
+ boost::tokenizer<boost::offset_separator> tok(buf, f);
+ std::vector<std::string> queue(tok.begin(), tok.end());
+
+ BOOST_FOREACH(std::string item, queue) {
//setup the out data
usrp2_ctrl_data_t out_data;
out_data.id = htonl(USRP2_CTRL_ID_HEY_WRITE_THIS_UART_FOR_ME_BRO);
out_data.data.uart_args.dev = dev;
- out_data.data.uart_args.bytes = buf.size();
+ out_data.data.uart_args.bytes = item.size();
//limitation of uart transaction size
- UHD_ASSERT_THROW(buf.size() <= sizeof(out_data.data.uart_args.data));
+ UHD_ASSERT_THROW(item.size() <= sizeof(out_data.data.uart_args.data));
//copy in the data
- std::copy(buf.begin(), buf.end(), out_data.data.uart_args.data);
+ std::copy(item.begin(), item.end(), out_data.data.uart_args.data);
//send and recv
usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data);
UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_MAN_I_TOTALLY_WROTE_THAT_UART_DUDE);
+ }
}
- std::string read_uart(boost::uint8_t dev, size_t num_bytes){
+ std::string read_uart(boost::uint8_t dev){
+ int readlen = 20;
+ std::string result;
+ while(readlen == 20) { //while we keep receiving full packets
//setup the out data
usrp2_ctrl_data_t out_data;
out_data.id = htonl(USRP2_CTRL_ID_SO_LIKE_CAN_YOU_READ_THIS_UART_BRO);
out_data.data.uart_args.dev = dev;
- out_data.data.uart_args.bytes = num_bytes;
+ out_data.data.uart_args.bytes = 20;
//limitation of uart transaction size
- UHD_ASSERT_THROW(num_bytes <= sizeof(out_data.data.uart_args.data));
+ //UHD_ASSERT_THROW(num_bytes <= sizeof(out_data.data.uart_args.data));
//send and recv
usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data);
UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_I_HELLA_READ_THAT_UART_DUDE);
+ readlen = in_data.data.uart_args.bytes;
//copy out the data
- std::string result((const char *)in_data.data.uart_args.data, (size_t)in_data.data.uart_args.bytes);
- return result;
+ result += std::string((const char *)in_data.data.uart_args.data, (size_t)readlen);
+ }
+ return result;
}
/***********************************************************************