fix(espnow): bridge async rx, uplink framing, driver RX handling
Bridge uses async for on AIOESPNow, pack_ws_uplink to Pi, AP channel from settings. Driver applies binary wire and JSON commands on receive. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import time
|
|
||||||
|
|
||||||
from microdot import Microdot
|
from microdot import Microdot
|
||||||
from microdot.websocket import WebSocketError, with_websocket
|
from microdot.websocket import WebSocketError, with_websocket
|
||||||
@@ -8,7 +7,7 @@ import aioespnow
|
|||||||
import machine
|
import machine
|
||||||
import network
|
import network
|
||||||
from settings import Settings
|
from settings import Settings
|
||||||
|
from espnow_wire import BROADCAST_MAC, pack_ws_uplink
|
||||||
|
|
||||||
wdt = machine.WDT(timeout=10000)
|
wdt = machine.WDT(timeout=10000)
|
||||||
wdt.feed()
|
wdt.feed()
|
||||||
@@ -17,9 +16,19 @@ print(settings)
|
|||||||
|
|
||||||
app = Microdot()
|
app = Microdot()
|
||||||
|
|
||||||
|
ch = settings.get("wifi_channel", 6)
|
||||||
|
try:
|
||||||
|
ch = max(1, min(11, int(ch)))
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
ch = 6
|
||||||
|
|
||||||
ap_if = network.WLAN(network.AP_IF)
|
ap_if = network.WLAN(network.AP_IF)
|
||||||
ap_if.active(True)
|
ap_if.active(True)
|
||||||
ap_if.config(ssid=settings.get("name"), password=settings.get("ap_password"))
|
ap_if.config(
|
||||||
|
ssid=settings.get("name"),
|
||||||
|
password=settings.get("ap_password"),
|
||||||
|
channel=ch,
|
||||||
|
)
|
||||||
print(ap_if.ifconfig())
|
print(ap_if.ifconfig())
|
||||||
|
|
||||||
sta_if = network.WLAN(network.STA_IF)
|
sta_if = network.WLAN(network.STA_IF)
|
||||||
@@ -28,16 +37,17 @@ print(sta_if.config("channel"))
|
|||||||
|
|
||||||
esp = aioespnow.AIOESPNow()
|
esp = aioespnow.AIOESPNow()
|
||||||
esp.active(True)
|
esp.active(True)
|
||||||
esp.add_peer(b"\xff\xff\xff\xff\xff\xff")
|
esp.add_peer(BROADCAST_MAC)
|
||||||
|
|
||||||
clients = set()
|
clients = set()
|
||||||
|
|
||||||
|
|
||||||
@app.route("/ws")
|
@app.route("/ws")
|
||||||
@with_websocket
|
@with_websocket
|
||||||
async def ws(request, ws):
|
async def ws(request, ws):
|
||||||
clients.add(ws)
|
clients.add(ws)
|
||||||
|
try:
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
raw = await ws.receive()
|
raw = await ws.receive()
|
||||||
except WebSocketError as err:
|
except WebSocketError as err:
|
||||||
@@ -46,19 +56,28 @@ async def ws(request, ws):
|
|||||||
if not raw:
|
if not raw:
|
||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
await esp.asend(b"\xff\xff\xff\xff\xff\xff", raw)
|
await esp.asend(BROADCAST_MAC, raw)
|
||||||
print(raw)
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print(err)
|
print(err)
|
||||||
break
|
break
|
||||||
ws.close()
|
finally:
|
||||||
clients.discard(ws)
|
clients.discard(ws)
|
||||||
|
|
||||||
|
|
||||||
async def _espnow_receive_loop():
|
async def _espnow_receive_loop():
|
||||||
async for host, msg in esp.airecv():
|
async for host, msg in esp:
|
||||||
print(host, msg)
|
if not host or not msg:
|
||||||
for client in clients:
|
continue
|
||||||
await client.send(msg)
|
print("espnow rx", len(msg), "B")
|
||||||
|
frame = pack_ws_uplink(host, msg)
|
||||||
|
dead = []
|
||||||
|
for client in list(clients):
|
||||||
|
try:
|
||||||
|
await client.send(frame)
|
||||||
|
except Exception:
|
||||||
|
dead.append(client)
|
||||||
|
for client in dead:
|
||||||
|
clients.discard(client)
|
||||||
|
|
||||||
|
|
||||||
async def _wdt_feed_loop():
|
async def _wdt_feed_loop():
|
||||||
@@ -66,6 +85,7 @@ async def _wdt_feed_loop():
|
|||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
wdt.feed()
|
wdt.feed()
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
asyncio.create_task(_wdt_feed_loop())
|
asyncio.create_task(_wdt_feed_loop())
|
||||||
asyncio.create_task(_espnow_receive_loop())
|
asyncio.create_task(_espnow_receive_loop())
|
||||||
|
|||||||
Submodule led-driver updated: 3e718f7432...1fdb2c9441
Reference in New Issue
Block a user