pinebuds/services/ble_profiles/cscp/cscps/src/cscps.h

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_)