248 lines
7.0 KiB
C
248 lines
7.0 KiB
C
|
#ifndef _RSCPS_H_
|
||
|
#define _RSCPS_H_
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @addtogroup RSCPS Running Speed and Cadence Profile Sensor
|
||
|
* @ingroup RSCP
|
||
|
* @brief Running Speed and Cadence Profile Sensor
|
||
|
* @{
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* INCLUDE FILES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#include "rwip_config.h"
|
||
|
|
||
|
#if (BLE_RSC_SENSOR)
|
||
|
#include "rscp_common.h"
|
||
|
|
||
|
#include "prf_types.h"
|
||
|
#include "prf.h"
|
||
|
#include "rscps_task.h"
|
||
|
#include "attm.h"
|
||
|
|
||
|
/*
|
||
|
* DEFINES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Maximum number of Running Speed and Cadence Profile Sensor role task instances
|
||
|
#define RSCPS_IDX_MAX (1)
|
||
|
|
||
|
/********************************************
|
||
|
******* RSCS Configuration Flag Masks ******
|
||
|
********************************************/
|
||
|
|
||
|
/// Mandatory Attributes (RSC Measurement + RSC Feature)
|
||
|
#define RSCPS_MANDATORY_MASK (0x003F)
|
||
|
/// Sensor Location Attributes
|
||
|
#define RSCPS_SENSOR_LOC_MASK (0x00C0)
|
||
|
/// SC Control Point Attributes
|
||
|
#define RSCPS_SC_CTNL_PT_MASK (0x0700)
|
||
|
|
||
|
/*
|
||
|
* MACROS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#define RSCPS_IS_FEATURE_SUPPORTED(features, flag) ((features & flag) == flag)
|
||
|
|
||
|
#define RSCPS_IS_PRESENT(features, flag) ((features & flag) == flag)
|
||
|
|
||
|
#define RSCPS_ENABLE_NTFIND(conidx, ccc_flag) (rscps_env->prfl_ntf_ind_cfg[conidx] |= ccc_flag)
|
||
|
|
||
|
#define RSCPS_DISABLE_NTFIND(conidx, ccc_flag) (rscps_env->prfl_ntf_ind_cfg[conidx] &= ~ccc_flag)
|
||
|
|
||
|
#define RSCPS_IS_NTFIND_ENABLED(conidx, ccc_flag) ((rscps_env->prfl_ntf_ind_cfg[conidx] & ccc_flag) == ccc_flag)
|
||
|
|
||
|
#define RSCPS_HANDLE(idx) \
|
||
|
(rscps_env->shdl + (idx) - \
|
||
|
((!(RSCPS_IS_FEATURE_SUPPORTED(rscps_env->prf_cfg, RSCPS_SENSOR_LOC_MASK)) && \
|
||
|
((idx) > RSCS_IDX_SENSOR_LOC_CHAR))? (1) : (0)))
|
||
|
|
||
|
// Get database attribute index
|
||
|
#define RSCPS_IDX(hdl) \
|
||
|
((hdl - rscps_env->shdl) + \
|
||
|
((!(RSCPS_IS_FEATURE_SUPPORTED(rscps_env->prf_cfg, RSCPS_SENSOR_LOC_MASK)) && \
|
||
|
((hdl - rscps_env->shdl) > RSCS_IDX_SENSOR_LOC_CHAR)) ? (1) : (0)))
|
||
|
|
||
|
/*
|
||
|
* ENUMERATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Possible states of the RSCPS task
|
||
|
enum rscps_state
|
||
|
{
|
||
|
/// Idle state
|
||
|
RSCPS_IDLE,
|
||
|
/// Busy state
|
||
|
RSCPS_BUSY,
|
||
|
|
||
|
/// Number of defined states.
|
||
|
RSCPS_STATE_MAX
|
||
|
};
|
||
|
|
||
|
/// Running Speed and Cadence Service - Attribute List
|
||
|
enum rscps_rscs_att_list
|
||
|
{
|
||
|
/// Running Speed and Cadence Service
|
||
|
RSCS_IDX_SVC,
|
||
|
/// RSC Measurement
|
||
|
RSCS_IDX_RSC_MEAS_CHAR,
|
||
|
RSCS_IDX_RSC_MEAS_VAL,
|
||
|
RSCS_IDX_RSC_MEAS_NTF_CFG,
|
||
|
/// RSC Feature
|
||
|
RSCS_IDX_RSC_FEAT_CHAR,
|
||
|
RSCS_IDX_RSC_FEAT_VAL,
|
||
|
/// Sensor Location
|
||
|
RSCS_IDX_SENSOR_LOC_CHAR,
|
||
|
RSCS_IDX_SENSOR_LOC_VAL,
|
||
|
/// SC Control Point
|
||
|
RSCS_IDX_SC_CTNL_PT_CHAR,
|
||
|
RSCS_IDX_SC_CTNL_PT_VAL,
|
||
|
RSCS_IDX_SC_CTNL_PT_NTF_CFG,
|
||
|
|
||
|
/// Number of attributes
|
||
|
RSCS_IDX_NB,
|
||
|
};
|
||
|
|
||
|
/// Profile Configuration Additional Flags ()
|
||
|
enum rscps_prf_cfg_flag
|
||
|
{
|
||
|
/// RSC Measurement - Client Char. Cfg
|
||
|
RSCP_PRF_CFG_FLAG_RSC_MEAS_NTF = (RSCP_FEAT_MULT_SENSOR_LOC_SUPP << 1),
|
||
|
/// SC Control Point - Client Char. Cfg
|
||
|
RSCP_PRF_CFG_FLAG_SC_CTNL_PT_IND = (RSCP_PRF_CFG_FLAG_RSC_MEAS_NTF << 1),
|
||
|
|
||
|
/// Bonded data configured
|
||
|
RSCP_PRF_CFG_PERFORMED_OK = 0x80
|
||
|
};
|
||
|
|
||
|
/// Sensor Location Supported Flag
|
||
|
enum rscps_sensor_loc_supp
|
||
|
{
|
||
|
/// Sensor Location Char. is not supported
|
||
|
RSCPS_SENSOR_LOC_NOT_SUPP,
|
||
|
/// Sensor Location Char. is supported
|
||
|
RSCPS_SENSOR_LOC_SUPP,
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* STRUCTURES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// ongoing notification information
|
||
|
struct rscps_ntf
|
||
|
{
|
||
|
/// Cursor on connection
|
||
|
uint8_t cursor;
|
||
|
/// Packed notification/indication data size
|
||
|
uint8_t length;
|
||
|
/// Packed notification/indication data
|
||
|
uint8_t value[RSCP_RSC_MEAS_MAX_LEN];
|
||
|
};
|
||
|
|
||
|
/// Running Power Profile Sensor environment variable per connection
|
||
|
struct rscps_cnx_env
|
||
|
{
|
||
|
/// Profile Notify/Indication Flags
|
||
|
uint8_t prfl_ntf_ind_cfg;
|
||
|
};
|
||
|
|
||
|
/// Running Speed and Cadence Profile Sensor environment variable
|
||
|
struct rscps_env_tag
|
||
|
{
|
||
|
/// profile environment
|
||
|
prf_env_t prf_env;
|
||
|
/// Notification data
|
||
|
struct rscps_ntf* ntf;
|
||
|
/// Cycling Speed and Cadence Service Start Handle
|
||
|
uint16_t shdl;
|
||
|
|
||
|
/// Features configuration
|
||
|
uint16_t features;
|
||
|
/// profile configuration
|
||
|
uint16_t prf_cfg;
|
||
|
|
||
|
/// Operation
|
||
|
uint8_t operation;
|
||
|
/// Sensor location
|
||
|
uint8_t sensor_loc;
|
||
|
|
||
|
/// State of different task instances
|
||
|
ke_state_t state[RSCPS_IDX_MAX];
|
||
|
/// Profile Notify/Indication Flags
|
||
|
uint8_t prfl_ntf_ind_cfg[BLE_CONNECTION_MAX];
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* GLOBAL VARIABLE DECLARATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
* FUNCTION DECLARATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Retrieve RSCP service profile interface
|
||
|
*
|
||
|
* @return RSCP service profile interface
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
const struct prf_task_cbs* rscps_prf_itf_get(void);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Send a RSCPS_CMP_EVT message to the application.
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
void rscps_send_cmp_evt(uint8_t conidx, uint8_t src_id, uint8_t dest_id, uint8_t operation, uint8_t status);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief This function fully manage event to trigg to peer(s) device(s) according
|
||
|
* to on-going operation requested by application
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
void rscps_exe_operation(void);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief This function sends control point indication error
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
void rscps_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 rscps_task_init(struct ke_task_desc *task_desc);
|
||
|
|
||
|
|
||
|
#endif //(BLE_RSC_SENSOR)
|
||
|
|
||
|
/// @} RSCPS
|
||
|
|
||
|
#endif //(_RSCPS_H_)
|