mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #6586 from kivaisan/new_receive_method
Lora: Introduce new receive API which returns port and flagspull/6625/head
commit
94103f9306
|
@ -220,7 +220,7 @@ public:
|
|||
virtual int16_t send(uint8_t port, const uint8_t* data,
|
||||
uint16_t length, int flags) = 0;
|
||||
|
||||
/** Receives a message from the Network Server.
|
||||
/** Receives a message from the Network Server on a specific port.
|
||||
*
|
||||
* @param port The application port number. Port numbers 0 and 224
|
||||
* are reserved, whereas port numbers from 1 to 223
|
||||
|
@ -259,8 +259,31 @@ public:
|
|||
* nothing available to read at the moment.
|
||||
* iv) A negative error code on failure.
|
||||
*/
|
||||
virtual int16_t receive(uint8_t port, uint8_t* data, uint16_t length,
|
||||
int flags) = 0;
|
||||
virtual int16_t receive(uint8_t port, uint8_t* data, uint16_t length, int flags) = 0;
|
||||
|
||||
/** Receives a message from the Network Server from any port.
|
||||
*
|
||||
* @param data A pointer to buffer where the received data will be
|
||||
* stored.
|
||||
*
|
||||
* @param length The size of data in bytes
|
||||
*
|
||||
* @param port Return the number of port to which message was received.
|
||||
*
|
||||
* @param flags Return flags to determine what type of message was received.
|
||||
* MSG_UNCONFIRMED_FLAG = 0x01
|
||||
* MSG_CONFIRMED_FLAG = 0x02
|
||||
* MSG_MULTICAST_FLAG = 0x04
|
||||
* MSG_PROPRIETARY_FLAG = 0x08
|
||||
*
|
||||
* @return It could be one of these:
|
||||
* i) 0 if there is nothing else to read.
|
||||
* ii) Number of bytes written to user buffer.
|
||||
* iii) LORAWAN_STATUS_WOULD_BLOCK if there is
|
||||
* nothing available to read at the moment.
|
||||
* iv) A negative error code on failure.
|
||||
*/
|
||||
virtual int16_t receive(uint8_t* data, uint16_t length, uint8_t& port, int& flags) = 0;
|
||||
|
||||
/** Add application callbacks to the stack.
|
||||
*
|
||||
|
|
|
@ -107,17 +107,19 @@ lorawan_status_t LoRaWANInterface::remove_channel_plan()
|
|||
return stk_obj().drop_channel_list();
|
||||
}
|
||||
|
||||
int16_t LoRaWANInterface::send(uint8_t port, const uint8_t* data,
|
||||
uint16_t length, int flags)
|
||||
int16_t LoRaWANInterface::send(uint8_t port, const uint8_t* data, uint16_t length, int flags)
|
||||
{
|
||||
return stk_obj().handle_tx(port, data, length, flags);
|
||||
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
return stk_obj().handle_rx(port, data, length, flags);
|
||||
return stk_obj().handle_rx(data, length, port, flags, true);
|
||||
}
|
||||
|
||||
int16_t LoRaWANInterface::receive(uint8_t* data, uint16_t length, uint8_t& port, int& flags)
|
||||
{
|
||||
return stk_obj().handle_rx(data, length, port, flags, false);
|
||||
}
|
||||
|
||||
lorawan_status_t LoRaWANInterface::add_app_callbacks(lorawan_app_callbacks_t *callbacks)
|
||||
|
|
|
@ -317,7 +317,7 @@ public:
|
|||
virtual int16_t send(uint8_t port, const uint8_t* data, uint16_t length,
|
||||
int flags);
|
||||
|
||||
/** Receives a message from the Network Server.
|
||||
/** Receives a message from the Network Server on a specific port.
|
||||
*
|
||||
* @param port The application port number. Port numbers 0 and 224
|
||||
* are reserved, whereas port numbers from 1 to 223
|
||||
|
@ -356,8 +356,31 @@ public:
|
|||
* nothing available to read at the moment.
|
||||
* iv) A negative error code on failure.
|
||||
*/
|
||||
virtual int16_t receive(uint8_t port, uint8_t* data, uint16_t length,
|
||||
int flags);
|
||||
virtual int16_t receive(uint8_t port, uint8_t* data, uint16_t length, int flags);
|
||||
|
||||
/** Receives a message from the Network Server on any port.
|
||||
*
|
||||
* @param data A pointer to buffer where the received data will be
|
||||
* stored.
|
||||
*
|
||||
* @param length The size of data in bytes
|
||||
*
|
||||
* @param port Return the number of port to which message was received.
|
||||
*
|
||||
* @param flags Return flags to determine what type of message was received.
|
||||
* MSG_UNCONFIRMED_FLAG = 0x01
|
||||
* MSG_CONFIRMED_FLAG = 0x02
|
||||
* MSG_MULTICAST_FLAG = 0x04
|
||||
* MSG_PROPRIETARY_FLAG = 0x08
|
||||
*
|
||||
* @return It could be one of these:
|
||||
* i) 0 if there is nothing else to read.
|
||||
* ii) Number of bytes written to user buffer.
|
||||
* iii) LORAWAN_STATUS_WOULD_BLOCK if there is
|
||||
* nothing available to read at the moment.
|
||||
* iv) A negative error code on failure.
|
||||
*/
|
||||
virtual int16_t receive(uint8_t* data, uint16_t length, uint8_t& port, int& flags);
|
||||
|
||||
/** Add application callbacks to the stack.
|
||||
*
|
||||
|
|
|
@ -387,8 +387,35 @@ int16_t LoRaWANStack::handle_tx(uint8_t port, const uint8_t* data,
|
|||
return (status == LORAWAN_STATUS_OK) ? len : (int16_t) status;
|
||||
}
|
||||
|
||||
int16_t LoRaWANStack::handle_rx(const uint8_t port, uint8_t* data,
|
||||
uint16_t length, uint8_t flags)
|
||||
int convert_to_msg_flag(const mcps_type_t type)
|
||||
{
|
||||
int msg_flag = MSG_UNCONFIRMED_FLAG;
|
||||
switch (type) {
|
||||
case MCPS_UNCONFIRMED:
|
||||
msg_flag = MSG_UNCONFIRMED_FLAG;
|
||||
break;
|
||||
|
||||
case MCPS_CONFIRMED:
|
||||
msg_flag = MSG_CONFIRMED_FLAG;
|
||||
break;
|
||||
|
||||
case MCPS_MULTICAST:
|
||||
msg_flag = MSG_MULTICAST_FLAG;
|
||||
break;
|
||||
|
||||
case MCPS_PROPRIETARY:
|
||||
msg_flag = MSG_PROPRIETARY_FLAG;
|
||||
break;
|
||||
|
||||
default:
|
||||
tr_error("Unknown message type!");
|
||||
MBED_ASSERT(0);
|
||||
}
|
||||
|
||||
return msg_flag;
|
||||
}
|
||||
|
||||
int16_t LoRaWANStack::handle_rx(uint8_t* data, uint16_t length, uint8_t& port, int& flags, bool validate_params)
|
||||
{
|
||||
if (!_lw_session.active) {
|
||||
return LORAWAN_STATUS_NO_ACTIVE_SESSIONS;
|
||||
|
@ -409,36 +436,28 @@ int16_t LoRaWANStack::handle_rx(const uint8_t port, uint8_t* data,
|
|||
return LORAWAN_STATUS_PARAMETER_INVALID;
|
||||
}
|
||||
|
||||
uint8_t *base_ptr = _rx_msg.msg.mcps_indication.buffer;
|
||||
int received_flags = convert_to_msg_flag(_rx_msg.msg.mcps_indication.type);
|
||||
if (validate_params) {
|
||||
// Check received message port and flags match with the ones requested by user
|
||||
received_flags &= MSG_FLAG_MASK;
|
||||
|
||||
if (_rx_msg.msg.mcps_indication.port != port || !(flags & received_flags)) {
|
||||
return LORAWAN_STATUS_WOULD_BLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
// Report values back to user
|
||||
port = _rx_msg.msg.mcps_indication.port;
|
||||
flags = received_flags;
|
||||
|
||||
const uint8_t *base_ptr = _rx_msg.msg.mcps_indication.buffer;
|
||||
uint16_t base_size = _rx_msg.msg.mcps_indication.buffer_size;
|
||||
bool read_complete = false;
|
||||
|
||||
if (_rx_msg.msg.mcps_indication.port != port) {
|
||||
// Nothing yet received for this particular port
|
||||
return LORAWAN_STATUS_WOULD_BLOCK;
|
||||
}
|
||||
|
||||
// check if message received is a Confirmed message and user subscribed to it or not
|
||||
if (_rx_msg.msg.mcps_indication.type == MCPS_CONFIRMED
|
||||
&& ((flags & MSG_FLAG_MASK) == MSG_CONFIRMED_FLAG
|
||||
|| (flags & MSG_FLAG_MASK) == MSG_CONFIRMED_MULTICAST
|
||||
|| (flags & MSG_FLAG_MASK) == MSG_CONFIRMED_PROPRIETARY)) {
|
||||
|
||||
tr_debug("RX - Confirmed Message, flags=%d", flags);
|
||||
}
|
||||
|
||||
// check if message received is a Unconfirmed message and user subscribed to it or not
|
||||
if (_rx_msg.msg.mcps_indication.type == MCPS_UNCONFIRMED
|
||||
&& ((flags & MSG_FLAG_MASK) == MSG_UNCONFIRMED_FLAG
|
||||
|| (flags & MSG_FLAG_MASK) == MSG_UNCONFIRMED_MULTICAST
|
||||
|| (flags & MSG_FLAG_MASK) == MSG_UNCONFIRMED_PROPRIETARY)) {
|
||||
tr_debug("RX - Unconfirmed Message - flags=%d", flags);
|
||||
}
|
||||
|
||||
// check the length of received message whether we can fit into user
|
||||
// buffer completely or not
|
||||
if (_rx_msg.msg.mcps_indication.buffer_size > length &&
|
||||
_rx_msg.prev_read_size == 0) {
|
||||
_rx_msg.prev_read_size == 0) {
|
||||
// we can't fit into user buffer. Invoke counter measures
|
||||
_rx_msg.pending_size = _rx_msg.msg.mcps_indication.buffer_size - length;
|
||||
base_size = length;
|
||||
|
@ -614,12 +633,12 @@ void LoRaWANStack::mcps_indication_handler(loramac_mcps_indication_t *mcps_indic
|
|||
default: {
|
||||
if (is_port_valid(mcps_indication->port) == true ||
|
||||
mcps_indication->type == MCPS_PROPRIETARY) {
|
||||
|
||||
// Valid message arrived.
|
||||
_rx_msg.type = LORAMAC_RX_MCPS_INDICATION;
|
||||
_rx_msg.msg.mcps_indication.buffer_size = mcps_indication->buffer_size;
|
||||
_rx_msg.msg.mcps_indication.port = mcps_indication->port;
|
||||
_rx_msg.msg.mcps_indication.buffer = mcps_indication->buffer;
|
||||
_rx_msg.msg.mcps_indication.type = mcps_indication->type;
|
||||
|
||||
// Notify application about received frame..
|
||||
tr_debug("Received %d bytes", _rx_msg.msg.mcps_indication.buffer_size);
|
||||
|
|
|
@ -299,16 +299,19 @@ public:
|
|||
uint16_t length, uint8_t flags, bool null_allowed = false);
|
||||
|
||||
/** Receives a message from the Network Server.
|
||||
*
|
||||
* @param data A pointer to buffer where the received data will be
|
||||
* stored.
|
||||
*
|
||||
* @param length The size of data in bytes
|
||||
*
|
||||
* @param port The application port number. Port numbers 0 and 224
|
||||
* are reserved, whereas port numbers from 1 to 223
|
||||
* (0x01 to 0xDF) are valid port numbers.
|
||||
* Anything out of this range is illegal.
|
||||
*
|
||||
* @param data A pointer to buffer where the received data will be
|
||||
* stored.
|
||||
*
|
||||
* @param length The size of data in bytes
|
||||
* In return will contain the number of port to which
|
||||
* message was received.
|
||||
*
|
||||
* @param flags A flag is used to determine what type of
|
||||
* message is being received, for example:
|
||||
|
@ -330,6 +333,13 @@ public:
|
|||
* receive both CONFIRMED AND UNCONFIRMED messages at
|
||||
* the same time.
|
||||
*
|
||||
* In return will contain the flags to determine what kind
|
||||
* of message was received.
|
||||
*
|
||||
* @param validate_params If set to true, the given port and flags values will be checked
|
||||
* against the values received with the message. If values do not
|
||||
* match, LORAWAN_STATUS_WOULD_BLOCK will be returned.
|
||||
*
|
||||
* @return It could be one of these:
|
||||
* i) 0 if there is nothing else to read.
|
||||
* ii) Number of bytes written to user buffer.
|
||||
|
@ -337,8 +347,7 @@ public:
|
|||
* nothing available to read at the moment.
|
||||
* iv) A negative error code on failure.
|
||||
*/
|
||||
int16_t handle_rx(const uint8_t port, uint8_t* data,
|
||||
uint16_t length, uint8_t flags);
|
||||
int16_t handle_rx(uint8_t* data, uint16_t length, uint8_t& port, int& flags, bool validate_params);
|
||||
|
||||
/** Send Link Check Request MAC command.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue