From b97c867202c29a5bb583d942ce59b29fcf4bbf75 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 3 May 2021 23:37:06 +0200 Subject: [PATCH] sx1280: skip receive after sending non-conn/scannable adv or scan response --- chipset/sx128x/ll_sx1280.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/chipset/sx128x/ll_sx1280.c b/chipset/sx128x/ll_sx1280.c index ab5f03d5b..4a90fc649 100644 --- a/chipset/sx128x/ll_sx1280.c +++ b/chipset/sx128x/ll_sx1280.c @@ -168,6 +168,7 @@ typedef enum { RADIO_RX_ERROR, RADIO_TX_TIMEOUT, RADIO_W4_TX_DONE_TO_RX, + RADIO_W4_TX_ONLY_DONE, RADIO_W4_TIMER, } radio_state_t; @@ -324,6 +325,7 @@ static struct { // adv param uint8_t adv_map; uint32_t adv_interval_us; + uint8_t adv_type; // adv data uint8_t scan_resp_len; @@ -496,7 +498,13 @@ static void ll_advertising_statemachine(void){ if ((ctx.adv_map & (1 << (ctx.channel - 37))) != 0) { // Set Channel select_channel(ctx.channel); - radio_state = RADIO_W4_TX_DONE_TO_RX; + if (ctx.adv_type == 3) { + // Non connectable undirected advertising (ADV_NONCONN_IND) + radio_state = RADIO_W4_TX_ONLY_DONE; + } else { + // All other are either connectable and/or scannable + radio_state = RADIO_W4_TX_DONE_TO_RX; + } send_adv(); break; } @@ -730,6 +738,9 @@ static void radio_on_tx_done(void ){ case RADIO_W4_TX_DONE_TO_RX: receive_response(); break; + case RADIO_W4_TX_ONLY_DONE: + radio_state = RADIO_LOWPOWER; + break; default: break; } @@ -812,6 +823,7 @@ static void radio_on_rx_done(void ){ if (pdu_type == PDU_ADV_TYPE_SCAN_REQ){ // scan request, select TX1 for active AutoTx SX1280SetBufferBaseAddresses( SX1280_TX1_OFFSET, SX1280_RX0_OFFSET); + radio_state = RADIO_W4_TX_ONLY_DONE; } else { // fetch reserved rx pdu @@ -1264,6 +1276,7 @@ uint8_t ll_set_advertising_parameters(uint16_t advertising_interval_min, uint16_ ctx.adv_map = advertising_channel_map; ctx.adv_interval_us = advertising_interval_max * 625; + ctx.adv_type= advertising_type; // TODO: validate other params // TODO: process other params