Hi, I noticed that on the UHD repository examples there isn’t an example that 
shows how to setup a TX streaming using RFNoC. There is the example for the RX 
but not the one with TX.

There’s an example for the replay block, but it can’t be used for transmitting 
a big file for instance.

I searched through the mailing list and found some posts of user that attached 
some rfnoc_tx_from_file, but they did it in 2018 and it was on UHD 3, it 
obviously doesn’t work on UHD 4.

Could someone post a simple example of transmitting from file using RFNoC 4?

Maybe it is considered trivial, but it could help as a reference.

![](data:text/plain;base64,I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dWhkL3R5cGVzL3R1bmVfcmVxdWVzdC5ocHA+CiNpbmNsdWRlIDx1aGQvdXNycC9tdWx0aV91c3JwLmhwcD4KI2luY2x1ZGUgPHVoZC91dGlscy9zYWZlX21haW4uaHBwPgojaW5jbHVkZSA8dWhkL3V0aWxzL3RocmVhZC5ocHA+CiNpbmNsdWRlIDx1aGQvcmZub2MvYmxvY2tfaWQuaHBwPgojaW5jbHVkZSA8dWhkL3Jmbm9jL2R1Y19ibG9ja19jb250cm9sLmhwcD4KI2luY2x1ZGUgPHVoZC9yZm5vYy9tYl9jb250cm9sbGVyLmhwcD4KI2luY2x1ZGUgPHVoZC9yZm5vYy9yYWRpb19jb250cm9sLmhwcD4KI2luY2x1ZGUgPHVoZC9yZm5vYy9yZXBsYXlfYmxvY2tfY29udHJvbC5ocHA+CiNpbmNsdWRlIDx1aGQvcmZub2NfZ3JhcGguaHBwPgojaW5jbHVkZSA8ZnN0cmVhbT4KCiNkZWZpbmUgQlVGRkVSU0laRSA4MTkyCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgVUhEX1NBRkVfTUFJTihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgICBjb25zdCBkb3VibGUgcmF0ZSA9IDYuMjVlNjsgICAgICAgICAgICAgICAgICAgICAvLyBTYW1wbGUgcmF0ZQogICAgY29uc3QgZG91YmxlIGZyZXEgPSA4NjguNWU2OyAgICAgICAgICAgICAgICAgICAvLyBDZW50ZXIgZnJlcXVlbmN5CiAgICBjb25zdCBkb3VibGUgZ2FpbiA9IDEwOyAgICAgICAgICAgICAgICAgICAgICAvLyBUWCBnYWluCiAgICBjb25zdCBzdHJpbmcgZGV2aWNlX2FkZHIgPSAidHlwZT14MzAwLGFkZHI9MTkyLjE2OC40MC4yIjsgICAgICAgICAgLy8gRGVmYXVsdCAoZmlyc3QgZGV2aWNlKQogICAgY29uc3Qgc3RyaW5nIGZpbGVuYW1lID0gInJhd2lxLnNjMTYiOwogICAgCiAgICB1aGQ6OnJmbm9jOjpyZm5vY19ncmFwaDo6c3B0ciBncmFwaDsKICAgIHVoZDo6cmZub2M6OmJsb2NrX2lkX3QgcmFkaW9fY29udHJvbF9pZDsKICAgIHVoZDo6cmZub2M6OnJhZGlvX2NvbnRyb2w6OnNwdHIgcmFkaW9fY29udHJvbCA7CiAgICB1aGQ6OnJmbm9jOjpibG9ja19pZF90IGR1Y19jb250cm9sX2lkOwogICAgdWhkOjpyZm5vYzo6ZHVjX2Jsb2NrX2NvbnRyb2w6OnNwdHIgZHVjX2NvbnRyb2wgOwoKICAgIGdyYXBoID0gdWhkOjpyZm5vYzo6cmZub2NfZ3JhcGg6Om1ha2UoZGV2aWNlX2FkZHIuY19zdHIoKSk7CgogICAgcmFkaW9fY29udHJvbF9pZCA9IHVoZDo6cmZub2M6OmJsb2NrX2lkX3QoMCwgIlJhZGlvIiwgMSkgOwogICAgcmFkaW9fY29udHJvbCA9IGdyYXBoLT5nZXRfYmxvY2s8dWhkOjpyZm5vYzo6cmFkaW9fY29udHJvbD4ocmFkaW9fY29udHJvbF9pZCkgOwogICAgcmFkaW9fY29udHJvbC0+c2V0X3R4X2dhaW4oZ2FpbiwwKTsKICAgIHJhZGlvX2NvbnRyb2wtPnNldF90eF9mcmVxdWVuY3koZnJlcSwwKTsKICAgIGlmKCAhcmFkaW9fY29udHJvbCApIHsKICAgICAgICBjb3V0IDw8ICJFUlJPUjogRmFpbGVkIHRvIGZpbmQgUmFkaW8gQmxvY2sgQ29udHJvbGxlciEiIDw8IGVuZGwgOwogICAgfQogICAgY291dCA8PCAiVXNpbmcgcmFkaW8gIiA8PCByYWRpb19jb250cm9sX2lkIDw8IGVuZGwgOwoKICAgIC8vIERVQyBCbG9jayBDb250cm9sbGVyCiAgICBkdWNfY29udHJvbF9pZCA9IHVoZDo6cmZub2M6OmJsb2NrX2lkX3QoMCwgIkRVQyIsIDEpIDsKCiAgICBkdWNfY29udHJvbCA9IGdyYXBoLT5nZXRfYmxvY2s8dWhkOjpyZm5vYzo6ZHVjX2Jsb2NrX2NvbnRyb2w+KGR1Y19jb250cm9sX2lkKSA7CiAgICBpZiggIWR1Y19jb250cm9sICkgewogICAgICAgIGNvdXQgPDwgIkVSUk9SOiBGYWlsZWQgdG8gZmluZCBEVUMgQmxvY2sgQ29udHJvbGxlciEiIDw8IGVuZGwgOwogICAgfQogICAgY291dCA8PCAiVXNpbmcgZHVjICIgPDwgZHVjX2NvbnRyb2xfaWQgPDwgZW5kbCA7CiAgICBkdWNfY29udHJvbC0+c2V0X291dHB1dF9yYXRlKDIwMGU2LDApOwogICAgZHVjX2NvbnRyb2wtPnNldF9mcmVxKDAsMCk7CiAgICBkdWNfY29udHJvbC0+c2V0X2lucHV0X3JhdGUocmF0ZSwwKTsKICAgIHVoZDo6c3RyZWFtX2FyZ3NfdCBzdHJlYW1fYXJncygic2MxNiIsICJzYzE2Iik7CiAgICBhdXRvIHR4X3N0cmVhbSA9IGdyYXBoLT5jcmVhdGVfdHhfc3RyZWFtZXIoMSwgc3RyZWFtX2FyZ3MpOwogICAgZ3JhcGgtPmNvbm5lY3QodHhfc3RyZWFtLDAsZHVjX2NvbnRyb2wtPmdldF91bmlxdWVfaWQoKSwwKTsKICAgIGdyYXBoLT5jb21taXQoKTsKCiAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwoKCiAgICBpbnQgayA9IDA7CiAgICBpZnN0cmVhbSAqaW5maWxlOwogICAgaW5maWxlID0gbmV3IGlmc3RyZWFtKGZpbGVuYW1lLCBzdGQ6Omlvczo6YmluYXJ5KTsKCiAgICB1aGQ6OnR4X21ldGFkYXRhX3QgbWQ7CiAgICBtZC5zdGFydF9vZl9idXJzdCA9IHRydWU7IC8vIFN0YXJ0IG9mIGJ1cnN0CiAgICBtZC5lbmRfb2ZfYnVyc3QgPSBmYWxzZTsgIC8vIFdlIHdpbGwgc3RvcCB0aGlzIGxhdGVyCiAgICBtZC5oYXNfdGltZV9zcGVjID0gZmFsc2U7CgogICAgc3RkOjp2ZWN0b3I8c3RkOjpjb21wbGV4PHNob3J0Pj4gYnVmZihCVUZGRVJTSVpFKTsKICAgIGNvdXQgPDwgIlN0YXJ0aW5nIHRyYW5zbWlzc2lvbiIgPDwgZW5kbDsKICAgIHdoaWxlICghaW5maWxlLT5lb2YoKSkgewogICAgICAgIGluZmlsZS0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYnVmZi5mcm9udCgpKSwgQlVGRkVSU0laRSAqIHNpemVvZihjb21wbGV4PHNob3J0PikpOwogICAgICAgIHNpemVfdCBzYW1wbGVzX3JlYWQgPSBpbmZpbGUtPmdjb3VudCgpIC8gc2l6ZW9mKGNvbXBsZXg8c2hvcnQ+KTsKICAgICAgICBpZiAoc2FtcGxlc19yZWFkID09IDApCiAgICAgICAgewogICAgICAgICAgICBjb3V0PDwiTm8gc2FtcGxlcyByZWFkXHJcbiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgdHhfc3RyZWFtLT5zZW5kKCZidWZmLmZyb250KCksIHNhbXBsZXNfcmVhZCwgbWQpOwogICAgICAgIG1kLnN0YXJ0X29mX2J1cnN0ID0gZmFsc2U7CiAgICB9CiAgICBtZC5lbmRfb2ZfYnVyc3QgPSB0cnVlOwogICAgdHhfc3RyZWFtLT5zZW5kKCIiLCAwLCBtZCk7CiAgICBpbmZpbGUtPmNsb3NlKCk7CiAgICBjb3V0IDw8ICJUcmFuc21pc3Npb24gY29tcGxldGUuIiA8PCBlbmRsOwoKCgogICAgcmV0dXJuIDA7Cn0K)Personally
 I tried to write a sample code, but as I stated in another thread I’m not sure 
