2021-02-25 21:01:52 -05:00
|
|
|
import asyncio
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from aioax25 import interface
|
|
|
|
from aioax25 import kiss as kiss
|
|
|
|
from aioax25.aprs import APRSInterface
|
2021-08-30 13:34:25 -04:00
|
|
|
|
2021-02-25 21:01:52 -05:00
|
|
|
|
|
|
|
LOG = logging.getLogger("APRSD")
|
|
|
|
|
|
|
|
|
|
|
|
class Aioax25Client:
|
|
|
|
def __init__(self, config):
|
|
|
|
self.config = config
|
2021-09-17 09:32:30 -04:00
|
|
|
loop = asyncio.new_event_loop()
|
|
|
|
asyncio.set_event_loop(loop)
|
|
|
|
self.loop = asyncio.get_event_loop()
|
2021-02-25 21:01:52 -05:00
|
|
|
self.setup()
|
|
|
|
|
|
|
|
def setup(self):
|
|
|
|
# we can be TCP kiss or Serial kiss
|
|
|
|
if "serial" in self.config["kiss"] and self.config["kiss"]["serial"].get(
|
|
|
|
"enabled",
|
|
|
|
False,
|
|
|
|
):
|
|
|
|
LOG.debug(
|
|
|
|
"Setting up Serial KISS connection to {}".format(
|
|
|
|
self.config["kiss"]["serial"]["device"],
|
|
|
|
),
|
|
|
|
)
|
|
|
|
self.kissdev = kiss.SerialKISSDevice(
|
|
|
|
device=self.config["kiss"]["serial"]["device"],
|
|
|
|
baudrate=self.config["kiss"]["serial"].get("baudrate", 9600),
|
|
|
|
loop=self.loop,
|
2022-07-28 16:24:25 -04:00
|
|
|
log=LOG,
|
2021-02-25 21:01:52 -05:00
|
|
|
)
|
|
|
|
elif "tcp" in self.config["kiss"] and self.config["kiss"]["tcp"].get(
|
|
|
|
"enabled",
|
|
|
|
False,
|
|
|
|
):
|
|
|
|
LOG.debug(
|
|
|
|
"Setting up KISSTCP Connection to {}:{}".format(
|
2021-09-01 14:48:22 -04:00
|
|
|
self.config["kiss"]["tcp"]["host"],
|
|
|
|
self.config["kiss"]["tcp"]["port"],
|
2021-02-25 21:01:52 -05:00
|
|
|
),
|
|
|
|
)
|
|
|
|
self.kissdev = kiss.TCPKISSDevice(
|
2021-09-01 14:48:22 -04:00
|
|
|
self.config["kiss"]["tcp"]["host"],
|
|
|
|
self.config["kiss"]["tcp"]["port"],
|
2021-02-25 21:01:52 -05:00
|
|
|
loop=self.loop,
|
2021-09-01 14:48:22 -04:00
|
|
|
log=LOG,
|
2021-02-25 21:01:52 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
LOG.debug("Creating AX25Interface")
|
2022-07-28 16:24:25 -04:00
|
|
|
self.ax25int = interface.AX25Interface(
|
|
|
|
kissport=self.kissdev[0],
|
|
|
|
loop=self.loop,
|
|
|
|
log=LOG,
|
|
|
|
)
|
2021-02-25 21:01:52 -05:00
|
|
|
|
|
|
|
LOG.debug("Creating APRSInterface")
|
|
|
|
self.aprsint = APRSInterface(
|
|
|
|
ax25int=self.ax25int,
|
2022-07-28 16:24:25 -04:00
|
|
|
mycall=self.config["aprsd"]["callsign"],
|
2021-02-25 21:01:52 -05:00
|
|
|
log=LOG,
|
|
|
|
)
|
2022-07-28 16:24:25 -04:00
|
|
|
self.kissdev.open()
|
2021-02-25 21:01:52 -05:00
|
|
|
|
|
|
|
def stop(self):
|
|
|
|
LOG.debug(self.kissdev)
|
|
|
|
self.loop.stop()
|
2022-07-28 16:24:25 -04:00
|
|
|
self.kissdev.close()
|
2021-02-25 21:01:52 -05:00
|
|
|
|
2021-09-17 09:32:30 -04:00
|
|
|
def set_filter(self, filter):
|
|
|
|
# This does nothing right now.
|
|
|
|
pass
|
|
|
|
|
2022-07-28 16:24:25 -04:00
|
|
|
def consumer(self, callback, blocking=False, immortal=False, raw=False):
|
|
|
|
callsign = self.config["aprsd"]["callsign"]
|
2021-09-17 09:32:30 -04:00
|
|
|
call = callsign.split("-")
|
|
|
|
if len(call) > 1:
|
|
|
|
callsign = call[0]
|
|
|
|
ssid = int(call[1])
|
|
|
|
else:
|
|
|
|
ssid = 0
|
|
|
|
self.aprsint.bind(callback=callback, callsign=callsign, ssid=ssid, regex=False)
|
2022-07-28 16:24:25 -04:00
|
|
|
|
|
|
|
# async def set_after(fut, delay, value):
|
|
|
|
# # Sleep for *delay* seconds.
|
|
|
|
# await asyncio.sleep(delay)
|
|
|
|
#
|
|
|
|
# # Set *value* as a result of *fut* Future.
|
|
|
|
# fut.set_result(value)
|
|
|
|
#
|
|
|
|
# async def my_wait(fut):
|
|
|
|
# await fut
|
|
|
|
#
|
|
|
|
# fut = self.loop.create_future()
|
|
|
|
# self.loop.create_task(
|
|
|
|
# set_after(fut, 5, "nothing")
|
|
|
|
# )
|
|
|
|
LOG.debug("RUN FOREVER")
|
2021-09-17 09:32:30 -04:00
|
|
|
self.loop.run_forever()
|
2022-07-28 16:24:25 -04:00
|
|
|
# my_wait(fut)
|
2021-02-25 21:01:52 -05:00
|
|
|
|
|
|
|
def send(self, msg):
|
|
|
|
"""Send an APRS Message object."""
|
2022-07-28 16:24:25 -04:00
|
|
|
LOG.debug(f"Send {msg} TO KISS")
|
2021-09-01 14:48:22 -04:00
|
|
|
payload = f"{msg._filter_for_send()}"
|
|
|
|
self.aprsint.send_message(
|
|
|
|
addressee=msg.tocall,
|
|
|
|
message=payload,
|
|
|
|
path=["WIDE1-1", "WIDE2-1"],
|
|
|
|
oneshot=True,
|
2021-02-25 21:01:52 -05:00
|
|
|
)
|