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