Skip to content

Commit 387f56c

Browse files
author
Hasnain Virk
committed
Adding acquisition of RX meta data
User can now inquire about any RX meta data available after a successful reception.
1 parent 555d945 commit 387f56c

File tree

6 files changed

+77
-0
lines changed

6 files changed

+77
-0
lines changed

features/lorawan/LoRaWANBase.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,22 @@ class LoRaWANBase {
353353
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned.
354354
*/
355355
virtual lorawan_status_t get_tx_metadata(lorawan_tx_metadata& metadata) = 0;
356+
357+
/** Get hold of RX meta-data
358+
*
359+
* Use this method to acquire any RX meta-data related to current
360+
* reception.
361+
* RX meta-data is only available right after the reception is completed.
362+
* In other words, you can check for RX meta-data right after receiving the
363+
* RX_DONE event.
364+
*
365+
* @param metadata the inbound structure that will be filled if the meta-data
366+
* is available.
367+
*
368+
* @return LORAWAN_STATUS_OK if the meta-data is available, otherwise
369+
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned.
370+
*/
371+
virtual lorawan_status_t get_rx_metadata(lorawan_rx_metadata& metadata) = 0;
356372
};
357373

358374
#endif /* LORAWAN_BASE_H_ */

features/lorawan/LoRaWANInterface.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ lorawan_status_t LoRaWANInterface::get_tx_metadata(lorawan_tx_metadata& metadata
128128
return _lw_stack.acquire_tx_metadata(metadata);
129129
}
130130

131+
lorawan_status_t LoRaWANInterface::get_rx_metadata(lorawan_rx_metadata& metadata)
132+
{
133+
Lock lock(*this);
134+
return _lw_stack.acquire_rx_metadata(metadata);
135+
}
136+
131137
int16_t LoRaWANInterface::receive(uint8_t port, uint8_t* data, uint16_t length, int flags)
132138
{
133139
Lock lock(*this);

features/lorawan/LoRaWANInterface.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,22 @@ class LoRaWANInterface: public LoRaWANBase {
452452
*/
453453
virtual lorawan_status_t get_tx_metadata(lorawan_tx_metadata& metadata);
454454

455+
/** Get hold of RX meta-data
456+
*
457+
* Use this method to acquire any RX meta-data related to current
458+
* reception.
459+
* RX meta-data is only available right after the reception is completed.
460+
* In other words, you can check for RX meta-data right after receiving the
461+
* RX_DONE event.
462+
*
463+
* @param metadata the inbound structure that will be filled if the meta-data
464+
* is available.
465+
*
466+
* @return LORAWAN_STATUS_OK if the meta-data is available, otherwise
467+
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned.
468+
*/
469+
virtual lorawan_status_t get_rx_metadata(lorawan_rx_metadata& metadata);
470+
455471
void lock(void) { _lw_stack.lock(); }
456472
void unlock(void) { _lw_stack.unlock(); }
457473

features/lorawan/LoRaWANStack.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ LoRaWANStack::LoRaWANStack()
7474
_tx_msg(),
7575
_rx_msg(),
7676
_tx_metadata(),
77+
_rx_metadata(),
7778
_num_retry(1),
7879
_ctrl_flags(IDLE_FLAG),
7980
_app_port(INVALID_PORT),
@@ -83,6 +84,7 @@ LoRaWANStack::LoRaWANStack()
8384
_queue(NULL)
8485
{
8586
_tx_metadata.stale = true;
87+
_rx_metadata.stale = true;
8688

8789
#ifdef MBED_CONF_LORA_APP_PORT
8890
if (is_port_valid(MBED_CONF_LORA_APP_PORT)) {
@@ -433,6 +435,17 @@ lorawan_status_t LoRaWANStack::acquire_tx_metadata(lorawan_tx_metadata& tx_meta
433435
return LORAWAN_STATUS_METADATA_NOT_AVAILABLE;
434436
}
435437

438+
lorawan_status_t LoRaWANStack::acquire_rx_metadata(lorawan_rx_metadata& metadata)
439+
{
440+
if (!_rx_metadata.stale) {
441+
metadata = _rx_metadata;
442+
_rx_metadata.stale = true;
443+
return LORAWAN_STATUS_OK;
444+
}
445+
446+
return LORAWAN_STATUS_METADATA_NOT_AVAILABLE;
447+
}
448+
436449
/*****************************************************************************
437450
* Interrupt handlers *
438451
****************************************************************************/
@@ -539,6 +552,8 @@ void LoRaWANStack::process_reception(const uint8_t* const payload, uint16_t size
539552

540553
_loramac.on_radio_rx_done(payload, size, rssi, snr);
541554

555+
make_rx_metadata_available();
556+
542557
if (_loramac.get_mlme_confirmation()->pending) {
543558
_loramac.post_process_mlme_request();
544559
mlme_confirm_handler();
@@ -635,6 +650,15 @@ void LoRaWANStack::make_tx_metadata_available(void)
635650
_tx_metadata.nb_retries = _loramac.get_mcps_confirmation()->nb_retries;
636651
}
637652

653+
void LoRaWANStack::make_rx_metadata_available(void)
654+
{
655+
_rx_metadata.stale = false;
656+
_rx_metadata.fpending_status = _loramac.get_mcps_indication()->fpending_status;
657+
_rx_metadata.rx_datarate = _loramac.get_mcps_indication()->rx_datarate;
658+
_rx_metadata.rssi = _loramac.get_mcps_indication()->rssi;
659+
_rx_metadata.snr = _loramac.get_mcps_indication()->snr;
660+
}
661+
638662
bool LoRaWANStack::is_port_valid(const uint8_t port, bool allow_port_0)
639663
{
640664
//Application should not use reserved and illegal port numbers.

features/lorawan/LoRaWANStack.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,18 @@ class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> {
391391
*/
392392
lorawan_status_t acquire_tx_metadata(lorawan_tx_metadata& metadata);
393393

394+
/** Acquire RX meta-data
395+
*
396+
* Upon successful reception, RX meta-data will be made available
397+
*
398+
* @param metadata A reference to the inbound structure which will be
399+
* filled with any RX meta-data if available.
400+
*
401+
* @return LORAWAN_STATUS_OK if successful,
402+
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE otherwise
403+
*/
404+
lorawan_status_t acquire_rx_metadata(lorawan_rx_metadata& metadata);
405+
394406
void lock(void) { _loramac.lock(); }
395407
void unlock(void) { _loramac.unlock(); }
396408

@@ -486,6 +498,7 @@ class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> {
486498
int convert_to_msg_flag(const mcps_type_t type);
487499

488500
void make_tx_metadata_available(void);
501+
void make_rx_metadata_available(void);
489502

490503
private:
491504
LoRaMac _loramac;
@@ -496,6 +509,7 @@ class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> {
496509
loramac_tx_message_t _tx_msg;
497510
loramac_rx_message_t _rx_msg;
498511
lorawan_tx_metadata _tx_metadata;
512+
lorawan_rx_metadata _rx_metadata;
499513
uint8_t _num_retry;
500514
uint32_t _ctrl_flags;
501515
uint8_t _app_port;

features/lorawan/lorawan_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ typedef struct {
375375
uint32_t tx_toa;
376376
} lorawan_tx_metadata;
377377

378+
/**
378379
* Meta-data collection for the received packet
379380
*/
380381
typedef struct {

0 commit comments

Comments
 (0)