diff options
| author | Martin Braun <martin.braun@ettus.com> | 2022-03-30 09:39:30 +0200 | 
|---|---|---|
| committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2022-03-30 05:29:00 -0700 | 
| commit | 9573640db723386d029a294620c5b48c4d4d13d6 (patch) | |
| tree | e4ac9ee36e86bc28cb5d81a8aeac6ec7b05849a2 | |
| parent | 958eab7ea804337bd904c119427d363a05aa5cf6 (diff) | |
| download | uhd-9573640db723386d029a294620c5b48c4d4d13d6.tar.gz uhd-9573640db723386d029a294620c5b48c4d4d13d6.tar.bz2 uhd-9573640db723386d029a294620c5b48c4d4d13d6.zip | |
mpm: x4xx: Fix clock/time source API
In f73e327, we modified PeriphManagerBase to explicitly list all
required methods as per the MPM/UHD API. This had an unintended side
effect: Because the clocking methods on x4xx are imported from
X4xxClockMgr, and not defined on x4xx itself, the method used to import
methods from X4xxClockMgr onto x4xx would refuse to re-define API calls
such as set_clock_source(), get_clock_source(), and so on.
The solution is to allow _add_public_methods() to overwrite existing
methods, which means we can overwrite abstract methods from
PeriphManagerBase in this fashion.
Without this patch, UHD sessions could fail in the following manner:
>>> import uhd
>>> U = uhd.usrp.MultiUSRP("type=x4xx")
>>> U.get_clock_source(0)
Traceback (most recent call last):
File "<input>", line 1, in <module>
U.get_clock_source(0)
RuntimeError: RuntimeError: Error during RPC call to `get_clock_source'.
Error message: get_clock_source() not available on this device!
| -rw-r--r-- | mpm/python/usrp_mpm/periph_manager/base.py | 6 | ||||
| -rw-r--r-- | mpm/python/usrp_mpm/periph_manager/x4xx.py | 3 | 
2 files changed, 6 insertions, 3 deletions
| diff --git a/mpm/python/usrp_mpm/periph_manager/base.py b/mpm/python/usrp_mpm/periph_manager/base.py index ff4a358b3..729952c33 100644 --- a/mpm/python/usrp_mpm/periph_manager/base.py +++ b/mpm/python/usrp_mpm/periph_manager/base.py @@ -659,7 +659,7 @@ class PeriphManagerBase(object):              self.dboards.append(db_class(dboard_idx, **dboard_info))          self.log.info("Initialized %d daughterboard(s).", len(self.dboards)) -    def _add_public_methods(self, src, prefix="", filter_cb=None): +    def _add_public_methods(self, src, prefix="", filter_cb=None, allow_overwrite=False):          """          Add public methods (=API) of src to self. To avoid naming conflicts and          make relations clear, all added method names are prefixed with 'prefix'. @@ -677,6 +677,8 @@ class PeriphManagerBase(object):          :param prefix: method names in dest will be prefixed with prefix          :param filter_cb: A callback that returns true if the method should be                            added. Defaults to always returning True +        :param allow_overwrite: If True, then methods from src will overwrite +                                existing methods on self. Use with care.          """          filter_cb = filter_cb or (lambda *args: True)          assert callable(filter_cb) @@ -691,7 +693,7 @@ class PeriphManagerBase(object):                       and filter_cb(name, getattr(src, name))                       ]:              destname = prefix + name -            if hasattr(self, destname): +            if hasattr(self, destname) and not allow_overwrite:                  self.log.warn("Cannot add method {} because it would "                                "overwrite existing method.".format(destname))              else: diff --git a/mpm/python/usrp_mpm/periph_manager/x4xx.py b/mpm/python/usrp_mpm/periph_manager/x4xx.py index 7479874dc..e72b2e41e 100644 --- a/mpm/python/usrp_mpm/periph_manager/x4xx.py +++ b/mpm/python/usrp_mpm/periph_manager/x4xx.py @@ -484,7 +484,8 @@ class x4xx(ZynqComponents, PeriphManagerBase):          self._add_public_methods(              self._clk_mgr,              prefix="", -            filter_cb=lambda name, method: not hasattr(method, '_norpc') +            filter_cb=lambda name, method: not hasattr(method, '_norpc'), +            allow_overwrite=True          )          # Overlay must be applied after clocks have been configured | 
