diff options
| -rw-r--r-- | host/examples/tx_waveforms.cpp | 19 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 10 | 
3 files changed, 22 insertions, 11 deletions
| diff --git a/host/examples/tx_waveforms.cpp b/host/examples/tx_waveforms.cpp index 9886000b1..3f319cf68 100644 --- a/host/examples/tx_waveforms.cpp +++ b/host/examples/tx_waveforms.cpp @@ -17,6 +17,7 @@  #include <uhd/utils/thread_priority.hpp>  #include <uhd/utils/safe_main.hpp> +#include <uhd/utils/static.hpp>  #include <uhd/usrp/simple_usrp.hpp>  #include <boost/program_options.hpp>  #include <boost/thread/thread_time.hpp> //system time @@ -44,9 +45,16 @@ float gen_ramp(float x){      return std::fmod(x, 1)*2 - 1;  } +#define sine_table_len 2048 +static float sine_table[sine_table_len]; +UHD_STATIC_BLOCK(gen_sine_table){ +    static const float m_pi = std::acos(float(-1)); +    for (size_t i = 0; i < sine_table_len; i++) +        sine_table[i] = std::sin((2*m_pi*i)/sine_table_len); +} +  float gen_sine(float x){ -    static const float two_pi = 2*std::acos(float(-1)); -    return std::sin(x*two_pi); +    return sine_table[size_t(x*sine_table_len)%sine_table_len];  }  int UHD_SAFE_MAIN(int argc, char *argv[]){ @@ -65,11 +73,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){          ("args", po::value<std::string>(&args)->default_value(""), "simple uhd device address args")          ("duration", po::value<size_t>(&total_duration)->default_value(3), "number of seconds to transmit")          ("spb", po::value<size_t>(&spb)->default_value(10000), "samples per buffer") -        ("rate", po::value<double>(&rate)->default_value(100e6/16), "rate of outgoing samples") +        ("rate", po::value<double>(&rate)->default_value(1.5e6), "rate of outgoing samples")          ("freq", po::value<double>(&freq)->default_value(0), "rf center frequency in Hz")          ("ampl", po::value<float>(&l)->default_value(float(0.3)), "amplitude of the waveform")          ("gain", po::value<float>(&gain)->default_value(float(0)), "gain for the RF chain") -        ("wave-type", po::value<std::string>(&wave_type)->default_value("SINE"), "waveform type (CONST, SQUARE, RAMP, SINE)") +        ("wave-type", po::value<std::string>(&wave_type)->default_value("CONST"), "waveform type (CONST, SQUARE, RAMP, SINE)")          ("wave-freq", po::value<double>(&wave_freq)->default_value(0), "waveform frequency in Hz")      ;      po::variables_map vm; @@ -113,6 +121,9 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){      if (std::abs(wave_freq) > sdev->get_tx_rate()/2){          throw std::runtime_error("wave freq out of Nyquist zone");      } +    if (sdev->get_tx_rate()/std::abs(wave_freq) > sine_table_len/2 and wave_type == "SINE"){ +        throw std::runtime_error("sine freq too small for table"); +    }      //store the generator function for the selected waveform      boost::function<float(float)> wave_gen; diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index 9e29edd82..4e883cf81 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -113,7 +113,7 @@ void usrp2_impl::io_impl::recv_pirate_loop(                  metadata.event_code = vrt_packet_handler::get_context_code<async_metadata_t::event_code_t>(vrt_hdr, if_packet_info);                  //print the famous U, and push the metadata into the message queue -                if (metadata.event_code & underflow_flags) std::cerr << "U"; +                if (metadata.event_code & underflow_flags) std::cerr << "U" << std::flush;                  async_msg_fifo->push_with_pop_on_full(metadata);                  continue;              } @@ -121,7 +121,7 @@ void usrp2_impl::io_impl::recv_pirate_loop(              //handle the packet count / sequence number              if (if_packet_info.packet_count != next_packet_seq){                  //std::cerr << "S" << (if_packet_info.packet_count - next_packet_seq)%16; -                std::cerr << "O"; //report overflow (drops in the kernel) +                std::cerr << "O" << std::flush; //report overflow (drops in the kernel)              }              next_packet_seq = (if_packet_info.packet_count+1)%16; diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index d5785f326..0b9f8ee83 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -69,6 +69,11 @@ usrp2_mboard_impl::usrp2_mboard_impl(          _allowed_decim_and_interp_rates.push_back(i);      } +    //Issue a stop streaming command (in case it was left running). +    //Since this command is issued before the networking is setup, +    //most if not all junk packets will never make it to the socket. +    this->issue_ddc_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); +      //init the rx control registers      _iface->poke32(U2_REG_RX_CTRL_NSAMPS_PER_PKT, _io_helper.get_max_recv_samps_per_packet());      _iface->poke32(U2_REG_RX_CTRL_NCHANNELS, 1); @@ -107,11 +112,6 @@ usrp2_mboard_impl::usrp2_mboard_impl(      //set default subdev specs      (*this)[MBOARD_PROP_RX_SUBDEV_SPEC] = subdev_spec_t();      (*this)[MBOARD_PROP_TX_SUBDEV_SPEC] = subdev_spec_t(); - -    //Issue a stop streaming command (in case it was left running). -    //Since this command is issued before the networking is setup, -    //most if not all junk packets will never make it to the socket. -    this->issue_ddc_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);  }  usrp2_mboard_impl::~usrp2_mboard_impl(void){ | 
