/** ***************************************************************************************** * 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. * * Example usage * \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 * * Example usage * \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 * * Example usage * \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_ */