373 lines
12 KiB
C
373 lines
12 KiB
C
#ifndef _LANS_H_
|
|
#define _LANS_H_
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @addtogroup LANS Location and Navigation Profile Sensor
|
|
* @ingroup LAN
|
|
* @brief Location and Navigation Profile Sensor
|
|
* @{
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* INCLUDE FILES
|
|
****************************************************************************************
|
|
*/
|
|
|
|
#include "rwip_config.h"
|
|
|
|
#if (BLE_LN_SENSOR)
|
|
#include "lan_common.h"
|
|
#include "lans_task.h"
|
|
#include "prf_types.h"
|
|
#include "prf.h"
|
|
#include "attm.h"
|
|
#include "co_math.h"
|
|
|
|
/*
|
|
* DEFINES
|
|
****************************************************************************************
|
|
*/
|
|
/// Maximum number of Location and Navigation Profile Sensor role task instances
|
|
#define LANS_IDX_MAX (1)
|
|
|
|
/********************************************
|
|
******* LANS Configuration Flag Masks ******
|
|
********************************************/
|
|
|
|
/// Mandatory Attributes (LN Feature + Location and Speed)
|
|
#define LANS_MANDATORY_MASK (0x003F)
|
|
/// Position quality Attribute
|
|
#define LANS_POS_Q_MASK (0x00C0)
|
|
/// Control Point Attributes
|
|
#define LANS_LN_CTNL_PT_MASK (0x0700)
|
|
/// Navigation Attributes
|
|
#define LANS_NAVI_MASK (0x3800)
|
|
|
|
|
|
/*
|
|
* MACROS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
#define LANS_IS_FEATURE_SUPPORTED(features, flag) ((features & flag) == flag)
|
|
|
|
#define LANS_IS_PRESENT(features, flag) ((features & flag) == flag)
|
|
|
|
#define LANS_IS_SET(features, flag) (features & flag)
|
|
|
|
#define LANS_IS_CLEAR(features, flag) ((features & flag) == 0)
|
|
|
|
#define LANS_ENABLE_NTF_IND(idx, ccc_flag) (lans_env->env[idx].prfl_ntf_ind_cfg |= ccc_flag)
|
|
|
|
#define LANS_DISABLE_NTF_IND(idx, ccc_flag) (lans_env->env[idx].prfl_ntf_ind_cfg &= ~ccc_flag)
|
|
|
|
#define LANS_IS_NTF_IND_ENABLED(idx, ccc_flag) ((lans_env->env[idx].prfl_ntf_ind_cfg & ccc_flag) == ccc_flag)
|
|
|
|
// Management of Navigation status
|
|
#define LANS_IS_NAV_EN(idx) ((lans_env->env[idx].nav_ctrl & 0x80) != 0)
|
|
#define LANS_SET_NAV_EN(idx, enable) \
|
|
(lans_env->env[idx].nav_ctrl = ((lans_env->env[idx].nav_ctrl & 0x7F) | (enable << 7)))
|
|
|
|
// Management of Navigation mode
|
|
#define LANS_GET_NAV_MODE(idx) (lans_env->env[idx].nav_ctrl & 0x7F)
|
|
#define LANS_SET_NAV_MODE(idx, mode) \
|
|
(lans_env->env[idx].nav_ctrl = ((lans_env->env[idx].nav_ctrl & 0x8F) | (mode & 0x7F)))
|
|
|
|
|
|
// MACRO TO CALCULATE HANDLE shdl + idx - POSQ - CNTL PT
|
|
// POSQ is 2 if the Position quality is supported otherwise 0
|
|
// CNTL PT is 3 if the CP characteristic is supported otherwise 0
|
|
#define LANS_HANDLE(idx) \
|
|
(lans_env->shdl + (idx) - \
|
|
((!(LANS_IS_FEATURE_SUPPORTED(lans_env->prfl_cfg, LANS_POS_Q_MASK)) && \
|
|
((idx) > LNS_IDX_POS_Q_CHAR))? (2) : (0)) - \
|
|
((!(LANS_IS_FEATURE_SUPPORTED(lans_env->prfl_cfg, LANS_LN_CTNL_PT_MASK)) && \
|
|
((idx) > LNS_IDX_LN_CTNL_PT_CHAR))? (3) : (0)))
|
|
|
|
// Get database attribute index
|
|
#define LANS_IDX(hdl) \
|
|
((hdl - lans_env->shdl) + \
|
|
((!(LANS_IS_FEATURE_SUPPORTED(lans_env->prfl_cfg, LANS_POS_Q_MASK)) && \
|
|
((hdl - lans_env->shdl) > LNS_IDX_POS_Q_CHAR)) ? (2) : (0)) + \
|
|
((!(LANS_IS_FEATURE_SUPPORTED(lans_env->prfl_cfg, LANS_LN_CTNL_PT_MASK)) && \
|
|
((hdl - lans_env->shdl) > LNS_IDX_LN_CTNL_PT_CHAR)) ? (3) : (0)))
|
|
|
|
/*
|
|
* ENUMERATIONS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/// Possible states of the LANS task
|
|
enum lans_state
|
|
{
|
|
/// Idle state
|
|
LANS_IDLE,
|
|
/// Busy state
|
|
LANS_BUSY,
|
|
|
|
/// Number of defined states.
|
|
LANS_STATE_MAX
|
|
};
|
|
|
|
/// Location and Navigation Service - Attribute List
|
|
enum lans_cps_att_list
|
|
{
|
|
/// Location and Navigation Service
|
|
LNS_IDX_SVC,
|
|
/// LN Feature
|
|
LNS_IDX_LN_FEAT_CHAR,
|
|
LNS_IDX_LN_FEAT_VAL,
|
|
/// Location and Speed
|
|
LNS_IDX_LOC_SPEED_CHAR,
|
|
LNS_IDX_LOC_SPEED_VAL,
|
|
LNS_IDX_LOC_SPEED_NTF_CFG,
|
|
/// Position Quality
|
|
LNS_IDX_POS_Q_CHAR,
|
|
LNS_IDX_POS_Q_VAL,
|
|
/// LN Control Point
|
|
LNS_IDX_LN_CTNL_PT_CHAR,
|
|
LNS_IDX_LN_CTNL_PT_VAL,
|
|
LNS_IDX_LN_CTNL_PT_IND_CFG,
|
|
/// Navigation
|
|
LNS_IDX_NAVIGATION_CHAR,
|
|
LNS_IDX_NAVIGATION_VAL,
|
|
LNS_IDX_NAVIGATION_NTF_CFG,
|
|
|
|
/// Number of attributes
|
|
LNS_IDX_NB,
|
|
};
|
|
|
|
/// Profile Configuration
|
|
enum lans_prf_cfg_flag
|
|
{
|
|
/// Nothing supported
|
|
LANS_NOTHING_SUPP_FLAG = (0x00),
|
|
/// Control Point supported flag
|
|
LANS_CTNL_PT_CHAR_SUPP_FLAG = (0x01),
|
|
/// Broadcast supported flag
|
|
LANS_NAVIGATION_SUPP_FLAG = (0x02),
|
|
};
|
|
|
|
|
|
/// Profile Configuration NTF/IND Flags ()
|
|
enum lans_prf_cfg_ntfind_flag
|
|
{
|
|
/// Location and Speed - Client Char. Cfg
|
|
LANS_PRF_CFG_FLAG_LOC_SPEED_NTF = 0x01,
|
|
|
|
/// Control Point - Client Characteristic configuration
|
|
LANS_PRF_CFG_FLAG_LN_CTNL_PT_IND = 0x02,
|
|
|
|
/// Navigation - Client Characteristic configuration
|
|
LANS_PRF_CFG_FLAG_NAVIGATION_NTF = 0x04,
|
|
|
|
/// Bonded Data configured
|
|
LANS_PRF_CFG_PERFORMED_OK = 0x80
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
* STRUCTURES
|
|
****************************************************************************************
|
|
*/
|
|
/// ongoing operation information
|
|
struct lans_op
|
|
{
|
|
/// On-going operation command
|
|
struct ke_msg * cmd;
|
|
/// notification pending
|
|
struct gattc_send_evt_cmd* ntf_pending;
|
|
|
|
/// Cursor on connection
|
|
uint8_t cursor;
|
|
};
|
|
|
|
/// Location and Navigation environment variable per connection
|
|
struct lans_cnx_env
|
|
{
|
|
/// Location an speed content mask
|
|
uint16_t mask_lspeed_content;
|
|
/// Profile Notify/Indication Flags
|
|
uint8_t prfl_ntf_ind_cfg;
|
|
/// LN Navigation Control parameter
|
|
uint8_t nav_ctrl;
|
|
};
|
|
|
|
|
|
/// Location and Navigation Profile Sensor environment variable
|
|
struct lans_env_tag
|
|
{
|
|
/// profile environment
|
|
prf_env_t prf_env;
|
|
|
|
/// Environment variable pointer for each connections
|
|
struct lans_cnx_env env[BLE_CONNECTION_MAX];
|
|
/// Position quality
|
|
struct lanp_posq *posq;
|
|
/// On-going operation
|
|
struct lans_op * op_data;
|
|
|
|
/// Feature Configuration Flags
|
|
uint32_t features;
|
|
|
|
/// Location and Navigation Service Start Handle
|
|
uint16_t shdl;
|
|
/// Profile Configuration Flags
|
|
uint16_t prfl_cfg;
|
|
/// Operation
|
|
uint8_t operation;
|
|
|
|
/// State of different task instances
|
|
ke_state_t state[LANS_IDX_MAX];
|
|
};
|
|
|
|
/*
|
|
* GLOBAL VARIABLE DECLARATIONS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* FUNCTION DECLARATIONS
|
|
****************************************************************************************
|
|
*/
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Retrieve LAN service profile interface
|
|
*
|
|
* @return LAN service profile interface
|
|
****************************************************************************************
|
|
*/
|
|
const struct prf_task_cbs* lans_prf_itf_get(void);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Send a LANS_CMP_EVT message to the application.
|
|
* @param[in] conidx connection index
|
|
* @param[in] src_id Source task
|
|
* @param[in] dest_id Destination task
|
|
* @param[in] operation Operation completed
|
|
* @param[in] status status of the operation
|
|
****************************************************************************************
|
|
*/
|
|
void lans_send_cmp_evt(uint8_t conidx, uint8_t src_id, uint8_t dest_id, uint8_t operation, uint8_t status);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Packs location and speed notifications
|
|
* @param[in] param Pointer to the parameters of the message.
|
|
* @param[out] pckd_loc_speed pointer to packed message
|
|
* @return status of the operation
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_pack_loc_speed_ntf(struct lanp_loc_speed *param, uint8_t *pckd_loc_speed);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Packs navigation notifications
|
|
* @param[in] param Pointer to the parameters of the message.
|
|
* @param[out] pckd_navigation pointer to packed message
|
|
* @return length
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_pack_navigation_ntf(struct lanp_navigation *param, uint8_t *pckd_navigation);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Splits notifications in order to be sent with default MTU
|
|
* @param[in] conidx connection index
|
|
* @param[in/out] loc_speed_ntf1 first notification
|
|
* @return length
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_split_loc_speed_ntf(uint8_t conidx, struct gattc_send_evt_cmd *loc_speed_ntf1);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief updates the environment with the descriptor configuration and sends indication
|
|
* @param[in] conidx connection index
|
|
* @param[in] prfl_config requested value
|
|
* @param[in] param pointer to the message parameters
|
|
* @return status of the operation
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_update_characteristic_config(uint8_t conidx, uint8_t prfl_config, struct gattc_write_req_ind const *param);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Packs position quality
|
|
* @param[in] param Pointer to the parameters of the message.
|
|
****************************************************************************************
|
|
*/
|
|
void lans_upd_posq(struct lanp_posq param);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Packs position quality
|
|
* @param[out] pckd_posq pointer to packed message
|
|
* @return length
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_pack_posq(uint8_t *pckd_posq);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Packs control point
|
|
* @param[in] conidx connection index
|
|
* @param[in] param Pointer to the parameters of the message.
|
|
* @param[out] rsp pointer to message
|
|
* @return status of the operation
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_pack_ln_ctnl_point_cfm (uint8_t conidx, struct lans_ln_ctnl_pt_cfm *param, uint8_t *rsp);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Unpack control point and sends indication
|
|
* @param[in] conidx connection index
|
|
* @param[in] param pointer to message
|
|
* @return status of the operation
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lans_unpack_ln_ctnl_point_ind (uint8_t conidx, struct gattc_write_req_ind const *param);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function fully manage notification of navigation and speed information
|
|
****************************************************************************************
|
|
*/
|
|
void lans_exe_operation(void);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Send a control point response to the peer
|
|
* @param[in] conidx connection index
|
|
* @param[in] req_op_code operation code
|
|
* @param[in] status status of the operation
|
|
****************************************************************************************
|
|
*/
|
|
void lans_send_rsp_ind(uint8_t conidx, uint8_t req_op_code, uint8_t status);
|
|
|
|
/*
|
|
* TASK DESCRIPTOR DECLARATIONS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* Initialize task handler
|
|
*
|
|
* @param task_desc Task descriptor to fill
|
|
****************************************************************************************
|
|
*/
|
|
void lans_task_init(struct ke_task_desc *task_desc);
|
|
|
|
#endif //(BLE_LN_SENSOR)
|
|
|
|
/// @} LANS
|
|
|
|
#endif //(_LANS_H_)
|