/*---------------------------------------------------------------------------- * Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved. * * Description: ble_personal_info_server.c * * Author: shey.tanxiaoyu * * Create: 2021-09-13 *--------------------------------------------------------------------------*/ #include "ble_personal_info_server.h" #include "ble_data_transmission.h" #include "health_api.h" /* 设置用户信息 */ void ble_set_personal_info(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; user_info_t user_info = {0}; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch ((data_info.type & 0x7F)) { case USER_GENDER_TYPE: user_info.gender = *in_data; break; case USER_AGE_TYPE: user_info.age = *in_data; break; case USER_HEIGHT_TYPE: user_info.height = *in_data; break; case USER_WEIGHT_TYPE: user_info.weight += (*in_data++) << 8; user_info.weight += (*in_data); health_api_user_info_set(&user_info); break; default: break; } in_data = data_info.p_data; in_data += (data_info.len); in_len -= (2 + data_info.len); if (in_len > FRAM_MAX_SIZ) { in_len = 0; } } while (in_len); write_idx = user_set_protocol_error(out_data, PERSON_INFO_SERVER, data_info.error); *out_len = write_idx; } /* 获取用户信息 */ void ble_get_personal_info(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { Ltv_t ltv_array[4] = {0}; FrameInfo_t frame_info = {0}; user_info_t *user_info = health_api_get_user_info(); ltv_array[0].len = 3; ltv_array[0].type = USER_GENDER_TYPE; ltv_array[0].value = user_info->gender; ltv_array[1].len = 3; ltv_array[1].type = USER_AGE_TYPE; ltv_array[1].value = user_info->age; ltv_array[2].len = 3; ltv_array[2].type = USER_HEIGHT_TYPE; ltv_array[2].value = user_info->height; ltv_array[3].len = 4; ltv_array[3].type = USER_WEIGHT_TYPE; ltv_array[3].value = user_info->weight; frame_info.serviceId = PERSON_INFO_SERVER; frame_info.commandId = GET_PERSONAL_INFO_ID; frame_info.frameType.value = 0; BLE_SendLtvArray(&frame_info, ltv_array, 4); *out_len = 0; } /* 设置日常步数目标 */ void ble_set_daily_step_goal(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint32_t remind_value = 0; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch ((data_info.type & 0x7F)) { case DAILY_STEP_GOAL_TYPE: remind_value += (*in_data++) << 8; remind_value += (*in_data); health_api_set_goal_step_th(remind_value); break; default: break; } in_data = data_info.p_data; in_data += (data_info.len); in_len -= (2 + data_info.len); if (in_len > FRAM_MAX_SIZ) { in_len = 0; } } while (in_len); write_idx = user_set_protocol_error(out_data, PERSON_INFO_SERVER, data_info.error); *out_len = write_idx; } const p_func_t personal_info_server_func[PERSONAL_INFO_SERVER_MAX_ID] = { user_null_func, ble_set_personal_info, //4.3.1 ble_get_personal_info, //4.3.2 ble_set_daily_step_goal, //4.3.3 };