make wsprnet and pskreporter settings work from the web config

This commit is contained in:
Jakob Ketterl 2021-04-07 17:54:14 +02:00
parent ebd4d93908
commit 5487861da1
6 changed files with 92 additions and 70 deletions

View File

@ -1,58 +0,0 @@
import threading
from abc import ABC, abstractmethod
from owrx.config import Config
class Reporter(ABC):
@abstractmethod
def stop(self):
pass
@abstractmethod
def spot(self, spot):
pass
@abstractmethod
def getSupportedModes(self):
return []
class ReportingEngine(object):
creationLock = threading.Lock()
sharedInstance = None
@staticmethod
def getSharedInstance():
with ReportingEngine.creationLock:
if ReportingEngine.sharedInstance is None:
ReportingEngine.sharedInstance = ReportingEngine()
return ReportingEngine.sharedInstance
@staticmethod
def stopAll():
with ReportingEngine.creationLock:
if ReportingEngine.sharedInstance is not None:
ReportingEngine.sharedInstance.stop()
def __init__(self):
self.reporters = []
config = Config.get()
if "pskreporter_enabled" in config and config["pskreporter_enabled"]:
# inline import due to circular dependencies
from owrx.pskreporter import PskReporter
self.reporters += [PskReporter()]
if "wsprnet_enabled" in config and config["wsprnet_enabled"]:
# inline import due to circular dependencies
from owrx.wsprnet import WsprnetReporter
self.reporters += [WsprnetReporter()]
def stop(self):
for r in self.reporters:
r.stop()
def spot(self, spot):
for r in self.reporters:
if spot["mode"] in r.getSupportedModes():
r.spot(spot)

View File

@ -0,0 +1,57 @@
import threading
from owrx.config import Config
from owrx.reporting.reporter import Reporter
from owrx.reporting.pskreporter import PskReporter
from owrx.reporting.wsprnet import WsprnetReporter
import logging
logger = logging.getLogger(__name__)
class ReportingEngine(object):
creationLock = threading.Lock()
sharedInstance = None
reporterClasses = {
"pskreporter_enabled": PskReporter,
"wsprnet_enabled": WsprnetReporter,
}
@staticmethod
def getSharedInstance():
with ReportingEngine.creationLock:
if ReportingEngine.sharedInstance is None:
ReportingEngine.sharedInstance = ReportingEngine()
return ReportingEngine.sharedInstance
@staticmethod
def stopAll():
with ReportingEngine.creationLock:
if ReportingEngine.sharedInstance is not None:
ReportingEngine.sharedInstance.stop()
def __init__(self):
self.reporters = []
self.configSub = Config.get().filter(*ReportingEngine.reporterClasses.keys()).wire(self.setupReporters)
self.setupReporters()
def setupReporters(self, *args):
config = Config.get()
for configKey, reporterClass in ReportingEngine.reporterClasses.items():
if configKey in config and config[configKey]:
if not any(isinstance(r, reporterClass) for r in self.reporters):
self.reporters += [reporterClass()]
else:
for reporter in [r for r in self.reporters if isinstance(r, reporterClass)]:
reporter.stop()
self.reporters.remove(reporter)
def stop(self):
for r in self.reporters:
r.stop()
self.configSub.cancel()
def spot(self, spot):
for r in self.reporters:
if spot["mode"] in r.getSupportedModes():
r.spot(spot)

View File

@ -9,7 +9,7 @@ from owrx.config import Config
from owrx.version import openwebrx_version from owrx.version import openwebrx_version
from owrx.locator import Locator from owrx.locator import Locator
from owrx.metrics import Metrics, CounterMetric from owrx.metrics import Metrics, CounterMetric
from owrx.reporting import Reporter from owrx.reporting.reporter import Reporter
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -22,6 +22,8 @@ class PskReporter(Reporter):
def stop(self): def stop(self):
self.cancelTimer() self.cancelTimer()
with self.spotLock:
self.spots = []
def __init__(self): def __init__(self):
self.spots = [] self.spots = []

View File

@ -0,0 +1,15 @@
from abc import ABC, abstractmethod
class Reporter(ABC):
@abstractmethod
def stop(self):
pass
@abstractmethod
def spot(self, spot):
pass
@abstractmethod
def getSupportedModes(self):
return []