it is working correctly.

Could anyone help here?
#include <iostream>
#include <uhd/types/tune_request.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/thread.hpp>
#include <uhd/rfnoc/block_id.hpp>
#include <uhd/rfnoc/duc_block_control.hpp>
#include <uhd/rfnoc/mb_controller.hpp>
#include <uhd/rfnoc/radio_control.hpp>
#include <uhd/rfnoc/replay_block_control.hpp>
#include <uhd/rfnoc_graph.hpp>
#include <fstream>

#define BUFFERSIZE 8192
using namespace std;

int UHD_SAFE_MAIN(int argc, char* argv[])
{
    const double rate = 6.25e6;                     // Sample rate
    const double freq = 868.5e6;                   // Center frequency
    const double gain = 10;                      // TX gain
    const string device_addr = "type=x300,addr=192.168.40.2";          // Default (first device)
    const string filename = "rawiq.sc16";
    
    uhd::rfnoc::rfnoc_graph::sptr graph;
    uhd::rfnoc::block_id_t radio_control_id;
    uhd::rfnoc::radio_control::sptr radio_control ;
    uhd::rfnoc::block_id_t duc_control_id;
    uhd::rfnoc::duc_block_control::sptr duc_control ;

    graph = uhd::rfnoc::rfnoc_graph::make(device_addr.c_str());

    radio_control_id = uhd::rfnoc::block_id_t(0, "Radio", 1) ;
    radio_control = graph->get_block<uhd::rfnoc::radio_control>(radio_control_id) ;
    radio_control->set_tx_gain(gain,0);
    radio_control->set_tx_frequency(freq,0);
    if( !radio_control ) {
        cout << "ERROR: Failed to find Radio Block Controller!" << endl ;
    }
    cout << "Using radio " << radio_control_id << endl ;

    // DUC Block Controller
    duc_control_id = uhd::rfnoc::block_id_t(0, "DUC", 1) ;

    duc_control = graph->get_block<uhd::rfnoc::duc_block_control>(duc_control_id) ;
    if( !duc_control ) {
        cout << "ERROR: Failed to find DUC Block Controller!" << endl ;
    }
    cout << "Using duc " << duc_control_id << endl ;
    duc_control->set_output_rate(200e6,0);
    duc_control->set_freq(0,0);
    duc_control->set_input_rate(rate,0);
    uhd::stream_args_t stream_args("sc16", "sc16");
    auto tx_stream = graph->create_tx_streamer(1, stream_args);
    graph->connect(tx_stream,0,duc_control->get_unique_id(),0);
    graph->commit();

    std::this_thread::sleep_for(std::chrono::seconds(1));


    int k = 0;
    ifstream *infile;
    infile = new ifstream(filename, std::ios::binary);

    uhd::tx_metadata_t md;
    md.start_of_burst = true; // Start of burst
    md.end_of_burst = false;  // We will stop this later
    md.has_time_spec = false;

    std::vector<std::complex<short>> buff(BUFFERSIZE);
    cout << "Starting transmission" << endl;
    while (!infile->eof()) {
        infile->read(reinterpret_cast<char*>(&buff.front()), BUFFERSIZE * sizeof(complex<short>));
        size_t samples_read = infile->gcount() / sizeof(complex<short>);
        if (samples_read == 0)
        {
            cout<<"No samples read\r\n";
            break;
        }

        
        tx_stream->send(&buff.front(), samples_read, md);
        md.start_of_burst = false;
    }
    md.end_of_burst = true;
    tx_stream->send("", 0, md);
    infile->close();
    cout << "Transmission complete." << endl;



    return 0;
}
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to