From 880ad3facf2fc963192b9680ef458cc86fe2e0e2 Mon Sep 17 00:00:00 2001 From: grigo Date: Fri, 26 Jun 2026 15:19:47 +0300 Subject: [PATCH] fixes kyrills issue --- .../loratester/telnet/StatsExtractor.java | 6 ++-- .../loratester/telnet/TelnetFrameParser.java | 3 +- .../loratester/LoraFrameExtractTest.java | 34 +++++++++++++++++++ .../loratester/TelnetFrameParserTest.java | 18 ++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/grigowashere/loratester/telnet/StatsExtractor.java b/app/src/main/java/com/grigowashere/loratester/telnet/StatsExtractor.java index d481629..3fbd48e 100644 --- a/app/src/main/java/com/grigowashere/loratester/telnet/StatsExtractor.java +++ b/app/src/main/java/com/grigowashere/loratester/telnet/StatsExtractor.java @@ -18,8 +18,10 @@ public class StatsExtractor { private static final Gson GSON = new Gson(); - private static final Pattern FRAME_SEND = Pattern.compile("(?m)^\\s*SEND\\b"); - private static final Pattern FRAME_RECEIVE = Pattern.compile("(?m)^\\s*RECEIVE\\b"); + private static final Pattern FRAME_SEND = Pattern.compile( + "(?m)^\\s*(?:MODE\\s+LORA\\s+)?SEND\\b", Pattern.CASE_INSENSITIVE); + private static final Pattern FRAME_RECEIVE = Pattern.compile( + "(?m)^\\s*(?:MODE\\s+LORA\\s+)?RECEIVE\\b", Pattern.CASE_INSENSITIVE); private static final Pattern POWER = Pattern.compile("Power\\s*:\\s*(\\d+(?:\\.\\d+)?)", Pattern.CASE_INSENSITIVE); private static final Pattern RSSI = Pattern.compile("RSSI\\s*:\\s*(-?\\d+(?:\\.\\d+)?)", Pattern.CASE_INSENSITIVE); private static final Pattern SNR = Pattern.compile("SNR\\s*:\\s*(-?\\d+(?:\\.\\d+)?)", Pattern.CASE_INSENSITIVE); diff --git a/app/src/main/java/com/grigowashere/loratester/telnet/TelnetFrameParser.java b/app/src/main/java/com/grigowashere/loratester/telnet/TelnetFrameParser.java index b0c9518..5525c33 100644 --- a/app/src/main/java/com/grigowashere/loratester/telnet/TelnetFrameParser.java +++ b/app/src/main/java/com/grigowashere/loratester/telnet/TelnetFrameParser.java @@ -20,7 +20,8 @@ public class TelnetFrameParser { private static final Charset CHARSET = StandardCharsets.UTF_8; /** Start of a new radio screen (TX or RX). */ private static final Pattern FRAME_HEADER = - Pattern.compile("(?m)^\\s*(SEND|RECEIVE)\\b"); + Pattern.compile("(?m)^\\s*(?:MODE\\s+LORA\\s+)?(SEND|RECEIVE)\\b", + Pattern.CASE_INSENSITIVE); private final List delimiters; private final FrameListener listener; diff --git a/app/src/test/java/com/grigowashere/loratester/LoraFrameExtractTest.java b/app/src/test/java/com/grigowashere/loratester/LoraFrameExtractTest.java index 63fd17a..22f3f7c 100644 --- a/app/src/test/java/com/grigowashere/loratester/LoraFrameExtractTest.java +++ b/app/src/test/java/com/grigowashere/loratester/LoraFrameExtractTest.java @@ -163,6 +163,40 @@ public class LoraFrameExtractTest { assertTrue(stats.metaJson.contains("\"preamble_length\":8")); } + @Test + public void parsesModeLoraSendFrame() { + StatsExtractor extractor = StatsExtractor.withDefaults(); + String frame = """ + MODE LORA SEND + Frequency: 433500000 Hz + Power: 20 dBm + Spreading Factor: 7 + Bandwidth: 125 kHz + Code Rate: 4/7 + Preamble Length: 8 + Low Data Rate Opt: Off + CRC: On + Payload length: 32 byte + On Air: 93 ms, 10.75 pkt/c + + Packet: 1648 + Payload: Test TX! + TX Timeout: 0 ms + TX Speed: 10.78 pkt/s, 2759 bit/s + """; + StatsExtractor.ExtractedStats stats = extractor.extract(frame); + + assertEquals("SEND", stats.frameType); + assertEquals(StatsExtractor.ROLE_TX, stats.role); + assertEquals(20.0, stats.rssi, 0.01); + assertTrue(stats.hasRadioFrame()); + assertTrue(stats.metaJson.contains("\"frequency_hz\":433500000")); + assertTrue(stats.metaJson.contains("\"spreading_factor\":7")); + assertTrue(stats.metaJson.contains("\"code_rate\":\"4/7\"")); + assertTrue(stats.metaJson.contains("\"packet\":1648")); + assertTrue(stats.metaJson.contains("\"tx_pkt_per_s\":10.78")); + } + @Test public void splitsTwoFramesByReceiveHeaderWithoutEsc() { List frames = new ArrayList<>(); diff --git a/app/src/test/java/com/grigowashere/loratester/TelnetFrameParserTest.java b/app/src/test/java/com/grigowashere/loratester/TelnetFrameParserTest.java index f9af26c..18e2dc2 100644 --- a/app/src/test/java/com/grigowashere/loratester/TelnetFrameParserTest.java +++ b/app/src/test/java/com/grigowashere/loratester/TelnetFrameParserTest.java @@ -63,4 +63,22 @@ public class TelnetFrameParserTest { assertEquals(1, frames.size()); assertTrue(frames.get(0).contains("tail")); } + + @Test + public void splitsModeLoraHeadersWithoutEsc() { + String stream = """ + MODE LORA SEND + Packet: 1 + Payload: tx + MODE LORA RECEIVE + Packet Number: 1 + Payload: rx + """; + parser.append(stream.getBytes(StandardCharsets.UTF_8)); + parser.flush(); + + assertEquals(2, frames.size()); + assertTrue(frames.get(0).contains("MODE LORA SEND")); + assertTrue(frames.get(1).contains("MODE LORA RECEIVE")); + } }