110 lines
3.6 KiB
C
110 lines
3.6 KiB
C
#include "app_ble_profiles/app_ble_diss.h"
|
|
|
|
/* Stack configuration */
|
|
#include "rwip_config.h"
|
|
|
|
/* BLE Stack */
|
|
#include "ns_ble.h"
|
|
|
|
/* Profile */
|
|
#include "diss.h"
|
|
#include "diss_task.h"
|
|
|
|
static int app_ble_diss_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);
|
|
|
|
static const struct ke_msg_handler app_diss_msg_handler_list[] = {
|
|
{DISS_VALUE_REQ_IND, (ke_msg_func_t)app_ble_diss_handler},
|
|
};
|
|
|
|
static const struct app_subtask_handlers app_diss_handlers = APP_HANDLERS(app_diss);
|
|
|
|
void app_ble_diss_init(void) {
|
|
struct diss_db_cfg *db_cfg;
|
|
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));
|
|
req->operation = GAPM_PROFILE_TASK_ADD;
|
|
req->sec_lvl = PERM(SVC_AUTH, NO_AUTH);
|
|
req->prf_task_id = TASK_ID_DISS;
|
|
req->app_task = TASK_APP;
|
|
req->start_hdl = 0;
|
|
|
|
db_cfg = (struct diss_db_cfg *)req->param;
|
|
db_cfg->features = APP_DISS_FEATURES;
|
|
|
|
ke_msg_send(req);
|
|
|
|
struct prf_task_t prf;
|
|
prf.prf_task_id = TASK_ID_DISS;
|
|
prf.prf_task_handler = &app_diss_handlers;
|
|
ns_ble_prf_task_register(&prf);
|
|
|
|
struct prf_get_func_t get_func;
|
|
get_func.task_id = TASK_ID_DISS;
|
|
get_func.prf_itf_get_func = diss_prf_itf_get;
|
|
prf_get_itf_func_register(&get_func);
|
|
}
|
|
|
|
static int app_ble_diss_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:
|
|
len = APP_DISS_MANUFACTURER_NAME_LEN;
|
|
data = (uint8_t *)APP_DISS_MANUFACTURER_NAME;
|
|
break;
|
|
case DIS_MODEL_NB_STR_CHAR:
|
|
len = APP_DISS_MODEL_NB_STR_LEN;
|
|
data = (uint8_t *)APP_DISS_MODEL_NB_STR;
|
|
break;
|
|
case DIS_SYSTEM_ID_CHAR:
|
|
len = APP_DISS_SYSTEM_ID_LEN;
|
|
data = (uint8_t *)APP_DISS_SYSTEM_ID;
|
|
break;
|
|
case DIS_PNP_ID_CHAR:
|
|
len = APP_DISS_PNP_ID_LEN;
|
|
data = (uint8_t *)APP_DISS_PNP_ID;
|
|
break;
|
|
case DIS_SERIAL_NB_STR_CHAR:
|
|
len = APP_DISS_SERIAL_NB_STR_LEN;
|
|
data = (uint8_t *)APP_DISS_SERIAL_NB_STR;
|
|
break;
|
|
case DIS_HARD_REV_STR_CHAR:
|
|
len = APP_DISS_HARD_REV_STR_LEN;
|
|
data = (uint8_t *)APP_DISS_HARD_REV_STR;
|
|
break;
|
|
case DIS_FIRM_REV_STR_CHAR:
|
|
len = APP_DISS_FIRM_REV_STR_LEN;
|
|
data = (uint8_t *)APP_DISS_FIRM_REV_STR;
|
|
break;
|
|
case DIS_SW_REV_STR_CHAR:
|
|
len = APP_DISS_SW_REV_STR_LEN;
|
|
data = (uint8_t *)APP_DISS_SW_REV_STR;
|
|
break;
|
|
case DIS_IEEE_CHAR:
|
|
len = APP_DISS_IEEE_LEN;
|
|
data = (uint8_t *)APP_DISS_IEEE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
struct diss_value_cfm *cfm_value = KE_MSG_ALLOC_DYN(DISS_VALUE_CFM, src_id, dest_id, diss_value_cfm, len);
|
|
|
|
cfm_value->value = param->value;
|
|
cfm_value->length = len;
|
|
|
|
if (len) {
|
|
memcpy(&cfm_value->data[0], data, len);
|
|
}
|
|
ke_msg_send(cfm_value);
|
|
|
|
return (KE_MSG_CONSUMED);
|
|
}
|