pinebuds/services/ble_stack/hl/inc/prf_utils.h

279 lines
10 KiB
C

#ifndef _PRF_UTILS_H_
#define _PRF_UTILS_H_
/**
****************************************************************************************
* @addtogroup PRF_UTILS
* @ingroup PROFILE
*
* @brief Definitions of shared profiles functions that can be used by several profiles
*
* @{
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "rwip_config.h"
#if (BLE_SERVER_PRF || BLE_CLIENT_PRF)
#include "ke_msg.h"
#include "prf_types.h"
#include "gattc_task.h"
#include "gapc.h"
#include "gapc_task.h"
#include "attm.h"
#include "prf.h"
#endif /* (BLE_SERVER_PRF || BLE_CLIENT_PRF) */
/*
* MACROS
****************************************************************************************
*/
/**
****************************************************************************************
* @brief Macro used to called the prf_client_get_env function.
*
* @param prf_id Profile Task ID (In Upper case, ex: HTPC, DISC, ...)
* @param type Profile task type (In lower case, ex: htpc, disc, ...)
****************************************************************************************
*/
#define PRF_ENV_GET(prf_id, type) \
((struct type ## _env_tag *)prf_env_get((TASK_ID_##prf_id)))
/*
* FUNCTION DECLARATIONS
****************************************************************************************
*/
#if (BLE_BATT_SERVER)
/**
****************************************************************************************
* @brief Pack Characteristic Presentation Format descriptor value
****************************************************************************************
*/
void prf_pack_char_pres_fmt(uint8_t *packed_val, const struct prf_char_pres_fmt* char_pres_fmt);
#endif // (BLE_BATT_SERVER)
#if (BLE_BATT_CLIENT)
/**
****************************************************************************************
* @brief Unpack Characteristic Presentation Format descriptor value
****************************************************************************************
*/
void prf_unpack_char_pres_fmt(const uint8_t *packed_val, struct prf_char_pres_fmt* char_pres_fmt);
#endif // (BLE_BATT_CLIENT)
#if (BLE_CLIENT_PRF)
/**
****************************************************************************************
* @brief Request peer device to read an attribute
*
* @param[in] prf_env Pointer to profile information
*
* @param conidx Connection index
* @param shdl Search Start Handle
* @param ehdl Search End Handle
*
* @param valhdl Value Handle
*
* @note: if attribute is invalid, nothing is registered
****************************************************************************************
*/
void prf_read_char_send(prf_env_t *prf_env, uint8_t conidx,
uint16_t shdl, uint16_t ehdl, uint16_t valhdl);
/**
****************************************************************************************
* @brief register attribute handle in GATT
*
* @param[in] prf_env Pointer to profile information
*
* @param conidx Connection index
* @param svc Service to register
*
* @note: if attribute is invalid, nothing is registered
****************************************************************************************
*/
void prf_register_atthdl2gatt(prf_env_t *prf_env, uint8_t conidx, struct prf_svc *svc);
/**
****************************************************************************************
* @brief Unregister attribute handle in GATT
*
* @param[in] prf_env Pointer to profile information
*
* @param conidx Connection index
* @param svc Service to register
*
* @note: if attribute is invalid, nothing is registered
****************************************************************************************
*/
void prf_unregister_atthdl2gatt(prf_env_t *prf_env, uint8_t conidx, struct prf_svc *svc);
/**
****************************************************************************************
* @brief Request service discovery on peer device.
*
* This request will be used to retrieve start and end handles of the service.
*
* @param[in] prf_env Pointer to profile information
*
* @param conidx Connection index
* @param uuid Service UUID
****************************************************************************************
*/
void prf_disc_svc_send(prf_env_t *prf_env,uint8_t conidx, uint16_t uuid);
/**
****************************************************************************************
* @brief Write peer characteristic using GATT.
*
* It will request write modification of peer handle
*
* @param[in] prf_env Pointer to profile information
* @param[in] conidx Connection index
* @param[in] handle Peer handle to modify
* @param[in] value New Peer handle value
* @param[in] length Value length
****************************************************************************************
*/
void prf_gatt_write(prf_env_t *prf_env, uint8_t conidx,
uint16_t handle, uint8_t* value, uint16_t length, uint8_t operation);
/**
****************************************************************************************
* @brief Modify peer client configuration descriptor using GATT
*
* It will request write modification of peer client configuration descriptor handle
*
* @param[in] prf_env Pointer to profile information
*
* @param[in] conidx Connection index
* @param[in] handle Peer client configuration descriptor handle to modify
*
* @param[in] ntf_ind_cfg Indication/Notification configuration
****************************************************************************************
*/
void prf_gatt_write_ntf_ind(prf_env_t *prf_env, uint8_t conidx, uint16_t handle,
uint16_t ntf_ind_cfg);
/**
****************************************************************************************
* @brief Check service characteristic validity
*
* For each characteristic in service it verifies handles.
*
* If some handles are not present, it checks if they shall be present or they are optional.
*
* @param nb_chars Number of Characteristics in the service
* @param chars Characteristics values (char handles, val handles, properties)
* @param chars_req Characteristics requirements.
*
* @return 0x1 if service is valid, 0x00 else.
****************************************************************************************
*/
uint8_t prf_check_svc_char_validity(uint8_t nb_chars,
const struct prf_char_inf* chars,
const struct prf_char_def* chars_req);
/**
****************************************************************************************
* @brief Check service characteristic descriptors validity
*
* For each characteristic descriptors in service it verifies handles.
*
* If some handles are not present, according to characteristic properties it verify if
* descriptor is optional or not.
*
* @param descs_size Number of Characteristic descriptors in the service
* @param descs Characteristic descriptors values (handles)
* @param descs_req Characteristics descriptors requirements.
*
* @return 0x1 if service is valid, 0x00 else.
****************************************************************************************
*/
uint8_t prf_check_svc_char_desc_validity(uint8_t descs_size,
const struct prf_char_desc_inf* descs,
const struct prf_char_desc_def* descs_req,
const struct prf_char_inf* chars);
/**
****************************************************************************************
* @brief Extract information of the service according to the service description
*
* @param param Service information
* @param nb_chars Length of provided arrays (chars and chars_req)
* @param chars_req Characteristics requirements
* @param chars Characteristics
* @param nb_descs Length of provided arrays (descs and descs_req)
* @param descs_req Descriptors requirements
* @param descs Descriptors
****************************************************************************************
*/
void prf_extract_svc_info(const struct gattc_sdp_svc_ind* param,
uint8_t nb_chars, const struct prf_char_def* chars_req, struct prf_char_inf* chars,
uint8_t nb_descs, const struct prf_char_desc_def* descs_req, struct prf_char_desc_inf* descs);
#endif //(BLE_CLIENT_PRF)
#if (BLE_CLIENT_PRF || BLE_TIP_SERVER || BLE_AN_SERVER || BLE_PAS_SERVER)
/**
****************************************************************************************
* @brief The function is used to send information about peer attribute value
*
* @param[in] prf_env Pointer to the profile environment variable
* @param[in] conidx Connection index
* @param[in] msg_id Profile message ID to trigger
* @param[in] status Response status code
* @param[in] read_ind GATT read message indication
****************************************************************************************
*/
void prf_client_att_info_rsp(prf_env_t *prf_env, uint8_t conidx, uint16_t msg_id,
uint8_t status, struct gattc_read_ind const* read_ind);
#endif //(BLE_CLIENT_PRF || BLE_TIP_SERVER || BLE_AN_SERVER || BLE_PAS_SERVER)
#if (BLE_SERVER_PRF || BLE_CLIENT_PRF)
/**
****************************************************************************************
* @brief Pack date time value
*
* @param[out] packed_date packed date time
* @param[in] date_time structure date time
*
* @return size of packed value
****************************************************************************************
*/
uint8_t prf_pack_date_time(uint8_t *packed_date, const struct prf_date_time* date_time);
/**
****************************************************************************************
* @brief Unpack date time value
*
* @param[in] packed_date packed date time
* @param[out] date_time structure date time
*
* @return size of packed value
****************************************************************************************
*/
uint8_t prf_unpack_date_time(uint8_t *packed_date, struct prf_date_time* date_time);
#endif /* (BLE_SERVER_PRF || BLE_CLIENT_PRF) */
/// @} prf_utils
#endif /* _PRF_UTILS_H_ */