Merge branch 'maint'
[debian/gnuradio] / usrp2 / host / lib / usrp2.cc
index 90a31b220515f635b7fabc7be27017cb5dd2aea1..0842482e40b37229c9ef832107fc250e771aba8e 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,7 @@
 #include <boost/weak_ptr.hpp>
 #include <string>
 #include <stdexcept>
+#include <cstdio>
 
 namespace usrp2 {
 
@@ -37,9 +38,9 @@ namespace usrp2 {
   struct usrp_table_entry {
     // inteface + normalized mac addr ("eth0:01:23:45:67:89:ab")
     std::string        key;
-    boost::weak_ptr<usrp2::usrp2>  value;
+    boost::weak_ptr<usrp2>  value;
 
-    usrp_table_entry(const std::string &_key, boost::weak_ptr<usrp2::usrp2> _value)
+    usrp_table_entry(const std::string &_key, boost::weak_ptr<usrp2> _value)
       : key(_key), value(_value) {}
   };
 
@@ -49,7 +50,7 @@ namespace usrp2 {
   static usrp_table s_table;
 
   usrp2::sptr
-  usrp2::find_existing_or_make_new(const std::string &ifc, props *pr)
+  usrp2::find_existing_or_make_new(const std::string &ifc, props *pr, size_t rx_bufsize)
   {
     std::string key = ifc + ":" + pr->addr;
 
@@ -61,7 +62,7 @@ namespace usrp2 {
       else {
        if (key == p->key)      // found it
          return usrp2::sptr(p->value);
-       else                    
+       else
          ++p;                  // keep looking
       }
     }
@@ -69,7 +70,7 @@ namespace usrp2 {
     // We don't have the USRP2 we're looking for
 
     // create a new one and stick it in the table.
-    usrp2::sptr r(new usrp2::usrp2(ifc, pr));
+    usrp2::sptr r(new usrp2(ifc, pr, rx_bufsize));
     usrp_table_entry t(key, r);
     s_table.push_back(t);
 
@@ -89,15 +90,15 @@ namespace usrp2 {
     p.addr[3] = 0x85;
     p.addr[4] = 0x30;
     p.addr[5] = 0x00;
-    
+
     int len = s.size();
     switch (len) {
-      
+
     case 5:
       if (sscanf(s.c_str(), "%hhx:%hhx", &p.addr[4], &p.addr[5]) != 2)
        return false;
       break;
-      
+
     case 17:
       if (sscanf(s.c_str(), "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
                 &p.addr[0], &p.addr[1], &p.addr[2],
@@ -108,7 +109,7 @@ namespace usrp2 {
     default:
       return false;
     }
-    
+
     char buf[128];
     snprintf(buf, sizeof(buf),
             "%02x:%02x:%02x:%02x:%02x:%02x",
@@ -119,7 +120,7 @@ namespace usrp2 {
   }
 
   usrp2::sptr
-  usrp2::make(const std::string &ifc, const std::string &addr)
+  usrp2::make(const std::string &ifc, const std::string &addr, size_t rx_bufsize)
   {
     std::string naddr = "";
     if (addr != "" && !parse_mac_addr(addr, naddr))
@@ -138,36 +139,47 @@ namespace usrp2 {
     if (n > 1)
       throw std::runtime_error("Multiple USRPs found on interface; must select by MAC address.");
 
-    return find_existing_or_make_new(ifc, &u2s[0]);
+    return find_existing_or_make_new(ifc, &u2s[0], rx_bufsize);
   }
 
   // Private constructor.  Sole function is to create an impl.
-  usrp2::usrp2(const std::string &ifc, props *p)
-    : d_impl(new usrp2::impl(ifc, p))
+  usrp2::usrp2(const std::string &ifc, props *p, size_t rx_bufsize)
+    : d_impl(new usrp2::impl(ifc, p, rx_bufsize))
   {
     // NOP
   }
-  
+
   // Public class destructor.  d_impl will auto-delete.
   usrp2::~usrp2()
   {
     // NOP
   }
-  
+
   std::string
   usrp2::mac_addr()
   {
     return d_impl->mac_addr();
   }
 
+  std::string
+  usrp2::interface_name()
+  {
+    return d_impl->interface_name();
+  }
+
   // Receive
 
-  bool 
+  bool
+  usrp2::set_rx_antenna(int ant){
+    return d_impl->set_rx_antenna(ant);
+  }
+
+  bool
   usrp2::set_rx_gain(double gain)
   {
     return d_impl->set_rx_gain(gain);
   }
-  
+
   double
   usrp2::rx_gain_min()
   {
@@ -186,12 +198,18 @@ namespace usrp2 {
     return d_impl->rx_gain_db_per_step();
   }
 
+  bool
+  usrp2::set_rx_lo_offset(double frequency)
+  {
+    return d_impl->set_rx_lo_offset(frequency);
+  }
+
   bool
   usrp2::set_rx_center_freq(double frequency, tune_result *result)
   {
     return d_impl->set_rx_center_freq(frequency, result);
   }
-  
+
   double
   usrp2::rx_freq_min()
   {
@@ -209,7 +227,7 @@ namespace usrp2 {
   {
     return d_impl->set_rx_decim(decimation_factor);
   }
-  
+
   int
   usrp2::rx_decim()
   {
@@ -221,13 +239,25 @@ namespace usrp2 {
   {
     return d_impl->set_rx_scale_iq(scale_i, scale_q);
   }
-  
+
   bool
   usrp2::start_rx_streaming(unsigned int channel, unsigned int items_per_frame)
   {
     return d_impl->start_rx_streaming(channel, items_per_frame);
   }
-  
+
+  bool
+  usrp2::start_rx_streaming_at(unsigned int channel, unsigned int items_per_frame, unsigned int time)
+  {
+    return d_impl->start_rx_streaming_at(channel, items_per_frame,time);
+  }
+
+  bool
+  usrp2::sync_and_start_rx_streaming_at(unsigned int channel, unsigned int items_per_frame, unsigned int time)
+  {
+    return d_impl->sync_and_start_rx_streaming_at(channel, items_per_frame, time);
+  }
+
   bool
   usrp2::rx_samples(unsigned int channel, rx_sample_handler *handler)
   {
@@ -245,7 +275,7 @@ namespace usrp2 {
   {
     return d_impl->rx_overruns();
   }
-  
+
   unsigned int
   usrp2::rx_missing()
   {
@@ -254,12 +284,17 @@ namespace usrp2 {
 
   // Transmit
 
-  bool 
+  bool
+  usrp2::set_tx_antenna(int ant){
+    return d_impl->set_tx_antenna(ant);
+  }
+
+  bool
   usrp2::set_tx_gain(double gain)
   {
     return d_impl->set_tx_gain(gain);
   }
-  
+
   double
   usrp2::tx_gain_min()
   {
@@ -278,12 +313,18 @@ namespace usrp2 {
     return d_impl->tx_gain_db_per_step();
   }
 
+  bool
+  usrp2::set_tx_lo_offset(double frequency)
+  {
+    return d_impl->set_tx_lo_offset(frequency);
+  }
+
   bool
   usrp2::set_tx_center_freq(double frequency, tune_result *result)
   {
     return d_impl->set_tx_center_freq(frequency, result);
   }
-  
+
   double
   usrp2::tx_freq_min()
   {
@@ -302,7 +343,7 @@ namespace usrp2 {
   {
     return d_impl->set_tx_interp(interpolation_factor);
   }
-  
+
   int
   usrp2::tx_interp()
   {
@@ -320,7 +361,7 @@ namespace usrp2 {
   {
     return d_impl->set_tx_scale_iq(scale_i, scale_q);
   }
-  
+
   bool
   usrp2::tx_32fc(unsigned int channel,
                 const std::complex<float> *samples,
@@ -385,7 +426,7 @@ namespace usrp2 {
   {
     return d_impl->rx_daughterboard_id(dbid);
   }
-  
+
 
   // low level methods
 
@@ -401,6 +442,12 @@ namespace usrp2 {
     return d_impl->sync_to_pps();
   }
 
+  bool
+  usrp2::sync_every_pps(bool enable)
+  {
+    return d_impl->sync_every_pps(enable);
+  }
+
   std::vector<uint32_t>
   usrp2::peek32(uint32_t addr, uint32_t words)
   {
@@ -413,8 +460,37 @@ namespace usrp2 {
     return d_impl->poke32(addr, data);
   }
 
-} // namespace usrp2
+  bool
+  usrp2::set_gpio_ddr(int bank, uint16_t value, uint16_t mask)
+  {
+    return d_impl->set_gpio_ddr(bank, value, mask);
+  }
 
+  bool
+  usrp2::set_gpio_sels(int bank, std::string src)
+  {
+    return d_impl->set_gpio_sels(bank, src);
+  }
+
+  bool
+  usrp2::write_gpio(int bank, uint16_t value, uint16_t mask)
+  {
+    return d_impl->write_gpio(bank, value, mask);
+  }
+
+  bool
+  usrp2::read_gpio(int bank, uint16_t *value)
+  {
+    return d_impl->read_gpio(bank, value);
+  }
+
+  bool
+  usrp2::enable_gpio_streaming(int bank, int enable)
+  {
+    return d_impl->enable_gpio_streaming(bank, enable);
+  }
+
+} // namespace usrp2
 
 std::ostream& operator<<(std::ostream &os, const usrp2::props &x)
 {