3 * Copyright 2008 Free Software Foundation, Inc.
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef INCLUDED_USRP2_IMPL_H
20 #define INCLUDED_USRP2_IMPL_H
22 #include <usrp2/usrp2.h>
23 #include <usrp2/data_handler.h>
24 #include <usrp2_eth_packet.h>
25 #include <boost/scoped_ptr.hpp>
35 class usrp2_tune_result;
39 class usrp2::impl : private data_handler
41 static const size_t NRIDS = 256;
42 static const size_t NCHANS = 32;
44 eth_buffer *d_eth_buf;
46 std::string d_addr; // FIXME: use u2_mac_addr_t instead
47 usrp2_thread *d_bg_thread;
48 volatile bool d_bg_running; // TODO: multistate if needed
54 unsigned int d_num_rx_frames;
55 unsigned int d_num_rx_missing;
56 unsigned int d_num_rx_overruns;
57 unsigned int d_num_rx_bytes;
59 unsigned int d_num_enqueued;
60 omni_mutex d_enqueued_mutex;
61 omni_condition d_bg_pending_cond;
63 // all pending_replies are stack allocated, thus no possibility of leaking these
64 pending_reply *d_pending_replies[NRIDS]; // indexed by 8-bit reply id
66 std::vector<ring_sptr> d_channel_rings; // indexed by 5-bit channel number
69 omni_mutex_lock l(d_enqueued_mutex);
74 omni_mutex_lock l(d_enqueued_mutex);
75 if (--d_num_enqueued == 0)
76 d_bg_pending_cond.signal();
79 static bool parse_mac_addr(const std::string &s, u2_mac_addr_t *p);
80 void init_et_hdrs(u2_eth_packet_t *p, const std::string &dst);
81 void init_etf_hdrs(u2_eth_packet_t *p, const std::string &dst,
82 int word0_flags, int chan, uint32_t timestamp);
84 void init_config_rx_v2_cmd(op_config_rx_v2_cmd *cmd);
85 void init_config_tx_v2_cmd(op_config_tx_v2_cmd *cmd);
86 bool transmit_cmd(void *cmd, size_t len, pending_reply *p, double secs=0.0);
87 virtual data_handler::result operator()(const void *base, size_t len);
88 data_handler::result handle_control_packet(const void *base, size_t len);
89 data_handler::result handle_data_packet(const void *base, size_t len);
92 impl(const std::string &ifc, props *p);
97 std::string mac_addr() const { return d_addr; } // FIXME: convert from u2_mac_addr_t
98 bool burn_mac_addr(const std::string &new_addr);
100 bool set_rx_gain(double gain);
101 bool set_rx_center_freq(double frequency, tune_result *result);
102 bool set_rx_decim(int decimation_factor);
103 bool set_rx_scale_iq(int scale_i, int scale_q);
104 bool start_rx_streaming(unsigned int channel, unsigned int items_per_frame);
105 bool rx_samples(unsigned int channel, rx_sample_handler *handler);
106 bool stop_rx_streaming(unsigned int channel);
107 unsigned int rx_overruns() const { return d_num_rx_overruns; }
108 unsigned int rx_missing() const { return d_num_rx_missing; }
110 bool set_tx_gain(double gain);
111 bool set_tx_center_freq(double frequency, tune_result *result);
112 bool set_tx_interp(int interpolation_factor);
113 bool set_tx_scale_iq(int scale_i, int scale_q);
115 bool tx_complex_float(unsigned int channel,
116 const std::complex<float> *samples,
118 const tx_metadata *metadata);
120 bool tx_complex_int16(unsigned int channel,
121 const std::complex<int16_t> *samples,
123 const tx_metadata *metadata);
125 bool tx_raw(unsigned int channel,
126 const uint32_t *items,
128 const tx_metadata *metadata);
133 #endif /* INCLUDED_USRP2_IMPL_H */