238 lines
6.8 KiB
C
238 lines
6.8 KiB
C
|
#ifndef _CSCPS_H_
|
||
|
#define _CSCPS_H_
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @addtogroup CSCPS Cycling Speed and Cadence Profile Sensor
|
||
|
* @ingroup CSCP
|
||
|
* @brief Cycling Speed and Cadence Profile Sensor
|
||
|
* @{
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* INCLUDE FILES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#include "rwip_config.h"
|
||
|
|
||
|
#if (BLE_CSC_SENSOR)
|
||
|
#include "cscp_common.h"
|
||
|
|
||
|
#include "prf_types.h"
|
||
|
#include "prf.h"
|
||
|
#include "cscps_task.h"
|
||
|
#include "attm.h"
|
||
|
|
||
|
/*
|
||
|
* DEFINES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Maximum number of Cycling Speed and Cadence Profile Sensor role task instances
|
||
|
#define CSCPS_IDX_MAX (1)
|
||
|
|
||
|
/********************************************
|
||
|
******* CSCPS Configuration Flag Masks ******
|
||
|
********************************************/
|
||
|
|
||
|
/// Mandatory Attributes (CSC Measurement + CSC Feature)
|
||
|
#define CSCPS_MANDATORY_MASK (0x003F)
|
||
|
/// Sensor Location Attributes
|
||
|
#define CSCPS_SENSOR_LOC_MASK (0x00C0)
|
||
|
/// SC Control Point Attributes
|
||
|
#define CSCPS_SC_CTNL_PT_MASK (0x0700)
|
||
|
|
||
|
/*
|
||
|
* MACROS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#define CSCPS_IS_FEATURE_SUPPORTED(features, flag) ((features & flag) == flag)
|
||
|
|
||
|
#define CSCPS_IS_PRESENT(features, flag) ((features & flag) == flag)
|
||
|
|
||
|
#define CSCPS_ENABLE_NTFIND(conidx, ccc_flag) (cscps_env->prfl_ntf_ind_cfg[conidx] |= ccc_flag)
|
||
|
|
||
|
#define CSCPS_DISABLE_NTFIND(conidx, ccc_flag) (cscps_env->prfl_ntf_ind_cfg[conidx] &= ~ccc_flag)
|
||
|
|
||
|
#define CSCPS_IS_NTFIND_ENABLED(conidx, ccc_flag) ((cscps_env->prfl_ntf_ind_cfg[conidx] & ccc_flag) == ccc_flag)
|
||
|
|
||
|
#define CSCPS_HANDLE(idx) \
|
||
|
(cscps_env->shdl + (idx) - \
|
||
|
((!(CSCPS_IS_FEATURE_SUPPORTED(cscps_env->prfl_cfg, CSCPS_SENSOR_LOC_MASK)) && \
|
||
|
((idx) > CSCS_IDX_SENSOR_LOC_CHAR))? (1) : (0)))
|
||
|
|
||
|
// Get database attribute index
|
||
|
#define CSCPS_IDX(hdl) \
|
||
|
((hdl - cscps_env->shdl) + \
|
||
|
((!(CSCPS_IS_FEATURE_SUPPORTED(cscps_env->prfl_cfg, CSCPS_SENSOR_LOC_MASK)) && \
|
||
|
((hdl - cscps_env->shdl) > CSCS_IDX_SENSOR_LOC_CHAR)) ? (1) : (0)))
|
||
|
|
||
|
/*
|
||
|
* ENUMERATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Possible states of the CSCPS task
|
||
|
enum cscps_state
|
||
|
{
|
||
|
/// Idle state
|
||
|
CSCPS_IDLE,
|
||
|
/// Busy state
|
||
|
CSCPS_BUSY,
|
||
|
|
||
|
/// Number of defined states.
|
||
|
CSCPS_STATE_MAX
|
||
|
};
|
||
|
|
||
|
/// Cycling Speed and Cadence Service - Attribute List
|
||
|
enum cscps_cscs_att_list
|
||
|
{
|
||
|
/// Cycling Speed and Cadence Service
|
||
|
CSCS_IDX_SVC,
|
||
|
/// CSC Measurement
|
||
|
CSCS_IDX_CSC_MEAS_CHAR,
|
||
|
CSCS_IDX_CSC_MEAS_VAL,
|
||
|
CSCS_IDX_CSC_MEAS_NTF_CFG,
|
||
|
/// CSC Feature
|
||
|
CSCS_IDX_CSC_FEAT_CHAR,
|
||
|
CSCS_IDX_CSC_FEAT_VAL,
|
||
|
/// Sensor Location
|
||
|
CSCS_IDX_SENSOR_LOC_CHAR,
|
||
|
CSCS_IDX_SENSOR_LOC_VAL,
|
||
|
/// SC Control Point
|
||
|
CSCS_IDX_SC_CTNL_PT_CHAR,
|
||
|
CSCS_IDX_SC_CTNL_PT_VAL,
|
||
|
CSCS_IDX_SC_CTNL_PT_NTF_CFG,
|
||
|
|
||
|
/// Number of attributes
|
||
|
CSCS_IDX_NB,
|
||
|
};
|
||
|
|
||
|
/// Profile Configuration Additional Flags ()
|
||
|
enum cscps_prf_cfg_flag
|
||
|
{
|
||
|
/// CSC Measurement - Client Char. Cfg
|
||
|
CSCP_PRF_CFG_FLAG_CSC_MEAS_NTF = (CSCP_FEAT_MULT_SENSOR_LOC_SUPP << 1),
|
||
|
/// SC Control Point - Client Char. Cfg
|
||
|
CSCP_PRF_CFG_FLAG_SC_CTNL_PT_IND = (CSCP_PRF_CFG_FLAG_CSC_MEAS_NTF << 1),
|
||
|
|
||
|
/// Bonded data used
|
||
|
CSCP_PRF_CFG_PERFORMED_OK = 0x80
|
||
|
};
|
||
|
|
||
|
/// Sensor Location Supported Flag
|
||
|
enum cscps_sensor_loc_supp
|
||
|
{
|
||
|
/// Sensor Location Char. is not supported
|
||
|
CSCPS_SENSOR_LOC_NOT_SUPP,
|
||
|
/// Sensor Location Char. is supported
|
||
|
CSCPS_SENSOR_LOC_SUPP,
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* STRUCTURES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// ongoing notification information
|
||
|
struct cscps_ntf
|
||
|
{
|
||
|
/// Cursor on connection
|
||
|
uint8_t cursor;
|
||
|
/// Packed notification/indication data size
|
||
|
uint8_t length;
|
||
|
/// Packed notification/indication data
|
||
|
uint8_t value[CSCP_CSC_MEAS_MAX_LEN];
|
||
|
};
|
||
|
|
||
|
/// Cycling Speed and Cadence Profile Sensor environment variable
|
||
|
struct cscps_env_tag
|
||
|
{
|
||
|
/// profile environment
|
||
|
prf_env_t prf_env;
|
||
|
/// Notification data
|
||
|
struct cscps_ntf* ntf;
|
||
|
/// Wheel revolution
|
||
|
uint32_t tot_wheel_rev;
|
||
|
|
||
|
/// Cycling Speed and Cadence Service Start Handle
|
||
|
uint16_t shdl;
|
||
|
/// Features configuration
|
||
|
uint16_t features;
|
||
|
/// profile configuration
|
||
|
uint16_t prfl_cfg;
|
||
|
|
||
|
/// Operation
|
||
|
uint8_t operation;
|
||
|
/// Sensor location
|
||
|
uint8_t sensor_loc;
|
||
|
|
||
|
/// Environment variable pointer for each connections
|
||
|
uint8_t prfl_ntf_ind_cfg[BLE_CONNECTION_MAX];
|
||
|
|
||
|
/// State of different task instances
|
||
|
ke_state_t state[CSCPS_IDX_MAX];
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* FUNCTION DECLARATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Retrieve CSCP service profile interface
|
||
|
*
|
||
|
* @return CSCP service profile interface
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
const struct prf_task_cbs* cscps_prf_itf_get(void);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Send a CSCPS_CMP_EVT message to the application.
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
void cscps_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 cscps_exe_operation(void);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief This function sends control point indication error
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
void cscps_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 cscps_task_init(struct ke_task_desc *task_desc);
|
||
|
|
||
|
#endif //(BLE_CSC_SENSOR)
|
||
|
|
||
|
/// @} CSCPS
|
||
|
|
||
|
#endif //(_CSCPS_H_)
|