You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

79 lines
2.1 KiB

import os
import time
import threading
import argparse
import modem
import frames
sent_messages = {}
received_messages = {}
def sends():
while True:
try:
with open(input_file) as f:
recipient, message = f.read().split(" ", 1)
os.unlink(input_file)
except FileNotFoundError:
continue
message = message.strip()
if message.startswith("QRY "):
message_id = message.split(" ")[1]
modem.send(
modem.wrap_frame(
frames.QryFrame(
recipient, my_identifier, message_id
).encode(),
callsign,
)
)
else:
frame = frames.MsgFrame(
recipient,
my_identifier,
message,
)
sent_messages[frame.message_id] = [
frame,
False,
]
modem.send(modem.wrap_frame(frame.encode(), callsign))
parser = argparse.ArgumentParser(prog="leonet")
parser.add_argument("identifier", help="my identifier (e.g. CALLSIGN-1)")
parser.add_argument(
"callsign", help="my call sign (does not need to match identifier)"
)
parser.add_argument("input_file", help="file to watch for messages")
args = parser.parse_args()
my_identifier = args.identifier
callsign = args.callsign
input_file = args.input_file
threading.Thread(target=sends).start()
transceiver = modem.Transceiver(my_identifier, callsign)
while True:
frame = transceiver.receive()
print()
print(frame)
if isinstance(frame, frames.MsgFrame):
print(frame.timestamp, frame.originator, frame.message)
time.sleep(5)
received_messages[frame.message_id] = frame
transceiver.transmit(frames.gen_ack().encode())
elif isinstance(frame, frames.QryFrame):
time.sleep(5)
if frame.message_id in received_messages:
transceiver.transmit(frames.gen_ack().encode())
else:
transceiver.transmit(frames.gen_nak().encode())