Show
Ignore:
Timestamp:
04/05/12 13:02:33 (15 months ago)
Author:
june
Message:

Completing test on USRP1, USRP2

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • ossiedev/branches/june/trunk/platform/USRP_UHD/src/USRP_UHD.cpp

    r11034 r11094  
    2626#include <vector> 
    2727#include <complex> 
     28#include <boost/program_options.hpp> 
     29#include <boost/format.hpp> 
     30#include <boost/thread.hpp> 
    2831 
    2932#include "ossie/cf.h" 
     
    3942        set_rx_packet_count(-1), 
    4043        rx_packet_count(1024), 
    41         rx_packet_size(256), 
     44        rx_packet_size(8192), 
    4245        rx_data_size(2), 
    4346        number_of_channels(1), 
     
    5053{ 
    5154// Create USRP_UHD Control ports for TX and RX 
    52     rx_control_port = new USRP_UHD_RX_Control_i(this, "U2_RX_Control", "DomainName1"); 
    53     tx_control_port = new USRP_UHD_TX_Control_i(this, "U2_TX_Control", "DomainName1"); 
     55    rx_control_port = new USRP_UHD_RX_Control_i(this, "UHD_RX_Control", "DomainName1"); 
     56    tx_control_port = new USRP_UHD_TX_Control_i(this, "UHD_TX_Control", "DomainName1"); 
    5457 
    5558// Create the ports for TX data 
    56     tx_data_port = new standardInterfaces_i::complexShort_p("U2_TX_Data", "DomainName1"); 
     59    for(int i=0;i<MAX_TX_CHANNEL;i++) 
     60        tx_data_ports[i] = new standardInterfaces_i::complexShort_p(boost::str(boost::format("UHD_TX_Data_%d") % (i+1)).c_str(), "DomainName1"); 
    5761 
    5862// Create the ports for RX Data 
    59     rx_data_1_port = new standardInterfaces_i::complexShort_u("U2_RX_Data_1", "DomainName1"); 
    60     rx_data_2_port = new standardInterfaces_i::complexShort_u("U2_RX_Data_2", "DomainName1"); 
     63    for(int i=0;i<MAX_RX_CHANNEL;i++) 
     64        rx_data_ports[i] = new standardInterfaces_i::complexShort_u(boost::str(boost::format("UHD_RX_Data_%d") % (i+1)).c_str(), "DomainName1"); 
     65 
    6166} 
    6267 
     
    8186    if (!CORBA::is_nil(p = rx_control_port->getPort(portName))) 
    8287        return p._retn(); 
    83     else if (!CORBA::is_nil(p = rx_data_1_port->getPort(portName))) 
     88    else if (!CORBA::is_nil(p = tx_control_port->getPort(portName))) 
    8489        return p._retn(); 
    85     else if (!CORBA::is_nil(p = rx_data_1_port->getPort(portName))) { 
    86         return p._retn(); 
    87     } else if (!CORBA::is_nil(p = tx_control_port->getPort(portName))) { 
    88         return p._retn(); 
    89     } else if (!CORBA::is_nil(p = tx_data_port->getPort(portName))) { 
    90         return p._retn(); 
     90    else { 
     91        for(int i=0;i<MAX_RX_CHANNEL;i++) 
     92                if (!CORBA::is_nil(p = rx_data_ports[i]->getPort(portName))) 
     93                        return p._retn(); 
     94 
     95        for(int i=0;i<MAX_TX_CHANNEL;i++) 
     96                if (!CORBA::is_nil(p = tx_data_ports[i]->getPort(portName))) 
     97                        return p._retn(); 
    9198    } 
     99 
    92100    std::cerr << "Couldn't find port " << portName << "Throwing exception" << std::endl; 
    93     throw CF::PortSupplier::UnknownPort(); 
     101   // throw CF::PortSupplier::UnknownPort(); 
    94102} 
    95103 
     
    100108    DEBUG(1, USRP_UHD, "Creating the usrp device with: "<< args) 
    101109    sdev = uhd::usrp::multi_usrp::make(args); 
    102     dev = sdev->get_device(); 
     110    dev = sdev->get_device();//uhd::device::make(args); 
     111    probe_usrp(); 
     112    rx_control_port->set_number_of_channels(1); 
     113    tx_control_port->set_number_of_channels(1); 
    103114    sdev->set_rx_antenna("RX2"); 
    104115    sdev->set_rx_antenna("TX/RX"); 
     
    127138} 
    128139 
     140void USRP_UHD_i::rx_error_helper(uhd::rx_metadata_t::error_code_t error) 
     141{ 
     142    switch(error){ 
     143        case uhd::rx_metadata_t::ERROR_CODE_NONE: 
     144            break; 
     145        case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: 
     146            DEBUG(2, USRP_UHD, "Got timeout before all samples received, possible packet loss") 
     147            break; 
     148        case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND: 
     149                DEBUG(2, USRP_UHD, "UHD::ERROR_CODE_LATE_COMMAND") 
     150                break; 
     151        case uhd::rx_metadata_t::ERROR_CODE_BROKEN_CHAIN: 
     152                DEBUG(2, USRP_UHD, "UHD::ERROR_CODE_BROKEN_CHAIN") 
     153                break; 
     154        case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW: 
     155                //DEBUG(2, USRP_UHD, "UHD::ERROR_CODE_OVERFLOW") 
     156                break; 
     157        case uhd::rx_metadata_t::ERROR_CODE_ALIGNMENT: 
     158                DEBUG(2, USRP_UHD, "UHD::ERROR_CODE_ALIGNMENT") 
     159                break; 
     160        case uhd::rx_metadata_t::ERROR_CODE_BAD_PACKET: 
     161                DEBUG(2, USRP_UHD, "UHD::ERROR_CODE_BAD_PACKET") 
     162                break; 
     163        default: 
     164            DEBUG(3, USRP_UHD, "Got Error Code 0x"<<error) 
     165    } 
     166} 
    129167 
    130168void USRP_UHD_i::rx_data_process() 
     
    146184    sdev->issue_stream_cmd(stream_cmd); 
    147185 
    148     uhd::stream_args_t stream_args("sc16"); 
     186    uhd::stream_args_t stream_args("sc16"); //complex floats 
    149187    stream_args.args["noclear"] = "1"; 
     188    for (size_t chan = 0; chan < rx_channels; chan++) 
     189        stream_args.channels.push_back(chan); //linear mapping 
    150190    uhd::rx_streamer::sptr rx_stream = sdev->get_rx_stream(stream_args); 
    151  
     191    DEBUG(3, USRP_UHD, "Rx Channels = " << rx_channels) 
    152192    PortTypes::ShortSequence I; 
    153193    PortTypes::ShortSequence Q; 
    154194     
    155195///\TODO Make sure rx_packet_size is >= than USRP_UHD_MIN_RX_SAMPLES!!!!! 
    156     rx_buff.resize(rx_packet_size); 
     196    std::vector<std::vector< std::complex<short> > > rx_buff( 
     197                rx_channels, std::vector< std::complex<short> >(rx_packet_size) 
     198    ); 
    157199    I.length(rx_packet_size); 
    158200    Q.length(rx_packet_size); 
     201 
     202    std::vector<std::complex<short> *> rx_buff_ptrs; 
     203    for (size_t i = 0; i < rx_buff.size(); i++) 
     204        rx_buff_ptrs.push_back(&rx_buff[i].front()); 
    159205 
    160206    DEBUG(3, USRP_UHD, "RX packet count " << rx_packet_count) 
     
    168214                        did_rx = true; 
    169215                } 
     216                //DEBUG(9, USRP_UHD, "issue cmd") 
    170217 
    171218         
    172219//TODO get rid of num_rx_samps variable 
    173         size_t num_rx_samps = rx_stream->recv( &rx_buff.front(), rx_packet_size, md); 
     220        size_t num_rx_samps = rx_stream->recv( rx_buff_ptrs, rx_packet_size, md); 
     221                //DEBUG(9, USRP_UHD, "recv data") 
    174222         
    175223        //Handle UHD error codes 
    176         switch(md.error_code){ 
    177             case uhd::rx_metadata_t::ERROR_CODE_NONE: 
    178                 break; 
    179             case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: 
    180                 DEBUG(3, USRP_UHD, "Got timeout before all samples received, possible packet loss") 
    181                 break; 
    182             default: 
    183                 DEBUG(3, USRP_UHD, "Got error code 0x"<<md.error_code) 
     224        rx_error_helper(md.error_code); 
     225 
     226        for(int j=0;j<rx_channels;j++){ 
     227 
     228                        for (unsigned int i = 0; i < num_rx_samps; i++) { 
     229                                I[i] = (CORBA::Short) rx_buff[j][i].real(); 
     230                                Q[i] = (CORBA::Short) rx_buff[j][i].imag(); 
     231                        } 
     232 
     233                        //DEBUG(9, USRP_UHD, "before push packet") 
     234                        rx_data_ports[j]->pushPacket(I, Q); 
     235                        //DEBUG(9, USRP_UHD, "after push packet") 
    184236        } 
    185237 
    186                 for (unsigned int i = 0; i < num_rx_samps; i++) { 
    187                         I[i] = (CORBA::Short) rx_buff[i].real(); 
    188                         Q[i] = (CORBA::Short) rx_buff[i].imag(); 
    189                 } 
    190                 rx_data_1_port->pushPacket(I, Q); 
     238 
    191239 
    192240                if (rx_packet_count != -1) 
     
    220268    const unsigned int tx_buf_len(USRP_UHD_MAX_TX_SAMPLES); 
    221269 
    222     uhd::stream_args_t stream_args("sc16"); 
     270    uhd::stream_args_t stream_args("sc16"); //complex short 
    223271    stream_args.args["noclear"] = "1"; 
     272    for (size_t chan = 0; chan < tx_channels; chan++) 
     273        stream_args.channels.push_back(chan); //linear mapping 
    224274    uhd::tx_streamer::sptr tx_stream = sdev->get_tx_stream(stream_args); 
    225  
    226275 
    227276    uhd::tx_metadata_t md3; 
     
    238287    //md.time_spec = uhd::time_spec_t((time_t)0 ); 
    239288 
    240     std::vector< std::complex<short int> > tx_buff(tx_buf_len); 
    241289 
    242290    DEBUG(3, USRP_UHD, "Starting tx_data_process thread.") 
    243291     
    244292    tx_active = true; // Cleared to stop TX in USRP_UHD_TX_Control->stop() 
    245  
     293    size_t samps_to_send = 0; 
     294    std::vector<std::complex<short> *> tx_buff_ptrs; 
     295    DEBUG(3, USRP_UHD, "Max Number of Sample="<<tx_stream->get_max_num_samps()) 
    246296    while (tx_active) { 
    247                 //if running half duplex mode we want to stop Rx streaming while transmitting 
    248                 if (full_duplex == false && did_rx == true)  { 
    249                                 did_rx = false; 
    250                         uhd::rx_metadata_t md; 
    251                         size_t num_rx_samps = dev->recv( &rx_buff.front(), rx_packet_size, md, 
    252                                                                                                 uhd::io_type_t::COMPLEX_INT16, 
    253                                                                                                 uhd::device::RECV_MODE_FULL_BUFF); 
    254                         sdev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); 
    255  
     297 
     298                for(int i=0;i<tx_channels;i++){ 
     299 
     300                        tx_data_ports[i]->getData(I_in, Q_in); 
     301                        samps_to_send = I_in->length(); 
     302 
     303                    std::vector<std::complex<short> > tx_buff(samps_to_send); 
     304 
     305                        for (unsigned int j = 0; j < samps_to_send; ++j) { 
     306                                tx_buff[j] = std::complex<short int> (convertToLE((*I_in)[j]),convertToLE((*Q_in)[j])); 
     307                        } 
     308 
     309                        tx_buff_ptrs.push_back(&tx_buff.front()); 
     310                tx_data_ports[i]->bufferEmptied(); 
    256311                } 
    257312 
    258  
    259         tx_data_port->getData(I_in, Q_in); 
    260         size_t samps_to_send = I_in->length(); 
    261          
    262         if(samps_to_send > tx_buf_len){ 
    263             std::cerr << "USRP_UHD Tx Buffer Overflow. Throwing Exception"<<std::endl; 
    264             throw std::runtime_error("USRP_UHD buffer overflow"); 
    265         } 
    266  
    267         for (unsigned int i = 0; i < samps_to_send; ++i) { 
    268             tx_buff[i] = std::complex<short int> (convertToLE((*I_in)[i]),convertToLE((*Q_in)[i])); 
    269         } 
    270  
    271313        //send the entire packet (driver fragments internally) 
    272         size_t num_tx_samps = tx_stream->send( &tx_buff.front(), samps_to_send, md3); 
    273         tx_data_port->bufferEmptied(); 
     314        size_t num_tx_samps = tx_stream->send(tx_buff_ptrs, samps_to_send, md3); 
     315 
     316 
    274317                 
    275318    } 
    276      
    277319    DEBUG(3, USRP_UHD, "Exiting tx_data_process thread.") 
    278320    tx_thread->exit(); 
    279321} 
     322 
     323void print_tree(const uhd::fs_path &path, uhd::property_tree::sptr tree){ 
     324    std::cout << path << std::endl; 
     325    BOOST_FOREACH(const std::string &name, tree->list(path)){ 
     326        print_tree(path / name, tree); 
     327    } 
     328} 
     329 
     330 
     331void USRP_UHD_i::probe_usrp() 
     332{ 
     333        DEBUG(3, USRP_UHD, "Probing daughter board of USRP..") 
     334    uhd::property_tree::sptr tree = dev->get_tree(); 
     335        uhd::fs_path db_path, mb_path = "/mboards"; 
     336        mb_count = tree->list("/mboards").size(); 
     337        std::cout<<" The number of MB : "<<mb_count<<std::endl; 
     338        for(int i=0;i<mb_count;i++){ 
     339                mb_path = "/mboards"; 
     340                mb_path = mb_path / tree->list("/mboards")[i]; 
     341                db_count = tree->list( mb_path / "dboards").size(); 
     342                std::cout<<"  The number of DB slot: "<<db_count<<std::endl; 
     343                for(int j=0;j<db_count;j++){ 
     344                        db_path = mb_path / "dboards" / tree->list( mb_path / "dboards")[j]; 
     345                        uhd::usrp::dboard_eeprom_t prom = tree->access<uhd::usrp::dboard_eeprom_t>(db_path / "tx_eeprom").get(); 
     346                        std::cout<<"   TxDB ID : "<<prom.id.to_string()<<std::endl; 
     347 
     348                        prom = tree->access<uhd::usrp::dboard_eeprom_t>(db_path / "rx_eeprom").get(); 
     349                        std::cout<<"   RxDB ID : "<<prom.id.to_string()<<std::endl; 
     350                } 
     351 
     352 
     353        } 
     354 
     355}