mcu_hi3321_watch/tjd/ble/protocol/ble_personal_info_server.c
2025-05-26 20:15:20 +08:00

131 lines
3.8 KiB
C

/*----------------------------------------------------------------------------
* 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
};