|
4 | 4 | import io |
5 | 5 | from typing import Any, Dict |
6 | 6 | from .events import Event, EventType, EventDispatcher |
7 | | -from .packets import BinaryReqType, PacketType |
| 7 | +from .packets import BinaryReqType, PacketType, ControlType |
8 | 8 | from .parsing import lpp_parse, lpp_parse_mma, parse_acl, parse_status |
9 | 9 | from cayennelpp import LppFrame, LppData |
10 | 10 | from meshcore.lpp_json_encoder import lpp_json_encoder |
@@ -331,8 +331,8 @@ async def handle_rx(self, data: bytearray): |
331 | 331 |
|
332 | 332 | elif packet_type_value == PacketType.RAW_DATA.value: |
333 | 333 | res = {} |
334 | | - res["SNR"] = dbuf.read(1)[0] / 4 |
335 | | - res["RSSI"] = dbuf.read(1)[0] |
| 334 | + res["SNR"] = int.from_bytes(dbuf.read(1), byteorder="little", signed=True) / 4 |
| 335 | + res["RSSI"] = int.from_bytes(dbuf.read(1), byteorder="little", signed=True) |
336 | 336 | res["payload"] = dbuf.read(4).hex() |
337 | 337 | logger.debug("Received raw data") |
338 | 338 | print(res) |
@@ -593,6 +593,43 @@ async def handle_rx(self, data: bytearray): |
593 | 593 | res = {"reason": "private_key_export_disabled"} |
594 | 594 | await self.dispatcher.dispatch(Event(EventType.DISABLED, res)) |
595 | 595 |
|
| 596 | + elif packet_type_value == PacketType.CONTROL_DATA.value: |
| 597 | + logger.debug("Received control data packet") |
| 598 | + res={} |
| 599 | + res["SNR"] = int.from_bytes(dbuf.read(1), byteorder="little", signed=True) / 4 |
| 600 | + res["RSSI"] = int.from_bytes(dbuf.read(1), byteorder="little", signed=True) |
| 601 | + res["path_len"] = dbuf.read(1)[0] |
| 602 | + payload = dbuf.read() |
| 603 | + payload_type = payload[0] |
| 604 | + res["payload_type"] = payload_type |
| 605 | + res["payload"] = payload |
| 606 | + |
| 607 | + attributes = {"payload_type": payload_type} |
| 608 | + await self.dispatcher.dispatch( |
| 609 | + Event(EventType.CONTROL_DATA, res, attributes) |
| 610 | + ) |
| 611 | + |
| 612 | + # decode NODE_DISCOVER_RESP |
| 613 | + if payload_type & 0xF0 == ControlType.NODE_DISCOVER_RESP.value: |
| 614 | + pbuf = io.BytesIO(payload[1:]) |
| 615 | + ndr = dict(res) |
| 616 | + del ndr["payload_type"] |
| 617 | + del ndr["payload"] |
| 618 | + ndr["node_type"] = payload_type & 0x0F |
| 619 | + ndr["SNR_in"] = int.from_bytes(pbuf.read(1), byteorder="little", signed=True)/4 |
| 620 | + ndr["tag"] = pbuf.read(4).hex() |
| 621 | + ndr["pubkey"] = pbuf.read(32).hex() |
| 622 | + |
| 623 | + attributes = { |
| 624 | + "node_type" : ndr["node_type"], |
| 625 | + "tag" : ndr["tag"], |
| 626 | + "pubkey" : ndr["pubkey"], |
| 627 | + } |
| 628 | + |
| 629 | + await self.dispatcher.dispatch( |
| 630 | + Event(EventType.DISCOVER_RESPONSE, ndr, attributes) |
| 631 | + ) |
| 632 | + |
596 | 633 | else: |
597 | 634 | logger.debug(f"Unhandled data received {data}") |
598 | 635 | logger.debug(f"Unhandled packet type: {packet_type_value}") |
0 commit comments