Revision 9fff25f4 lib/usrp/mboard/usrp2.cpp
| b/lib/usrp/mboard/usrp2.cpp | ||
|---|---|---|
| 16 | 16 |
// |
| 17 | 17 |
|
| 18 | 18 |
#include <uhd/usrp/mboard/usrp2.hpp> |
| 19 |
#include <uhd/transport/udp.hpp> |
|
| 20 | 19 |
#include "usrp2_fw_common.h" |
| 21 | 20 |
#include <uhd/device.hpp> |
| 22 | 21 |
#include <boost/thread.hpp> |
| ... | ... | |
| 29 | 28 |
/*********************************************************************** |
| 30 | 29 |
* Discovery over the udp transport |
| 31 | 30 |
**********************************************************************/ |
| 32 |
std::vector<uhd::device_addr_t> usrp2::discover(const device_addr_t &hint){
|
|
| 33 |
std::vector<uhd::device_addr_t> usrp2_addrs;
|
|
| 31 |
uhd::device_addrs_t usrp2::discover(const device_addr_t &hint){
|
|
| 32 |
device_addrs_t usrp2_addrs;
|
|
| 34 | 33 |
|
| 35 | 34 |
//create a udp transport to communicate |
| 35 |
//TODO if an addr is not provided, search all interfaces? |
|
| 36 | 36 |
std::string ctrl_port = boost::lexical_cast<std::string>(USRP2_UDP_CTRL_PORT); |
| 37 |
uhd::transport::udp udp_transport(hint.udp_args.addr, ctrl_port, true);
|
|
| 37 |
uhd::transport::udp udp_transport(hint["addr"], ctrl_port, true);
|
|
| 38 | 38 |
|
| 39 | 39 |
//send a hello control packet |
| 40 | 40 |
usrp2_ctrl_data_t ctrl_data_out; |
| 41 |
ctrl_data_out.id = htonl(USRP2_CTRL_ID_HELLO);
|
|
| 41 |
ctrl_data_out.id = htonl(USRP2_CTRL_ID_GIVE_ME_YOUR_IP_ADDR_BRO);
|
|
| 42 | 42 |
udp_transport.send(boost::asio::buffer(&ctrl_data_out, sizeof(ctrl_data_out))); |
| 43 | 43 |
|
| 44 | 44 |
//loop and recieve until the time is up |
| 45 | 45 |
size_t num_timeouts = 0; |
| 46 | 46 |
while(true){
|
| 47 |
boost::asio::const_buffer buff = udp_transport.recv();
|
|
| 47 |
uhd::shared_iovec iov = udp_transport.recv();
|
|
| 48 | 48 |
//std::cout << boost::asio::buffer_size(buff) << "\n"; |
| 49 |
if (boost::asio::buffer_size(buff) < sizeof(usrp2_ctrl_data_t)){
|
|
| 49 |
if (iov.len < sizeof(usrp2_ctrl_data_t)){
|
|
| 50 | 50 |
//sleep a little so we dont burn cpu |
| 51 | 51 |
if (num_timeouts++ > 50) break; |
| 52 | 52 |
boost::this_thread::sleep(boost::posix_time::milliseconds(1)); |
| 53 | 53 |
}else{
|
| 54 | 54 |
//handle the received data |
| 55 |
const usrp2_ctrl_data_t *ctrl_data_in = boost::asio::buffer_cast<const usrp2_ctrl_data_t *>(buff);
|
|
| 55 |
const usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<const usrp2_ctrl_data_t *>(iov.base);
|
|
| 56 | 56 |
switch(ntohl(ctrl_data_in->id)){
|
| 57 |
case USRP2_CTRL_ID_HELLO:
|
|
| 57 |
case USRP2_CTRL_ID_THIS_IS_MY_IP_ADDR_DUDE:
|
|
| 58 | 58 |
//make a boost asio ipv4 with the raw addr in host byte order |
| 59 |
boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.discovery_addrs.ip_addr)); |
|
| 60 |
std::cout << "hello " << ip_addr.to_string() << "\n"; |
|
| 59 |
boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.ip_addr)); |
|
| 60 |
device_addr_t new_addr; |
|
| 61 |
new_addr["name"] = "USRP2"; |
|
| 62 |
new_addr["type"] = "udp"; |
|
| 63 |
new_addr["addr"] = ip_addr.to_string(); |
|
| 64 |
usrp2_addrs.push_back(new_addr); |
|
| 61 | 65 |
break; |
| 62 | 66 |
} |
| 63 | 67 |
} |
| ... | ... | |
| 65 | 69 |
|
| 66 | 70 |
return usrp2_addrs; |
| 67 | 71 |
} |
| 72 |
|
|
| 73 |
/*********************************************************************** |
|
| 74 |
* Structors |
|
| 75 |
**********************************************************************/ |
|
| 76 |
usrp2::usrp2(const device_addr_t &device_addr){
|
|
| 77 |
_udp_ctrl_transport = uhd::transport::udp::sptr( |
|
| 78 |
new uhd::transport::udp( |
|
| 79 |
device_addr["addr"], |
|
| 80 |
boost::lexical_cast<std::string>(USRP2_UDP_CTRL_PORT) |
|
| 81 |
) |
|
| 82 |
); |
|
| 83 |
_udp_data_transport = uhd::transport::udp::sptr( |
|
| 84 |
new uhd::transport::udp( |
|
| 85 |
device_addr["addr"], |
|
| 86 |
boost::lexical_cast<std::string>(USRP2_UDP_DATA_PORT) |
|
| 87 |
) |
|
| 88 |
); |
|
| 89 |
} |
|
| 90 |
|
|
| 91 |
usrp2::~usrp2(void){
|
|
| 92 |
/* NOP */ |
|
| 93 |
} |
|
| 94 |
|
|
| 95 |
/*********************************************************************** |
|
| 96 |
* Get Properties |
|
| 97 |
**********************************************************************/ |
|
| 98 |
void usrp2::get(const wax::obj &, wax::obj &){
|
|
| 99 |
|
|
| 100 |
} |
|
| 101 |
|
|
| 102 |
/*********************************************************************** |
|
| 103 |
* Set Properties |
|
| 104 |
**********************************************************************/ |
|
| 105 |
void usrp2::set(const wax::obj &, const wax::obj &){
|
|
| 106 |
|
|
| 107 |
} |
|
Also available in: Unified diff