diff options
author | Samuel O'Brien <sam.obrien@ni.com> | 2020-07-21 12:43:55 -0500 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2020-10-28 15:25:48 -0500 |
commit | bd278a4b936f3e30f51d7cb9ff489f3ff7215379 (patch) | |
tree | 0001f604bf57831c8b760f7c135f134d91e950c2 | |
parent | d42ddc804118b2e9120c84efd477f9f4b3f8472e (diff) | |
download | uhd-bd278a4b936f3e30f51d7cb9ff489f3ff7215379.tar.gz uhd-bd278a4b936f3e30f51d7cb9ff489f3ff7215379.tar.bz2 uhd-bd278a4b936f3e30f51d7cb9ff489f3ff7215379.zip |
sim: Support Configuration Files
This commit adds support for configuration files to the simulator. As of
now, these files only change the source and sink of data samples, but
they are easily extensible to add more configuration to the simulator.
Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
-rw-r--r-- | mpm/python/usrp_mpm/periph_manager/sim.py | 11 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/simulator/CMakeLists.txt | 1 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/simulator/chdr_endpoint.py | 12 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/simulator/config.py | 52 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/simulator/sample_source.py | 1 |
5 files changed, 68 insertions, 9 deletions
diff --git a/mpm/python/usrp_mpm/periph_manager/sim.py b/mpm/python/usrp_mpm/periph_manager/sim.py index b5cc45807..3e761c809 100644 --- a/mpm/python/usrp_mpm/periph_manager/sim.py +++ b/mpm/python/usrp_mpm/periph_manager/sim.py @@ -17,6 +17,7 @@ from usrp_mpm.rpc_server import no_claim from usrp_mpm.periph_manager import PeriphManagerBase from usrp_mpm.simulator.sim_dboard_catalina import SimulatedCatalinaDboard from usrp_mpm.simulator.chdr_endpoint import ChdrEndpoint +from usrp_mpm.simulator.config import Config CLOCK_SOURCE_INTERNAL = "internal" @@ -81,9 +82,17 @@ class sim(PeriphManagerBase): ########################################################################### def __init__(self, args): super().__init__() + if 'config' in args: + config_path = args['config'] + self.log.info("Loading config from {}".format(config_path)) + self.config = Config.from_path(config_path) + else: + self.log.warn("No config specified, using default") + self.config = Config.default() + self.device_id = 1 - self.chdr_endpoint = ChdrEndpoint(self.log, args) + self.chdr_endpoint = ChdrEndpoint(self.log, self.config) # Unlike the real hardware drivers, if there is an exception here, # we just crash. No use missing an error when testing. diff --git a/mpm/python/usrp_mpm/simulator/CMakeLists.txt b/mpm/python/usrp_mpm/simulator/CMakeLists.txt index e95709249..21f281e52 100644 --- a/mpm/python/usrp_mpm/simulator/CMakeLists.txt +++ b/mpm/python/usrp_mpm/simulator/CMakeLists.txt @@ -21,6 +21,7 @@ set(USRP_MPM_SIMULATOR_FILES ${CMAKE_CURRENT_SOURCE_DIR}/chdr_stream.py ${CMAKE_CURRENT_SOURCE_DIR}/rfnoc_common.py ${CMAKE_CURRENT_SOURCE_DIR}/stream_endpoint_node.py + ${CMAKE_CURRENT_SOURCE_DIR}/config.py ) list(APPEND USRP_MPM_FILES ${USRP_MPM_SIMULATOR_FILES}) set(USRP_MPM_FILES ${USRP_MPM_FILES} PARENT_SCOPE) diff --git a/mpm/python/usrp_mpm/simulator/chdr_endpoint.py b/mpm/python/usrp_mpm/simulator/chdr_endpoint.py index 303f3268d..17d707ae7 100644 --- a/mpm/python/usrp_mpm/simulator/chdr_endpoint.py +++ b/mpm/python/usrp_mpm/simulator/chdr_endpoint.py @@ -15,7 +15,6 @@ import select from uhd.chdr import ChdrPacket, ChdrWidth from .rfnoc_graph import XbarNode, XportNode, StreamEndpointNode, RFNoCGraph, NodeType from .chdr_stream import SendWrapper, ChdrOutputStream, ChdrInputStream, SelectableQueue -from .sample_source import NullSamples CHDR_W = ChdrWidth.W64 @@ -25,14 +24,13 @@ class ChdrEndpoint: traffic to the appropriate destination, and responding to said traffic. - The extra_args parameter is passed in from the periph_manager, and - coresponds to the --default_args flag of usrp_hwd.py on the - command line + The config parameter is a Config object (see simulator/config.py) """ - def __init__(self, log, extra_args): + def __init__(self, log, config): self.log = log.getChild("ChdrEndpoint") - self.source_gen = NullSamples - self.sink_gen = NullSamples + self.config = config + self.source_gen = config.source_gen + self.sink_gen = config.sink_gen self.xport_map = {} self.send_queue = SelectableQueue() diff --git a/mpm/python/usrp_mpm/simulator/config.py b/mpm/python/usrp_mpm/simulator/config.py new file mode 100644 index 000000000..a5f07950d --- /dev/null +++ b/mpm/python/usrp_mpm/simulator/config.py @@ -0,0 +1,52 @@ +# +# Copyright 2020 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +""" +This module contains the logic to read configuration files from the +filesystem and parse configuration data from them. This data includes +anything from the serial number of the radio to the type of hardware +it identifies itself as. +""" + +import configparser +from .sample_source import sinks, sources, NullSamples + +class Config: + """This class represents a configuration file for the usrp simulator. + This file should conform to the .ini format defined by the + configparser module + + It should have a [sample.source] section and a [sample.sink] section. + Each section should have a 'class' key, which gives the name of the + Source/Sink class to instanitate (see the decorators in + sample_source.py). The other key value pairs in the section are + passed to the source/sink constructor as strings through **kwargs + """ + def __init__(self, source_gen, sink_gen): + self.source_gen = source_gen + self.sink_gen = sink_gen + + @classmethod + def from_path(cls, path): + """Parse a config .ini file from a path""" + parser = configparser.ConfigParser() + parser.read(path) + source_gen = Config._read_sample_section(parser['sample.source'], sources) + sink_gen = Config._read_sample_section(parser['sample.sink'], sinks) + return cls(source_gen, sink_gen) + + @staticmethod + def _read_sample_section(section, lookup): + args = dict(section) + class_name = args.pop("class") + constructor = lookup[class_name] + def section_gen(): + return constructor(**args) + return section_gen + + @classmethod + def default(cls): + """Return a default config""" + return cls(NullSamples, NullSamples) diff --git a/mpm/python/usrp_mpm/simulator/sample_source.py b/mpm/python/usrp_mpm/simulator/sample_source.py index 184649994..36278efd8 100644 --- a/mpm/python/usrp_mpm/simulator/sample_source.py +++ b/mpm/python/usrp_mpm/simulator/sample_source.py @@ -8,7 +8,6 @@ This module contains the interface for providing data to a simulator stream and receiving data from a simulator stream. """ -#TODO: This is currently unused, as the cli is largely incomplete sources = {} sinks = {} |