restore pocsag functionality

This commit is contained in:
Jakob Ketterl
2021-09-06 20:00:14 +02:00
parent b9f43654cd
commit 6014ce8921
10 changed files with 126 additions and 121 deletions

View File

@ -2,14 +2,9 @@ from owrx.map import Map, LatLngLocation
from owrx.metrics import Metrics, CounterMetric
from owrx.bands import Bandplan
from datetime import datetime, timezone
from csdr.module import Module
from pycsdr.modules import Reader
from pycsdr.types import Format
from threading import Thread
from io import BytesIO
from csdr.module import PickleModule
import re
import logging
import pickle
logger = logging.getLogger(__name__)
@ -50,41 +45,8 @@ def getSymbolData(symbol, table):
return {"symbol": symbol, "table": table, "index": ord(symbol) - 33, "tableindex": ord(table) - 33}
class Ax25Parser(Module, Thread):
def __init__(self):
self.doRun = True
super().__init__()
def getInputFormat(self) -> Format:
return Format.CHAR
def getOutputFormat(self) -> Format:
return Format.CHAR
def setReader(self, reader: Reader) -> None:
super().setReader(reader)
self.start()
def stop(self):
self.doRun = False
self.reader.stop()
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:
frame = self.parse(pickle.load(io))
if frame is not None:
self.writer.write(pickle.dumps(frame))
except EOFError:
pass
def parse(self, ax25frame):
class Ax25Parser(PickleModule):
def process(self, ax25frame):
control_pid = ax25frame.find(bytes([0x03, 0xF0]))
if control_pid % 7 > 0:
logger.warning("aprs packet framing error: control/pid position not aligned with 7-octet callsign data")
@ -189,45 +151,15 @@ class AprsLocation(LatLngLocation):
return res
class AprsParser(Module, Thread):
class AprsParser(PickleModule):
def __init__(self):
super().__init__()
self.metrics = {}
self.doRun = True
self.band = None
def setDialFrequency(self, freq):
self.band = Bandplan.getSharedInstance().findBand(freq)
def setReader(self, reader: Reader) -> None:
super().setReader(reader)
self.start()
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:
frame = self.parse(pickle.load(io))
if frame is not None:
self.writer.write(pickle.dumps(frame))
except EOFError:
pass
def stop(self):
self.doRun = False
self.reader.stop()
def getMetric(self, category):
if category not in self.metrics:
band = "unknown"
@ -250,7 +182,7 @@ class AprsParser(Module, Thread):
return False
return True
def parse(self, data):
def process(self, data):
try:
# TODO how can we tell if this is an APRS frame at all?
aprsData = self.parseAprsData(data)

View File

@ -1,9 +1,6 @@
from pycsdr.modules import Reader
from pycsdr.types import Format
from csdr.module import Module
from threading import Thread
import socket
import time
from csdr.module import ThreadModule
import pickle
import logging
@ -16,11 +13,10 @@ TFEND = 0xDC
TFESC = 0xDD
class KissDeframer(Module, Thread):
class KissDeframer(ThreadModule):
def __init__(self):
self.escaped = False
self.buf = bytearray()
self.doRun = True
super().__init__()
def getInputFormat(self) -> Format:
@ -29,10 +25,6 @@ class KissDeframer(Module, Thread):
def getOutputFormat(self) -> Format:
return Format.CHAR
def setReader(self, reader: Reader) -> None:
super().setReader(reader)
self.start()
def run(self):
while self.doRun:
data = self.reader.read()
@ -42,10 +34,6 @@ class KissDeframer(Module, Thread):
for frame in self.parse(data):
self.writer.write(pickle.dumps(frame))
def stop(self):
self.doRun = False
self.reader.stop()
def parse(self, input):
for b in input:
if b == FESC: