blob: f12f8c381dd48d597e3c5245f5bef0ab2acde4a2 [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_
#define H_LORA_
#include "stats/stats.h"
#include "os/mynewt.h"
#include "node/mac/LoRaMac.h"
STATS_SECT_START(lora_mac_stats)
STATS_SECT_ENTRY(join_req_tx)
STATS_SECT_ENTRY(join_accept_rx)
STATS_SECT_ENTRY(link_chk_tx)
STATS_SECT_ENTRY(link_chk_ans_rxd)
STATS_SECT_ENTRY(join_failures)
STATS_SECT_ENTRY(joins)
STATS_SECT_ENTRY(tx_timeouts)
STATS_SECT_ENTRY(unconfirmed_tx)
STATS_SECT_ENTRY(confirmed_tx_fail)
STATS_SECT_ENTRY(confirmed_tx_good)
STATS_SECT_ENTRY(tx_mac_flush)
STATS_SECT_ENTRY(rx_errors)
STATS_SECT_ENTRY(rx_frames)
STATS_SECT_ENTRY(rx_mic_failures)
STATS_SECT_ENTRY(rx_mlme)
STATS_SECT_ENTRY(rx_mcps)
STATS_SECT_ENTRY(rx_dups)
STATS_SECT_ENTRY(rx_invalid)
STATS_SECT_ENTRY(no_bufs)
STATS_SECT_ENTRY(already_joined)
STATS_SECT_END
extern STATS_SECT_DECL(lora_mac_stats) lora_mac_stats;
STATS_SECT_START(lora_stats)
STATS_SECT_ENTRY(rx_error)
STATS_SECT_ENTRY(rx_success)
STATS_SECT_ENTRY(rx_timeout)
STATS_SECT_ENTRY(tx_success)
STATS_SECT_ENTRY(tx_timeout)
STATS_SECT_END
extern STATS_SECT_DECL(lora_stats) lora_stats;
/* XXX: for now. Maybe have api to set these? */
#define LORA_EUI_LEN (8)
#define LORA_KEY_LEN (16)
extern uint8_t g_lora_dev_eui[LORA_EUI_LEN];
extern uint8_t g_lora_app_eui[LORA_EUI_LEN];
extern uint8_t g_lora_app_key[LORA_KEY_LEN];
/* Received packet information */
struct lora_rx_info
{
/*!
* Downlink datarate
*/
uint8_t rxdatarate;
/*!
* Snr of the received packet
*/
uint8_t snr;
/*!
* Frame pending status
*/
uint8_t frame_pending: 1;
/*!
* Receive window
*
* [0: Rx window 1, 1: Rx window 2, 2: class C only. Not 1 or 2]
*/
uint8_t rxslot: 2;
/*!
* Set if an acknowledgement was received
*/
uint8_t ack_rxd: 1;
/*!
* Indicates, if data is available
*/
uint8_t rxdata: 1;
/*!
* Multicast
*/
uint8_t multicast: 1;
/*!
* Rssi of the received packet
*/
int16_t rssi;
/*!
* The downlink counter value for the received frame
*/
uint32_t downlink_cntr;
};
/* Transmitted packet information */
struct lora_txd_info
{
/*!
* Uplink datarate
*/
uint8_t datarate;
/*!
* Transmission power
*/
int8_t txpower;
/*!
* Initially, 'retries' for confirmed frames is the number of trials
* (described below). In the confirmation, this field is set to the
* actual # of retries (0 retries if successful on first attempt).
*
* 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.1, chapter 19.4, according
* to 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 NbTrials is set to 1 or 2, the MAC will not decrease
* the datarate, in case the LoRaMAC layer did not receive an acknowledgment
*/
uint8_t retries;
/*!
* Set if an acknowledgement was received
*/
uint8_t ack_rxd: 1;
/*!
* The transmission time on air of the frame (in msecs)
*/
uint32_t tx_time_on_air;
/*!
* The uplink counter value related to the frame
*/
uint32_t uplink_cntr;
/*!
* The uplink channel related to the frame
*/
uint32_t uplink_chan;
};
/*
* Lora packet header information. This is the user header portion of a lora
* packet.
*/
struct lora_pkt_info
{
uint8_t port;
uint8_t pkt_type;
LoRaMacEventInfoStatus_t status;
union {
struct lora_rx_info rxdinfo;
struct lora_txd_info txdinfo;
};
};
/* Allocate a packet for lora transmission. This returns a packet header mbuf */
struct os_mbuf *lora_pkt_alloc(void);
/* Given a pointer to a packet header mbuf chain, obtain pointer to lora info */
#define LORA_PKT_INFO_PTR(om) \
(struct lora_pkt_info *)((uint8_t *)om + sizeof(struct os_mbuf) + \
sizeof(struct os_mbuf_pkthdr))
/* Port API */
typedef void (*lora_txd_func)(uint8_t port, LoRaMacEventInfoStatus_t status,
Mcps_t pkt_type, struct os_mbuf *om);
/* Received data callback. Mbuf must be freed by this function */
typedef void (*lora_rxd_func)(uint8_t port, LoRaMacEventInfoStatus_t status,
Mcps_t pkt_type, struct os_mbuf *om);
/**
* Open a lora application port. This function will allocate a lora port, set
* port default values for datarate and retries, set the transmit done and
* received data callbacks, and add port to list of open ports.
*
* @param port Port number. Valid range: 1 to 223, inclusive.
* @param txd_cb Transmit done callback
* @param rxd_cb Receive data callback
*
* @return int A return code from set of lora return codes
*/
int lora_app_port_open(uint8_t port, lora_txd_func txd_cb, lora_rxd_func rxd_cb);
/**
* Close an open lora port
*
* @param port Port number
*
* @return int A return code from set of lora return codes
*/
int lora_app_port_close(uint8_t port);
/**
* Configure an application port. This configures the number of retries for
* confirmed packets.
*
* @param port Port number
* @param retries NUmmber of retries for confirmed packets
*
* @return int A return code from set of lora return codes
*/
int lora_app_port_cfg(uint8_t port, uint8_t retries);
/**
* Send a packet on a port.
*
* @param port Port number
* @param pkt_type Type of packet
* @param om Pointer to packet
*
* @return int A return code from set of lora return codes
*/
int lora_app_port_send(uint8_t port, Mcps_t pkt_type, struct os_mbuf *om);
/* Join callback proto */
typedef void (*lora_join_cb)(LoRaMacEventInfoStatus_t status, uint8_t attempts);
extern lora_join_cb lora_join_cb_func;
/* Link check callback proto */
typedef void (*lora_link_chk_cb)(LoRaMacEventInfoStatus_t status,
uint8_t num_gw, uint8_t demod_margin);
extern lora_link_chk_cb lora_link_chk_cb_func;
/*
* The following API are available if the system configuration variable
* LORA_APP_AUTO_JOIN is set to 0. If LORA_APP_AUTO_JOIN is set to 1,
* joining will be handled by the stack and not the application.
*/
#if !MYNEWT_VAL(LORA_APP_AUTO_JOIN)
/**
* Join a lora network. When called this function will attempt to join
* if the end device is not already joined. Join status (success, failure)
* will be reported through the callback.
*
* @param dev_eui Pointer to device EUI
* @param app_eui Pointer to Application EUI
* @param app_key Pointer to application key
* @param trials Number of join attempts before failure
*
* @return int Lora return code
*/
int lora_app_join(uint8_t *dev_eui, uint8_t *app_eui, uint8_t *app_key,
uint8_t trials);
/**
* Tells whether we have successfully joined a LoRa network or not.
*
* @return LORA_APP_STATUS_ALREADY_JOINED if joined.
*/
int lora_node_chk_if_joined(void);
/* Performs a link check */
int lora_app_link_check(void);
/**
* Query RSSI and SNR average for data received over LoRA.
*
* @param rssi Pointer to where to store the RSSI.
* @param snr Pointer to where to store the SNR.
*
* @return 0 if we have collected samples. non-zero if not.
*/
int lora_node_link_qual(int16_t *rssi, int16_t *snr);
/*
* Maximum payload that can be sent in the next frame.
*/
int lora_app_mtu(void);
#endif
/**
* Set the join callback. This will be called when joining succeeds or fails.
*
* @param join_cb Pointer to join callback function.
*
* @return int Lora return code
*/
int lora_app_set_join_cb(lora_join_cb join_cb);
/**
* set the link check callback.
*
* @param link_chk_cb
*
* @return int
*/
int lora_app_set_link_check_cb(lora_link_chk_cb link_chk_cb);
/* Lora app return codes */
#define LORA_APP_STATUS_OK (0)
#define LORA_APP_STATUS_NO_PORT (1)
#define LORA_APP_STATUS_INVALID_PARAM (2)
#define LORA_APP_STATUS_ENOMEM (3)
#define LORA_APP_STATUS_INVALID_PORT (4)
#define LORA_APP_STATUS_ALREADY_OPEN (5)
#define LORA_APP_STATUS_JOIN_FAILURE (6)
#define LORA_APP_STATUS_ALREADY_JOINED (7)
#define LORA_APP_STATUS_NO_NETWORK (8)
#endif