pinebuds/services/ble_profiles/cpp/cpp_common.h

442 lines
13 KiB
C

#ifndef _CPP_COMMON_H_
#define _CPP_COMMON_H_
/**
****************************************************************************************
* @addtogroup CPP Cycling Power Profile
* @ingroup PROFILE
* @brief Cycling Power Profile
*
* The Cycling Power Profile is used to enable a collector device in order to obtain
* data from a Cycling Power Sensor (CP Sensor) that exposes the Cycling Power Service
* in sports and fitness applications.
*
* This file contains all definitions that are common for the server and the client parts
* of the profile.
*****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "prf_types.h"
#include <stdint.h>
/*
* DEFINES
****************************************************************************************
*/
/// Procedure Already in Progress Error Code
#define CPP_ERROR_PROC_IN_PROGRESS (0x80)
/// CP Measurement Notification Value Max Length
#define CPP_CP_MEAS_NTF_MAX_LEN (35)
/// CP Measurement Value Min Length
#define CPP_CP_MEAS_NTF_MIN_LEN (4)
/// ADV Header size
#define CPP_CP_ADV_HEADER_LEN (3)
/// ADV Length size
#define CPP_CP_ADV_LENGTH_LEN (1)
/// CP Measurement Advertisement Value Max Length
#define CPP_CP_MEAS_ADV_MAX_LEN (CPP_CP_MEAS_NTF_MAX_LEN + CPP_CP_ADV_HEADER_LEN)
/// CP Measurement Value Min Length
#define CPP_CP_MEAS_ADV_MIN_LEN (CPP_CP_MEAS_NTF_MIN_LEN + CPP_CP_ADV_HEADER_LEN)
/// CP Vector Value Max Length
#define CPP_CP_VECTOR_MAX_LEN (19)
/// CP Vector Value Min Length
#define CPP_CP_VECTOR_MIN_LEN (1)
/// CP Control Point Value Max Length
#define CPP_CP_CNTL_PT_REQ_MAX_LEN (9)
/// CP Control Point Value Min Length
#define CPP_CP_CNTL_PT_REQ_MIN_LEN (1)
/// CP Control Point Value Max Length
#define CPP_CP_CNTL_PT_RSP_MAX_LEN (20)
/// CP Control Point Value Min Length
#define CPP_CP_CNTL_PT_RSP_MIN_LEN (3)
/*
* ENUMERATIONS
****************************************************************************************
*/
/// CPP Service Characteristics
enum cpp_cpps_char
{
/// CPP Measurement
CPP_CPS_MEAS_CHAR,
/// CPP Feature
CPP_CPS_FEAT_CHAR,
/// Sensor Location
CPP_CPS_SENSOR_LOC_CHAR,
///Cycling Power Vector
CPP_CPS_VECTOR_CHAR,
/// CP Control Point
CPP_CPS_CTNL_PT_CHAR,
CPP_CPS_CHAR_MAX,
};
/// CPP Measurement Flags
enum cpp_meas_flags
{
/// Pedal Power Balance Present
CPP_MEAS_PEDAL_POWER_BALANCE_PRESENT = 0x0001,
/// Pedal Power Balance Reference
CPP_MEAS_PEDAL_POWER_BALANCE_REFERENCE = 0x0002,
/// Accumulated Torque Present
CPP_MEAS_ACCUM_TORQUE_PRESENT = 0x0004,
/// Accumulated Torque Source
CPP_MEAS_ACCUM_TORQUE_SOURCE = 0x0008,
/// Wheel Revolution Data Present
CPP_MEAS_WHEEL_REV_DATA_PRESENT = 0x0010,
/// Crank Revolution Data Present
CPP_MEAS_CRANK_REV_DATA_PRESENT = 0x0020,
/// Extreme Force Magnitudes Present
CPP_MEAS_EXTREME_FORCE_MAGNITUDES_PRESENT = 0x0040,
/// Extreme Torque Magnitudes Present
CPP_MEAS_EXTREME_TORQUE_MAGNITUDES_PRESENT = 0x0080,
/// Extreme Angles Present
CPP_MEAS_EXTREME_ANGLES_PRESENT = 0x0100,
/// Top Dead Spot Angle Present
CPP_MEAS_TOP_DEAD_SPOT_ANGLE_PRESENT = 0x0200,
/// Bottom Dead Spot Angle Present
CPP_MEAS_BOTTOM_DEAD_SPOT_ANGLE_PRESENT = 0x0400,
/// Accumulated Energy Present
CPP_MEAS_ACCUM_ENERGY_PRESENT = 0x0800,
/// Offset Compensation Indicator
CPP_MEAS_OFFSET_COMPENSATION_INDICATOR = 0x1000,
/// All Supported
CPP_MEAS_ALL_SUPP = 0x1FFF,
};
/// CPP Feature Flags
enum cpp_feat_flags
{
/// Pedal Power Balance Supported
CPP_FEAT_PEDAL_POWER_BALANCE_SUPP = 0x00000001,
/// Accumulated Torque Supported
CPP_FEAT_ACCUM_TORQUE_SUPP = 0x00000002,
/// Wheel Revolution Data Supported
CPP_FEAT_WHEEL_REV_DATA_SUPP = 0x00000004,
/// Crank Revolution Data Supported
CPP_FEAT_CRANK_REV_DATA_SUPP = 0x00000008,
/// Extreme Magnitudes Supported
CPP_FEAT_EXTREME_MAGNITUDES_SUPP = 0x00000010,
/// Extreme Angles Supported
CPP_FEAT_EXTREME_ANGLES_SUPP = 0x00000020,
/// Top and Bottom Dead Spot Angles Supported
CPP_FEAT_TOPBOT_DEAD_SPOT_ANGLES_SUPP = 0x00000040,
/// Accumulated Energy Supported
CPP_FEAT_ACCUM_ENERGY_SUPP = 0x00000080,
/// Offset Compensation Indicator Supported
CPP_FEAT_OFFSET_COMP_IND_SUPP = 0x00000100,
/// Offset Compensation Supported
CPP_FEAT_OFFSET_COMP_SUPP = 0x00000200,
/// CP Measurement CH Content Masking Supported
CPP_FEAT_CP_MEAS_CH_CONTENT_MASKING_SUPP = 0x00000400,
/// Multiple Sensor Locations Supported
CPP_FEAT_MULT_SENSOR_LOC_SUPP = 0x00000800,
/// Crank Length Adjustment Supported
CPP_FEAT_CRANK_LENGTH_ADJ_SUPP = 0x00001000,
/// Chain Length Adjustment Supported
CPP_FEAT_CHAIN_LENGTH_ADJ_SUPP = 0x00002000,
/// Chain Weight Adjustment Supported
CPP_FEAT_CHAIN_WEIGHT_ADJ_SUPP = 0x00004000,
/// Span Length Adjustment Supported
CPP_FEAT_SPAN_LENGTH_ADJ_SUPP = 0x00008000,
/// Sensor Measurement Context
CPP_FEAT_SENSOR_MEAS_CONTEXT = 0x00010000,
/// Instantaneous Measurement Direction Supported
CPP_FEAT_INSTANT_MEAS_DIRECTION_SUPP = 0x00020000,
/// Factory Calibration Date Supported
CPP_FEAT_FACTORY_CALIBRATION_DATE_SUPP = 0x00040000,
/// All supported
CPP_FEAT_ALL_SUPP = 0x0007FFFF,
};
/// CPP Sensor Locations Keys
enum cpp_sensor_loc
{
/// Other (0)
CPP_LOC_OTHER = 0,
/// Top of shoe (1)
CPP_LOC_TOP_SHOE,
/// In shoe (2)
CPP_LOC_IN_SHOE,
/// Hip (3)
CPP_LOC_HIP,
/// Front Wheel (4)
CPP_LOC_FRONT_WHEEL,
/// Left Crank (5)
CPP_LOC_LEFT_CRANK,
/// Right Crank (6)
CPP_LOC_RIGHT_CRANK,
/// Left Pedal (7)
CPP_LOC_LEFT_PEDAL,
/// Right Pedal (8)
CPP_LOC_RIGHT_PEDAL,
/// Front Hub (9)
CPP_LOC_FRONT_HUB,
/// Rear Dropout (10)
CPP_LOC_REAR_DROPOUT,
/// Chainstay (11)
CPP_LOC_CHAINSTAY,
/// Rear Wheel (12)
CPP_LOC_REAR_WHEEL,
/// Rear Hub (13)
CPP_LOC_REAR_HUB,
/// Chest (14)
CPP_LOC_CHEST,
CPP_LOC_MAX,
};
/// CPP Vector Flags
enum cpp_vector_flags
{
/// Crank Revolution Data Present
CPP_VECTOR_CRANK_REV_DATA_PRESENT = 0x01,
/// First Crank Measurement Angle Present
CPP_VECTOR_FIRST_CRANK_MEAS_ANGLE_PRESENT = 0x02,
/// Instantaneous Force Magnitude Array Present
CPP_VECTOR_INST_FORCE_MAGNITUDE_ARRAY_PRESENT = 0x04,
/// Instantaneous Torque Magnitude Array Present
CPP_VECTOR_INST_TORQUE_MAGNITUDE_ARRAY_PRESENT = 0x08,
/// Instantaneous Measurement Direction LSB
CPP_VECTOR_INST_MEAS_DIRECTION_LSB = 0x10,
/// Instantaneous Measurement Direction MSB
CPP_VECTOR_INST_MEAS_DIRECTION_MSB = 0x20,
///All suported
CPP_VECTOR_ALL_SUPP = 0x3F,
};
/// CPP Control Point Code Keys
enum cpp_ctnl_pt_code
{
/// Reserved value
CPP_CTNL_PT_RESERVED = 0,
/// Set Cumulative Value
CPP_CTNL_PT_SET_CUMUL_VAL,
/// Update Sensor Location
CPP_CTNL_PT_UPD_SENSOR_LOC,
/// Request Supported Sensor Locations
CPP_CTNL_PT_REQ_SUPP_SENSOR_LOC,
/// Set Crank Length
CPP_CTNL_PT_SET_CRANK_LENGTH,
/// Request Crank Length
CPP_CTNL_PT_REQ_CRANK_LENGTH,
/// Set Chain Length
CPP_CTNL_PT_SET_CHAIN_LENGTH,
/// Request Chain Length
CPP_CTNL_PT_REQ_CHAIN_LENGTH,
/// Set Chain Weight
CPP_CTNL_PT_SET_CHAIN_WEIGHT,
/// Request Chain Weight
CPP_CTNL_PT_REQ_CHAIN_WEIGHT,
/// Set Span Length
CPP_CTNL_PT_SET_SPAN_LENGTH,
/// Request Span Length
CPP_CTNL_PT_REQ_SPAN_LENGTH,
/// Start Offset Compensation
CPP_CTNL_PT_START_OFFSET_COMP,
/// Mask CP Measurement Characteristic Content
CPP_CTNL_MASK_CP_MEAS_CH_CONTENT,
/// Request Sampling Rate
CPP_CTNL_REQ_SAMPLING_RATE,
/// Request Factory Calibration Date
CPP_CTNL_REQ_FACTORY_CALIBRATION_DATE,
/// Response Code
CPP_CTNL_PT_RSP_CODE = 32,
};
/// CPP Control Point Response Value
enum cpp_ctnl_pt_resp_val
{
/// Reserved value
CPP_CTNL_PT_RESP_RESERVED = 0,
/// Success
CPP_CTNL_PT_RESP_SUCCESS,
/// Operation Code Not Supported
CPP_CTNL_PT_RESP_NOT_SUPP,
/// Invalid Parameter
CPP_CTNL_PT_RESP_INV_PARAM,
/// Operation Failed
CPP_CTNL_PT_RESP_FAILED,
};
/*
* STRUCTURES
****************************************************************************************
*/
/// CP Measurement
struct cpp_cp_meas
{
/// Flags
uint16_t flags;
/// Instantaneous Power
int16_t inst_power;
/// Pedal Power Balance
uint8_t pedal_power_balance;
/// Accumulated torque
uint16_t accum_torque;
/// Cumulative Wheel Revolutions
int16_t cumul_wheel_rev;
/// Last Wheel Event Time
uint16_t last_wheel_evt_time;
/// Cumulative Crank Revolution
uint16_t cumul_crank_rev;
/// Last Crank Event Time
uint16_t last_crank_evt_time;
/// Maximum Force Magnitude
int16_t max_force_magnitude;
/// Minimum Force Magnitude
int16_t min_force_magnitude;
/// Maximum Torque Magnitude
int16_t max_torque_magnitude;
/// Minimum Torque Magnitude
int16_t min_torque_magnitude;
/// Maximum Angle (12 bits)
uint16_t max_angle;
/// Minimum Angle (12bits)
uint16_t min_angle;
/// Top Dead Spot Angle
uint16_t top_dead_spot_angle;
/// Bottom Dead Spot Angle
uint16_t bot_dead_spot_angle;
///Accumulated energy
uint16_t accum_energy;
};
/// CP Measurement
struct cpp_cp_meas_ind
{
/// Flags
uint16_t flags;
/// Instantaneous Power
int16_t inst_power;
/// Pedal Power Balance
uint8_t pedal_power_balance;
/// Accumulated torque
uint16_t accum_torque;
/// Cumulative Wheel Revolutions
uint32_t cumul_wheel_rev;
/// Last Wheel Event Time
uint16_t last_wheel_evt_time;
/// Cumulative Crank Revolution
uint16_t cumul_crank_rev;
/// Last Crank Event Time
uint16_t last_crank_evt_time;
/// Maximum Force Magnitude
int16_t max_force_magnitude;
/// Minimum Force Magnitude
int16_t min_force_magnitude;
/// Maximum Torque Magnitude
int16_t max_torque_magnitude;
/// Minimum Torque Magnitude
int16_t min_torque_magnitude;
/// Maximum Angle (12 bits)
uint16_t max_angle;
/// Minimum Angle (12bits)
uint16_t min_angle;
/// Top Dead Spot Angle
uint16_t top_dead_spot_angle;
/// Bottom Dead Spot Angle
uint16_t bot_dead_spot_angle;
///Accumulated energy
uint16_t accum_energy;
};
///CP Vector
struct cpp_cp_vector
{
/// Flags
uint8_t flags;
/// Force-Torque Magnitude Array Length
uint8_t nb;
/// Cumulative Crank Revolutions
uint16_t cumul_crank_rev;
/// Last Crank Event Time
uint16_t last_crank_evt_time;
/// First Crank Measurement Angle
uint16_t first_crank_meas_angle;
///Mutually excluded Force and Torque Magnitude Arrays
int16_t force_torque_magnitude[__ARRAY_EMPTY];
};
/// CP Control Point Request
struct cpp_ctnl_pt_req
{
/// Operation Code
uint8_t op_code;
/// Value
union cpp_ctnl_pt_req_val
{
/// Cumulative Value
uint32_t cumul_val;
/// Sensor Location
uint8_t sensor_loc;
/// Crank Length
uint16_t crank_length;
/// Chain Length
uint16_t chain_length;
/// Chain Weight
uint16_t chain_weight;
/// Span Length
uint16_t span_length;
/// Mask Content
uint16_t mask_content;
} value;
};
/// CP Control Point Response
struct cpp_ctnl_pt_rsp
{
/// Requested Operation Code
uint8_t req_op_code;
/// Response Value
uint8_t resp_value;
///Value
union cpp_ctnl_pt_rsp_val
{
/// List of supported locations
uint32_t supp_loc;
/// Crank Length
uint16_t crank_length;
/// Chain Length
uint16_t chain_length;
/// Chain Weight
uint16_t chain_weight;
/// Span Length
uint16_t span_length;
/// Start Offset Compensation
int16_t offset_comp;
/// Sampling Rate Procedure
uint8_t sampling_rate;
/// Calibration date
struct prf_date_time factory_calibration;
} value;
};
/// @} cpp_common
#endif //(_CPP_COMMON_H_)