91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
|
from owrx.config import PropertyManager
|
||
|
from owrx.feature import FeatureDetector, UnknownFeatureException
|
||
|
import sys
|
||
|
|
||
|
import logging
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class SdrService(object):
|
||
|
sdrProps = None
|
||
|
sources = {}
|
||
|
lastPort = None
|
||
|
|
||
|
@staticmethod
|
||
|
def getNextPort():
|
||
|
pm = PropertyManager.getSharedInstance()
|
||
|
(start, end) = pm["iq_port_range"]
|
||
|
if SdrService.lastPort is None:
|
||
|
SdrService.lastPort = start
|
||
|
else:
|
||
|
SdrService.lastPort += 1
|
||
|
if SdrService.lastPort > end:
|
||
|
raise IndexError("no more available ports to start more sdrs")
|
||
|
return SdrService.lastPort
|
||
|
|
||
|
@staticmethod
|
||
|
def loadProps():
|
||
|
if SdrService.sdrProps is None:
|
||
|
pm = PropertyManager.getSharedInstance()
|
||
|
featureDetector = FeatureDetector()
|
||
|
|
||
|
def loadIntoPropertyManager(dict: dict):
|
||
|
propertyManager = PropertyManager()
|
||
|
for (name, value) in dict.items():
|
||
|
propertyManager[name] = value
|
||
|
return propertyManager
|
||
|
|
||
|
def sdrTypeAvailable(value):
|
||
|
try:
|
||
|
if not featureDetector.is_available(value["type"]):
|
||
|
logger.error(
|
||
|
'The RTL source type "{0}" is not available. please check requirements.'.format(
|
||
|
value["type"]
|
||
|
)
|
||
|
)
|
||
|
return False
|
||
|
return True
|
||
|
except UnknownFeatureException:
|
||
|
logger.error(
|
||
|
'The RTL source type "{0}" is invalid. Please check your configuration'.format(value["type"])
|
||
|
)
|
||
|
return False
|
||
|
|
||
|
# transform all dictionary items into PropertyManager object, filtering out unavailable ones
|
||
|
SdrService.sdrProps = {
|
||
|
name: loadIntoPropertyManager(value) for (name, value) in pm["sdrs"].items() if sdrTypeAvailable(value)
|
||
|
}
|
||
|
logger.info(
|
||
|
"SDR sources loaded. Availables SDRs: {0}".format(
|
||
|
", ".join(map(lambda x: x["name"], SdrService.sdrProps.values()))
|
||
|
)
|
||
|
)
|
||
|
|
||
|
@staticmethod
|
||
|
def getSource(id=None):
|
||
|
SdrService.loadProps()
|
||
|
sources = SdrService.getSources()
|
||
|
if not sources:
|
||
|
return None
|
||
|
if id is None:
|
||
|
# TODO: configure default sdr in config? right now it will pick the first one off the list.
|
||
|
id = list(sources.keys())[0]
|
||
|
|
||
|
if not id in sources:
|
||
|
return None
|
||
|
return sources[id]
|
||
|
|
||
|
@staticmethod
|
||
|
def getSources():
|
||
|
SdrService.loadProps()
|
||
|
for id in SdrService.sdrProps.keys():
|
||
|
if not id in SdrService.sources:
|
||
|
props = SdrService.sdrProps[id]
|
||
|
sdrType = props["type"]
|
||
|
className = "".join(x for x in sdrType.title() if x.isalnum()) + "Source"
|
||
|
module = __import__("owrx.source.{0}".format(sdrType), fromlist=[className])
|
||
|
cls = getattr(module, className)
|
||
|
SdrService.sources[id] = cls(id, props, SdrService.getNextPort())
|
||
|
return {key: s for key, s in SdrService.sources.items() if not s.isFailed()}
|