implement device shutdown on deletion or lack of profiles

This commit is contained in:
Jakob Ketterl 2021-03-18 22:59:46 +01:00
parent f1619b81fe
commit c50473fea5
7 changed files with 39 additions and 12 deletions

View File

@ -230,6 +230,11 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient):
self.write_log_message('SDR device "{0}" was disabled, selecting new device'.format(self.sdr.getName()))
self.setSdr()
def onShutdown(self):
logger.warning('SDR device "%s" is shutting down, selecting new device', self.sdr.getName())
self.write_log_message('SDR device "{0}" is shutting down, selecting new device'.format(self.sdr.getName()))
self.setSdr()
def getClientClass(self) -> SdrClientClass:
return SdrClientClass.USER

View File

@ -214,3 +214,6 @@ class DspManager(csdr.output, SdrSourceEventClient):
def onFail(self):
logger.debug("received onFail(), shutting down DspSource")
self.dsp.stop()
def onShutdown(self):
self.dsp.stop()

View File

@ -84,3 +84,6 @@ class SpectrumThread(csdr.output, SdrSourceEventClient):
def onFail(self):
self.dsp.stop()
def onShutdown(self):
self.dsp.stop()

View File

@ -27,7 +27,7 @@ class MappedSdrSources(PropertyDelegator):
if self.isDeviceValid(value) and key not in self:
self._addSource(key, value)
elif not self.isDeviceValid(value) and key in self:
self._removeSource(key)
del self[key]
def _addSource(self, key, value):
if self.isDeviceValid(value):
@ -38,13 +38,6 @@ class MappedSdrSources(PropertyDelegator):
value["profiles"].wire(updateMethod)
]
def _removeSource(self, key):
if key in self:
self[key].stop()
for sub in self.subscriptions[key]:
sub.cancel()
del self.subscriptions[key]
def isDeviceValid(self, device):
return self._hasProfiles(device) and self._sdrTypeAvailable(device)
@ -75,15 +68,23 @@ class MappedSdrSources(PropertyDelegator):
cls = getattr(module, className)
return cls(id, props)
def _removeSource(self, key, source):
source.shutdown()
for sub in self.subscriptions[key]:
sub.cancel()
del self.subscriptions[key]
def __setitem__(self, key, value):
if key in self:
self._removeSource(key)
source = self[key] if key in self else None
super().__setitem__(key, value)
if source is not None:
self._removeSource(key, source)
def __delitem__(self, key):
if key in self:
self._removeSource(key)
source = self[key] if key in self else None
super().__delitem__(key)
if source is not None:
self._removeSource(key, source)
class SdrService(object):

View File

@ -122,6 +122,10 @@ class ServiceHandler(SdrSourceEventClient):
logger.debug("sdr source failed; stopping services.")
self.stopServices()
def onShutdown(self):
logger.debug("sdr source is shutting down; shutting down service handler, too.")
self.shutdown()
def onEnable(self):
self._scheduleServiceStartup()

View File

@ -258,6 +258,9 @@ class ServiceScheduler(SdrSourceEventClient):
def onFail(self):
self.shutdown()
def onShutdown(self):
self.shutdown()
def onDisable(self):
self.cancelTimer()

View File

@ -56,6 +56,9 @@ class SdrSourceEventClient(object):
def onFail(self):
pass
def onShutdown(self):
pass
def onDisable(self):
pass
@ -349,6 +352,11 @@ class SdrSource(ABC):
if self.monitor:
self.monitor.join()
def shutdown(self):
self.stop()
for c in self.clients.copy():
c.onShutdown()
def getClients(self, *args):
if not args:
return self.clients