Skip to content

Commit a4e3148

Browse files
adejewskikartben
authored andcommitted
drivers: lora: Add user_data to lora_recv_async
The LoRa driver does not allow to pass void* user_data to callback in lora_recv_async function. This leads to complex way of using the API. This commit fixes the issue and adds the field to the function and to the callback. Signed-off-by: Aleksander Dejewski <aleksander.dejewski@gmail.com>
1 parent d739c20 commit a4e3148

File tree

6 files changed

+29
-12
lines changed

6 files changed

+29
-12
lines changed

doc/releases/migration-guide-4.1.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,13 @@ MCUmgr
369369
Modem
370370
=====
371371

372+
LoRa
373+
====
374+
375+
* The function :c:func:`lora_recv_async` and callback ``lora_recv_cb`` now include an
376+
additional ``user_data`` parameter, which is a void pointer. This parameter can be used to reference
377+
any user-defined data structure. To maintain the current behavior, set this parameter to ``NULL``.
378+
372379
Architectures
373380
*************
374381

drivers/lora/rylrxxx.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ struct rylr_data {
102102
uint8_t pending_async_flags;
103103
struct k_poll_signal *async_tx_signal;
104104
lora_recv_cb async_rx_cb;
105+
void *async_user_data;
105106
const struct device *dev;
106107
uint8_t msgq_buffer[CONFIG_RYLRXXX_UNSOLICITED_RX_MSGQ_SIZE];
107108
struct modem_pipe *modem_pipe;
@@ -170,7 +171,8 @@ static void on_rx(struct modem_chat *chat, char **argv, uint16_t argc, void *use
170171
msg.snr = atoi(argv[5]);
171172

172173
if (RYLR_IS_RX_PENDING(driver_data->pending_async_flags)) {
173-
driver_data->async_rx_cb(driver_data->dev, msg.data, msg.length, msg.rssi, msg.snr);
174+
driver_data->async_rx_cb(driver_data->dev, msg.data, msg.length, msg.rssi, msg.snr,
175+
driver_data->async_user_data);
174176
} else {
175177
err = k_msgq_put(&driver_data->rx_msgq, &msg, K_NO_WAIT);
176178
if (err != 0) {
@@ -515,7 +517,7 @@ int rylr_recv(const struct device *dev, uint8_t *ret_msg, uint8_t size, k_timeou
515517
return ret;
516518
}
517519

518-
int rylr_recv_async(const struct device *dev, lora_recv_cb cb)
520+
int rylr_recv_async(const struct device *dev, lora_recv_cb cb, void *user_data)
519521
{
520522
int err = 0;
521523
struct rylr_data *data = dev->data;
@@ -538,6 +540,7 @@ int rylr_recv_async(const struct device *dev, lora_recv_cb cb)
538540
}
539541

540542
data->async_rx_cb = cb;
543+
data->async_user_data = user_data;
541544
if (RYLR_IS_ASYNC_OP_PENDING(data->pending_async_flags)) {
542545
LOG_ERR("pending async opperation");
543546
err = -EBUSY;

drivers/lora/sx12xx_common.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ static struct sx12xx_data {
3333
const struct device *dev;
3434
struct k_poll_signal *operation_done;
3535
lora_recv_cb async_rx_cb;
36+
void *async_user_data;
3637
RadioEvents_t events;
3738
struct lora_modem_config tx_cfg;
3839
atomic_t modem_usage;
@@ -106,7 +107,8 @@ static void sx12xx_ev_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
106107
/* Start receiving again */
107108
Radio.Rx(0);
108109
/* Run the callback */
109-
dev_data.async_rx_cb(dev_data.dev, payload, size, rssi, snr);
110+
dev_data.async_rx_cb(dev_data.dev, payload, size, rssi, snr,
111+
dev_data.async_user_data);
110112
/* Don't run the synchronous code */
111113
return;
112114
}
@@ -305,7 +307,7 @@ int sx12xx_lora_recv(const struct device *dev, uint8_t *data, uint8_t size,
305307
return size;
306308
}
307309

308-
int sx12xx_lora_recv_async(const struct device *dev, lora_recv_cb cb)
310+
int sx12xx_lora_recv_async(const struct device *dev, lora_recv_cb cb, void *user_data)
309311
{
310312
/* Cancel ongoing reception */
311313
if (cb == NULL) {
@@ -323,6 +325,7 @@ int sx12xx_lora_recv_async(const struct device *dev, lora_recv_cb cb)
323325

324326
/* Store parameters */
325327
dev_data.async_rx_cb = cb;
328+
dev_data.async_user_data = user_data;
326329

327330
/* Start reception */
328331
Radio.SetMaxPayloadLength(MODEM_LORA, 255);

drivers/lora/sx12xx_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ int sx12xx_lora_send_async(const struct device *dev, uint8_t *data,
2929
int sx12xx_lora_recv(const struct device *dev, uint8_t *data, uint8_t size,
3030
k_timeout_t timeout, int16_t *rssi, int8_t *snr);
3131

32-
int sx12xx_lora_recv_async(const struct device *dev, lora_recv_cb cb);
32+
int sx12xx_lora_recv_async(const struct device *dev, lora_recv_cb cb, void *user_data);
3333

3434
int sx12xx_lora_config(const struct device *dev,
3535
struct lora_modem_config *config);

include/zephyr/drivers/lora.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ struct lora_modem_config {
121121
* @see lora_recv() for argument descriptions.
122122
*/
123123
typedef void (*lora_recv_cb)(const struct device *dev, uint8_t *data, uint16_t size,
124-
int16_t rssi, int8_t snr);
124+
int16_t rssi, int8_t snr, void *user_data);
125125

126126
/**
127127
* @typedef lora_api_config()
@@ -168,7 +168,8 @@ typedef int (*lora_api_recv)(const struct device *dev, uint8_t *data,
168168
* @param dev Modem to receive data on.
169169
* @param cb Callback to run on receiving data.
170170
*/
171-
typedef int (*lora_api_recv_async)(const struct device *dev, lora_recv_cb cb);
171+
typedef int (*lora_api_recv_async)(const struct device *dev, lora_recv_cb cb,
172+
void *user_data);
172173

173174
/**
174175
* @typedef lora_api_test_cw()
@@ -286,14 +287,16 @@ static inline int lora_recv(const struct device *dev, uint8_t *data,
286287
* @param dev Modem to receive data on.
287288
* @param cb Callback to run on receiving data. If NULL, any pending
288289
* asynchronous receptions will be cancelled.
290+
* @param user_data User data passed to callback
289291
* @return 0 when reception successfully setup, negative on error
290292
*/
291-
static inline int lora_recv_async(const struct device *dev, lora_recv_cb cb)
293+
static inline int lora_recv_async(const struct device *dev, lora_recv_cb cb,
294+
void *user_data)
292295
{
293296
const struct lora_driver_api *api =
294297
(const struct lora_driver_api *)dev->api;
295298

296-
return api->recv_async(dev, cb);
299+
return api->recv_async(dev, cb, user_data);
297300
}
298301

299302
/**

samples/drivers/lora/receive/src/main.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,21 @@ BUILD_ASSERT(DT_NODE_HAS_STATUS_OKAY(DEFAULT_RADIO_NODE),
2121
LOG_MODULE_REGISTER(lora_receive);
2222

2323
void lora_receive_cb(const struct device *dev, uint8_t *data, uint16_t size,
24-
int16_t rssi, int8_t snr)
24+
int16_t rssi, int8_t snr, void *user_data)
2525
{
2626
static int cnt;
2727

2828
ARG_UNUSED(dev);
2929
ARG_UNUSED(size);
30+
ARG_UNUSED(user_data);
3031

3132
LOG_INF("LoRa RX RSSI: %d dBm, SNR: %d dB", rssi, snr);
3233
LOG_HEXDUMP_INF(data, size, "LoRa RX payload");
3334

3435
/* Stop receiving after 10 packets */
3536
if (++cnt == 10) {
3637
LOG_INF("Stopping packet receptions");
37-
lora_recv_async(dev, NULL);
38+
lora_recv_async(dev, NULL, NULL);
3839
}
3940
}
4041

@@ -85,7 +86,7 @@ int main(void)
8586

8687
/* Enable asynchronous reception */
8788
LOG_INF("Asynchronous reception");
88-
lora_recv_async(lora_dev, lora_receive_cb);
89+
lora_recv_async(lora_dev, lora_receive_cb, NULL);
8990
k_sleep(K_FOREVER);
9091
return 0;
9192
}

0 commit comments

Comments
 (0)