Add EAS/SAME human-readable decoder
This commit is contained in:
parent
907eede566
commit
6de51ce1c6
|
|
@ -2,7 +2,7 @@ from csdr.chain.demodulator import ServiceDemodulator, DialFrequencyReceiver
|
|||
from csdr.module.toolbox import Rtl433Module, MultimonModule, DumpHfdlModule, DumpVdl2Module, Dump1090Module, AcarsDecModule, RedseaModule, SatDumpModule
|
||||
from pycsdr.modules import FmDemod, AudioResampler, Convert, Agc, Squelch
|
||||
from pycsdr.types import Format
|
||||
from owrx.toolbox import TextParser, PageParser, SelCallParser, IsmParser, RdsParser
|
||||
from owrx.toolbox import TextParser, PageParser, SelCallParser, EasSameParser, IsmParser, RdsParser
|
||||
from owrx.aircraft import HfdlParser, Vdl2Parser, AdsbParser, AcarsParser
|
||||
|
||||
from datetime import datetime
|
||||
|
|
@ -92,6 +92,15 @@ class SelCallDemodulator(MultimonDemodulator):
|
|||
)
|
||||
|
||||
|
||||
class EasSameDemodulator(MultimonDemodulator):
|
||||
def __init__(self, service: bool = False):
|
||||
super().__init__(
|
||||
["EAS"],
|
||||
EasSameParser(service=service),
|
||||
withSquelch = True
|
||||
)
|
||||
|
||||
|
||||
class ZveiDemodulator(MultimonDemodulator):
|
||||
def __init__(self, service: bool = False):
|
||||
super().__init__(
|
||||
|
|
|
|||
|
|
@ -677,6 +677,9 @@ class DspManager(SdrSourceEventClient, ClientDemodulatorSecondaryDspEventClient)
|
|||
elif mod == "selcall":
|
||||
from csdr.chain.toolbox import SelCallDemodulator
|
||||
return SelCallDemodulator()
|
||||
elif mod == "eassame":
|
||||
from csdr.chain.toolbox import EasSameDemodulator
|
||||
return EasSameDemodulator()
|
||||
elif mod == "zvei":
|
||||
from csdr.chain.toolbox import ZveiDemodulator
|
||||
return ZveiDemodulator()
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ class FeatureDetector(object):
|
|||
"acars": ["acarsdec"],
|
||||
"page": ["multimon"],
|
||||
"selcall": ["multimon"],
|
||||
"eas_same": ["multimon", "dsame3_simple"],
|
||||
"wxsat": ["satdump"],
|
||||
"png": ["imagemagick"],
|
||||
"rds": ["redsea"],
|
||||
|
|
@ -737,6 +738,12 @@ class FeatureDetector(object):
|
|||
"""
|
||||
return self.command_is_runnable("multimon-ng --help")
|
||||
|
||||
def has_dsame3_simple(self):
|
||||
"""
|
||||
dsame3_simple is used to decode EAS SAME messages to readable text.
|
||||
"""
|
||||
return self.command_is_runnable("dsame3_simple --help")
|
||||
|
||||
def has_satdump(self):
|
||||
"""
|
||||
OpenWebRX uses [SatDump](https://github.com/SatDump/SatDump) software
|
||||
|
|
|
|||
|
|
@ -216,6 +216,13 @@ class Modes(object):
|
|||
requirements=["selcall"],
|
||||
squelch=True
|
||||
),
|
||||
DigitalMode(
|
||||
"eassame",
|
||||
"EAS SAME",
|
||||
underlying=["nfm"],
|
||||
requirements=["eas_same"],
|
||||
squelch=True
|
||||
),
|
||||
DigitalMode(
|
||||
"zvei",
|
||||
"Zvei",
|
||||
|
|
|
|||
|
|
@ -370,3 +370,31 @@ class SelCallParser(TextParser):
|
|||
dec = None
|
||||
# Done
|
||||
return out
|
||||
|
||||
class EasSameParser(TextParser):
|
||||
def __init__(self, service: bool = False):
|
||||
self.reSplit = re.compile(r"(EAS: \S+)")
|
||||
self.reMatch = re.compile(r"EAS")
|
||||
self.mode = ""
|
||||
# Construct parent object
|
||||
super().__init__(filePrefix="EAS_SAME", service=service)
|
||||
|
||||
def parse(self, msg: bytes):
|
||||
# Do not parse in service mode
|
||||
if self.service:
|
||||
return None
|
||||
# Parse EAS SAME messages
|
||||
from dsame3_simple.dsame import same_decode_string
|
||||
msg = msg.decode('utf-8', 'replace')
|
||||
out = []
|
||||
|
||||
r = self.reSplit.split(msg)
|
||||
for s in r:
|
||||
if not self.reMatch.match(s):
|
||||
continue
|
||||
dec = same_decode_string(s)
|
||||
if not dec:
|
||||
continue
|
||||
out += [s, '\n'.join(dec), '']
|
||||
# Done
|
||||
return '\n'.join(out)
|
||||
|
|
|
|||
Loading…
Reference in New Issue