16#include "LibCyberRadio/NDR651/DUCSink.h"
17#include "LibCyberRadio/NDR651/TransmitPacketizer.h"
28 const std::string& name,
29 const std::string& radio_host_name,
30 unsigned int radio_tcp_port,
31 unsigned int tengig_iface_index,
32 float iq_scale_factor,
33 unsigned int duc_channel,
34 const std::string& duc_iface_string,
35 unsigned int duc_rate_index,
37 float duc_attenuation,
38 unsigned int duc_tx_channels,
39 double duc_tx_frequency,
40 unsigned int duc_tx_attenuation,
41 unsigned int duc_stream_id,
44 unsigned int fc_update_rate,
47 unsigned int duchsPfThresh,
48 unsigned int duchsPeThresh,
49 unsigned int duchsPeriod,
54 d_radio_host_name(radio_host_name),
55 d_radio_tcp_port(radio_tcp_port),
56 d_duc_iface_index(tengig_iface_index),
57 d_iq_scale_factor(iq_scale_factor),
58 d_duc_channel(duc_channel),
59 d_duc_iface_string(duc_iface_string),
60 d_duc_rate_index(duc_rate_index),
61 d_duc_frequency(duc_frequency),
62 d_duc_attenuation(duc_attenuation),
63 d_duc_tx_channels(duc_tx_channels),
64 d_duc_tx_frequency(duc_tx_frequency),
65 d_duc_tx_attenuation(duc_tx_attenuation),
66 d_duc_stream_id(duc_stream_id),
67 d_config_tx(config_tx),
68 d_fc_update_rate(fc_update_rate),
70 d_use_ring_buffer(use_ring_buffer),
72 d_duchsPfThresh(duchsPfThresh),
73 d_duchsPeThresh(duchsPeThresh),
74 d_duchsPeriod(duchsPeriod),
76 d_duc_txinv_mode(txinv_mode)
78 this->
debug(
"construction\n");
79 memset(d_sample_buffer, 0, SAMPLES_PER_FRAME * 2 *
sizeof(
short));
83 d_radio_host_name, d_radio_tcp_port,
84 d_duc_channel, d_duc_iface_string,
85 d_duc_iface_index, -1, d_duc_rate_index,
86 d_duc_tx_channels, d_duc_frequency,
87 d_duc_attenuation, d_duc_tx_frequency,
88 d_duc_tx_attenuation, d_duc_stream_id,
90 d_tx->setDuchsParameters(d_duchsPfThresh, d_duchsPeThresh, d_duchsPeriod, d_updatePE);
91 d_tx->setDucTxinvMode(d_duc_txinv_mode);
99 this->
debug(
"destruction\n");
106 return d_radio_host_name;
111 return d_radio_tcp_port;
116 return d_tengig_iface_list;
121 return d_iq_scale_factor;
126 d_iq_scale_factor = iq_scale_factor;
131 return d_duc_channel;
136 d_duc_channel = duc_channel;
138 d_tx->setDucChannel(d_duc_channel);
143 return d_duc_iface_string;
148 return d_duc_iface_index;
153 d_duc_iface_string = duc_iface_string;
156 d_tx->setDucInterface(d_duc_iface_string, d_duc_iface_index);
161 return d_duc_rate_index;
166 d_duc_rate_index = duc_rate_index;
168 d_tx->setDucRate(d_duc_rate_index);
173 return d_duc_frequency;
178 d_duc_frequency = duc_frequency;
180 d_tx->setDucFreq(d_duc_frequency);
185 d_duc_txinv_mode = duc_txinv_mode;
187 d_tx->setDucTxinvMode((
unsigned int)duc_txinv_mode);
192 return d_duc_attenuation;
197 d_duc_attenuation = duc_attenuation;
199 d_tx->setDucAtten(d_duc_attenuation);
204 return d_duc_tx_channels;
209 d_duc_tx_channels = duc_tx_channels;
211 d_tx->setDucTxChannels(d_duc_tx_channels);
216 return d_duc_tx_frequency;
221 d_duc_tx_frequency = duc_tx_frequency;
222 if ( (d_tx != NULL)&&d_config_tx )
223 d_tx->setTxFreq(d_duc_tx_frequency);
228 return d_duc_tx_attenuation;
233 d_duc_tx_attenuation = duc_tx_attenuation;
234 if ( (d_tx != NULL)&&d_config_tx )
235 d_tx->setTxAtten(d_duc_tx_attenuation);
240 return d_duc_stream_id;
245 d_duc_stream_id = duc_stream_id;
247 d_tx->setStreamId(d_duc_stream_id);
253 if ( d_duc_rate_index == 16 )
256 ret = (long)(102.4e6 / pow(2, d_duc_rate_index));
260 void DUCSink::set_duchs_pf_threshold(
unsigned int duchsPfThresh) {
261 d_duchsPfThresh = duchsPfThresh;
263 d_tx->setDuchsParameters(d_duchsPfThresh, d_duchsPeThresh, d_duchsPeriod, d_updatePE);
266 void DUCSink::set_duchs_pe_threshold(
unsigned int duchsPeThresh) {
267 d_duchsPeThresh = duchsPeThresh;
269 d_tx->setDuchsParameters(d_duchsPfThresh, d_duchsPeThresh, d_duchsPeriod, d_updatePE);
272 void DUCSink::set_duchs_period(
unsigned int duchsPeriod) {
273 d_duchsPeriod = duchsPeriod;
275 d_tx->setDuchsParameters(d_duchsPfThresh, d_duchsPeThresh, d_duchsPeriod, d_updatePE);
278 void DUCSink::set_duchs_update_pe(
bool updatePE) {
279 d_updatePE = updatePE;
281 d_tx->setDuchsParameters(d_duchsPfThresh, d_duchsPeThresh, d_duchsPeriod, d_updatePE);
303 int noutput_items_processed = 0;
305 int sample_input_item;
308 if ( (d_tx != NULL) && d_tx->isReadyToReceive() )
312 while ( d_tx->isReadyToReceive() &&
314 (noutput_items_processed < noutput_items) )
318 for (sample = 0; sample < SAMPLES_PER_FRAME; sample++)
320 sample_input_item = noutput_items_processed * SAMPLES_PER_FRAME + sample;
321 d_sample_buffer[sample * 2] = (short)(input_items[sample_input_item].imag() * d_iq_scale_factor);
322 d_sample_buffer[sample * 2 + 1] = (short)(input_items[sample_input_item].real() * d_iq_scale_factor);
325 int samplesSent = d_tx->sendFrame(d_sample_buffer);
326 if ( samplesSent > 0 )
327 noutput_items_processed++;
337 noutput_items_processed = noutput_items;
339 return noutput_items_processed;
343 const std::string& radio_host_name,
345 const std::vector<std::string>& tengig_iface_list)
347 this->
debug(
"setting radio parameters\n");
348 d_radio_host_name = radio_host_name;
349 d_radio_tcp_port = radio_tcp_port;
350 d_tengig_iface_list = tengig_iface_list;
351 set_duc_iface_index_from_string();
354 d_tx->setRadioParameters(d_radio_host_name, d_radio_tcp_port);
355 d_tx->setDucInterface(d_duc_iface_string, d_duc_iface_index);
356 d_tx->setDucParameters(d_duc_iface_index, d_duc_rate_index,
357 d_duc_tx_channels, d_duc_frequency,
358 d_duc_attenuation, d_duc_tx_frequency,
359 d_duc_attenuation, d_duc_stream_id);
363 void DUCSink::set_duc_iface_index_from_string()
365 d_duc_iface_index = 0;
366 for (
int idx = 1; idx <= (int)d_tengig_iface_list.size(); idx++)
368 if ( d_tengig_iface_list[idx-1] == d_duc_iface_string )
370 d_duc_iface_index = idx;
virtual int debug(const char *format,...)
Outputs debug information.
Debuggable(bool debug=false, const std::string &debug_name="", FILE *debug_fp=DEBUG_FP, const std::string &debug_timefmt=DEBUG_TIME_FMT)
Constructs a Debuggable object.
float get_duc_attenuation() const
Gets the attenuation for the DUC in use.
int get_radio_tcp_port() const
Gets the radio TCP port.
void set_duc_attenuation(float duc_attenuation)
Sets the attenuation for the DUC in use.
void set_duc_frequency(long duc_frequency)
Sets the frequency offset for the DUC in use.
unsigned int get_duc_stream_id() const
Gets the VITA stream ID for the DUC.
int get_duc_channel() const
Gets the channel number for the DUC in use.
void set_duc_rate_index(int duc_rate_index)
Sets the rate index (zero-based) for the DUC in use.
long get_duc_frequency() const
Gets the frequency offset for the DUC in use.
void set_iq_scale_factor(float iq_scale_factor)
Sets the I/Q scale factor used for the radio.
~DUCSink()
Destroys a DUCSink object.
std::string get_radio_host_name() const
Gets the radio host name.
bool stop()
Stops the sink.
DUCSink(const std::string &name="DUCSink", const std::string &radio_host_name="", unsigned int radio_tcp_port=8617, unsigned int tengig_iface_index=1, float iq_scale_factor=1.0, unsigned int duc_channel=1, const std::string &duc_iface_string="eth0", unsigned int duc_rate_index=0, long duc_frequency=0, float duc_attenuation=0, unsigned int duc_tx_channels=0, double duc_tx_frequency=900, unsigned int duc_tx_attenuation=0, unsigned int duc_stream_id=40001, bool config_tx=false, bool debug=false, unsigned int fc_update_rate=20, bool use_udp=false, bool use_ring_buffer=false, unsigned int duchsPfThresh=25, unsigned int duchsPeThresh=24, unsigned int duchsPeriod=10, bool updatePE=false, int txinv_mode=0)
Creates a DUCSink object.
void set_duc_iface_string(const std::string &duc_iface_string)
Sets the interface name for the DUC in use.
void set_radio_params(const std::string &radio_host_name, int radio_tcp_port, const std::vector< std::string > &tengig_iface_list)
Sets the radio parameters.
unsigned int get_duc_tx_attenuation() const
Gets the transmit attenuation (in dB) for the DUC in use.
unsigned int get_duc_tx_channels() const
Gets the transmit channel mask for the DUC in use.
void set_duc_tx_channels(unsigned int duc_tx_channels)
Sets the transmit channel mask for the DUC in use.
float get_iq_scale_factor() const
Gets the I/Q scale factor used for the radio.
void set_duc_stream_id(unsigned int duc_stream_id)
Sets the VITA stream ID for the DUC.
void set_duc_tx_attenuation(unsigned int duc_tx_attenuation)
Sets the transmit attenuation (in dB) for the DUC in use.
bool start()
Starts the sink.
double get_duc_tx_frequency() const
Gets the transmit center frequency (in MHz) for the DUC in use.
void set_duc_txinv_mode(int duc_txinv_mode)
Sets the TX inversion mode for the DUC in use.
long get_duc_sample_rate() const
Gets the sample rate (in Hz) for the DUC in use, based on the rate index.
void set_duc_tx_frequency(double duc_tx_frequency)
Sets the transmit center frequency (in MHz) for the DUC in use.
int get_duc_iface_index() const
Gets the interface index (one-based) for the DUC in use.
int sendFrames(int noutput_items, std::complex< float > *input_items)
Sends a number of VITA 49 frames.
int get_duc_rate_index() const
Gets the rate index (zero-based) for the DUC in use.
void set_duc_channel(int duc_channel)
Sets the channel number for the DUC in use.
std::vector< std::string > get_tengig_iface_list() const
Gets the 10GigE interface list for the radio.
std::string get_duc_iface_string() const
Gets the interface name for the DUC in use.
Transmit packetizer class.
Provides programming elements for controlling the CyberRadio Solutions NDR651 radio.
Defines functionality for LibCyberRadio applications.