From 0479162ae39d3d4708ab332107c25f4710275232 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Fri, 29 Apr 2011 14:27:04 -0700
Subject: usrp2: allow devices to be discovered when usrp2_iface::make throws

If the discovery throws an exception, we can still yeild a discovered device.
The error (which is a problem) will re-appear at make/factory time.

The side effect is that a device w/ error will be discovered w/ empty serial and names.
We protect against this by supporing older firmwares where i2c proto is compatible.
---
 host/lib/usrp/usrp2/usrp2_impl.cpp | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

(limited to 'host/lib')

diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index cb92b1921..48443bba4 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -105,33 +105,37 @@ static device_addrs_t usrp2_find(const device_addr_t &hint_){
         size_t len = udp_transport->recv(asio::buffer(usrp2_ctrl_data_in_mem));
         //std::cout << len << "\n";
         if (len > offsetof(usrp2_ctrl_data_t, data) and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE){
+
             //make a boost asio ipv4 with the raw addr in host byte order
             boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.ip_addr));
             device_addr_t new_addr;
             new_addr["type"] = "usrp2";
             new_addr["addr"] = ip_addr.to_string();
+
             //Attempt to read the name from the EEPROM and perform filtering.
             //This operation can throw due to compatibility mismatch.
-            //In this case, the discovered device will be ignored.
             try{
                 mboard_eeprom_t mb_eeprom = usrp2_iface::make(udp_simple::make_connected(
                     new_addr["addr"], boost::lexical_cast<std::string>(USRP2_UDP_CTRL_PORT)
                 ))->mb_eeprom;
                 new_addr["name"] = mb_eeprom["name"];
                 new_addr["serial"] = mb_eeprom["serial"];
-                if (
-                    (not hint.has_key("name")   or hint["name"]   == new_addr["name"]) and
-                    (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
-                ){
-                    usrp2_addrs.push_back(new_addr);
-                }
             }
-            catch(const std::exception &e){
-                uhd::warning::post(
-                    std::string("Ignoring discovered device\n")
-                    + e.what()
-                );
+            catch(const std::exception &){
+                //set these values as empty string so the device may still be found
+                //and the filter's below can still operate on the discovered device
+                new_addr["name"] = "";
+                new_addr["serial"] = "";
             }
+
+            //filter the discovered device below by matching optional keys
+            if (
+                (not hint.has_key("name")   or hint["name"]   == new_addr["name"]) and
+                (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
+            ){
+                usrp2_addrs.push_back(new_addr);
+            }
+
             //dont break here, it will exit the while loop
             //just continue on to the next loop iteration
         }
-- 
cgit v1.2.3