131 lines
3.8 KiB
C
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
|
|
};
|
|
|