restore pocsag functionality
This commit is contained in:
@ -5,6 +5,8 @@ from owrx.aprs import Ax25Parser, AprsParser
|
||||
from pycsdr.modules import Convert, FmDemod
|
||||
from pycsdr.types import Format
|
||||
from owrx.aprs.module import DirewolfModule
|
||||
from digiham.modules import FskDemodulator, PocsagDecoder
|
||||
from owrx.pocsag import PocsagParser
|
||||
|
||||
|
||||
class AudioChopperDemodulator(SecondaryDemodulator, FixedAudioRateChain, DialFrequencyReceiver):
|
||||
@ -42,3 +44,20 @@ class PacketDemodulator(SecondaryDemodulator, FixedAudioRateChain, DialFrequency
|
||||
|
||||
def setDialFrequency(self, frequency: int) -> None:
|
||||
self.parser.setDialFrequency(frequency)
|
||||
|
||||
|
||||
class PocsagDemodulator(SecondaryDemodulator, FixedAudioRateChain):
|
||||
def __init__(self):
|
||||
workers = [
|
||||
FmDemod(),
|
||||
FskDemodulator(samplesPerSymbol=40, invert=True),
|
||||
PocsagDecoder(),
|
||||
PocsagParser(),
|
||||
]
|
||||
super().__init__(workers)
|
||||
|
||||
def supportsSquelch(self) -> bool:
|
||||
return False
|
||||
|
||||
def getFixedAudioRate(self) -> int:
|
||||
return 48000
|
||||
|
@ -2,6 +2,9 @@ from pycsdr.modules import Module as BaseModule
|
||||
from pycsdr.modules import Reader, Writer
|
||||
from pycsdr.types import Format
|
||||
from abc import ABCMeta, abstractmethod
|
||||
from threading import Thread
|
||||
from io import BytesIO
|
||||
import pickle
|
||||
|
||||
|
||||
class Module(BaseModule, metaclass=ABCMeta):
|
||||
@ -23,3 +26,57 @@ class Module(BaseModule, metaclass=ABCMeta):
|
||||
@abstractmethod
|
||||
def getOutputFormat(self) -> Format:
|
||||
pass
|
||||
|
||||
|
||||
class ThreadModule(Module, Thread, metaclass=ABCMeta):
|
||||
def __init__(self):
|
||||
self.doRun = True
|
||||
super().__init__()
|
||||
Thread.__init__(self)
|
||||
|
||||
def _checkStart(self) -> None:
|
||||
if self.reader is not None and self.writer is not None:
|
||||
self.start()
|
||||
|
||||
def setReader(self, reader: Reader) -> None:
|
||||
super().setReader(reader)
|
||||
self._checkStart()
|
||||
|
||||
def setWriter(self, writer: Writer) -> None:
|
||||
super().setWriter(writer)
|
||||
self._checkStart()
|
||||
|
||||
@abstractmethod
|
||||
def run(self):
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
self.doRun = False
|
||||
self.reader.stop()
|
||||
|
||||
|
||||
class PickleModule(ThreadModule):
|
||||
def getInputFormat(self) -> Format:
|
||||
return Format.CHAR
|
||||
|
||||
def getOutputFormat(self) -> Format:
|
||||
return Format.CHAR
|
||||
|
||||
def run(self):
|
||||
while self.doRun:
|
||||
data = self.reader.read()
|
||||
if data is None:
|
||||
self.doRun = False
|
||||
break
|
||||
io = BytesIO(data.tobytes())
|
||||
try:
|
||||
while True:
|
||||
output = self.process(pickle.load(io))
|
||||
if output is not None:
|
||||
self.writer.write(pickle.dumps(output))
|
||||
except EOFError:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def process(self, input):
|
||||
pass
|
||||
|
Reference in New Issue
Block a user