ping pong loop nearly working
This commit is contained in:
@@ -2,9 +2,30 @@ import time
|
||||
import uuid
|
||||
from sx1262 import SX1262
|
||||
|
||||
import uasyncio as asyncio
|
||||
|
||||
from machine import Pin
|
||||
led = Pin(25, Pin.OUT)
|
||||
|
||||
class Queue:
|
||||
def __init__(self):
|
||||
self.items = []
|
||||
self.waiters = []
|
||||
|
||||
async def put(self, item):
|
||||
self.items.append(item)
|
||||
if self.waiters:
|
||||
waiter = self.waiters.pop(0)
|
||||
waiter.set()
|
||||
|
||||
async def get(self):
|
||||
while not self.items:
|
||||
event = asyncio.Event()
|
||||
self.waiters.append(event)
|
||||
await event.wait()
|
||||
|
||||
return self.items.pop(0)
|
||||
|
||||
class FixedDeque:
|
||||
def __init__(self, maxlen):
|
||||
self.maxlen = maxlen
|
||||
@@ -55,7 +76,7 @@ class LoRaHandler:
|
||||
def __init__(self):
|
||||
print("Initializing LoRa...")
|
||||
|
||||
self.sender_id = str(uuid.uuid4())
|
||||
self.my_id = str(uuid.uuid4())
|
||||
|
||||
# initialize our radio, im using the HAT SX1262 hat for the pico
|
||||
self.radio = SX1262(spi_bus=1, clk=10, mosi=11, miso=12, cs=3, irq=20, rst=15, gpio=2)
|
||||
@@ -64,9 +85,10 @@ class LoRaHandler:
|
||||
|
||||
self.recent_messages = FixedDeque(32)
|
||||
self.neighbours = set()
|
||||
self.message_queue = Queue()
|
||||
|
||||
def send(self, data: bytes, recipient_id: str):
|
||||
msg_bytes = LoRaMessage(sender_id=self.sender_id, recipient_id=recipient_id, payload=data).encode()
|
||||
msg_bytes = LoRaMessage(sender_id=self.my_id, recipient_id=recipient_id, payload=data).encode()
|
||||
self.radio.send(msg_bytes)
|
||||
|
||||
def forward(self, msg: LoRaMessage):
|
||||
@@ -87,12 +109,13 @@ class LoRaHandler:
|
||||
# if we receive a message with lifetime <= 0 we just drop it,
|
||||
# otherwise we decrement the lifetime and forward it to all
|
||||
# neighbors except the sender
|
||||
msg.lifetime -= 1
|
||||
if msg.lifetime <= 0:
|
||||
return
|
||||
msg.lifetime -= 1
|
||||
|
||||
# forward messages if they aren't meant for us
|
||||
if (msg.recipient_id != self.sender_id) and msg.recipient_id != "BROADCAST":
|
||||
|
||||
if (msg.recipient_id != self.my_id) and msg.recipient_id != "BROADCAST":
|
||||
print("Forwarding message...")
|
||||
self.forward(msg)
|
||||
return
|
||||
@@ -101,9 +124,11 @@ class LoRaHandler:
|
||||
if not msg.sender_id in self.neighbours:
|
||||
print(f"Neighbour discovered: {msg.sender_id}")
|
||||
self.neighbours.add(msg.sender_id)
|
||||
self.send(b"Ping!", msg.sender_id)
|
||||
|
||||
return
|
||||
|
||||
print(f"Received message from {msg.sender_id}: {msg.payload}")
|
||||
asyncio.create_task(self.message_queue.put(msg))
|
||||
|
||||
|
||||
|
||||
@@ -119,5 +144,5 @@ class LoRaHandler:
|
||||
|
||||
self.on_receive(LoRaMessage.decode(msg))
|
||||
elif events & SX1262.TX_DONE:
|
||||
#print('TX done.')
|
||||
pass
|
||||
pass
|
||||
#print('TX done.')
|
||||
Reference in New Issue
Block a user