pinebuds/services/ble_profiles/prf/prf.c

895 lines
23 KiB
C

/**
****************************************************************************************
* @addtogroup PRF
* @{
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "rwip_config.h"
#if (BLE_PROFILES)
#include "prf.h"
#include "att.h"
#if (BLE_HT_THERMOM)
extern const struct prf_task_cbs* htpt_prf_itf_get(void);
#endif // (BLE_HT_THERMOM)
#if (BLE_HT_COLLECTOR)
extern const struct prf_task_cbs* htpc_prf_itf_get(void);
#endif // (BLE_HT_COLLECTOR)
#if (BLE_DIS_SERVER)
extern const struct prf_task_cbs* diss_prf_itf_get(void);
#endif // (BLE_HT_THERMOM)
#if (BLE_DIS_CLIENT)
extern const struct prf_task_cbs* disc_prf_itf_get(void);
#endif // (BLE_DIS_CLIENT)
#if (BLE_BP_SENSOR)
extern const struct prf_task_cbs* blps_prf_itf_get(void);
#endif // (BLE_BP_SENSOR)
#if (BLE_BP_COLLECTOR)
extern const struct prf_task_cbs* blpc_prf_itf_get(void);
#endif // (BLE_BP_COLLECTOR)
#if (BLE_TIP_SERVER)
extern const struct prf_task_cbs* tips_prf_itf_get(void);
#endif // (BLE_TIP_SERVER)
#if (BLE_TIP_CLIENT)
extern const struct prf_task_cbs* tipc_prf_itf_get(void);
#endif // (BLE_TIP_CLIENT)
#if (BLE_HR_SENSOR)
extern const struct prf_task_cbs* hrps_prf_itf_get(void);
#endif // (BLE_HR_SENSOR)
#if (BLE_HR_COLLECTOR)
extern const struct prf_task_cbs* hrpc_prf_itf_get(void);
#endif // (BLE_HR_COLLECTOR)
#if (BLE_FINDME_LOCATOR)
extern const struct prf_task_cbs* findl_prf_itf_get(void);
#endif // (BLE_FINDME_LOCATOR)
#if (BLE_FINDME_TARGET)
extern const struct prf_task_cbs* findt_prf_itf_get(void);
#endif // (BLE_FINDME_TARGET)
#if (BLE_PROX_MONITOR)
extern const struct prf_task_cbs* proxm_prf_itf_get(void);
#endif // (BLE_PROX_MONITOR)
#if (BLE_PROX_REPORTER)
extern const struct prf_task_cbs* proxr_prf_itf_get(void);
#endif // (BLE_PROX_REPORTER)
#if (BLE_SP_CLIENT)
extern const struct prf_task_cbs* scppc_prf_itf_get(void);
#endif // (BLE_SP_CLENT)
#if (BLE_SP_SERVER)
extern const struct prf_task_cbs* scpps_prf_itf_get(void);
#endif // (BLE_SP_SERVER)
#if (BLE_BATT_CLIENT)
extern const struct prf_task_cbs* basc_prf_itf_get(void);
#endif // (BLE_BATT_CLIENT)
#if (BLE_BATT_SERVER)
extern const struct prf_task_cbs* bass_prf_itf_get(void);
#endif // (BLE_BATT_SERVER)
#if (BLE_HID_DEVICE)
extern const struct prf_task_cbs* hogpd_prf_itf_get(void);
#endif // (BLE_HID_DEVICE)
#if (BLE_HID_BOOT_HOST)
extern const struct prf_task_cbs* hogpbh_prf_itf_get(void);
#endif // (BLE_HID_BOOT_HOST)
#if (BLE_HID_REPORT_HOST)
extern const struct prf_task_cbs* hogprh_prf_itf_get(void);
#endif // (BLE_HID_REPORT_HOST)
#if (BLE_GL_COLLECTOR)
extern const struct prf_task_cbs* glpc_prf_itf_get(void);
#endif // (BLE_GL_COLLECTOR)
#if (BLE_GL_SENSOR)
extern const struct prf_task_cbs* glps_prf_itf_get(void);
#endif // (BLE_GL_SENSOR)
#if (BLE_RSC_COLLECTOR)
extern const struct prf_task_cbs* rscpc_prf_itf_get(void);
#endif // (BLE_RSC_COLLECTOR)
#if (BLE_RSC_SENSOR)
extern const struct prf_task_cbs* rscps_prf_itf_get(void);
#endif // (BLE_RSC_COLLECTOR)
#if (BLE_CSC_COLLECTOR)
extern const struct prf_task_cbs* cscpc_prf_itf_get(void);
#endif // (BLE_CSC_COLLECTOR)
#if (BLE_CSC_SENSOR)
extern const struct prf_task_cbs* cscps_prf_itf_get(void);
#endif // (BLE_CSC_COLLECTOR)
#if (BLE_AN_CLIENT)
extern const struct prf_task_cbs* anpc_prf_itf_get(void);
#endif // (BLE_AN_CLIENT)
#if (BLE_AN_SERVER)
extern const struct prf_task_cbs* anps_prf_itf_get(void);
#endif // (BLE_AN_SERVER)
#if (BLE_PAS_CLIENT)
extern const struct prf_task_cbs* paspc_prf_itf_get(void);
#endif // (BLE_PAS_CLIENT)
#if (BLE_PAS_SERVER)
extern const struct prf_task_cbs* pasps_prf_itf_get(void);
#endif // (BLE_PAS_SERVER)
#if (BLE_CP_COLLECTOR)
extern const struct prf_task_cbs* cppc_prf_itf_get(void);
#endif //(BLE_CP_COLLECTOR)
#if (BLE_CP_SENSOR)
extern const struct prf_task_cbs* cpps_prf_itf_get(void);
#endif //(BLE_CP_SENSOR)
#if (BLE_LN_COLLECTOR)
extern const struct prf_task_cbs* lanc_prf_itf_get(void);
#endif //(BLE_CP_COLLECTOR)
#if (BLE_LN_SENSOR)
extern const struct prf_task_cbs* lans_prf_itf_get(void);
#endif //(BLE_CP_SENSOR)
#if (BLE_IPS_SERVER)
extern const struct prf_task_cbs* ipss_prf_itf_get(void);
#endif //(BLE_IPS_SERVER)
#if (BLE_IPS_CLIENT)
extern const struct prf_task_cbs* ipsc_prf_itf_get(void);
#endif //(BLE_IPS_CLIENT)
#if (BLE_ENV_SERVER)
extern const struct prf_task_cbs* envs_prf_itf_get(void);
#endif //(BLE_ENV_SERVER)
#if (BLE_ENV_CLIENT)
extern const struct prf_task_cbs* envc_prf_itf_get(void);
#endif //(BLE_ENV_CLIENT
#if (BLE_WSC_SERVER)
extern const struct prf_task_cbs* wscs_prf_itf_get(void);
#endif //(BLE_WSC_SERVER)
#if (BLE_WSC_CLIENT)
extern const struct prf_task_cbs* wscc_prf_itf_get(void);
#endif //(BLE_WSC_CLIENT
#if (BLE_BCS_SERVER)
extern const struct prf_task_cbs* bcss_prf_itf_get(void);
#endif //(BLE_BCS_SERVER)
#if (BLE_BCS_CLIENT)
extern const struct prf_task_cbs* bcsc_prf_itf_get(void);
#endif //(BLE_BCS_CLIENT)
#ifdef BLE_AM0_HEARING_AID_SERV
extern const struct prf_task_cbs* am0_has_prf_itf_get(void);
#endif // BLE_AM0_HEARING_AID_SERV
#if (BLE_UDS_SERVER)
extern const struct prf_task_cbs* udss_prf_itf_get(void);
#endif //(BLE_UDS_SERVER)
#if (BLE_UDS_CLIENT)
extern const struct prf_task_cbs* udsc_prf_itf_get(void);
#endif //(BLE_UDS_CLIENT)
#if (BLE_VOICEPATH)
extern const struct prf_task_cbs* voicepath_prf_itf_get(void);
#endif //(BLE_VOICEPATH)
#if (BLE_DATAPATH_SERVER)
extern const struct prf_task_cbs* datapathps_prf_itf_get(void);
#endif //(BLE_DATAPATH_SERVER)
#if (BLE_OTA)
extern const struct prf_task_cbs* ota_prf_itf_get(void);
#endif //(BLE_OTA)
#if (BLE_TOTA)
extern const struct prf_task_cbs* tota_prf_itf_get(void);
#endif //(BLE_TOTA)
#if (BLE_BMS)
extern const struct prf_task_cbs* bms_prf_itf_get(void);
#endif //(BLE_BMS)
#if (BLE_ANC_CLIENT)
extern const struct prf_task_cbs* ancc_prf_itf_get(void);
#endif //(BLE_ANC_CLIENT)
#if (BLE_AMS_CLIENT)
extern const struct prf_task_cbs* amsc_prf_itf_get(void);
#endif //(BLE_AMS_CLIENT)
#if (BLE_GFPS_PROVIDER)
extern const struct prf_task_cbs* gfpsp_prf_itf_get(void);
#endif //(BLE_GFPS_PROVIDER)
#ifdef BLE_AI_VOICE
extern const struct prf_task_cbs* ai_prf_itf_get(void);
#endif
#if (ANCS_PROXY_ENABLE)
extern const struct prf_task_cbs* ancs_proxy_prf_itf_get(void);
extern const struct prf_task_cbs* ams_proxy_prf_itf_get(void);
#endif
#if (BLE_TILE)
extern const struct prf_task_cbs* tile_prf_itf_get(void);
#endif //(BLE_TILE)
/*
* TYPE DEFINITIONS
****************************************************************************************
*/
/*
* DEFINES
****************************************************************************************
*/
/*
* MACROS
****************************************************************************************
*/
/*
* GLOBAL VARIABLE DEFINITIONS
****************************************************************************************
*/
struct prf_env_tag prf_env;
/*
* LOCAL FUNCTIONS DEFINITIONS
****************************************************************************************
*/
/**
****************************************************************************************
* @brief Retrieve profile interface
****************************************************************************************
*/
static const struct prf_task_cbs * prf_itf_get(uint16_t task_id)
{
const struct prf_task_cbs* prf_cbs = NULL;
BLE_DBG(">>>>>> prf_itf_get task_id: %d task_id %d<<<<<<\n", KE_TYPE_GET(task_id), task_id);
switch(KE_TYPE_GET(task_id))
{
#if (BLE_HT_THERMOM)
case TASK_ID_HTPT:
prf_cbs = htpt_prf_itf_get();
break;
#endif // (BLE_HT_THERMOM)
#if (BLE_HT_COLLECTOR)
case TASK_ID_HTPC:
prf_cbs = htpc_prf_itf_get();
break;
#endif // (BLE_HT_COLLECTOR)
#if (BLE_DIS_SERVER)
case TASK_ID_DISS:
prf_cbs = diss_prf_itf_get();
break;
#endif // (BLE_DIS_SERVER)
#if (BLE_DIS_CLIENT)
case TASK_ID_DISC:
prf_cbs = disc_prf_itf_get();
break;
#endif // (BLE_DIS_CLIENT)
#if (BLE_BP_SENSOR)
case TASK_ID_BLPS:
prf_cbs = blps_prf_itf_get();
break;
#endif // (BLE_BP_SENSOR)
#if (BLE_BP_COLLECTOR)
case TASK_ID_BLPC:
prf_cbs = blpc_prf_itf_get();
break;
#endif // (BLE_BP_COLLECTOR)
#if (BLE_TIP_SERVER)
case TASK_ID_TIPS:
prf_cbs = tips_prf_itf_get();
break;
#endif // (BLE_TIP_SERVER)
#if (BLE_TIP_CLIENT)
case TASK_ID_TIPC:
prf_cbs = tipc_prf_itf_get();
break;
#endif // (BLE_TIP_CLIENT)
#if (BLE_HR_SENSOR)
case TASK_ID_HRPS:
prf_cbs = hrps_prf_itf_get();
break;
#endif // (BLE_HR_SENSOR)
#if (BLE_HR_COLLECTOR)
case TASK_ID_HRPC:
prf_cbs = hrpc_prf_itf_get();
break;
#endif // (BLE_HR_COLLECTOR)
#if (BLE_FINDME_LOCATOR)
case TASK_ID_FINDL:
prf_cbs = findl_prf_itf_get();
break;
#endif // (BLE_FINDME_LOCATOR)
#if (BLE_FINDME_TARGET)
case TASK_ID_FINDT:
prf_cbs = findt_prf_itf_get();
break;
#endif // (BLE_FINDME_TARGET)
#if (BLE_PROX_MONITOR)
case TASK_ID_PROXM:
prf_cbs = proxm_prf_itf_get();
break;
#endif // (BLE_PROX_MONITOR)
#if (BLE_PROX_REPORTER)
case TASK_ID_PROXR:
prf_cbs = proxr_prf_itf_get();
break;
#endif // (BLE_PROX_REPORTER)
#if (BLE_SP_SERVER)
case TASK_ID_SCPPS:
prf_cbs = scpps_prf_itf_get();
break;
#endif // (BLE_SP_SERVER)
#if (BLE_SP_CLIENT)
case TASK_ID_SCPPC:
prf_cbs = scppc_prf_itf_get();
break;
#endif // (BLE_SP_CLIENT)
#if (BLE_BATT_SERVER)
case TASK_ID_BASS:
prf_cbs = bass_prf_itf_get();
break;
#endif // (BLE_BATT_SERVER)
#if (BLE_BATT_CLIENT)
case TASK_ID_BASC:
prf_cbs = basc_prf_itf_get();
break;
#endif // (BLE_BATT_CLIENT)
#if (BLE_HID_DEVICE)
case TASK_ID_HOGPD:
prf_cbs = hogpd_prf_itf_get();
break;
#endif // (BLE_HID_DEVICE)
#if (BLE_HID_BOOT_HOST)
case TASK_ID_HOGPBH:
prf_cbs = hogpbh_prf_itf_get();
break;
#endif // (BLE_HID_BOOT_HOST)
#if (BLE_HID_REPORT_HOST)
case TASK_ID_HOGPRH:
prf_cbs = hogprh_prf_itf_get();
break;
#endif // (BLE_HID_REPORT_HOST)
#if (BLE_GL_COLLECTOR)
case TASK_ID_GLPC:
prf_cbs = glpc_prf_itf_get();
break;
#endif // (BLE_GL_COLLECTOR)
#if (BLE_GL_SENSOR)
case TASK_ID_GLPS:
prf_cbs = glps_prf_itf_get();
break;
#endif // (BLE_GL_SENSOR)
#if (BLE_RSC_COLLECTOR)
case TASK_ID_RSCPC:
prf_cbs = rscpc_prf_itf_get();
break;
#endif // (BLE_RSC_COLLECTOR)
#if (BLE_RSC_SENSOR)
case TASK_ID_RSCPS:
prf_cbs = rscps_prf_itf_get();
break;
#endif // (BLE_RSC_SENSOR)
#if (BLE_CSC_COLLECTOR)
case TASK_ID_CSCPC:
prf_cbs = cscpc_prf_itf_get();
break;
#endif // (BLE_CSC_COLLECTOR)
#if (BLE_CSC_SENSOR)
case TASK_ID_CSCPS:
prf_cbs = cscps_prf_itf_get();
break;
#endif // (BLE_CSC_SENSOR)
#if (BLE_CP_COLLECTOR)
case TASK_ID_CPPC:
prf_cbs = cppc_prf_itf_get();
break;
#endif // (BLE_CP_COLLECTOR)
#if (BLE_CP_SENSOR)
case TASK_ID_CPPS:
prf_cbs = cpps_prf_itf_get();
break;
#endif // (BLE_CP_SENSOR)
#if (BLE_LN_COLLECTOR)
case TASK_ID_LANC:
prf_cbs = lanc_prf_itf_get();
break;
#endif // (BLE_LN_COLLECTOR)
#if (BLE_LN_SENSOR)
case TASK_ID_LANS:
prf_cbs = lans_prf_itf_get();
break;
#endif // (BLE_LN_SENSOR)
#if (BLE_AN_CLIENT)
case TASK_ID_ANPC:
prf_cbs = anpc_prf_itf_get();
break;
#endif // (BLE_AN_CLIENT)
#if (BLE_AN_SERVER)
case TASK_ID_ANPS:
prf_cbs = anps_prf_itf_get();
break;
#endif // (BLE_AN_SERVER)
#if (BLE_PAS_CLIENT)
case TASK_ID_PASPC:
prf_cbs = paspc_prf_itf_get();
break;
#endif // (BLE_PAS_CLIENT)
#if (BLE_PAS_SERVER)
case TASK_ID_PASPS:
prf_cbs = pasps_prf_itf_get();
break;
#endif // (BLE_PAS_SERVER)
#ifdef BLE_AM0_HEARING_AID_SERV
case TASK_ID_AM0_HAS:
prf_cbs = am0_has_prf_itf_get();
break;
#endif // defined(BLE_AM0_HEARING_AID_SERV)
#if (BLE_IPS_SERVER)
case TASK_ID_IPSS:
prf_cbs = ipss_prf_itf_get();
break;
#endif //(BLE_IPS_SERVER)
#if (BLE_IPS_CLIENT)
case TASK_ID_IPSC:
prf_cbs = ipsc_prf_itf_get();
break;
#endif //(BLE_IPS_CLIENT)
#if (BLE_ENV_SERVER)
case TASK_ID_ENVS:
prf_cbs = envs_prf_itf_get();
break;
#endif //(BLE_ENV_SERVER)
#if (BLE_ENV_CLIENT)
case TASK_ID_ENVC:
prf_cbs = envc_prf_itf_get();
break;
#endif //(BLE_ENV_CLIENT
#if (BLE_WSC_SERVER)
case TASK_ID_WSCS:
prf_cbs = wscs_prf_itf_get();
break;
#endif //(BLE_WSC_SERVER)
#if (BLE_WSC_CLIENT)
case TASK_ID_WSCC:
prf_cbs = wscc_prf_itf_get();
break;
#endif //(BLE_WSC_CLIENT
#if (BLE_BCS_SERVER)
case TASK_ID_BCSS:
prf_cbs = bcss_prf_itf_get();
break;
#endif //(BLE_BCS_SERVER)
#if (BLE_BCS_CLIENT)
case TASK_ID_BCSC:
prf_cbs = bcsc_prf_itf_get();
break;
#endif //(BLE_BCS_CLIENT)
#if (BLE_UDS_SERVER)
case TASK_ID_UDSS:
prf_cbs = udss_prf_itf_get();
break;
#endif //(BLE_UDS_SERVER)
#if (BLE_UDS_CLIENT)
case TASK_ID_UDSC:
prf_cbs = udsc_prf_itf_get();
break;
#endif //(BLE_UDS_CLIENT)
#if (BLE_VOICEPATH)
case TASK_ID_VOICEPATH:
prf_cbs = voicepath_prf_itf_get();
break;
#endif //(TASK_ID_VOICEPATH)
#if (BLE_OTA)
case TASK_ID_OTA:
prf_cbs = ota_prf_itf_get();
break;
#endif //(BLE_OTA)
#if (BLE_TOTA)
case TASK_ID_TOTA:
prf_cbs = tota_prf_itf_get();
break;
#endif //(BLE_TOTA)
#if (BLE_BMS)
case TASK_ID_BMS:
prf_cbs = bms_prf_itf_get();
break;
#endif //(BLE_BMS)
#if (BLE_ANC_CLIENT)
case TASK_ID_ANCC:
prf_cbs = ancc_prf_itf_get();
break;
#endif //(BLE_ANC_CLIENT)
#if (BLE_AMS_CLIENT)
case TASK_ID_AMSC:
prf_cbs = amsc_prf_itf_get();
break;
#endif //(BLE_AMS_CLIENT)
#if (BLE_TILE)
case TASK_ID_TILE:
prf_cbs = tile_prf_itf_get();
break;
#endif //(TASK_ID_TILE)
#if (ANCS_PROXY_ENABLE)
case TASK_ID_ANCSP:
prf_cbs = ancs_proxy_prf_itf_get();
break;
case TASK_ID_AMSP:
prf_cbs = ams_proxy_prf_itf_get();
break;
#endif //(ANCS_PROXY_ENABLE)
#if (BLE_GFPS_PROVIDER)
case TASK_ID_GFPSP:
prf_cbs = gfpsp_prf_itf_get();
break;
#endif //(BLE_GFPS_PROVIDER)
#if (BLE_AI_VOICE)
case TASK_ID_AI:
prf_cbs = ai_prf_itf_get();
break;
#endif //(BLE_AMA)
#if (BLE_DATAPATH_SERVER)
case TASK_ID_DATAPATHPS:
prf_cbs = datapathps_prf_itf_get();
break;
#endif //(BLE_DATAPATH_SERVER)
default: /* Nothing to do */
break;
}
return prf_cbs;
}
/*
* EXPORTED FUNCTIONS DEFINITIONS
****************************************************************************************
*/
void prf_init(bool reset)
{
uint8_t i;
BLE_FUNC_ENTER();
BLE_DBG(">>>>>> prf_create reset %d<<<<<<\n", reset);
if (!reset)
{
// FW boot profile initialization
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
prf_env.prf[i].env = NULL;
prf_env.prf[i].task = TASK_GAPC + i +1;
prf_env.prf[i].id = TASK_ID_INVALID;
// Initialize Task Descriptor
prf_env.prf[i].desc.msg_handler_tab = NULL;
prf_env.prf[i].desc.state = NULL;
prf_env.prf[i].desc.idx_max = 0;
prf_env.prf[i].desc.msg_cnt = 0;
ke_task_create(prf_env.prf[i].task, &(prf_env.prf[i].desc));
BLE_DBG("prf_init prf_env.prf[%d].task: %d\n", i, prf_env.prf[i].task);
}
}
else
{
// FW boot profile destruction
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// Get Profile API
const struct prf_task_cbs * cbs = prf_itf_get(prf_env.prf[i].id);
if(cbs != NULL)
{
// request to destroy profile
cbs->destroy(&(prf_env.prf[i]));
}
// unregister profile
prf_env.prf[i].id = TASK_ID_INVALID;
prf_env.prf[i].desc.msg_handler_tab = NULL;
prf_env.prf[i].desc.state = NULL;
prf_env.prf[i].desc.idx_max = 0;
prf_env.prf[i].desc.msg_cnt = 0;
// Request kernel to flush task messages
ke_task_msg_flush(KE_TYPE_GET(prf_env.prf[i].task));
}
}
BLE_FUNC_LEAVE();
}
uint8_t prf_add_profile(struct gapm_profile_task_add_cmd * params, ke_task_id_t* prf_task)
{
uint8_t i;
uint8_t status = GAP_ERR_NO_ERROR;
BLE_DBG(">>>>>> prf_add_profile <<<<<<\n");
// retrieve profile callback
const struct prf_task_cbs * cbs = prf_itf_get(params->prf_task_id);
if(cbs == NULL)
{
// profile API not available
status = GAP_ERR_INVALID_PARAM;
}
// check if profile not already present in task list
if(status == GAP_ERR_NO_ERROR)
{
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
if(prf_env.prf[i].id == params->prf_task_id)
{
status = GAP_ERR_NOT_SUPPORTED;
break;
}
}
}
if(status == GAP_ERR_NO_ERROR)
{
// find first available task
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// available task found
if(prf_env.prf[i].id == TASK_ID_INVALID)
{
// initialize profile
status = cbs->init(&(prf_env.prf[i]), &(params->start_hdl), params->app_task, params->sec_lvl, params->param);
// initialization succeed
if(status == GAP_ERR_NO_ERROR)
{
// register profile
prf_env.prf[i].id = params->prf_task_id;
*prf_task = prf_env.prf[i].task;
}
break;
}
}
if(i == BLE_NB_PROFILES)
{
status = GAP_ERR_INSUFF_RESOURCES;
}
}
return (status);
}
void prf_create(uint8_t conidx)
{
uint8_t i;
/* simple connection creation handler, nothing to do. */
BLE_DBG(">>>>>> prf_create <<<<<<\n");
// execute create function of each profiles
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// Get Profile API
const struct prf_task_cbs * cbs = prf_itf_get(prf_env.prf[i].id);
if(cbs != NULL)
{
// call create callback
cbs->create(&(prf_env.prf[i]), conidx);
}
}
}
void prf_cleanup(uint8_t conidx, uint8_t reason)
{
uint8_t i;
/* simple connection creation handler, nothing to do. */
BLE_DBG(">>>>>> prf_cleanup <<<<<<\n");
// execute create function of each profiles
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// Get Profile API
const struct prf_task_cbs * cbs = prf_itf_get(prf_env.prf[i].id);
if(cbs != NULL)
{
// call cleanup callback
cbs->cleanup(&(prf_env.prf[i]), conidx, reason);
}
}
}
prf_env_t* prf_env_get(uint16_t prf_id)
{
prf_env_t* env = NULL;
uint8_t i;
// find if profile present in profile tasks
BLE_DBG("%s prf_id %d", __func__, prf_id);
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// check if profile identifier is known
if(prf_env.prf[i].id == prf_id)
{
env = prf_env.prf[i].env;
break;
}
}
return env;
}
ke_task_id_t prf_src_task_get(prf_env_t* env, uint8_t conidx)
{
ke_task_id_t task = PERM_GET(env->prf_task, PRF_TASK);
BLE_DBG("%s conidx %d", __func__, conidx);
if(PERM_GET(env->prf_task, PRF_MI))
{
task = KE_BUILD_ID(task, conidx);
}
return task;
}
ke_task_id_t prf_dst_task_get(prf_env_t* env, uint8_t conidx)
{
ke_task_id_t task = PERM_GET(env->app_task, PRF_TASK);
BLE_DBG("%s app_task %d conidx %d", __func__, env->app_task, conidx);
if(PERM_GET(env->app_task, PRF_MI))
{
task = KE_BUILD_ID(task, conidx);
}
return task;
}
ke_task_id_t prf_get_id_from_task(ke_msg_id_t task)
{
ke_task_id_t id = TASK_ID_INVALID;
uint8_t idx = KE_IDX_GET(task);
uint8_t i;
task = KE_TYPE_GET(task);
BLE_DBG("%s task %d", __func__, task);
// find if profile present in profile tasks
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// check if profile identifier is known
if(prf_env.prf[i].task == task)
{
id = prf_env.prf[i].id;
break;
}
}
return KE_BUILD_ID(id, idx);
}
ke_task_id_t prf_get_task_from_id(ke_msg_id_t id)
{
ke_task_id_t task = TASK_NONE;
uint8_t idx = KE_IDX_GET(id);
uint8_t i;
id = KE_TYPE_GET(id);
BLE_DBG("%s id %d", __func__, id);
// find if profile present in profile tasks
for(i = 0; i < BLE_NB_PROFILES ; i++)
{
// check if profile identifier is known
if(prf_env.prf[i].id == id)
{
task = prf_env.prf[i].task;
break;
}
}
return KE_BUILD_ID(task, idx);
}
#endif // (BLE_PROFILES)
/// @} PRF