diff --git a/csdr/chain/digimodes.py b/csdr/chain/digimodes.py index 867a90a..da3faaf 100644 --- a/csdr/chain/digimodes.py +++ b/csdr/chain/digimodes.py @@ -1,4 +1,5 @@ from csdr.chain.demodulator import ServiceDemodulator, SecondaryDemodulator, DialFrequencyReceiver, SecondarySelectorChain +from csdr.module.msk144 import Msk144Module from owrx.audio.chopper import AudioChopper, AudioChopperParser from owrx.aprs.kiss import KissDeframer from owrx.aprs import Ax25Parser, AprsParser @@ -20,6 +21,18 @@ class AudioChopperDemodulator(ServiceDemodulator, DialFrequencyReceiver): self.chopper.setDialFrequency(frequency) +class Msk144Demodulator(ServiceDemodulator): + def __init__(self): + workers = [ + Convert(Format.FLOAT, Format.SHORT), + Msk144Module(), + ] + super().__init__(workers) + + def getFixedAudioRate(self) -> int: + return 12000 + + class PacketDemodulator(ServiceDemodulator, DialFrequencyReceiver): def __init__(self, service: bool = False): self.parser = AprsParser() diff --git a/csdr/module/msk144.py b/csdr/module/msk144.py new file mode 100644 index 0000000..cf3fcff --- /dev/null +++ b/csdr/module/msk144.py @@ -0,0 +1,13 @@ +from pycsdr.types import Format +from csdr.module import PopenModule + + +class Msk144Module(PopenModule): + def getCommand(self): + return ["msk144decoder"] + + def getInputFormat(self) -> Format: + return Format.SHORT + + def getOutputFormat(self) -> Format: + return Format.CHAR diff --git a/owrx/dsp.py b/owrx/dsp.py index a16a314..3abe02a 100644 --- a/owrx/dsp.py +++ b/owrx/dsp.py @@ -581,6 +581,9 @@ class DspManager(SdrSourceEventClient, ClientDemodulatorSecondaryDspEventClient) from csdr.chain.digimodes import AudioChopperDemodulator from owrx.wsjt import WsjtParser return AudioChopperDemodulator(mod, WsjtParser()) + elif mod == "msk144": + from csdr.chain.digimodes import Msk144Demodulator + return Msk144Demodulator() elif mod == "js8": from csdr.chain.digimodes import AudioChopperDemodulator from owrx.js8 import Js8Parser diff --git a/owrx/modes.py b/owrx/modes.py index b6c73e4..130ae55 100644 --- a/owrx/modes.py +++ b/owrx/modes.py @@ -120,6 +120,7 @@ class Modes(object): WsjtMode("fst4", "FST4", requirements=["wsjt-x-2-3"]), WsjtMode("fst4w", "FST4W", bandpass=Bandpass(1350, 1650), requirements=["wsjt-x-2-3"]), WsjtMode("q65", "Q65", requirements=["wsjt-x-2-4"]), + DigitalMode("msk144", "MSK144", requirements=["msk144"], underlying=["usb"], service=True), Js8Mode("js8", "JS8Call"), DigitalMode( "packet",