#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_ */