From c3e5ba3a53554ab5784a6fb115d04ea075534c57 Mon Sep 17 00:00:00 2001 From: acidburns Date: Wed, 4 Feb 2026 14:40:34 +0100 Subject: [PATCH] Use protocol constants for ACK airtime window sizing --- include/lora_transport.h | 8 ++++++++ src/main.cpp | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/lora_transport.h b/include/lora_transport.h index 9f3e42e..af02ba5 100644 --- a/include/lora_transport.h +++ b/include/lora_transport.h @@ -5,6 +5,14 @@ #include "data_model.h" constexpr size_t LORA_MAX_PAYLOAD = 230; +constexpr size_t LORA_FRAME_HEADER_LEN = 3; // msg_kind + dev_id_short +constexpr size_t LORA_FRAME_CRC_LEN = 2; +constexpr size_t LORA_ACK_DOWN_PAYLOAD_LEN = 7; // flags(1) + batch_id(2) + epoch_utc(4) +static_assert(LORA_ACK_DOWN_PAYLOAD_LEN == 7, "ACK_DOWN payload must remain 7 bytes"); + +constexpr size_t lora_frame_size(size_t payload_len) { + return LORA_FRAME_HEADER_LEN + payload_len + LORA_FRAME_CRC_LEN; +} enum class LoraMsgKind : uint8_t { BatchUp = 0, diff --git a/src/main.cpp b/src/main.cpp index 820477e..8261f1c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -451,7 +451,7 @@ static void send_batch_ack(uint16_t batch_id, uint8_t sample_count) { LoraPacket ack = {}; ack.msg_kind = LoraMsgKind::AckDown; ack.device_id_short = g_short_id; - ack.payload_len = 7; + ack.payload_len = LORA_ACK_DOWN_PAYLOAD_LEN; ack.payload[0] = time_valid; write_u16_be(&ack.payload[1], batch_id); write_u32_be(&ack.payload[3], epoch); @@ -848,7 +848,7 @@ static void sender_loop() { if (g_batch_ack_pending) { LoraPacket ack_pkt = {}; - const uint32_t ack_len = 3 + 7 + 2; + constexpr size_t ack_len = lora_frame_size(LORA_ACK_DOWN_PAYLOAD_LEN); uint32_t ack_air_ms = lora_airtime_ms(ack_len); uint32_t ack_window_ms = ack_air_ms + 300; if (ack_window_ms < 1200) { @@ -874,7 +874,7 @@ static void sender_loop() { sender_note_rx_reject(lora_get_last_rx_reject_reason(), "ack"); } else if (ack_pkt.msg_kind != LoraMsgKind::AckDown) { sender_note_rx_reject(RxRejectReason::InvalidMsgKind, "ack"); - } else if (ack_pkt.payload_len < 7) { + } else if (ack_pkt.payload_len < LORA_ACK_DOWN_PAYLOAD_LEN) { sender_note_rx_reject(RxRejectReason::LengthMismatch, "ack"); } else { uint8_t time_valid = ack_pkt.payload[0] & 0x01;