View File

@ -1,4 +1,4 @@
from owrx.reporting import Reporter from owrx.reporting.reporter import Reporter
from owrx.version import openwebrx_version from owrx.version import openwebrx_version
from owrx.config import Config from owrx.config import Config
from owrx.locator import Locator from owrx.locator import Locator
@ -12,14 +12,13 @@ from datetime import datetime, timezone
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
PoisonPill = object()
class Worker(threading.Thread): class Worker(threading.Thread):
def __init__(self, queue: Queue): def __init__(self, queue: Queue):
self.queue = queue self.queue = queue
self.doRun = True self.doRun = True
# some constants that we don't expect to change
config = Config.get()
self.callsign = config["wsprnet_callsign"]
self.locator = Locator.fromCoordinates(config["receiver_gps"])
super().__init__(daemon=True) super().__init__(daemon=True)
@ -27,8 +26,11 @@ class Worker(threading.Thread):
while self.doRun: while self.doRun:
try: try:
spot = self.queue.get() spot = self.queue.get()
self.uploadSpot(spot) if spot is PoisonPill:
self.queue.task_done() self.doRun = False
else:
self.uploadSpot(spot)
self.queue.task_done()
except Exception: except Exception:
logger.exception("Exception while uploading WSPRNet spot") logger.exception("Exception while uploading WSPRNet spot")
@ -40,6 +42,7 @@ class Worker(threading.Thread):
return interval return interval
def uploadSpot(self, spot): def uploadSpot(self, spot):
config = Config.get()
# function=wspr&date=210114&time=1732&sig=-15&dt=0.5&drift=0&tqrg=7.040019&tcall=DF2UU&tgrid=JN48&dbm=37&version=2.3.0-rc3&rcall=DD5JFK&rgrid=JN58SC&rqrg=7.040047&mode=2 # function=wspr&date=210114&time=1732&sig=-15&dt=0.5&drift=0&tqrg=7.040019&tcall=DF2UU&tgrid=JN48&dbm=37&version=2.3.0-rc3&rcall=DD5JFK&rgrid=JN58SC&rqrg=7.040047&mode=2
# {'timestamp': 1610655960000, 'db': -23.0, 'dt': 0.3, 'freq': 7040048, 'drift': -1, 'msg': 'LA3JJ JO59 37', 'callsign': 'LA3JJ', 'locator': 'JO59', 'mode': 'WSPR'} # {'timestamp': 1610655960000, 'db': -23.0, 'dt': 0.3, 'freq': 7040048, 'drift': -1, 'msg': 'LA3JJ JO59 37', 'callsign': 'LA3JJ', 'locator': 'JO59', 'mode': 'WSPR'}
date = datetime.fromtimestamp(spot["timestamp"] / 1000, tz=timezone.utc) date = datetime.fromtimestamp(spot["timestamp"] / 1000, tz=timezone.utc)
@ -57,9 +60,8 @@ class Worker(threading.Thread):
"tgrid": spot["locator"], "tgrid": spot["locator"],
"dbm": spot["dbm"], "dbm": spot["dbm"],
"version": openwebrx_version, "version": openwebrx_version,
"rcall": self.callsign, "rcall": config["wsprnet_callsign"],
"rgrid": self.locator, "rgrid": Locator.fromCoordinates(config["receiver_gps"]),
# mode 2 = WSPR 2 minutes
"mode": self._getMode(spot), "mode": self._getMode(spot),
} }
).encode() ).encode()
@ -79,7 +81,10 @@ class WsprnetReporter(Reporter):
metrics.addMetric("wsprnet.spots", self.spotCounter) metrics.addMetric("wsprnet.spots", self.spotCounter)
def stop(self): def stop(self):
pass while not self.queue.empty():
self.queue.get(timeout=1)
self.queue.task_done()
self.queue.put(PoisonPill)
def spot(self, spot): def spot(self, spot):
try: try:

View File

@ -22,6 +22,7 @@ setup(
"owrx.property", "owrx.property",
"owrx.form", "owrx.form",
"owrx.config", "owrx.config",
"owrx.reporting",
"csdr", "csdr",
"htdocs", "htdocs",
"owrxadmin", "owrxadmin",