fixes kyrills issue

This commit is contained in:
2026-06-26 15:19:47 +03:00
parent ff1d3b17c1
commit 880ad3facf
4 changed files with 58 additions and 3 deletions
@@ -18,8 +18,10 @@ public class StatsExtractor {
private static final Gson GSON = new Gson(); private static final Gson GSON = new Gson();
private static final Pattern FRAME_SEND = Pattern.compile("(?m)^\\s*SEND\\b"); private static final Pattern FRAME_SEND = Pattern.compile(
private static final Pattern FRAME_RECEIVE = Pattern.compile("(?m)^\\s*RECEIVE\\b"); "(?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 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 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); private static final Pattern SNR = Pattern.compile("SNR\\s*:\\s*(-?\\d+(?:\\.\\d+)?)", Pattern.CASE_INSENSITIVE);
@@ -20,7 +20,8 @@ public class TelnetFrameParser {
private static final Charset CHARSET = StandardCharsets.UTF_8; private static final Charset CHARSET = StandardCharsets.UTF_8;
/** Start of a new radio screen (TX or RX). */ /** Start of a new radio screen (TX or RX). */
private static final Pattern FRAME_HEADER = 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<byte[]> delimiters; private final List<byte[]> delimiters;
private final FrameListener listener; private final FrameListener listener;
@@ -163,6 +163,40 @@ public class LoraFrameExtractTest {
assertTrue(stats.metaJson.contains("\"preamble_length\":8")); 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 @Test
public void splitsTwoFramesByReceiveHeaderWithoutEsc() { public void splitsTwoFramesByReceiveHeaderWithoutEsc() {
List<String> frames = new ArrayList<>(); List<String> frames = new ArrayList<>();
@@ -63,4 +63,22 @@ public class TelnetFrameParserTest {
assertEquals(1, frames.size()); assertEquals(1, frames.size());
assertTrue(frames.get(0).contains("tail")); 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"));
}
} }