1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
"""
Source Generator Plugins for RF Test Scripts
"""
import importlib
from inspect import isclass
from builtins import input, object
from six import itervalues
###############################################################################
# Source Generator Plugins
###############################################################################
class SourceGenerator(object):
"""
Parent class for source generators.
"""
def __init__(self, log, **_):
self.log = log
def tune(self, freq, power_lvl_dbm):
"""
Set the TX frequency. This function can block until the Tx frequency is
stable, so if LOs need to settle or whatnot, it's OK for this function
to take a while to return. After it's returned, the assumption is that
we can start RXing.
"""
raise NotImplementedError()
def tear_down(self):
"""Do all necessary clean-up for the source generator"""
pass
class ManualSourceGenerator(SourceGenerator):
"""
Not really a source generator, but a command-line interaction with the user
to manually set the TX source.
"""
def tune(self, freq, power_lvl_dbm):
"""
Ask the user to set the TX frequency. Once the user continues, the
assumption is that we can start RXing.
"""
input("Please tune the signal generator to {:.3f} MHz and {:.1f} dBm, "
"then press Enter".format(freq / 1e6, power_lvl_dbm))
DEFAULT_SOURCE_GENERATORS = {
'default': ManualSourceGenerator,
}
DEFAULT_SOURCE_GENERATOR = 'default'
def get_source_generator(log=None, src_gen_id=None, **kwargs):
"""
Factory function to get a source generator
"""
src_gen_id = src_gen_id or DEFAULT_SOURCE_GENERATOR
if src_gen_id in DEFAULT_SOURCE_GENERATORS:
return DEFAULT_SOURCE_GENERATORS.get(src_gen_id)(log, **kwargs)
try:
module = importlib.import_module(src_gen_id)
except ImportError:
raise RuntimeError("Could not find source generator plugin `{}'!".format(
src_gen_id))
src_gens = [
x for x in itervalues(module.__dict__)
if isclass(x) and issubclass(x, SourceGenerator) and x != SourceGenerator
]
if not src_gens:
raise RuntimeError(
"Could not find any source generator classes in module `{}'!"
.format(src_gen_id))
if len(src_gens) > 1:
raise RuntimeError(
"Ambiguous source generator plugin `{}'! Too many generator classes: {}"
.format(src_gen_id, src_gens))
return src_gens[0](log, **kwargs)
|