lorawan: change downlink callback

Change downlink callback to transport data using flags.
Related to Issue #55072

Co-authored-by: Jan Kowalewski <jkowalewski@cthings.co>

Signed-off-by: romain pelletant <romainp@kickmaker.net>
Signed-off-by: Jan Kowalewski <jkowalewski@cthings.co>
This commit is contained in:
romain pelletant 2023-02-22 12:10:45 +01:00 committed by Anas Nashif
parent 91d3eb9107
commit 866905fd6a
6 changed files with 23 additions and 15 deletions

View file

@ -103,6 +103,13 @@ enum lorawan_message_type {
LORAWAN_MSG_CONFIRMED, /**< Confirmed message */ LORAWAN_MSG_CONFIRMED, /**< Confirmed message */
}; };
/**
* @brief LoRaWAN downlink flags.
*/
enum lorawan_dl_flags {
LORAWAN_DATA_PENDING = BIT(0),
};
/** /**
* @brief LoRaWAN join parameters for over-the-Air activation (OTAA) * @brief LoRaWAN join parameters for over-the-Air activation (OTAA)
* *
@ -181,15 +188,14 @@ struct lorawan_downlink_cb {
* and should therefore be as short as possible. * and should therefore be as short as possible.
* *
* @param port Port message was sent on * @param port Port message was sent on
* @param data_pending Network server has more downlink packets pending * @param flags Downlink data flags (see @ref lorawan_dl_flags)
* @param rssi Received signal strength in dBm * @param rssi Received signal strength in dBm
* @param snr Signal to Noise ratio in dBm * @param snr Signal to Noise ratio in dBm
* @param len Length of data received, will be 0 for ACKs * @param len Length of data received, will be 0 for ACKs
* @param data Data received, will be NULL for ACKs * @param data Data received, will be NULL for ACKs
*/ */
void (*cb)(uint8_t port, bool data_pending, void (*cb)(uint8_t port, uint8_t flags, int16_t rssi, int8_t snr, uint8_t len,
int16_t rssi, int8_t snr, const uint8_t *data);
uint8_t len, const uint8_t *data);
/** Node for callback list */ /** Node for callback list */
sys_snode_t node; sys_snode_t node;
}; };

View file

@ -27,11 +27,12 @@ LOG_MODULE_REGISTER(lorawan_class_a);
char data[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}; char data[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
static void dl_callback(uint8_t port, bool data_pending, static void dl_callback(uint8_t port, uint8_t flags,
int16_t rssi, int8_t snr, int16_t rssi, int8_t snr,
uint8_t len, const uint8_t *hex_data) uint8_t len, const uint8_t *hex_data)
{ {
LOG_INF("Port %d, Pending %d, RSSI %ddB, SNR %ddBm", port, data_pending, rssi, snr); LOG_INF("Port %d, Pending %d, RSSI %ddB, SNR %ddBm",
port, flags & LORAWAN_DATA_PENDING, rssi, snr);
if (hex_data) { if (hex_data) {
LOG_HEXDUMP_INF(hex_data, len, "Payload: "); LOG_HEXDUMP_INF(hex_data, len, "Payload: ");
} }

View file

@ -148,6 +148,7 @@ static void mcps_confirm_handler(McpsConfirm_t *mcps_confirm)
static void mcps_indication_handler(McpsIndication_t *mcps_indication) static void mcps_indication_handler(McpsIndication_t *mcps_indication)
{ {
struct lorawan_downlink_cb *cb; struct lorawan_downlink_cb *cb;
uint8_t flags = 0;
LOG_DBG("Received McpsIndication %d", mcps_indication->McpsIndication); LOG_DBG("Received McpsIndication %d", mcps_indication->McpsIndication);
@ -162,15 +163,15 @@ static void mcps_indication_handler(McpsIndication_t *mcps_indication)
datarate_observe(false); datarate_observe(false);
} }
/* IsUplinkTxPending also indicates pending downlinks */
flags |= (mcps_indication->IsUplinkTxPending == 1 ? LORAWAN_DATA_PENDING : 0);
/* Iterate over all registered downlink callbacks */ /* Iterate over all registered downlink callbacks */
SYS_SLIST_FOR_EACH_CONTAINER(&dl_callbacks, cb, node) { SYS_SLIST_FOR_EACH_CONTAINER(&dl_callbacks, cb, node) {
if ((cb->port == LW_RECV_PORT_ANY) || if ((cb->port == LW_RECV_PORT_ANY) ||
(cb->port == mcps_indication->Port)) { (cb->port == mcps_indication->Port)) {
cb->cb(mcps_indication->Port, cb->cb(mcps_indication->Port, flags, mcps_indication->Rssi,
/* IsUplinkTxPending also indicates pending downlinks */ mcps_indication->Snr, mcps_indication->BufferSize,
mcps_indication->IsUplinkTxPending == 1,
mcps_indication->Rssi, mcps_indication->Snr,
mcps_indication->BufferSize,
mcps_indication->Buffer); mcps_indication->Buffer);
} }
} }

View file

@ -91,7 +91,7 @@ static inline k_timeout_t clock_sync_calc_periodicity(void)
return K_SECONDS(ctx.periodicity - 30 + sys_rand32_get() % 61); return K_SECONDS(ctx.periodicity - 30 + sys_rand32_get() % 61);
} }
static void clock_sync_package_callback(uint8_t port, bool data_pending, int16_t rssi, int8_t snr, static void clock_sync_package_callback(uint8_t port, uint8_t flags, int16_t rssi, int8_t snr,
uint8_t len, const uint8_t *rx_buf) uint8_t len, const uint8_t *rx_buf)
{ {
uint8_t tx_buf[3 * MAX_CLOCK_SYNC_ANS_LEN]; uint8_t tx_buf[3 * MAX_CLOCK_SYNC_ANS_LEN];

View file

@ -101,8 +101,8 @@ static struct frag_transport_context ctx;
/* Callback for notification of finished firmware transfer */ /* Callback for notification of finished firmware transfer */
static void (*finished_cb)(void); static void (*finished_cb)(void);
static void frag_transport_package_callback(uint8_t port, bool data_pending, int16_t rssi, static void frag_transport_package_callback(uint8_t port, uint8_t flags, int16_t rssi, int8_t snr,
int8_t snr, uint8_t len, const uint8_t *rx_buf) uint8_t len, const uint8_t *rx_buf)
{ {
uint8_t tx_buf[FRAG_TRANSPORT_MAX_CMDS_PER_PACKAGE * FRAG_TRANSPORT_MAX_ANS_LEN]; uint8_t tx_buf[FRAG_TRANSPORT_MAX_CMDS_PER_PACKAGE * FRAG_TRANSPORT_MAX_ANS_LEN];
uint8_t tx_pos = 0; uint8_t tx_pos = 0;

View file

@ -107,7 +107,7 @@ static int32_t multicast_schedule_class_c_session(uint8_t id, uint32_t session_t
return time_to_start; return time_to_start;
} }
static void multicast_package_callback(uint8_t port, bool data_pending, int16_t rssi, int8_t snr, static void multicast_package_callback(uint8_t port, uint8_t flags, int16_t rssi, int8_t snr,
uint8_t len, const uint8_t *rx_buf) uint8_t len, const uint8_t *rx_buf)
{ {
uint8_t tx_buf[MAX_MULTICAST_CMDS_PER_PACKAGE * MAX_MULTICAST_ANS_LEN]; uint8_t tx_buf[MAX_MULTICAST_CMDS_PER_PACKAGE * MAX_MULTICAST_ANS_LEN];