pinebuds/services/ble_app/app_dis/app_dis.c
2022-08-15 17:20:27 +08:00

198 lines
5.6 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
/**
****************************************************************************************
* @addtogroup APP
* @{
****************************************************************************************
*/
#include "rwip_config.h" // SW configuration
#if (BLE_APP_DIS)
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "app.h" // Application Manager Definitions
#include "app_dis.h" // Device Information Service Application Definitions
#include "diss_task.h" // Device Information Profile Functions
#include "prf_types.h" // Profile Common Types Definitions
#include "gapm_task.h" // GAP Manager Task API
#include <string.h>
/*
* LOCAL FUNCTION DEFINITIONS
****************************************************************************************
*/
static int diss_value_req_ind_handler(ke_msg_id_t const msgid,
struct diss_value_req_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
// Initialize length
uint8_t len = 0;
// Pointer to the data
uint8_t *data = NULL;
// Check requested value
switch (param->value)
{
case DIS_MANUFACTURER_NAME_CHAR:
{
// Set information
len = APP_DIS_MANUFACTURER_NAME_LEN;
data = (uint8_t *)APP_DIS_MANUFACTURER_NAME;
} break;
case DIS_MODEL_NB_STR_CHAR:
{
// Set information
len = APP_DIS_MODEL_NB_STR_LEN;
data = (uint8_t *)APP_DIS_MODEL_NB_STR;
} break;
case DIS_SYSTEM_ID_CHAR:
{
// Set information
len = APP_DIS_SYSTEM_ID_LEN;
data = (uint8_t *)APP_DIS_SYSTEM_ID;
} break;
case DIS_PNP_ID_CHAR:
{
// Set information
len = APP_DIS_PNP_ID_LEN;
data = (uint8_t *)APP_DIS_PNP_ID;
} break;
case DIS_SERIAL_NB_STR_CHAR:
{
// Set information
len = APP_DIS_SERIAL_NB_STR_LEN;
data = (uint8_t *)APP_DIS_SERIAL_NB_STR;
} break;
case DIS_HARD_REV_STR_CHAR:
{
// Set information
len = APP_DIS_HARD_REV_STR_LEN;
data = (uint8_t *)APP_DIS_HARD_REV_STR;
} break;
case DIS_FIRM_REV_STR_CHAR:
{
// Set information
len = APP_DIS_FIRM_REV_STR_LEN;
data = (uint8_t *)APP_DIS_FIRM_REV_STR;
} break;
case DIS_SW_REV_STR_CHAR:
{
// Set information
len = APP_DIS_SW_REV_STR_LEN;
data = (uint8_t *)APP_DIS_SW_REV_STR;
} break;
case DIS_IEEE_CHAR:
{
// Set information
len = APP_DIS_IEEE_LEN;
data = (uint8_t *)APP_DIS_IEEE;
} break;
default:
ASSERT_ERR(0);
break;
}
// Allocate confirmation to send the value
struct diss_value_cfm *cfm_value = KE_MSG_ALLOC_DYN(DISS_VALUE_CFM,
src_id, dest_id,
diss_value_cfm,
len);
// Set parameters
cfm_value->value = param->value;
cfm_value->length = len;
if (len)
{
// Copy data
memcpy(&cfm_value->data[0], data, len);
}
// Send message
ke_msg_send(cfm_value);
return (KE_MSG_CONSUMED);
}
/*
* GLOBAL FUNCTION DEFINITIONS
****************************************************************************************
*/
void app_dis_init(void)
{
// Nothing to do
}
void app_dis_add_dis(void)
{
struct diss_db_cfg* db_cfg;
// Allocate the DISS_CREATE_DB_REQ
struct gapm_profile_task_add_cmd *req = KE_MSG_ALLOC_DYN(GAPM_PROFILE_TASK_ADD_CMD,
TASK_GAPM, TASK_APP,
gapm_profile_task_add_cmd, sizeof(struct diss_db_cfg));
// Fill message
req->operation = GAPM_PROFILE_TASK_ADD;
#if BLE_CONNECTION_MAX>1
req->sec_lvl = PERM(SVC_AUTH, ENABLE)|PERM(SVC_MI, ENABLE);
#else
req->sec_lvl = PERM(SVC_AUTH, ENABLE);
#endif
req->prf_task_id = TASK_ID_DISS;
req->app_task = TASK_APP;
req->start_hdl = 0;
// Set parameters
db_cfg = (struct diss_db_cfg* ) req->param;
db_cfg->features = APP_DIS_FEATURES;
// Send the message
ke_msg_send(req);
}
/*
* GLOBAL VARIABLE DEFINITIONS
****************************************************************************************
*/
/// Default State handlers definition
const struct ke_msg_handler app_dis_msg_handler_list[] =
{
{DISS_VALUE_REQ_IND, (ke_msg_func_t)diss_value_req_ind_handler},
};
const struct ke_state_handler app_dis_table_handler =
{&app_dis_msg_handler_list[0], (sizeof(app_dis_msg_handler_list)/sizeof(struct ke_msg_handler))};
#endif //BLE_APP_DIS
/// @} APP