fix problems with sdr device failover detection
This commit is contained in:
parent
efa9771ad7
commit
eab3bf780e
@ -15,6 +15,7 @@ from owrx.modes import Modes, DigitalMode
|
||||
from multiprocessing import Queue
|
||||
from queue import Full
|
||||
from js8py import Js8Frame
|
||||
from abc import ABC, abstractmethod
|
||||
import json
|
||||
import threading
|
||||
|
||||
@ -23,7 +24,7 @@ import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Client(object):
|
||||
class Client(ABC):
|
||||
def __init__(self, conn):
|
||||
self.conn = conn
|
||||
self.multiprocessingPipe = Queue(100)
|
||||
@ -52,6 +53,7 @@ class Client(object):
|
||||
except Full:
|
||||
self.close()
|
||||
|
||||
@abstractmethod
|
||||
def handleTextMessage(self, conn, message):
|
||||
pass
|
||||
|
||||
@ -145,8 +147,12 @@ class OpenWebRxReceiverClient(Client):
|
||||
self.startDsp()
|
||||
|
||||
if "params" in message:
|
||||
params = message["params"]
|
||||
self.getDsp().setProperties(params)
|
||||
dsp = self.getDsp()
|
||||
if dsp is None:
|
||||
logger.warning("DSP not available; discarding client data")
|
||||
else:
|
||||
params = message["params"]
|
||||
dsp.setProperties(params)
|
||||
|
||||
elif message["type"] == "config":
|
||||
if "params" in message:
|
||||
@ -172,27 +178,38 @@ class OpenWebRxReceiverClient(Client):
|
||||
logger.warning("message is not json: {0}".format(message))
|
||||
|
||||
def setSdr(self, id=None):
|
||||
next = None
|
||||
if id is not None:
|
||||
next = SdrService.getSource(id)
|
||||
if next is None:
|
||||
next = SdrService.getFirstSource()
|
||||
if next is None:
|
||||
# exit condition: no sdrs available
|
||||
self.handleNoSdrsAvailable()
|
||||
return
|
||||
while True:
|
||||
next = None
|
||||
if id is not None:
|
||||
next = SdrService.getSource(id)
|
||||
if next is None:
|
||||
next = SdrService.getFirstSource()
|
||||
if next is None:
|
||||
# exit condition: no sdrs available
|
||||
logger.warning("no more SDR devices available")
|
||||
self.handleNoSdrsAvailable()
|
||||
return
|
||||
|
||||
# exit condition: no change
|
||||
if next == self.sdr:
|
||||
return
|
||||
# exit condition: no change
|
||||
if next == self.sdr:
|
||||
return
|
||||
|
||||
self.stopDsp()
|
||||
self.stopDsp()
|
||||
|
||||
if self.configSub is not None:
|
||||
self.configSub.cancel()
|
||||
self.configSub = None
|
||||
if self.configSub is not None:
|
||||
self.configSub.cancel()
|
||||
self.configSub = None
|
||||
|
||||
self.sdr = next
|
||||
self.sdr = next
|
||||
|
||||
self.getDsp()
|
||||
|
||||
# found a working sdr, exit the loop
|
||||
if self.sdr.getState() != SdrSource.STATE_FAILED:
|
||||
break
|
||||
|
||||
logger.warning('SDR device "%s" has failed, selecing new device', self.sdr.getName())
|
||||
self.write_log_message('SDR device "{0}" has failed, selecting new device'.format(self.sdr.getName()))
|
||||
|
||||
# send initial config
|
||||
self.getDsp().setProperties(self.connectionProperties)
|
||||
@ -227,13 +244,7 @@ class OpenWebRxReceiverClient(Client):
|
||||
self.write_sdr_error("No SDR Devices available")
|
||||
|
||||
def startDsp(self):
|
||||
while True:
|
||||
self.getDsp().start()
|
||||
if self.sdr.getState() == SdrSource.STATE_FAILED:
|
||||
self.write_log_message('SDR device "{0}" has failed, selecting new device'.format(self.sdr.getName()))
|
||||
self.setSdr()
|
||||
else:
|
||||
break
|
||||
self.getDsp().start()
|
||||
|
||||
def close(self):
|
||||
self.stopDsp()
|
||||
@ -271,7 +282,7 @@ class OpenWebRxReceiverClient(Client):
|
||||
pass
|
||||
|
||||
def getDsp(self):
|
||||
if self.dsp is None:
|
||||
if self.dsp is None and self.sdr is not None:
|
||||
self.dsp = DspManager(self, self.sdr)
|
||||
return self.dsp
|
||||
|
||||
|
@ -199,9 +199,15 @@ class WebSocketConnection(object):
|
||||
data = bytes([b ^ masking_key[index % 4] for (index, b) in enumerate(data)])
|
||||
if opcode == OPCODE_TEXT_MESSAGE:
|
||||
message = data.decode("utf-8")
|
||||
self.messageHandler.handleTextMessage(self, message)
|
||||
try:
|
||||
self.messageHandler.handleTextMessage(self, message)
|
||||
except Exception:
|
||||
logger.exception("Exception in websocket handler handleTextMessage()")
|
||||
elif opcode == OPCODE_BINARY_MESSAGE:
|
||||
self.messageHandler.handleBinaryMessage(self, data)
|
||||
try:
|
||||
self.messageHandler.handleBinaryMessage(self, data)
|
||||
except Exception:
|
||||
logger.exception("Exception in websocket handler handleBinaryMessage()")
|
||||
elif opcode == OPCODE_PING:
|
||||
self.sendPong()
|
||||
elif opcode == OPCODE_PONG:
|
||||
|
Loading…
Reference in New Issue
Block a user