refactor aprs stuff

This commit is contained in:
Jakob Ketterl 2021-09-02 11:00:57 +02:00
parent efa7faaa2a
commit 7c43c78c4b
5 changed files with 66 additions and 59 deletions

View File

@ -30,7 +30,8 @@ from functools import partial
from csdr.output import Output from csdr.output import Output
from owrx.kiss import KissClient, DirewolfConfig, DirewolfConfigSubscriber from owrx.aprs.kiss import KissClient
from owrx.aprs.direwolf import DirewolfConfig, DirewolfConfigSubscriber
from owrx.audio.chopper import AudioChopper from owrx.audio.chopper import AudioChopper
from csdr.pipe import Pipe from csdr.pipe import Pipe

View File

@ -1,6 +1,5 @@
from owrx.kiss import KissDeframer from owrx.aprs.kiss import KissDeframer
from owrx.map import Map, LatLngLocation from owrx.map import Map, LatLngLocation
from owrx.bands import Bandplan
from owrx.metrics import Metrics, CounterMetric from owrx.metrics import Metrics, CounterMetric
from owrx.parser import Parser from owrx.parser import Parser
from datetime import datetime, timezone from datetime import datetime, timezone

View File

@ -1,17 +1,12 @@
import socket
import time
import logging
import random import random
from owrx.config import Config from owrx.config import Config
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import socket
import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
FEND = 0xC0
FESC = 0xDB
TFEND = 0xDC
TFESC = 0xDD
FEET_PER_METER = 3.28084 FEET_PER_METER = 3.28084
@ -141,51 +136,3 @@ IGLOGIN {callsign} {password}
) )
return config return config
class KissClient(object):
def __init__(self, port):
delay = 0.5
retries = 0
while True:
try:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(("localhost", port))
break
except ConnectionError:
if retries > 20:
logger.error("maximum number of connection attempts reached. did direwolf start up correctly?")
raise
retries += 1
time.sleep(delay)
def read(self):
return self.socket.recv(1)
class KissDeframer(object):
def __init__(self):
self.escaped = False
self.buf = bytearray()
def parse(self, input):
frames = []
for b in input:
if b == FESC:
self.escaped = True
elif self.escaped:
if b == TFEND:
self.buf.append(FEND)
elif b == TFESC:
self.buf.append(FESC)
else:
logger.warning("invalid escape char: %s", str(input[0]))
self.escaped = False
elif input[0] == FEND:
# data frames start with 0x00
if len(self.buf) > 1 and self.buf[0] == 0x00:
frames += [self.buf[1:]]
self.buf = bytearray()
else:
self.buf.append(b)
return frames

59
owrx/aprs/kiss.py Normal file
View File

@ -0,0 +1,59 @@
import socket
import time
import logging
logger = logging.getLogger(__name__)
FEND = 0xC0
FESC = 0xDB
TFEND = 0xDC
TFESC = 0xDD
class KissClient(object):
def __init__(self, port):
delay = 0.5
retries = 0
while True:
try:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(("localhost", port))
break
except ConnectionError:
if retries > 20:
logger.error("maximum number of connection attempts reached. did direwolf start up correctly?")
raise
retries += 1
time.sleep(delay)
def read(self):
return self.socket.recv(1)
class KissDeframer(object):
def __init__(self):
self.escaped = False
self.buf = bytearray()
def parse(self, input):
frames = []
for b in input:
if b == FESC:
self.escaped = True
elif self.escaped:
if b == TFEND:
self.buf.append(FEND)
elif b == TFESC:
self.buf.append(FESC)
else:
logger.warning("invalid escape char: %s", str(input[0]))
self.escaped = False
elif input[0] == FEND:
# data frames start with 0x00
if len(self.buf) > 1 and self.buf[0] == 0x00:
frames += [self.buf[1:]]
self.buf = bytearray()
else:
self.buf.append(b)
return frames

View File

@ -26,6 +26,7 @@ setup(
"owrx.reporting", "owrx.reporting",
"owrx.audio", "owrx.audio",
"owrx.admin", "owrx.admin",
"owrx.aprs",
"csdr", "csdr",
"htdocs", "htdocs",
] ]