blob: d817123aaa17a9740de44eec8c908d737808f8fe [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef H_LORA_PRIV_
#define H_LORA_PRIV_
#include "node/mac/LoRaMac.h"
#include "os/mynewt.h"
#include "node/lora.h"
#include "node/lora_band.h"
/* Connection state machine flags. */
union lora_mac_flags {
struct {
uint8_t gw_ack_req: 1;
uint8_t node_ack_req: 1;
uint8_t last_tx_join: 1;
uint8_t is_joined: 1;
uint8_t is_joining: 1;
uint8_t is_public_nwk: 1;
uint8_t is_mcps_req: 1;
uint8_t repeater_supp: 1;
} lmfbit;
uint8_t lmf_all;
} __attribute__((packed));
/*
* Lora MAC data object
*/
struct lora_mac_obj
{
/* To limit # of join attempts */
uint8_t cur_join_attempt;
uint8_t max_join_attempt;
/* Current tx payload (N) */
uint8_t cur_tx_pyld;
/* current and last transmit channel used */
uint8_t cur_chan;
uint8_t last_tx_chan;
/*!
* Maximum duty cycle
* \remark Possibility to shutdown the device.
*/
uint8_t max_dc;
/*!
* Number of trials to get a frame acknowledged
*/
uint8_t ack_timeout_retries;
/*!
* Number of trials to get a frame acknowledged
*/
uint8_t ack_timeout_retries_cntr;
/*!
* Uplink messages repetitions counter
*/
uint8_t nb_rep_cntr;
/*!
* Device nonce is a random value extracted by issuing a sequence of RSSI
* measurements
*/
uint16_t dev_nonce;
/*!
* Aggregated duty cycle management
*/
uint16_t aggr_dc;
uint32_t aggr_last_tx_done_time;
uint32_t aggr_time_off;
/*!
* LoRaMac reception windows delay
* \remark normal frame: RxWindowXDelay = ReceiveDelayX - RADIO_WAKEUP_TIME
* join frame : RxWindowXDelay = JoinAcceptDelayX - RADIO_WAKEUP_TIME
*/
uint32_t rx_win1_delay;
uint32_t rx_win2_delay;
/* uplink and downlink counters */
uint32_t uplink_cntr;
uint32_t downlink_cntr;
/*!
* Last transmission time on air (in msecs)
*/
uint32_t tx_time_on_air;
/* Counts the number of missed ADR acknowledgements */
uint32_t adr_ack_cntr;
/*!
* Network ID ( 3 bytes )
*/
uint32_t netid;
/*!
* Mote Address
*/
uint32_t dev_addr;
/*!
* Holds the current rx window slot
*/
LoRaMacRxSlot_t rx_slot;
/* Task event queue */
struct os_eventq lm_evq;
/* Transmit queue */
struct os_mqueue lm_txq;
/* Join event */
struct os_event lm_join_ev;
/* Link check event */
struct os_event lm_link_chk_ev;
#define LORA_DELTA_SHIFT 3
#define LORA_AVG_SHIFT 4
/* Averaging of RSSI/SNR for received frames */
int16_t lm_rssi_avg;
int16_t lm_snr_avg;
/* TODO: this is temporary until we figure out a better way to deal */
/* Transmit queue timer */
struct os_callout lm_txq_timer;
/*
* Pointer to the lora packet information of the packet being currently
* transmitted.
*/
struct lora_pkt_info *curtx;
/*
* Global lora tx packet info structure. Used when transmitting but no mbuf
* was available for transmission.
*/
struct lora_pkt_info txpkt;
/* Pointer to current transmit mbuf. Can be NULL and still txing */
struct os_mbuf *cur_tx_mbuf;
/*!
* Retransmission timer. This is used for confirmed frames on both class
* A and C devices and for unconfirmed transmissions on class C devices
* (so that a class C device will not transmit before listening on the
* second receive window).
*/
struct hal_timer rtx_timer;
/*
* Global lora rx packet info structure. Used when receiving and prior to
* obtaining a mbuf.
*/
uint16_t rxbufsize;
uint8_t *rxbuf;
struct lora_pkt_info rxpkt;
/* Flags */
union lora_mac_flags lmflags;
/*!
* Stores the time at LoRaMac initialization.
*
* NOTE: units of this variable are in os time ticks
*
* \remark Used for the BACKOFF_DC computation.
*/
os_time_t init_time;
};
extern struct lora_mac_obj g_lora_mac_data;
/* Flag macros */
#define LM_F_GW_ACK_REQ() (g_lora_mac_data.lmflags.lmfbit.gw_ack_req)
#define LM_F_NODE_ACK_REQ() (g_lora_mac_data.lmflags.lmfbit.node_ack_req)
#define LM_F_IS_JOINED() (g_lora_mac_data.lmflags.lmfbit.is_joined)
#define LM_F_IS_JOINING() (g_lora_mac_data.lmflags.lmfbit.is_joining)
#define LM_F_IS_PUBLIC_NWK() (g_lora_mac_data.lmflags.lmfbit.is_public_nwk)
#define LM_F_IS_MCPS_REQ() (g_lora_mac_data.lmflags.lmfbit.is_mcps_req)
#define LM_F_REPEATER_SUPP() (g_lora_mac_data.lmflags.lmfbit.repeater_supp)
#define LM_F_LAST_TX_IS_JOIN_REQ() (g_lora_mac_data.lmflags.lmfbit.last_tx_join)
void lora_cli_init(void);
void lora_app_init(void);
struct os_mbuf;
void lora_app_mcps_indicate(struct os_mbuf *om);
void lora_app_mcps_confirm(struct os_mbuf *om);
void lora_app_join_confirm(LoRaMacEventInfoStatus_t status, uint8_t attempts);
void lora_app_link_chk_confirm(LoRaMacEventInfoStatus_t status, uint8_t num_gw,
uint8_t demod_margin);
void lora_node_mcps_request(struct os_mbuf *om);
void lora_node_mac_mcps_indicate(void);
int lora_node_join(uint8_t *dev_eui, uint8_t *app_eui, uint8_t *app_key,
uint8_t trials);
int lora_node_link_check(void);
int lora_node_mtu(void);
struct os_eventq *lora_node_mac_evq_get(void);
void lora_node_chk_txq(void);
bool lora_node_txq_empty(void);
bool lora_mac_srv_ack_requested(void);
uint8_t lora_mac_cmd_buffer_len(void);
void lora_node_qual_sample(int16_t rssi, int16_t snr);
/* Lora debug log */
#define LORA_NODE_DEBUG_LOG
#if defined(LORA_NODE_DEBUG_LOG)
struct lora_node_debug_log_entry
{
uint8_t lnd_id;
uint8_t lnd_p8;
uint16_t lnd_p16;
uint32_t lnd_p32;
uint32_t lnd_cputime;
};
#define LORA_NODE_DEBUG_LOG_ENTRIES (128)
void lora_node_log(uint8_t logid, uint8_t p8, uint16_t p16, uint32_t p32);
extern struct lora_node_debug_log_entry g_lnd_log[LORA_NODE_DEBUG_LOG_ENTRIES];
extern uint16_t g_lnd_log_index;
/* IDs */
#define LORA_NODE_LOG_UNUSED (0)
#define LORA_NODE_LOG_TX_DONE (10)
#define LORA_NODE_LOG_TX_SETUP (11)
#define LORA_NODE_LOG_TX_START (12)
#define LORA_NODE_LOG_TX_DELAY (15)
#define LORA_NODE_LOG_TX_PREP_FRAME (16)
#define LORA_NODE_LOG_RX_WIN1_SETUP (20)
#define LORA_NODE_LOG_RX_TIMEOUT (21)
#define LORA_NODE_LOG_RX_DONE (22)
#define LORA_NODE_LOG_RADIO_TIMEOUT_IRQ (24)
#define LORA_NODE_LOG_RX_PORT (25)
#define LORA_NODE_LOG_RX_WIN2 (26)
#define LORA_NODE_LOG_RX_CFG (27)
#define LORA_NODE_LOG_APP_TX (40)
#define LORA_NODE_LOG_RTX_TIMEOUT (50)
#define LORA_NODE_LOG_RX_ADR_REQ (80)
#define LORA_NODE_LOG_PROC_MAC_CMD (85)
#define LORA_NODE_LOG_LINK_CHK (90)
#else
#define lora_node_log(a,b,c,d)
#endif
#endif