/usr/include/uhd/device_deprecated.ipp is in libuhd-dev 3.7.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | //
// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
//this file is included inside device class
//it supports the old send/recv functions
//this was replaced by the streamer API
#define _lazymin(x, y) (((x) > (y))? (y) : (x))
/*!
* Send modes for the device send routine.
*/
enum send_mode_t{
//! Tells the send routine to send the entire buffer
SEND_MODE_FULL_BUFF = 0,
//! Tells the send routine to return after one packet
SEND_MODE_ONE_PACKET = 1
};
/*!
* Recv modes for the device recv routine.
*/
enum recv_mode_t{
//! Tells the recv routine to recv the entire buffer
RECV_MODE_FULL_BUFF = 0,
//! Tells the recv routine to return after one packet
RECV_MODE_ONE_PACKET = 1
};
//! Typedef for a pointer to a single, or a collection of send buffers
typedef ref_vector<const void *> send_buffs_type;
//! Typedef for a pointer to a single, or a collection of recv buffers
typedef ref_vector<void *> recv_buffs_type;
/*!
* Send buffers containing IF data described by the metadata.
*
* Send handles fragmentation as follows:
* If the buffer has more samples than the maximum per packet,
* the send method will fragment the samples across several packets.
* Send will respect the burst flags when fragmenting to ensure
* that start of burst can only be set on the first fragment and
* that end of burst can only be set on the final fragment.
* Fragmentation only applies in the full buffer send mode.
*
* This is a blocking call and will not return until the number
* of samples returned have been read out of each buffer.
* Under a timeout condition, the number of samples returned
* may be less than the number of samples specified.
*
* \param buffs a vector of read-only memory containing IF data
* \param nsamps_per_buff the number of samples to send, per buffer
* \param metadata data describing the buffer's contents
* \param io_type the type of data loaded in the buffer
* \param send_mode tells send how to unload the buffer
* \param timeout the timeout in seconds to wait on a packet
* \return the number of samples sent
*/
size_t send(
const send_buffs_type &buffs,
size_t nsamps_per_buff,
const tx_metadata_t &metadata,
const io_type_t &io_type,
send_mode_t send_mode,
double timeout = 0.1
){
if (_tx_streamer.get() == NULL or _tx_streamer->get_num_channels() != buffs.size() or _send_tid != io_type.tid){
_send_tid = io_type.tid;
_tx_streamer.reset(); //cleanup possible old one
stream_args_t args;
args.cpu_format = (_send_tid == io_type_t::COMPLEX_FLOAT32)? "fc32" : "sc16";
args.otw_format = "sc16";
args.args["noclear"] = "1";
for (size_t ch = 0; ch < buffs.size(); ch++)
args.channels.push_back(ch); //linear mapping
_tx_streamer = get_tx_stream(args);
}
const size_t nsamps = (send_mode == SEND_MODE_ONE_PACKET)?
_lazymin(nsamps_per_buff, get_max_send_samps_per_packet()) :
nsamps_per_buff;
return _tx_streamer->send(buffs, nsamps, metadata, timeout);
}
/*!
* Receive buffers containing IF data described by the metadata.
*
* Receive handles fragmentation as follows:
* If the buffer has insufficient space to hold all samples
* that were received in a single packet over-the-wire,
* then the buffer will be completely filled and the implementation
* will hold a pointer into the remaining portion of the packet.
* Subsequent calls will load from the remainder of the packet,
* and will flag the metadata to show that this is a fragment.
* The next call to receive, after the remainder becomes exahausted,
* will perform an over-the-wire receive as usual.
* See the rx metadata fragment flags and offset fields for details.
*
* This is a blocking call and will not return until the number
* of samples returned have been written into each buffer.
* Under a timeout condition, the number of samples returned
* may be less than the number of samples specified.
*
* When using the full buffer recv mode, the metadata only applies
* to the first packet received and written into the recv buffers.
* Use the one packet recv mode to get per packet metadata.
*
* \param buffs a vector of writable memory to fill with IF data
* \param nsamps_per_buff the size of each buffer in number of samples
* \param metadata data to fill describing the buffer
* \param io_type the type of data to fill into the buffer
* \param recv_mode tells recv how to load the buffer
* \param timeout the timeout in seconds to wait for a packet
* \return the number of samples received or 0 on error
*/
size_t recv(
const recv_buffs_type &buffs,
size_t nsamps_per_buff,
rx_metadata_t &metadata,
const io_type_t &io_type,
recv_mode_t recv_mode,
double timeout = 0.1
){
if (_rx_streamer.get() == NULL or _rx_streamer->get_num_channels() != buffs.size() or _recv_tid != io_type.tid){
_recv_tid = io_type.tid;
_rx_streamer.reset(); //cleanup possible old one
stream_args_t args;
args.cpu_format = (_recv_tid == io_type_t::COMPLEX_FLOAT32)? "fc32" : "sc16";
args.otw_format = "sc16";
args.args["noclear"] = "1";
for (size_t ch = 0; ch < buffs.size(); ch++)
args.channels.push_back(ch); //linear mapping
_rx_streamer = get_rx_stream(args);
}
const size_t nsamps = (recv_mode == RECV_MODE_ONE_PACKET)?
_lazymin(nsamps_per_buff, get_max_recv_samps_per_packet()) :
nsamps_per_buff;
return _rx_streamer->recv(buffs, nsamps, metadata, timeout);
}
/*!
* Get the maximum number of samples per packet on send.
* \return the number of samples
*/
size_t get_max_send_samps_per_packet(void){
if (_tx_streamer.get() == NULL){
stream_args_t args;
args.cpu_format = "fc32";
args.otw_format = "sc16";
args.args["noclear"] = "1";
_tx_streamer = get_tx_stream(args);
_send_tid = io_type_t::COMPLEX_FLOAT32;
}
return _tx_streamer->get_max_num_samps();
}
/*!
* Get the maximum number of samples per packet on recv.
* \return the number of samples
*/
size_t get_max_recv_samps_per_packet(void){
if (_rx_streamer.get() == NULL){
stream_args_t args;
args.cpu_format = "fc32";
args.otw_format = "sc16";
args.args["noclear"] = "1";
_rx_streamer = get_rx_stream(args);
_recv_tid = io_type_t::COMPLEX_FLOAT32;
}
return _rx_streamer->get_max_num_samps();
}
/*!
* Receive and asynchronous message from the device.
* \param async_metadata the metadata to be filled in
* \param timeout the timeout in seconds to wait for a message
* \return true when the async_metadata is valid, false for timeout
*/
virtual bool recv_async_msg(
async_metadata_t &async_metadata, double timeout = 0.1
) = 0;
private:
rx_streamer::sptr _rx_streamer;
io_type_t::tid_t _recv_tid;
tx_streamer::sptr _tx_streamer;
io_type_t::tid_t _send_tid;
|