Realtek/inc/bluetooth/profile/gatt_builtin_services.h

277 lines
10 KiB
C
Raw Normal View History

2025-11-25 10:21:47 +08:00
/**
*****************************************************************************************
* Copyright(c) 2015, Realtek Semiconductor Corporation. All rights reserved.
*****************************************************************************************
* @file gatt_builtin_services.h
* @brief Head file for using builtin services, including GAP service and GATT service.
* @details GAPS data structs and external functions declaration.
* @author jane
* @date 2015-5-12
* @version v0.1
* *************************************************************************************
*/
/* Define to prevent recursive inclusion */
#ifndef _BUILTIN_SERVICES_H_
#define _BUILTIN_SERVICES_H_
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Add Includes here */
#include "upperstack_config.h"
#include "profile_server.h"
/** @defgroup GAP_GATT_SERVICE GAP and GATT Inbox Services
* @brief GAP and GATT inbox services
* @{
*/
/*============================================================================*
* Macros
*============================================================================*/
/** @defgroup GAP_GATT_SERVICE_Exported_Macros GAP and GATT Service Exported Macros
* @brief
* @{
*/
/** @defgroup GAPS_Write_PROPERTY GAP Service Write Property
* @brief GAP service write property.
* @{
*/
#define GAPS_PROPERTY_WRITE_DISABLE 0
#define GAPS_PROPERTY_WRITE_ENABLE 1
/** @} */
/** @defgroup GAPS_WRITE_TYPE GAP and GATT Service Write Type
* @brief GAP and GATT Service Write Type.
* @{
*/
#define GAPS_WRITE_DEVICE_NAME 1
#define GAPS_WRITE_APPEARANCE 2
#define GATT_SERVICE_CHANGE_CCCD_ENABLE 3
#define GATT_SERVICE_CHANGE_CCCD_DISABLE 4
#define GATT_SERVICE_WRITE_CLIENT_SUPPORTED_FEATURES 5
/** @} */
/** @brief GATT Service Client Supported Features bit field. */
#define GATTS_CLIENT_SUPPORTED_FEAUTRES_DEFAULT_VALUE 0x00 /**< Server shall not use any of the features associated with that bit when communicating with this client. */
#define GATTS_CLIENT_SUPPORTED_FEAUTRES_ROBUST_CACHING_BIT 0x01 /**< The client supports robust caching. */
#define GATTS_CLIENT_SUPPORTED_FEAUTRES_EATT_BEARER_BIT 0x02 /**< The client supports Enhanced ATT bearer. */
#define GATTS_CLIENT_SUPPORTED_FEAUTRES_MULTI_NOTIF_BIT 0x04 /**< The client supports receiving ATT_MULTIPLE_HANDLE_VALUE_NTF PDUs. */
/** End of GAP_GATT_SERVICE_Exported_Macros
* @}
*/
/*============================================================================*
* Types
*============================================================================*/
/** @defgroup GAP_GATT_SERVICE_Exported_Types GAP and GATT Service Exported Types
* @brief
* @{
*/
/** @brief GAPS parameter type */
typedef enum
{
GAPS_PARAM_DEVICE_NAME = 0x00,
GAPS_PARAM_APPEARANCE = 0x01,
#if F_BT_LE_PRIVACY_SUPPORT
GAPS_PARAM_CENTRAL_ADDRESS_RESOLUTION = 0x02,
#endif
GAPS_PARAM_DEVICE_NAME_PROPERTY = 0x03,
GAPS_PARAM_APPEARANCE_PROPERTY = 0x04,
} T_GAPS_PARAM_TYPE;
/** @brief Builtin services data struct for notification data to application. */
typedef struct
{
uint8_t opcode; //!< ref: @ref GAPS_WRITE_TYPE
uint16_t len;
uint8_t *p_value;
} T_GAPS_UPSTREAM_MSG_DATA;
/** @brief Builtin services callback data to inform application */
typedef struct
{
T_SERVICE_CALLBACK_TYPE msg_type;
uint8_t conn_id;
T_GAPS_UPSTREAM_MSG_DATA msg_data;
} T_GAPS_CALLBACK_DATA;
/** End of GAP_GATT_SERVICE_Exported_Types
* @}
*/
/*============================================================================*
* Functions
*============================================================================*/
/** @defgroup GAP_GATT_SERVICE_Exported_Functions GAP and GATT Service Exported Functions
* @brief
* @{
*/
/**
* @brief Register callback to builtin services.
*
* @param[in] p_func Callback to notify app.
* @return none.
*
* <b>Example usage</b>
* \code{.c}
void test(void)
{
uint8_t appearance_prop = GAPS_PROPERTY_WRITE_ENABLE;
uint8_t device_name_prop = GAPS_PROPERTY_WRITE_ENABLE;
gaps_set_parameter(GAPS_PARAM_APPEARANCE_PROPERTY, sizeof(appearance_prop), &appearance_prop);
gaps_set_parameter(GAPS_PARAM_DEVICE_NAME_PROPERTY, sizeof(device_name_prop), &device_name_prop);
gatt_register_callback(gap_service_callback);
}
T_APP_RESULT gap_service_callback(T_SERVER_ID service_id, void *p_para)
{
T_APP_RESULT result = APP_RESULT_SUCCESS;
T_GAPS_CALLBACK_DATA *p_gap_data = (T_GAPS_CALLBACK_DATA *)p_para;
APP_PRINT_INFO2("gap_service_callback conn_id = %d msg_type = %d\n", p_gap_data->conn_id,
p_gap_data->msg_type);
if (p_gap_data->msg_type == SERVICE_CALLBACK_TYPE_WRITE_CHAR_VALUE)
{
switch (p_gap_data->msg_data.opcode)
{
case GAPS_WRITE_DEVICE_NAME:
{
T_LOCAL_NAME device_name;
memcpy(device_name.local_name, p_gap_data->msg_data.p_value, p_gap_data->msg_data.len);
device_name.local_name[p_gap_data->msg_data.len] = 0;
flash_save_local_name(&device_name);
}
break;
case GAPS_WRITE_APPEARANCE:
{
uint16_t appearance_val;
T_LOCAL_APPEARANCE appearance;
LE_ARRAY_TO_UINT16(appearance_val, p_gap_data->msg_data.p_value);
appearance.local_appearance = appearance_val;
flash_save_local_appearance(&appearance);
}
break;
default:
break;
}
}
else if (p_gap_data->msg_type == SERVICE_CALLBACK_TYPE_INDIFICATION_NOTIFICATION)
{
if (p_gap_data->msg_data.opcode == GATT_SERVICE_CHANGE_CCCD_ENABLE)
{
APP_PRINT_INFO0("GATT_SERVICE_CHANGE_CCCD_ENABLE");
}
}
return result;
}
* \endcode
*/
void gatt_register_callback(void *p_func);
/**
* @brief Set GAP service parameter.
*
* @param[in] param_type parameter type to set: @ref T_GAPS_PARAM_TYPE
* @param[in] length value length to be set.
* @param[in] p_value value to set.
* @return parameter set result.
* @retval 0 false
* @retval 1 true
*
* <b>Example usage</b>
* \code{.c}
void test(void)
{
uint8_t appearance_prop = GAPS_PROPERTY_WRITE_ENABLE;
uint8_t device_name_prop = GAPS_PROPERTY_WRITE_ENABLE;
gaps_set_parameter(GAPS_PARAM_APPEARANCE_PROPERTY, sizeof(appearance_prop), &appearance_prop);
gaps_set_parameter(GAPS_PARAM_DEVICE_NAME_PROPERTY, sizeof(device_name_prop), &device_name_prop);
gatt_register_callback(gap_service_callback);
}
* \endcode
*/
bool gaps_set_parameter(T_GAPS_PARAM_TYPE param_type, uint8_t length, void *p_value);
/**
* @brief Set the preferred connection parameter.
*
* @param[in] conn_interval_min Defines minimum value for the connection interval in the
following manner:
connIntervalmin = Conn_Interval_Min * 1.25 ms
Conn_Interval_Min range: 0x0006 to 0x0C80
Value of 0xFFFF indicates no specific minimum.
Values outside the range (except 0xFFFF) are reserved for
future use.
* @param[in] conn_interval_max Defines maximum value for the connection interval in the
following manner:
connIntervalmax = Conn_Interval_Max * 1.25 ms
Conn_Interval_Max range: 0x0006 to 0x0C80
Shall be equal to or greater than the Conn_Interval_Min.
Value of 0xFFFF indicates no specific maximum.
Values outside the range (except 0xFFFF) are reserved for
future use.
* @param[in] slave_latency Defines the slave latency for the connection in number of
connection events.
Slave latency range: 0x0000 to 0x01F3
Values outside the range are reserved for future use.
* @param[in] supervision_timeout Defines the connection supervisor timeout multiplier as amultiple of 10ms.
Range: 0xFFFF indicates no specific value requested.
Range: 0x000A to 0x0C80
Time = N * 10 ms
Time Range: 100 ms to 32 seconds
Values outside the range (except 0xFFFF) are reserved for
future use.
* @return none
*/
void gaps_set_peripheral_preferred_conn_param(uint16_t conn_interval_min,
uint16_t conn_interval_max,
uint16_t slave_latency,
uint16_t supervision_timeout);
/**
* @brief Send service changed indication.
*
* @param[in] conn_id Connection id
* @param[in] start_handle Start of Affected Attribute Handle Range
* @param[in] end_handle End of Affected Attribute Handle Range
* @return parameter set result.
* @retval 0 false
* @retval 1 true
*
* <b>Example usage</b>
* \code{.c}
void test(void)
{
uint8_t conn_id = 0;
uint16_t start_handle = 0x05;
uint16_t end_handle = 0xFF;
gatts_service_changed_indicate(conn_id, start_handle, end_handle);
}
* \endcode
*/
bool gatts_service_changed_indicate(uint8_t conn_id, uint16_t start_handle, uint16_t end_handle);
/** End of GAP_GATT_SERVICE_Exported_Functions
* @}
*/
/** End of GAP_GATT_SERVICE
* @}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _BUILTIN_SERVICES_H_ */