From f9881d2346f29487e756f88350bbc8713f6fc42f Mon Sep 17 00:00:00 2001 From: maze Date: Wed, 18 Feb 2026 13:25:29 +0100 Subject: [PATCH] protocol/meshcore: refactor decoding logic --- protocol/meshcore/node.go | 51 ++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/protocol/meshcore/node.go b/protocol/meshcore/node.go index 966ab42..3f98f58 100644 --- a/protocol/meshcore/node.go +++ b/protocol/meshcore/node.go @@ -279,34 +279,45 @@ func (drv *companionDriver) handlePushFrame(b []byte) { } func (drv *companionDriver) handleRXData(b []byte) { - if len(b) < 2+minPacketSize { - return - } - if drv.packets == nil { + if drv.packets == nil && drv.rawPackets == nil { return // not listening for packets, discard } - now := time.Now().UTC() - packet := new(Packet) - if err := packet.UnmarshalBytes(b[2:]); err == nil { - packet.SNR = float64(b[0]) / 4 - packet.RSSI = int8(b[1]) + if len(b) < 2+minPacketSize { + return // too short + } + + var ( + now = time.Now().UTC() + snr = float64(b[0]) / 4 + rssi = int8(b[1]) + ) + + // Decode raw + if drv.rawPackets != nil { select { - case drv.packets <- packet: + case drv.rawPackets <- &protocol.Packet{ + Time: now, + Protocol: protocol.MeshCore, + SNR: snr, + RSSI: rssi, + Raw: b[2:], + }: default: - log.Printf("meshcore: packet channel full, dropping packet") + log.Printf("meshcore: raw packet channel full, dropping packet") } - if drv.rawPackets != nil { + } + + // Decode payload + if drv.packets != nil { + packet := new(Packet) + if err := packet.UnmarshalBytes(b[2:]); err == nil { + packet.SNR = snr + packet.RSSI = rssi select { - case drv.rawPackets <- &protocol.Packet{ - Time: now, - Protocol: "meshcore", - SNR: packet.SNR, - RSSI: packet.RSSI, - Raw: packet.Raw, - }: + case drv.packets <- packet: default: - log.Printf("meshcore: raw packet channel full, dropping packet") + log.Printf("meshcore: packet channel full, dropping packet") } } }