Greetings!

I'm having some issues with talking to two channels at the same time.  I'm
building from the maint branch, and if I use just one channel, I get
readings, but if I do two channels, the device simply hangs and never
responds.

The following is the sample code for this:
// Compile with:
// g++ -DZERO -o /tmp/channels channels.cc -luhd -lboost_system
// or
// g++ -DONE -o /tmp/channels channels.cc -luhd -lboost_system
// or
// g++ -DBOTH -o /tmp/channels channels.cc -luhd -lboost_system

#include <iostream>

#include <uhd/device3.hpp>
#include <uhd/rfnoc/radio_ctrl.hpp>

using ::boost::uint32_t;
using ::std::cout;
using ::std::vector;

using uhd::rfnoc::radio_ctrl;

constexpr double kTimeout_sec = 20;
constexpr int kSPP = 1000;

void Report(int samples_read, const uhd::rx_metadata_t &md) {
  cout << "Read : " << samples_read
       << " sample\n Metadata is: " << md.to_pp_string(false) << "\n";
}

int main(int argc, char *argv[]) {
  uhd::device3::sptr usrp = uhd::device3::make(std::string(argv[1]));
  int samples_to_read = 10;
  uhd::device_addr_t streamer_args(std::string(""));
  uhd::stream_args_t stream_args("sc16", "sc16");

#ifdef ZERO
  uhd::rfnoc::block_id_t radio_ctrl_id0(0, "Radio");
  radio_ctrl::sptr radio0 =
usrp->get_block_ctrl<radio_ctrl>(radio_ctrl_id0);
  radio0->set_arg<int>(std::string("spp"), kSPP);
  streamer_args["block_id"] = radio_ctrl_id0.to_string();
  stream_args.channels = {0};
  vector<vector<uint32_t>> buffs(1, vector<uint32_t>(samples_to_read));
#endif

#ifdef ONE
  uhd::rfnoc::block_id_t radio_ctrl_id1(0, "Radio", 1);
  radio_ctrl::sptr radio1 =
usrp->get_block_ctrl<radio_ctrl>(radio_ctrl_id1);
  radio1->set_arg<int>(std::string("spp"), kSPP);
  streamer_args["block_id"] = radio_ctrl_id1.to_string();
  stream_args.channels = {1};
  vector<vector<uint32_t>> buffs(1, vector<uint32_t>(samples_to_read));
#endif

#ifdef BOTH
  uhd::rfnoc::block_id_t radio_ctrl_id0(0, "Radio");
  uhd::rfnoc::block_id_t radio_ctrl_id1(0, "Radio", 1);
  radio_ctrl::sptr radio0 =
usrp->get_block_ctrl<radio_ctrl>(radio_ctrl_id0);
  radio_ctrl::sptr radio1 =
usrp->get_block_ctrl<radio_ctrl>(radio_ctrl_id1);
  radio0->set_arg<int>(std::string("spp"), kSPP);
  radio1->set_arg<int>(std::string("spp"), kSPP);
  streamer_args["block_id0"] = radio_ctrl_id0.to_string();
  streamer_args["block_id1"] = radio_ctrl_id1.to_string();
  stream_args.channels = {0, 1};
  vector<vector<uint32_t>> buffs(2, vector<uint32_t>(samples_to_read));
#endif

  stream_args.args = streamer_args;
  streamer_args["block_port"] = std::string("0");
  stream_args.args["spp"] = boost::lexical_cast<std::string>(kSPP);
  uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
  uhd::stream_cmd_t
stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
  stream_cmd.stream_now = true;
  rx_stream->issue_stream_cmd(stream_cmd);
  vector<uint32_t *> buff_ptrs;
  for (auto &b : buffs) buff_ptrs.push_back(b.data());

  uhd::rx_metadata_t md;
  int samples_read =
      rx_stream->recv(buff_ptrs, samples_to_read, md, kTimeout_sec);
  Report(samples_read, md);
  stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS;
  stream_cmd.stream_now = true;
  rx_stream->issue_stream_cmd(stream_cmd);
  return EXIT_SUCCESS;
}


-Tal
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to