diff --git a/csdr/module/__init__.py b/csdr/module/__init__.py index f1ed9282..02ba5ece 100644 --- a/csdr/module/__init__.py +++ b/csdr/module/__init__.py @@ -1,5 +1,5 @@ from pycsdr.modules import Module as BaseModule -from pycsdr.modules import Reader, Writer, CallbackWriter +from pycsdr.modules import Reader, Writer, Buffer from pycsdr.types import Format from abc import ABCMeta, abstractmethod from threading import Thread @@ -198,21 +198,31 @@ class PopenModule(AutoStartModule, metaclass=ABCMeta): self.reader.stop() -class LogWriter(CallbackWriter): - def __init__(self, prefix: str): +class LogReader(Thread): + def __init__(self, prefix: str, buffer: Buffer): + self.reader = buffer.getReader() self.logger = logging.getLogger(prefix) self.retained = bytes() - super().__init__(Format.CHAR) + super().__init__() + self.start() - def write(self, data: memoryview) -> None: - self.retained += data - lines = self.retained.split(b"\n") + def run(self) -> None: + while True: + data = self.reader.read() + if data is None: + return - # keep the last line - # this should either be empty if the last char was \n - # or an incomplete line if the read returned early - self.retained = lines[-1] + self.retained += data + lines = self.retained.split(b"\n") - # log all completed lines - for line in lines[0:-1]: - self.logger.info("{}: {}".format("STDOUT", line.strip(b'\n').decode())) + # keep the last line + # this should either be empty if the last char was \n + # or an incomplete line if the read returned early + self.retained = lines[-1] + + # log all completed lines + for line in lines[0:-1]: + self.logger.info("{}: {}".format("STDOUT", line.strip(b'\n').decode())) + + def stop(self): + self.reader.stop() diff --git a/owrx/aprs/direwolf.py b/owrx/aprs/direwolf.py index f551595c..9a533ea2 100644 --- a/owrx/aprs/direwolf.py +++ b/owrx/aprs/direwolf.py @@ -1,6 +1,6 @@ from pycsdr.types import Format -from pycsdr.modules import Writer, TcpSource, ExecModule -from csdr.module import LogWriter +from pycsdr.modules import Writer, TcpSource, ExecModule, Buffer +from csdr.module import LogReader from owrx.config.core import CoreConfig from owrx.config import Config from abc import ABC, abstractmethod @@ -160,7 +160,9 @@ class DirewolfModule(ExecModule, DirewolfConfigSubscriber): super().__init__(Format.SHORT, Format.CHAR, ["direwolf", "-c", self.direwolfConfigPath, "-r", "48000", "-t", "0", "-q", "d", "-q", "h"]) # direwolf supplies the data via a socket which we tap into in start() # the output on its STDOUT is informative, but we still want to log it - super().setWriter(LogWriter(__name__)) + buffer = Buffer(Format.CHAR) + self.logReader = LogReader(__name__, buffer) + super().setWriter(buffer) self.start() def __writeConfig(self): @@ -199,6 +201,8 @@ class DirewolfModule(ExecModule, DirewolfConfigSubscriber): def stop(self) -> None: super().stop() + self.logReader.stop() + self.logReader = None os.unlink(self.direwolfConfigPath) self.direwolfConfig.unwire(self) self.direwolfConfig = None