Adding acquisition of RX meta data

User can now inquire about any RX meta data available after a
successful reception.
pull/6910/head
Hasnain Virk 2018-05-15 15:07:02 +03:00
parent 555d945a42
commit 387f56c738
6 changed files with 77 additions and 0 deletions

View File

@ -353,6 +353,22 @@ public:
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned. * LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned.
*/ */
virtual lorawan_status_t get_tx_metadata(lorawan_tx_metadata& metadata) = 0; virtual lorawan_status_t get_tx_metadata(lorawan_tx_metadata& metadata) = 0;
/** Get hold of RX meta-data
*
* Use this method to acquire any RX meta-data related to current
* reception.
* RX meta-data is only available right after the reception is completed.
* In other words, you can check for RX meta-data right after receiving the
* RX_DONE event.
*
* @param metadata the inbound structure that will be filled if the meta-data
* is available.
*
* @return LORAWAN_STATUS_OK if the meta-data is available, otherwise
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned.
*/
virtual lorawan_status_t get_rx_metadata(lorawan_rx_metadata& metadata) = 0;
}; };
#endif /* LORAWAN_BASE_H_ */ #endif /* LORAWAN_BASE_H_ */

View File

@ -128,6 +128,12 @@ lorawan_status_t LoRaWANInterface::get_tx_metadata(lorawan_tx_metadata& metadata
return _lw_stack.acquire_tx_metadata(metadata); return _lw_stack.acquire_tx_metadata(metadata);
} }
lorawan_status_t LoRaWANInterface::get_rx_metadata(lorawan_rx_metadata& metadata)
{
Lock lock(*this);
return _lw_stack.acquire_rx_metadata(metadata);
}
int16_t LoRaWANInterface::receive(uint8_t port, uint8_t* data, uint16_t length, int flags) int16_t LoRaWANInterface::receive(uint8_t port, uint8_t* data, uint16_t length, int flags)
{ {
Lock lock(*this); Lock lock(*this);

View File

@ -452,6 +452,22 @@ public:
*/ */
virtual lorawan_status_t get_tx_metadata(lorawan_tx_metadata& metadata); virtual lorawan_status_t get_tx_metadata(lorawan_tx_metadata& metadata);
/** Get hold of RX meta-data
*
* Use this method to acquire any RX meta-data related to current
* reception.
* RX meta-data is only available right after the reception is completed.
* In other words, you can check for RX meta-data right after receiving the
* RX_DONE event.
*
* @param metadata the inbound structure that will be filled if the meta-data
* is available.
*
* @return LORAWAN_STATUS_OK if the meta-data is available, otherwise
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE is returned.
*/
virtual lorawan_status_t get_rx_metadata(lorawan_rx_metadata& metadata);
void lock(void) { _lw_stack.lock(); } void lock(void) { _lw_stack.lock(); }
void unlock(void) { _lw_stack.unlock(); } void unlock(void) { _lw_stack.unlock(); }

View File

@ -74,6 +74,7 @@ LoRaWANStack::LoRaWANStack()
_tx_msg(), _tx_msg(),
_rx_msg(), _rx_msg(),
_tx_metadata(), _tx_metadata(),
_rx_metadata(),
_num_retry(1), _num_retry(1),
_ctrl_flags(IDLE_FLAG), _ctrl_flags(IDLE_FLAG),
_app_port(INVALID_PORT), _app_port(INVALID_PORT),
@ -83,6 +84,7 @@ LoRaWANStack::LoRaWANStack()
_queue(NULL) _queue(NULL)
{ {
_tx_metadata.stale = true; _tx_metadata.stale = true;
_rx_metadata.stale = true;
#ifdef MBED_CONF_LORA_APP_PORT #ifdef MBED_CONF_LORA_APP_PORT
if (is_port_valid(MBED_CONF_LORA_APP_PORT)) { 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
return LORAWAN_STATUS_METADATA_NOT_AVAILABLE; return LORAWAN_STATUS_METADATA_NOT_AVAILABLE;
} }
lorawan_status_t LoRaWANStack::acquire_rx_metadata(lorawan_rx_metadata& metadata)
{
if (!_rx_metadata.stale) {
metadata = _rx_metadata;
_rx_metadata.stale = true;
return LORAWAN_STATUS_OK;
}
return LORAWAN_STATUS_METADATA_NOT_AVAILABLE;
}
/***************************************************************************** /*****************************************************************************
* Interrupt handlers * * Interrupt handlers *
****************************************************************************/ ****************************************************************************/
@ -539,6 +552,8 @@ void LoRaWANStack::process_reception(const uint8_t* const payload, uint16_t size
_loramac.on_radio_rx_done(payload, size, rssi, snr); _loramac.on_radio_rx_done(payload, size, rssi, snr);
make_rx_metadata_available();
if (_loramac.get_mlme_confirmation()->pending) { if (_loramac.get_mlme_confirmation()->pending) {
_loramac.post_process_mlme_request(); _loramac.post_process_mlme_request();
mlme_confirm_handler(); mlme_confirm_handler();
@ -635,6 +650,15 @@ void LoRaWANStack::make_tx_metadata_available(void)
_tx_metadata.nb_retries = _loramac.get_mcps_confirmation()->nb_retries; _tx_metadata.nb_retries = _loramac.get_mcps_confirmation()->nb_retries;
} }
void LoRaWANStack::make_rx_metadata_available(void)
{
_rx_metadata.stale = false;
_rx_metadata.fpending_status = _loramac.get_mcps_indication()->fpending_status;
_rx_metadata.rx_datarate = _loramac.get_mcps_indication()->rx_datarate;
_rx_metadata.rssi = _loramac.get_mcps_indication()->rssi;
_rx_metadata.snr = _loramac.get_mcps_indication()->snr;
}
bool LoRaWANStack::is_port_valid(const uint8_t port, bool allow_port_0) bool LoRaWANStack::is_port_valid(const uint8_t port, bool allow_port_0)
{ {
//Application should not use reserved and illegal port numbers. //Application should not use reserved and illegal port numbers.

View File

@ -391,6 +391,18 @@ public:
*/ */
lorawan_status_t acquire_tx_metadata(lorawan_tx_metadata& metadata); lorawan_status_t acquire_tx_metadata(lorawan_tx_metadata& metadata);
/** Acquire RX meta-data
*
* Upon successful reception, RX meta-data will be made available
*
* @param metadata A reference to the inbound structure which will be
* filled with any RX meta-data if available.
*
* @return LORAWAN_STATUS_OK if successful,
* LORAWAN_STATUS_METADATA_NOT_AVAILABLE otherwise
*/
lorawan_status_t acquire_rx_metadata(lorawan_rx_metadata& metadata);
void lock(void) { _loramac.lock(); } void lock(void) { _loramac.lock(); }
void unlock(void) { _loramac.unlock(); } void unlock(void) { _loramac.unlock(); }
@ -486,6 +498,7 @@ private:
int convert_to_msg_flag(const mcps_type_t type); int convert_to_msg_flag(const mcps_type_t type);
void make_tx_metadata_available(void); void make_tx_metadata_available(void);
void make_rx_metadata_available(void);
private: private:
LoRaMac _loramac; LoRaMac _loramac;
@ -496,6 +509,7 @@ private:
loramac_tx_message_t _tx_msg; loramac_tx_message_t _tx_msg;
loramac_rx_message_t _rx_msg; loramac_rx_message_t _rx_msg;
lorawan_tx_metadata _tx_metadata; lorawan_tx_metadata _tx_metadata;
lorawan_rx_metadata _rx_metadata;
uint8_t _num_retry; uint8_t _num_retry;
uint32_t _ctrl_flags; uint32_t _ctrl_flags;
uint8_t _app_port; uint8_t _app_port;

View File

@ -375,6 +375,7 @@ typedef struct {
uint32_t tx_toa; uint32_t tx_toa;
} lorawan_tx_metadata; } lorawan_tx_metadata;
/**
* Meta-data collection for the received packet * Meta-data collection for the received packet
*/ */
typedef struct { typedef struct {