149 lines
5.1 KiB
C
149 lines
5.1 KiB
C
/*----------------------------------------------------------------------------
|
|
* Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved.
|
|
*
|
|
* Description: ble_stress_server.c
|
|
*
|
|
* Author: shey.tanxiaoyu
|
|
*
|
|
* Create: 2021-09-13
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#include "ble_stress_server.h"
|
|
#include "ble_data_transmission.h"
|
|
#include "exercise_api.h"
|
|
#include "health_api.h"
|
|
#include "task_ui.h"
|
|
#include "ui_heartrate.h"
|
|
#include "ui_main_heartrate.h"
|
|
#include "ui_breath_training.h"
|
|
#include "ui_bloodoxygen.h"
|
|
|
|
/* 4.7.3 开始压力测量 */
|
|
void ble_set_stress_once_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 stress_once_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 SET_STRESS_ONCE_MEASURE_SWITCH_TYPE:
|
|
stress_once_measure_switch = *in_data;
|
|
|
|
if ((health_api_get_bp_measure_sw() == 0) &&
|
|
(exercise_api_exercise_state_get() == 0 || exercise_api_exercise_state_get() == 4) &&
|
|
(get_hr_state() == 0) &&
|
|
(get_main_hr_state() == 0) &&
|
|
(get_breath_state() == 0) &&
|
|
(ui_bloodoxygen_get_measure_state() == 0)) {
|
|
task_ui_notify(EVENT_STRESS_MEASURE_SWITCH, stress_once_measure_switch, NULL, 0);
|
|
} else {
|
|
data_info.error = UNKNOW_ERROR;
|
|
}
|
|
break;
|
|
|
|
case SET_STRESS_ONCE_MEASURE_TIME_TYPE:
|
|
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, STRESS_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
/* 4.7.4 压力结果主动上报 */
|
|
void ble_stress_measure_report(void *ptr)
|
|
{
|
|
uint16_t write_idx = 0;
|
|
uint8_t buf_temp[TEMP_NUM_MAX] = {0};
|
|
|
|
buf_temp[write_idx++] = 0x03;
|
|
buf_temp[write_idx++] = STRESS_MEASURE_REPORT_TYPE;
|
|
buf_temp[write_idx++] = health_api_get_real_stress_val();
|
|
|
|
BLE_SendFrameById(STRESS_SERVER, STRESS_MEASURE_REPORT_ID, buf_temp, write_idx);
|
|
}
|
|
|
|
/* 4.7.5 自动压力检测开关 */
|
|
void ble_set_stress_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 stress_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 SET_STRESS_CONTINUE_MEASURE_SWITCH_TYPE:
|
|
stress_continue_measure_switch = *in_data;
|
|
health_api_set_stress_cont_measure_sw(stress_continue_measure_switch);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
in_data = in_data + (data_info.len);
|
|
in_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, STRESS_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
/* 4.7.6 接收APP下发的压力校准数据 */
|
|
void ble_recieve_stress_calibration_data(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};
|
|
|
|
data_info.error = FENDA_SUCCESS;
|
|
do {
|
|
user_get_data_info(&data_info, &in_data, &in_len);
|
|
switch (data_info.type & 0x7F) {
|
|
case SET_STRESS_CALIBRATION_VALUE_TYPE:
|
|
health_api_set_stress_measure_calibration(*in_data, 1);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
in_data = in_data + (data_info.len);
|
|
in_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, STRESS_SERVER, data_info.error);
|
|
*out_len = write_idx;
|
|
}
|
|
|
|
const p_func_t stress_server_func[STRESS_SERVERE_MAX_ID] = {
|
|
user_null_func,
|
|
user_null_func, //4.7.1 获取压力检测记录列表帧信息
|
|
user_null_func, //4.7.2 获取压力检测记录帧详细
|
|
ble_set_stress_once_measure_switch, //4.7.3 开始压力测量
|
|
user_null_func, //4.7.4 压力结果主动上报
|
|
ble_set_stress_continue_measure_switch, //4.7.5 自动压力检测开关
|
|
ble_recieve_stress_calibration_data, //4.7.6 接收APP下发的压力校准信息
|
|
};
|
|
|