mirror of https://github.com/ARMmbed/mbed-os.git
Adding acquisition of RX meta data
User can now inquire about any RX meta data available after a successful reception.pull/6910/head
parent
555d945a42
commit
387f56c738
|
|
@ -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_ */
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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(); }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue