47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
|
from .connector import ConnectorSource
|
||
|
|
||
|
|
||
|
class SoapyConnectorSource(ConnectorSource):
|
||
|
"""
|
||
|
must be implemented by child classes to be able to build a driver-based device selector by default.
|
||
|
return value must be the corresponding soapy driver identifier.
|
||
|
"""
|
||
|
def getDriver(self):
|
||
|
pass
|
||
|
|
||
|
def parseDeviceString(self, dstr):
|
||
|
|
||
|
def decodeComponent(c):
|
||
|
kv = c.split("=", 1)
|
||
|
if len(kv) < 2:
|
||
|
return c
|
||
|
else:
|
||
|
return {kv[0]: kv[1]}
|
||
|
|
||
|
return [decodeComponent(c) for c in dstr.split(",")]
|
||
|
|
||
|
def encodeDeviceString(self, dobj):
|
||
|
|
||
|
def encodeComponent(c):
|
||
|
if isinstance(c, str):
|
||
|
return c
|
||
|
else:
|
||
|
return ",".join(["{0}={1}".format(key, value) for key, value in c.items()])
|
||
|
|
||
|
return ",".join([encodeComponent(c) for c in dobj])
|
||
|
|
||
|
"""
|
||
|
this method always attempts to inject a driver= part into the soapysdr query, depending on what connector was used.
|
||
|
this prevents the soapy_connector from using the wrong device in scenarios where there's no same-type sdrs.
|
||
|
"""
|
||
|
def getCommandValues(self):
|
||
|
values = super().getCommandValues()
|
||
|
if "device" in values and values["device"] is not None:
|
||
|
parsed = self.parseDeviceString(values["device"])
|
||
|
parsed = [v for v in parsed if "driver" not in v]
|
||
|
parsed += [{"driver": self.getDriver()}]
|
||
|
values["device"] = self.encodeDeviceString(parsed)
|
||
|
else:
|
||
|
values["device"] = "driver={0}".format(self.getDriver())
|
||
|
return values
|