openwebrx-clone/csdr/chain/digiham.py

85 lines
2.5 KiB
Python
Raw Normal View History

2021-08-23 12:25:28 +00:00
from csdr.chain.demodulator import BaseDemodulatorChain
2021-07-31 22:49:20 +00:00
from pycsdr.modules import FmDemod, Agc, Writer
from pycsdr.types import Format
from digiham.modules import DstarDecoder, DcBlock, FskDemodulator, GfskDemodulator, DigitalVoiceFilter, MbeSynthesizer, NarrowRrcFilter, NxdnDecoder, DmrDecoder, WideRrcFilter, YsfDecoder
from digiham.ambe import Modes
2021-07-29 22:06:21 +00:00
2021-08-23 12:25:28 +00:00
class DigihamChain(BaseDemodulatorChain):
def __init__(self, fskDemodulator, decoder, mbeMode, filter=None, codecserver: str = ""):
self.decoder = decoder
if codecserver is None:
codecserver = ""
2021-08-06 18:02:59 +00:00
agc = Agc(Format.SHORT)
agc.setMaxGain(30)
agc.setInitialGain(3)
workers = [FmDemod(), DcBlock()]
if filter is not None:
workers += [filter]
workers += [
fskDemodulator,
decoder,
MbeSynthesizer(mbeMode, codecserver),
DigitalVoiceFilter(),
2021-08-06 18:02:59 +00:00
agc
2021-07-29 22:06:21 +00:00
]
2021-08-23 12:25:28 +00:00
super().__init__(workers)
def getFixedIfSampleRate(self):
return 48000
def getFixedAudioRate(self):
return 8000
2021-07-29 22:06:21 +00:00
2021-07-31 22:49:20 +00:00
def setMetaWriter(self, writer: Writer):
self.decoder.setMetaWriter(writer)
2021-07-29 22:06:21 +00:00
2021-08-23 12:25:28 +00:00
def supportsSquelch(self):
return False
2021-07-31 22:49:20 +00:00
class Dstar(DigihamChain):
2021-07-29 22:06:21 +00:00
def __init__(self, codecserver: str = ""):
super().__init__(
fskDemodulator=FskDemodulator(samplesPerSymbol=10),
decoder=DstarDecoder(),
mbeMode=Modes.DStarMode,
codecserver=codecserver
)
2021-07-31 22:49:20 +00:00
class Nxdn(DigihamChain):
def __init__(self, codecserver: str = ""):
super().__init__(
fskDemodulator=GfskDemodulator(samplesPerSymbol=20),
decoder=NxdnDecoder(),
mbeMode=Modes.NxdnMode,
filter=NarrowRrcFilter(),
codecserver=codecserver
)
2021-08-06 18:02:59 +00:00
2021-08-06 22:09:40 +00:00
2021-08-06 18:02:59 +00:00
class Dmr(DigihamChain):
def __init__(self, codecserver: str = ""):
super().__init__(
fskDemodulator=GfskDemodulator(samplesPerSymbol=10),
decoder=DmrDecoder(),
mbeMode=Modes.DmrMode,
filter=WideRrcFilter(),
codecserver=codecserver,
)
def setSlotFilter(self, slotFilter: int) -> None:
self.decoder.setSlotFilter(slotFilter)
2021-08-06 22:09:40 +00:00
class Ysf(DigihamChain):
def __init__(self, codecserver: str = ""):
super().__init__(
fskDemodulator=GfskDemodulator(samplesPerSymbol=10),
decoder=YsfDecoder(),
mbeMode=Modes.YsfMode,
filter=WideRrcFilter(),
codecserver=codecserver
)