mbed-os/features/lorawan/system/lorawan_data_structures.h

1314 lines
29 KiB
C

/**
* @file lorawan_data_structures.h
*
* @brief Contains common data structures used by Mbed-OS
* LoRaWAN mplementation.
*
* \code
* ______ _
* / _____) _ | |
* ( (____ _____ ____ _| |_ _____ ____| |__
* \____ \| ___ | (_ _) ___ |/ ___) _ \
* _____) ) ____| | | || |_| ____( (___| | | |
* (______/|_____)_|_|_| \__)_____)\____)_| |_|
* (C)2013 Semtech
* ___ _____ _ ___ _ _____ ___ ___ ___ ___
* / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
* \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
* |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
* embedded.connectivity.solutions===============
*
* \endcode
*
* Description: LoRa PHY layer
*
* License: Revised BSD License, see LICENSE.TXT file include in the project
*
* Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE )
*
* Copyright (c) 2017, Arm Limited and affiliates.
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#ifndef LORAWAN_SYSTEM_LORAWAN_DATA_STRUCTURES_H_
#define LORAWAN_SYSTEM_LORAWAN_DATA_STRUCTURES_H_
#include <inttypes.h>
#include "lorawan_types.h"
/*!
* \brief Timer time variable definition
*/
#ifndef lorawan_time_t
typedef uint32_t lorawan_time_t;
#endif
/*!
* Sets the length of the LoRaMAC footer field.
* Mainly indicates the MIC field length.
*/
#define LORAMAC_MFR_LEN 4
/*!
* The FRMPayload overhead to be used when setting the `Radio.SetMaxPayloadLength`
* in the `RxWindowSetup` function.
* The maximum PHYPayload = MaxPayloadOfDatarate/MaxPayloadOfDatarateRepeater + LORA_MAC_FRMPAYLOAD_OVERHEAD
*/
#define LORA_MAC_FRMPAYLOAD_OVERHEAD 13 // MHDR(1) + FHDR(7) + Port(1) + MIC(4)
/**
* LoRaMac maximum number of channels
*/
#define LORA_MAX_NB_CHANNELS 16
/**
* Maximum PHY layer payload size for reception.
*/
#define LORAMAC_PHY_MAXPAYLOAD 255
#define LORAWAN_DEFAULT_QOS 1
/**
*
* Default user application maximum data size for transmission
*/
// reject if user tries to set more than MTU
#if MBED_CONF_LORA_TX_MAX_SIZE > 255
#warning "Cannot set TX Max size more than MTU=255"
#define MBED_CONF_LORA_TX_MAX_SIZE 255
#endif
/*!
* LoRaMAC band parameters definition.
*/
typedef struct {
/*!
* The duty cycle.
*/
uint16_t duty_cycle;
/*!
* The maximum TX power.
*/
int8_t max_tx_pwr;
/*!
* The timestamp of the last Join Request TX frame.
*/
lorawan_time_t last_join_tx_time;
/*!
* The timestamp of the last TX frame.
*/
lorawan_time_t last_tx_time;
/*!
* The device off time.
*/
lorawan_time_t off_time;
/*!
* Lower band boundry
*/
uint32_t lower_band_freq;
/*!
* Higher band boundry
*/
uint32_t higher_band_freq;
} band_t;
/*!
* LoRaMAC receive window 2 channel parameters.
*/
typedef struct {
/*!
* The frequency in Hz.
*/
uint32_t frequency;
/*!
* The data rate.
*
* LoRaWAN Regional Parameters V1.0.2rB.
*
* The allowed ranges are region-specific. Please refer to \ref DR_0 to \ref DR_15 for details.
*/
uint8_t datarate;
} rx2_channel_params;
/*!
* LoRaMAC receive window enumeration
*/
typedef enum {
/*!
* LoRaMAC receive window 1
*/
RX_SLOT_WIN_1,
/*!
* LoRaMAC receive window 2
*/
RX_SLOT_WIN_2,
/*!
* LoRaMAC receive window 2 for class c - continuous listening
*/
RX_SLOT_WIN_CLASS_C,
/*!
* LoRaMAC class b ping slot window
*/
RX_SLOT_WIN_PING_SLOT
} rx_slot_t;
/*!
* The global MAC layer parameters.
*/
typedef struct {
/*!
* The TX power in channels.
*/
int8_t channel_tx_power;
/*!
* The data rate in channels.
*/
int8_t channel_data_rate;
/*!
* LoRaMac maximum time a reception window stays open.
*/
uint32_t max_rx_win_time;
/*!
* Receive delay 1.
*/
uint32_t recv_delay1;
/*!
* Receive delay 2.
*/
uint32_t recv_delay2;
/*!
* Join accept delay 1.
*/
uint32_t join_accept_delay1;
/*!
* Join accept delay 1.
*/
uint32_t join_accept_delay2;
/*!
* The number of uplink messages repetitions for QOS set by network server
* in LinkADRReq mac command (unconfirmed messages only).
*/
uint8_t nb_trans;
/*!
* The datarate offset between uplink and downlink on first window.
*/
uint8_t rx1_dr_offset;
/*!
* LoRaMAC 2nd reception window settings.
*/
rx2_channel_params rx2_channel;
/*!
* The uplink dwell time configuration. 0: No limit, 1: 400ms
*/
uint8_t uplink_dwell_time;
/*!
* The downlink dwell time configuration. 0: No limit, 1: 400ms
*/
uint8_t downlink_dwell_time;
/*!
* The maximum possible EIRP.
*/
float max_eirp;
/*!
* The antenna gain of the node.
*/
float antenna_gain;
/*!
* Maximum duty cycle
* \remark Possibility to shutdown the device.
*/
uint8_t max_duty_cycle;
/*!
* Aggregated duty cycle management
*/
uint16_t aggregated_duty_cycle;
/*!
* LoRaMac ADR control status
*/
bool adr_on;
} lora_mac_system_params_t;
/*!
* LoRaMAC multicast channel parameter.
*/
typedef struct multicast_params_s {
/*!
* Address.
*/
uint32_t address;
/*!
* Network session key.
*/
uint8_t nwk_skey[16];
/*!
* Application session key.
*/
uint8_t app_skey[16];
/*!
* Downlink counter.
*/
uint32_t dl_frame_counter;
/*!
* A reference pointer to the next multicast channel parameters in the list.
*/
struct multicast_params_s *next;
} multicast_params_t;
/*!
* LoRaMAC frame types.
*
* LoRaWAN Specification V1.0.2, chapter 4.2.1, table 1.
*/
typedef enum {
/*!
* LoRaMAC join request frame.
*/
FRAME_TYPE_JOIN_REQ = 0x00,
/*!
* LoRaMAC join accept frame.
*/
FRAME_TYPE_JOIN_ACCEPT = 0x01,
/*!
* LoRaMAC unconfirmed uplink frame.
*/
FRAME_TYPE_DATA_UNCONFIRMED_UP = 0x02,
/*!
* LoRaMAC unconfirmed downlink frame.
*/
FRAME_TYPE_DATA_UNCONFIRMED_DOWN = 0x03,
/*!
* LoRaMAC confirmed uplink frame.
*/
FRAME_TYPE_DATA_CONFIRMED_UP = 0x04,
/*!
* LoRaMAC confirmed downlink frame.
*/
FRAME_TYPE_DATA_CONFIRMED_DOWN = 0x05,
/*!
* LoRaMAC RFU frame.
*/
FRAME_TYPE_RFU = 0x06,
/*!
* LoRaMAC proprietary frame.
*/
FRAME_TYPE_PROPRIETARY = 0x07,
} mac_frame_type_t;
/*!
* LoRaMAC mote MAC commands.
*
* LoRaWAN Specification V1.0.2, chapter 5, table 4.
*/
typedef enum {
/*!
* LinkCheckReq
*/
MOTE_MAC_LINK_CHECK_REQ = 0x02,
/*!
* LinkADRAns
*/
MOTE_MAC_LINK_ADR_ANS = 0x03,
/*!
* DutyCycleAns
*/
MOTE_MAC_DUTY_CYCLE_ANS = 0x04,
/*!
* RXParamSetupAns
*/
MOTE_MAC_RX_PARAM_SETUP_ANS = 0x05,
/*!
* DevStatusAns
*/
MOTE_MAC_DEV_STATUS_ANS = 0x06,
/*!
* NewChannelAns
*/
MOTE_MAC_NEW_CHANNEL_ANS = 0x07,
/*!
* RXTimingSetupAns
*/
MOTE_MAC_RX_TIMING_SETUP_ANS = 0x08,
/*!
* TXParamSetupAns
*/
MOTE_MAC_TX_PARAM_SETUP_ANS = 0x09,
/*!
* DlChannelAns
*/
MOTE_MAC_DL_CHANNEL_ANS = 0x0A
} mote_mac_cmds_t;
/*!
* LoRaMAC server MAC commands.
*
* LoRaWAN Specification V1.0.2 chapter 5, table 4.
*/
typedef enum {
/*!
* LinkCheckAns
*/
SRV_MAC_LINK_CHECK_ANS = 0x02,
/*!
* LinkADRReq
*/
SRV_MAC_LINK_ADR_REQ = 0x03,
/*!
* DutyCycleReq
*/
SRV_MAC_DUTY_CYCLE_REQ = 0x04,
/*!
* RXParamSetupReq
*/
SRV_MAC_RX_PARAM_SETUP_REQ = 0x05,
/*!
* DevStatusReq
*/
SRV_MAC_DEV_STATUS_REQ = 0x06,
/*!
* NewChannelReq
*/
SRV_MAC_NEW_CHANNEL_REQ = 0x07,
/*!
* RXTimingSetupReq
*/
SRV_MAC_RX_TIMING_SETUP_REQ = 0x08,
/*!
* NewChannelReq
*/
SRV_MAC_TX_PARAM_SETUP_REQ = 0x09,
/*!
* DlChannelReq
*/
SRV_MAC_DL_CHANNEL_REQ = 0x0A,
} server_mac_cmds_t;
/*!
* LoRaMAC battery level indicator.
*/
typedef enum {
/*!
* An external power source.
*/
BAT_LEVEL_EXT_SRC = 0x00,
/*!
* Battery level empty.
*/
BAT_LEVEL_EMPTY = 0x01,
/*!
* Battery level full.
*/
BAT_LEVEL_FULL = 0xFE,
/*!
* Battery level - no measurement available.
*/
BAT_LEVEL_NO_MEASURE = 0xFF,
} device_battery_level_t;
/*!
* LoRaMAC header field definition (MHDR field).
*
* LoRaWAN Specification V1.0.2, chapter 4.2.
*/
typedef union {
/*!
* Byte-access to the bits.
*/
uint8_t value;
/*!
* The structure containing single access to header bits.
*/
struct hdr_bits_s {
/*!
* Major version.
*/
uint8_t major : 2;
/*!
* RFU
*/
uint8_t RFU : 3;
/*!
* Message type
*/
uint8_t mtype : 3;
} bits;
} loramac_mhdr_t;
/*!
* LoRaMAC frame control field definition (FCtrl).
*
* LoRaWAN Specification V1.0.2, chapter 4.3.1.
*/
typedef union {
/*!
* Byte-access to the bits.
*/
uint8_t value;
/*!
* The structure containing single access to bits.
*/
struct ctrl_bits_s {
/*!
* Frame options length.
*/
uint8_t fopts_len : 4;
/*!
* Frame pending bit.
*/
uint8_t fpending : 1;
/*!
* Message acknowledge bit.
*/
uint8_t ack : 1;
/*!
* ADR acknowledgment request bit.
*/
uint8_t adr_ack_req : 1;
/*!
* ADR control in the frame header.
*/
uint8_t adr : 1;
} bits;
} loramac_frame_ctrl_t;
/*!
* The enumeration containing the status of the operation of a MAC service.
*/
typedef enum {
/*!
* Service performed successfully.
*/
LORAMAC_EVENT_INFO_STATUS_OK = 0,
/*!
* An error occurred during the execution of the service.
*/
LORAMAC_EVENT_INFO_STATUS_ERROR,
/*!
* A TX timeout occurred.
*/
LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT,
/*!
* An RX timeout occurred on receive window 1.
*/
LORAMAC_EVENT_INFO_STATUS_RX1_TIMEOUT,
/*!
* An RX timeout occurred on receive window 2.
*/
LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT,
/*!
* An RX error occurred on receive window 1.
*/
LORAMAC_EVENT_INFO_STATUS_RX1_ERROR,
/*!
* An RX error occurred on receive window 2.
*/
LORAMAC_EVENT_INFO_STATUS_RX2_ERROR,
/*!
* An error occurred in the join procedure.
*/
LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL,
/*!
* A frame with an invalid downlink counter was received. The
* downlink counter of the frame was equal to the local copy
* of the downlink counter of the node.
*/
LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED,
/*!
* The MAC could not retransmit a frame since the MAC decreased the datarate. The
* payload size is not applicable for the datarate.
*/
LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR,
/*!
* The node has lost MAX_FCNT_GAP or more frames.
*/
LORAMAC_EVENT_INFO_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOST,
/*!
* An address error occurred.
*/
LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL,
/*!
* Message integrity check failure.
*/
LORAMAC_EVENT_INFO_STATUS_MIC_FAIL,
/*!
* Crypto methods failure
*/
LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL,
} loramac_event_info_status_t;
/*!
*
* \brief LoRaMAC data services
*
* \details The following table list the primitives supported by a
* specific MAC data service:
*
* Name | Request | Indication | Response | Confirm
* --------------------- | :-----: | :--------: | :------: | :-----:
* \ref MCPS_UNCONFIRMED | YES | YES | NO | YES
* \ref MCPS_CONFIRMED | YES | YES | NO | YES
* \ref MCPS_MULTICAST | NO | YES | NO | NO
* \ref MCPS_PROPRIETARY | YES | YES | NO | YES
*
*/
typedef enum {
/*!
* Unconfirmed LoRaMAC frame.
*/
MCPS_UNCONFIRMED,
/*!
* Confirmed LoRaMAC frame.
*/
MCPS_CONFIRMED,
/*!
* Multicast LoRaMAC frame.
*/
MCPS_MULTICAST,
/*!
* Proprietary frame.
*/
MCPS_PROPRIETARY,
} mcps_type_t;
/*!
* LoRaMAC MCPS-Confirm.
*/
typedef struct {
/*!
* Holds the previously performed MCPS-Request type. i.e., the type of
* the MCPS request for which this confirmation is being generated
*/
mcps_type_t req_type;
/*!
* The status of the operation.
*/
loramac_event_info_status_t status;
/*!
* The uplink datarate.
*/
uint8_t data_rate;
/*!
* The transmission power.
*/
int8_t tx_power;
/*!
* Set if an acknowledgement was received.
*/
bool ack_received;
/*!
* Provides the number of retransmissions.
*/
uint8_t nb_retries;
/*!
* The transmission time on air of the frame.
*/
lorawan_time_t tx_toa;
/*!
* The uplink counter value related to the frame.
*/
uint32_t ul_frame_counter;
/*!
* The uplink channel related to the frame.
*/
uint32_t channel;
} loramac_mcps_confirm_t;
/*!
* LoRaMAC MCPS-Indication primitive.
*/
typedef struct {
/*!
* True if an MCPS indication was pending
*/
bool pending;
/*!
* MCPS-Indication type.
*/
mcps_type_t type;
/*!
* The status of the operation.
*/
loramac_event_info_status_t status;
/*!
* Multicast.
*/
uint8_t multicast;
/*!
* The application port.
*/
uint8_t port;
/*!
* The downlink datarate.
*/
uint8_t rx_datarate;
/*!
* Frame pending status.
*/
uint8_t fpending_status;
/*!
* A pointer to the received data stream.
*/
const uint8_t *buffer;
/*!
* The size of the received data stream.
*/
uint16_t buffer_size;
/*!
* Indicates, if data is available.
*/
bool is_data_recvd;
/*!
* The RSSI of the received packet.
*/
int16_t rssi;
/*!
* The SNR of the received packet.
*/
int8_t snr;
/*!
* The receive window.
*
* [0: Rx window 1, 1: Rx window 2]
*/
rx_slot_t rx_slot;
/*!
* Set if an acknowledgement was received.
*/
bool is_ack_recvd;
/*!
* The downlink counter value for the received frame.
*/
uint32_t dl_frame_counter;
/*!
* The downlink channel
*/
uint32_t channel;
/*!
* The time on air of the received frame.
*/
lorawan_time_t rx_toa;
} loramac_mcps_indication_t;
/*!
* \brief LoRaMAC management services.
*
* \details The following table list the primitives supported by a
* specific MAC management service:
*
* Name | Request | Indication | Response | Confirm
* ---------------------------- | :-----: | :--------: | :------: | :-----:
* \ref MLME_JOIN | YES | NO | NO | YES
* \ref MLME_LINK_CHECK | YES | NO | NO | YES
* \ref MLME_TXCW | YES | NO | NO | YES
* \ref MLME_SCHEDULE_UPLINK | NO | YES | NO | NO
*
*/
typedef enum {
/*!
* Initiates the Over-the-Air activation.
*
* LoRaWAN Specification V1.0.2, chapter 6.2.
*/
MLME_JOIN,
/*!
* LinkCheckReq - Connectivity validation.
*
* LoRaWAN Specification V1.0.2, chapter 5, table 4.
*/
MLME_LINK_CHECK,
/*!
* Sets TX continuous wave mode.
*
* LoRaWAN end-device certification.
*/
MLME_TXCW,
/*!
* Sets TX continuous wave mode (new LoRa-Alliance CC definition).
*
* LoRaWAN end-device certification.
*/
MLME_TXCW_1,
/*!
* Indicates that the application shall perform an uplink as
* soon as possible.
*/
MLME_SCHEDULE_UPLINK
} mlme_type_t;
/*!
* LoRaMAC MLME-Request for the join service.
*/
typedef struct {
/*!
* A globally unique end-device identifier.
*
* LoRaWAN Specification V1.0.2, chapter 6.2.1.
*/
uint8_t *dev_eui;
/*!
* An application identifier.
*
* LoRaWAN Specification V1.0.2, chapter 6.1.2
*/
uint8_t *app_eui;
/*!
* AES-128 application key.
*
* LoRaWAN Specification V1.0.2, chapter 6.2.2.
*/
uint8_t *app_key;
/*!
* The number of trials for the join request.
*/
uint8_t nb_trials;
} mlme_join_req_t;
/*!
* LoRaMAC MLME-Request for TX continuous wave mode.
*/
typedef struct {
/*!
* The time while the radio is kept in continuous wave mode, in seconds.
*/
uint16_t timeout;
/*!
* The RF frequency to set (only used with the new way).
*/
uint32_t frequency;
/*!
* The RF output power to set (only used with the new way).
*/
uint8_t power;
} mlme_cw_tx_mode_t;
/*!
* LoRaMAC MLME-Confirm primitive.
*/
typedef struct {
/*!
* Indicates if a request is pending or not
*/
bool pending;
/*!
* The previously performed MLME-Request. i.e., the request type
* for which the confirmation is being generated
*/
mlme_type_t req_type;
/*!
* The status of the operation.
*/
loramac_event_info_status_t status;
/*!
* The transmission time on air of the frame.
*/
lorawan_time_t tx_toa;
/*!
* The demodulation margin. Contains the link margin [dB] of the last LinkCheckReq
* successfully received.
*/
uint8_t demod_margin;
/*!
* The number of gateways which received the last LinkCheckReq.
*/
uint8_t nb_gateways;
/*!
* The number of retransmissions.
*/
uint8_t nb_retries;
} loramac_mlme_confirm_t;
/*!
* LoRaMAC MLME-Indication primitive
*/
typedef struct {
/*!
* MLME-Indication type
*/
mlme_type_t indication_type;
bool pending;
} loramac_mlme_indication_t;
/**
* End-device states.
*/
typedef enum device_states {
DEVICE_STATE_NOT_INITIALIZED,
DEVICE_STATE_JOINING,
DEVICE_STATE_IDLE,
DEVICE_STATE_CONNECTING,
DEVICE_STATE_AWAITING_JOIN_ACCEPT,
DEVICE_STATE_RECEIVING,
DEVICE_STATE_CONNECTED,
DEVICE_STATE_SCHEDULING,
DEVICE_STATE_SENDING,
DEVICE_STATE_AWAITING_ACK,
DEVICE_STATE_STATUS_CHECK,
DEVICE_STATE_SHUTDOWN
} device_states_t;
/**
* Stack level TX message structure
*/
typedef struct {
/**
* TX Ongoing flag
*/
bool tx_ongoing;
/**
* Application Port Number
*/
uint8_t port;
/**
* Message type
*/
mcps_type_t type;
/*!
* Frame port field. Must be set if the payload is not empty. Use the
* application-specific frame port values: [1...223].
*
* LoRaWAN Specification V1.0.2, chapter 4.3.2.
*/
uint8_t fport;
/*!
* Uplink datarate, if ADR is off.
*/
int8_t data_rate;
/*!
*
* For CONFIRMED Messages:
*
* The number of trials to transmit the frame, if the LoRaMAC layer did not
* receive an acknowledgment. The MAC performs a datarate adaptation
* according to the LoRaWAN Specification V1.0.2, chapter 18.4, as in
* the following table:
*
* Transmission nb | Data Rate
* ----------------|-----------
* 1 (first) | DR
* 2 | DR
* 3 | max(DR-1,0)
* 4 | max(DR-1,0)
* 5 | max(DR-2,0)
* 6 | max(DR-2,0)
* 7 | max(DR-3,0)
* 8 | max(DR-3,0)
*
* Note that if nb_trials is set to 1 or 2, the MAC will not decrease
* the datarate, if the LoRaMAC layer did not receive an acknowledgment.
*
* For UNCONFIRMED Messages:
*
* Provides a certain QOS level set by network server in LinkADRReq MAC
* command. The device will transmit the given UNCONFIRMED message nb_trials
* time with same frame counter until a downlink is received. Standard defined
* range is 1:15. Data rates will NOT be adapted according to chapter 18.4.
*/
uint8_t nb_trials;
/** Payload data
*
* Base pointer to the buffer
*/
uint8_t f_buffer[MBED_CONF_LORA_TX_MAX_SIZE];
/** Payload size.
*
* The size of the frame payload.
*/
uint16_t f_buffer_size;
/**
* Pending data size
*/
uint16_t pending_size;
} loramac_tx_message_t;
/** lora_mac_rx_message_type_t
*
* An enum representing a structure for RX messages.
*/
typedef enum {
LORAMAC_RX_MLME_CONFIRM = 0, /**< lora_mac_mlme_confirm_t */
LORAMAC_RX_MCPS_CONFIRM, /**< lora_mac_mcps_confirm_t */
LORAMAC_RX_MCPS_INDICATION /**< lora_mac_mcps_indication_t */
} rx_msg_type;
/** lora_mac_rx_message_by_type_t union
*
* A union representing a structure for RX messages.
*/
typedef union {
loramac_mlme_confirm_t mlme_confirm;
loramac_mcps_confirm_t mcps_confirm;
loramac_mcps_indication_t mcps_indication;
} rx_message_u;
/** loramac_rx_message_t
*
* A structure representing a structure for an RX message.
*/
typedef struct {
bool receive_ready;
rx_msg_type type;
rx_message_u msg;
uint16_t pending_size;
uint16_t prev_read_size;
} loramac_rx_message_t;
/** LoRaWAN session
*
* A structure for keeping session details.
*/
typedef struct lorawan_session {
/**
* True if the session is active
*/
bool active;
/*!
* Select the connection type, either LORAWAN_CONNECTION_OTAA
* or LORAWAN_CONNECTION_ABP.
*/
uint8_t connect_type;
/**
* LoRaWAN uplink counter
*/
uint32_t uplink_counter;
/**
* LoRaWAN downlink counter
*/
uint32_t downlink_counter;
} lorawan_session_t;
/*!
* The parameter structure for the function for regional rx configuration.
*/
typedef struct {
/*!
* Type of modulation used (LoRa or FSK)
*/
uint8_t modem_type;
/*!
* The RX channel.
*/
uint8_t channel;
/*!
* The RX datarate index.
*/
uint8_t datarate;
/*!
* The RX bandwidth.
*/
uint8_t bandwidth;
/*!
* The RX datarate offset.
*/
int8_t dr_offset;
/*!
* The RX frequency.
*/
uint32_t frequency;
/*!
* The RX window timeout - Symbols
*/
uint32_t window_timeout;
/*!
* The RX window timeout - Milliseconds
*/
uint32_t window_timeout_ms;
/*!
* The RX window offset
*/
int32_t window_offset;
/*!
* The downlink dwell time.
*/
uint8_t dl_dwell_time;
/*!
* Set to true, if a repeater is supported.
*/
bool is_repeater_supported;
/*!
* Set to true, if RX should be continuous.
*/
bool is_rx_continuous;
/*!
* Sets the RX window.
*/
rx_slot_t rx_slot;
} rx_config_params_t;
/*!
* \brief Timer object description
*/
typedef struct {
mbed::Callback<void()> callback;
int timer_id;
} timer_event_t;
/*!
* A composite structure containing device identifiers and security keys
*/
typedef struct {
/*!
* Device IEEE EUI
*/
uint8_t *dev_eui;
/*!
* Application IEEE EUI
*/
uint8_t *app_eui;
/*!
* AES encryption/decryption cipher application key
*/
uint8_t *app_key;
/*!
* AES encryption/decryption cipher network session key
* NOTE! LoRaMac determines the length of the key based on sizeof this variable
*/
uint8_t nwk_skey[16];
/*!
* AES encryption/decryption cipher application session key
* NOTE! LoRaMac determines the length of the key based on sizeof this variable
*/
uint8_t app_skey[16];
} loramac_keys;
/*!
* A composite structure containing all the timers used in the LoRaWAN operation
*/
typedef struct {
/*!
* Aggregated duty cycle management
*/
lorawan_time_t aggregated_last_tx_time;
lorawan_time_t aggregated_timeoff;
/*!
* Stores the time at LoRaMac initialization.
*
* \remark Used for the BACKOFF_DC computation.
*/
lorawan_time_t mac_init_time;
/*!
* Last transmission time on air
*/
lorawan_time_t tx_toa;
/*!
* LoRaMac duty cycle backoff timer
*/
timer_event_t backoff_timer;
/*!
* LoRaMac reception windows timers
*/
timer_event_t rx_window1_timer;
timer_event_t rx_window2_timer;
/*!
* Acknowledge timeout timer. Used for packet retransmissions.
*/
timer_event_t ack_timeout_timer;
} lorawan_timers;
/*!
* Global MAC layer configuration parameters
*/
typedef struct {
/*!
* Holds the type of current Receive window slot
*/
rx_slot_t rx_slot;
/*!
* Indicates if the node is connected to a private or public network
*/
bool is_nwk_public;
/*!
* Indicates if the node supports repeaters
*/
bool is_repeater_supported;
/*!
* Used for test purposes. Disables the opening of the reception windows.
*/
bool is_rx_window_enabled;
/*!
* Indicates if the MAC layer has already joined a network.
*/
bool is_nwk_joined;
/*!
* If the node has sent a FRAME_TYPE_DATA_CONFIRMED_UP this variable indicates
* if the nodes needs to manage the server acknowledgement.
*/
bool is_node_ack_requested;
/*!
* If the server has sent a FRAME_TYPE_DATA_CONFIRMED_DOWN this variable indicates
* if the ACK bit must be set for the next transmission
*/
bool is_srv_ack_requested;
/*!
* Enables/Disables duty cycle management (Test only)
*/
bool is_dutycycle_on;
/*!
* Set to true, if the last uplink was a join request
*/
bool is_last_tx_join_request;
/*!
* Indicates if the AckTimeout timer has expired or not
*/
bool is_ack_retry_timeout_expired;
/*!
* Current channel index
*/
uint8_t channel;
/*!
* Current channel index
*/
uint8_t last_channel_idx;
/*!
* Uplink messages repetitions counter
*/
uint8_t ul_nb_rep_counter;
/*!
* TX buffer used for encrypted outgoing frames
*/
uint8_t tx_buffer[LORAMAC_PHY_MAXPAYLOAD];
/*!
* Length of TX buffer
*/
uint16_t tx_buffer_len;
/*!
* Used for storing decrypted RX data.
*/
uint8_t rx_buffer[LORAMAC_PHY_MAXPAYLOAD];
/*!
* Length of the RX buffer
*/
uint8_t rx_buffer_len;
/*!
* Number of trials to get a frame acknowledged
*/
uint8_t max_ack_timeout_retries;
/*!
* Number of trials to get a frame acknowledged
*/
uint8_t ack_timeout_retry_counter;
/*!
* Maximum number of trials for the Join Request
*/
uint8_t max_join_request_trials;
/*!
* Number of trials for the Join Request
*/
uint8_t join_request_trial_counter;
/*!
* Mac keys
*/
loramac_keys keys;
/*!
* Device nonce is a random value extracted by issuing a sequence of RSSI
* measurements
*/
uint16_t dev_nonce;
/*!
* Network ID ( 3 bytes )
*/
uint32_t net_id;
/*!
* Mote Address
*/
uint32_t dev_addr;
/*!
* LoRaMAC frame counter. Each time a packet is sent the counter is incremented.
* Only the 16 LSB bits are sent
*/
uint32_t ul_frame_counter;
/*!
* LoRaMAC frame counter. Each time a packet is received the counter is incremented.
* Only the 16 LSB bits are received
*/
uint32_t dl_frame_counter;
/*!
* Counts the number of missed ADR acknowledgements
*/
uint32_t adr_ack_counter;
/*!
* LoRaMac reception windows delay
* \remark normal frame: RxWindowXDelay = ReceiveDelayX - Offset
* join frame : RxWindowXDelay = JoinAcceptDelayX - Offset
*/
uint32_t rx_window1_delay;
uint32_t rx_window2_delay;
/*!
* Timer objects and stored values
*/
lorawan_timers timers;
/*!
* LoRaMac parameters
*/
lora_mac_system_params_t sys_params;
/*!
* Receive Window configurations for PHY layer
*/
rx_config_params_t rx_window1_config;
rx_config_params_t rx_window2_config;
/*!
* Multicast channels linked list
*/
multicast_params_t *multicast_channels;
} loramac_protocol_params;
#endif /* LORAWAN_SYSTEM_LORAWAN_DATA_STRUCTURES_H_ */