Fix race condition that caused commands such as stop_rx_streaming to fail.
[debian/gnuradio] / usrp2 / host / lib / usrp2_impl.h
index 0a6b97b860385501e686056ce5fff96edb3a21ff..434e0e9b13f865aecc7c8fef1ac8b0b6264b6741 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
  *
  * 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
@@ -27,6 +27,8 @@
 #include "ring.h"
 #include <string>
 
+#define MAX_SUBPKT_LEN 252
+
 namespace usrp2 {
   
   class eth_buffer;
@@ -55,6 +57,7 @@ namespace usrp2 {
     static const size_t NCHANS = 32;
 
     eth_buffer    *d_eth_buf;
+    std::string    d_interface_name;
     pktfilter     *d_pf;
     std::string    d_addr;       // FIXME: use u2_mac_addr_t instead
     usrp2_thread  *d_bg_thread;
@@ -76,6 +79,7 @@ namespace usrp2 {
     pending_reply *d_pending_replies[NRIDS]; // indexed by 8-bit reply id
 
     std::vector<ring_sptr>   d_channel_rings; // indexed by 5-bit channel number
+    omni_mutex     d_channel_rings_mutex;
 
     db_info       d_tx_db_info;
     db_info       d_rx_db_info;
@@ -101,19 +105,22 @@ namespace usrp2 {
     void stop_bg();
     void init_config_rx_v2_cmd(op_config_rx_v2_cmd *cmd);
     void init_config_tx_v2_cmd(op_config_tx_v2_cmd *cmd);
-    bool transmit_cmd(void *cmd, size_t len, pending_reply *p, double secs=0.0);
+    bool transmit_cmd_and_wait(void *cmd, size_t len, pending_reply *p, double secs=0.0);
+    bool transmit_cmd(void *cmd, size_t len);
     virtual data_handler::result operator()(const void *base, size_t len);
     data_handler::result handle_control_packet(const void *base, size_t len);
     data_handler::result handle_data_packet(const void *base, size_t len);
     bool dboard_info();
+    bool reset_db();
 
   public:
-    impl(const std::string &ifc, props *p);
+    impl(const std::string &ifc, props *p, size_t rx_bufsize);
     ~impl();
     
     void bg_loop();
 
     std::string mac_addr() const { return d_addr; } // FIXME: convert from u2_mac_addr_t
+    std::string interface_name() const { return d_interface_name; }
 
     // Rx
 
@@ -121,12 +128,18 @@ namespace usrp2 {
     double rx_gain_min() { return d_rx_db_info.gain_min; }
     double rx_gain_max() { return d_rx_db_info.gain_max; }
     double rx_gain_db_per_step() { return d_rx_db_info.gain_step_size; }
+    bool set_rx_lo_offset(double frequency);
     bool set_rx_center_freq(double frequency, tune_result *result);
     double rx_freq_min() { return d_rx_db_info.freq_min; }
     double rx_freq_max() { return d_rx_db_info.freq_max; }
     bool set_rx_decim(int decimation_factor);
     int rx_decim() { return d_rx_decim; }
     bool set_rx_scale_iq(int scale_i, int scale_q);
+    bool set_gpio_ddr(int bank, uint16_t value, uint16_t mask);
+    bool set_gpio_sels(int bank, std::string src);
+    bool enable_gpio_streaming(int bank, int enable);
+    bool write_gpio(int bank, uint16_t value, uint16_t mask);
+    bool read_gpio(int bank, uint16_t *value);
     bool start_rx_streaming(unsigned int channel, unsigned int items_per_frame);
     bool rx_samples(unsigned int channel, rx_sample_handler *handler);
     bool stop_rx_streaming(unsigned int channel);
@@ -139,11 +152,13 @@ namespace usrp2 {
     double tx_gain_min() { return d_tx_db_info.gain_min; }
     double tx_gain_max() { return d_tx_db_info.gain_max; }
     double tx_gain_db_per_step() { return d_tx_db_info.gain_step_size; }
+    bool set_tx_lo_offset(double frequency);
     bool set_tx_center_freq(double frequency, tune_result *result);
     double tx_freq_min() { return d_tx_db_info.freq_min; }
     double tx_freq_max() { return d_tx_db_info.freq_max; }
     bool set_tx_interp(int interpolation_factor);
     int tx_interp() { return d_tx_interp; }
+    void default_tx_scale_iq(int interpolation_factor, int *scale_i, int *scale_q);
     bool set_tx_scale_iq(int scale_i, int scale_q);
 
     bool tx_32fc(unsigned int channel,
@@ -174,7 +189,9 @@ namespace usrp2 {
 
     bool burn_mac_addr(const std::string &new_addr);
     bool sync_to_pps();
+    bool sync_every_pps(bool enable);
     std::vector<uint32_t> peek32(uint32_t addr, uint32_t words);
+    bool poke32(uint32_t addr, const std::vector<uint32_t> &data);
   };
   
 } // namespace usrp2