openwebrx-clone/owrx/bands.py

80 lines
2.4 KiB
Python
Raw Normal View History

import json
2019-07-19 21:15:10 +00:00
import logging
2019-07-19 21:15:10 +00:00
logger = logging.getLogger(__name__)
class Band(object):
def __init__(self, dict):
self.name = dict["name"]
self.lower_bound = dict["lower_bound"]
self.upper_bound = dict["upper_bound"]
2019-07-19 21:15:10 +00:00
self.frequencies = []
if "frequencies" in dict:
for (mode, freqs) in dict["frequencies"].items():
if not isinstance(freqs, list):
freqs = [freqs]
for f in freqs:
if not self.inBand(f):
logger.warning(
"Frequency for {mode} on {band} is not within band limits: {frequency}".format(
mode=mode, frequency=f, band=self.name
)
)
2019-07-19 21:15:10 +00:00
else:
self.frequencies.append({"mode": mode, "frequency": f})
def inBand(self, freq):
return self.lower_bound <= freq <= self.upper_bound
def getName(self):
return self.name
def getDialFrequencies(self, range):
(low, hi) = range
return [e for e in self.frequencies if low <= e["frequency"] <= hi]
class Bandplan(object):
sharedInstance = None
@staticmethod
def getSharedInstance():
if Bandplan.sharedInstance is None:
Bandplan.sharedInstance = Bandplan()
return Bandplan.sharedInstance
def __init__(self):
self.bands = self.loadBands()
def loadBands(self):
for file in ["/etc/openwebrx/bands.json", "bands.json"]:
try:
f = open(file, "r")
bands_json = json.load(f)
f.close()
return [Band(d) for d in bands_json]
except FileNotFoundError:
pass
2019-12-15 16:44:31 +00:00
except json.JSONDecodeError:
logger.exception("error while parsing bandplan file %s", file)
return []
except Exception:
logger.exception("error while processing bandplan from %s", file)
2019-12-15 16:44:31 +00:00
return []
return []
2019-07-28 09:45:28 +00:00
def findBands(self, freq):
return [band for band in self.bands if band.inBand(freq)]
def findBand(self, freq):
2019-07-28 09:45:28 +00:00
bands = self.findBands(freq)
if bands:
return bands[0]
else:
return None
2019-07-21 21:39:11 +00:00
def collectDialFrequencies(self, range):
return [e for b in self.bands for e in b.getDialFrequencies(range)]