226 lines
6.8 KiB
C
226 lines
6.8 KiB
C
/*----------------------------------------------------------------------------
|
|
* Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved.
|
|
*
|
|
* Description: ble_heart_rate_server.c
|
|
*
|
|
* Author: shey.tanxiaoyu
|
|
*
|
|
* Create: 2021-09-13
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#include "ble_heart_rate_server.h"
|
|
#include "ble_data_transmission.h"
|
|
#include "health_api.h"
|
|
#include "exercise_api.h"
|
|
#include "ui_event.h"
|
|
#include "task_ui.h"
|
|
|
|
/* 4.5.1 设置连续心率测量开关 */
|
|
void ble_set_hr_continue_measure_switch(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};
|
|
uint8_t hr_continue_measure_switch = 0;
|
|
|
|
data_info.error = FENDA_SUCCESS;
|
|
do {
|
|
user_get_data_info(&data_info, &in_data, &in_len);
|
|
switch ((data_info.type & 0x7F)) {
|
|
case HR_CONTINUE_MEASURE_TYPE:
|
|
hr_continue_measure_switch = *in_data;
|
|
health_api_set_hr_cont_measure_sw(hr_continue_measure_switch);
|
|
task_ui_notify(EVENT_HEARTRATE_MEASURE_SWITCH, 0, NULL, NULL);
|
|
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, HEART_RATE_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
|
|
/* 4.5.2 心率升高提醒设置 */
|
|
void ble_set_hr_continue_upper_remind(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};
|
|
uint8_t remind_switch = 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 HR_UPPER_REMIND_SWITCH_TYPE:
|
|
remind_switch = *in_data;
|
|
break;
|
|
|
|
case HR_UPPER_REMIND_THRESHOLD_TYPE:
|
|
remind_value = *in_data;
|
|
health_api_set_hr_upper_remind(remind_switch, 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, HEART_RATE_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
/* 4.5.3 心率降低提醒设置 */
|
|
void ble_set_hr_continue_lower_remind(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};
|
|
uint8_t remind_switch = 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 HR_LOWER_REMIND_SWITCH_TYPE:
|
|
remind_switch = *in_data;
|
|
break;
|
|
|
|
case HR_LOWER_REMIND_THRESHOLD_TYPE:
|
|
remind_value = *in_data;
|
|
health_api_set_hr_lower_remind(remind_switch, 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, HEART_RATE_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
/* 4.5.4 获取心率升高/降低告警值 */
|
|
void ble_get_hr_alarm_record(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/* 4.5.5 设置心率区间参数 */
|
|
void ble_set_hr_zone(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};
|
|
exercise_hr_zone_cfg_t hr_zone_cfg;
|
|
|
|
data_info.error = FENDA_SUCCESS;
|
|
do {
|
|
user_get_data_info(&data_info, &in_data, &in_len);
|
|
switch (data_info.type & 0x7F) {
|
|
case 0x01:
|
|
hr_zone_cfg.hr_warn_sw = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x02:
|
|
hr_zone_cfg.hr_normal_upper_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x03:
|
|
hr_zone_cfg.hr_normal_max_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x04:
|
|
hr_zone_cfg.hr_warm_lower_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x05:
|
|
hr_zone_cfg.hr_warm_upper_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x06:
|
|
hr_zone_cfg.hr_fat_lower_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x07:
|
|
hr_zone_cfg.hr_fat_upper_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x08:
|
|
hr_zone_cfg.hr_aerobic_lower_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x09:
|
|
hr_zone_cfg.hr_aerobic_upper_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x10:
|
|
hr_zone_cfg.hr_anaerobic_lower_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x11:
|
|
hr_zone_cfg.hr_anaerobic_upper_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x12:
|
|
hr_zone_cfg.hr_extremity_lower_th = data_info.p_data[0];
|
|
break;
|
|
|
|
case 0x13:
|
|
hr_zone_cfg.hr_extremity_upper_th = data_info.p_data[0];
|
|
break;
|
|
|
|
default:
|
|
data_info.error = PARAM_ERROR;
|
|
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);
|
|
|
|
if (data_info.error == FENDA_SUCCESS) {
|
|
exercise_api_hr_zone_cfg_set(&hr_zone_cfg);
|
|
}
|
|
|
|
write_idx = user_set_protocol_error(out_data, HEART_RATE_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
const p_func_t heart_rate_server_func[HEART_RATE_SERVER_MAX_ID] = {
|
|
user_null_func,
|
|
ble_set_hr_continue_measure_switch, //4.5.1
|
|
ble_set_hr_continue_upper_remind, //4.5.2
|
|
ble_set_hr_continue_lower_remind, //4.5.3
|
|
user_null_func, //4.5.4
|
|
ble_set_hr_zone, //4.5.5
|
|
};
|
|
|