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
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())
|
|
|