Use protocol constants for ACK airtime window sizing

This commit is contained in:
2026-02-04 14:40:34 +01:00
parent 373667ab8a
commit c3e5ba3a53
2 changed files with 11 additions and 3 deletions

View File

@@ -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,

View File

@@ -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;