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

298 lines
11 KiB
C

/*----------------------------------------------------------------------------
* Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved.
*
* Description: ble_body_temp_server.c
*
* Author: shey.tanxiaoyu
*
* Create: 2021-09-13
*--------------------------------------------------------------------------*/
#include "ble_body_temp_server.h"
#include "ble_data_transmission.h"
#include "health_api.h"
#include "FreeRTOS.h"
#define ENABLE_STATIC_PRINT 0
extern uint32_t am_util_stdio_printf(const char *pcFmt, ...);
#define static_print_error(...) am_util_stdio_printf(__VA_ARGS__)//错误打印一般常开
#if ENABLE_STATIC_PRINT
#define static_print_info(...) am_util_stdio_printf(__VA_ARGS__)//一般信息打印宏控制
#else
#define static_print_info(...)
#endif
#define BODY_TEMP_DATA_FRAME_NUMBER_MAX 585
/* 5.23.11 获取体温历史帧数 */
void ble_get_body_temp_measure_frame_number(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len)
{
protocol_data_info_t data_info = {0};
uint32_t start_timestamp = 0;
uint32_t end_timestamp = 0;
uint32_t frame_num = 0;
uint16_t write_idx = 0;
uint8_t send_buf[10] = {0};
data_info.error = FENDA_SUCCESS;
do {
user_get_data_info(&data_info, &in_data, &in_len);
switch (data_info.type & 0x7F) {
case 0x01:
break;
case 0x02:
start_timestamp += data_info.p_data[0] << 24;
start_timestamp += data_info.p_data[1] << 16;
start_timestamp += data_info.p_data[2] << 8;
start_timestamp += data_info.p_data[3];
break;
case 0x03:
end_timestamp += data_info.p_data[0] << 24;
end_timestamp += data_info.p_data[1] << 16;
end_timestamp += data_info.p_data[2] << 8;
end_timestamp += data_info.p_data[3];
health_api_body_temp_frame_number_get(BODY_TEMP_DATA_FRAME_NUMBER_MAX, start_timestamp, end_timestamp, &frame_num);
send_buf[write_idx++] = 4;
send_buf[write_idx++] = 0x04;
send_buf[write_idx++] = frame_num >> 8;
send_buf[write_idx++] = frame_num;
BLE_SendFrameById(BODY_TEMP_SERVER, GET_BODY_TEMP_MEASURE_FRAME_NUMBER_ID, send_buf, write_idx);
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);
*out_len = 0;
}
/* 5.23.12 获取体温历史详情数据 */
void ble_get_body_temp_measure_frame_detail(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len)
{
protocol_data_info_t data_info = {0};
uint32_t frame_index = 0;
uint32_t item_num = 0;
health_body_temp_data_t *item_buf = NULL;
uint16_t body_temp_data_len = 0;
uint32_t i;
uint16_t write_idx = 0;
uint8_t *send_buf = NULL;
item_buf = (health_body_temp_data_t *)pvPortMalloc(sizeof(health_body_temp_data_t) * BODY_TEMP_DATA_FRAME_NUMBER_MAX);
send_buf = (uint8_t *)pvPortMalloc(sizeof(uint8_t) * 4096);
if ((item_buf == NULL) || (send_buf == NULL)) {
static_print_info("ble_get_body_temp_measure_frame_detail item_buf or send_buf malloc failed!!!\n");
data_info.error = REQ_MEMORY_ERROR;
write_idx = user_set_protocol_error(out_data, BODY_TEMP_SERVER, data_info.error);
*out_len = write_idx;
return;
}
data_info.error = FENDA_SUCCESS;
do {
user_get_data_info(&data_info, &in_data, &in_len);
switch (data_info.type & 0x7F) {
case 0x01:
frame_index += data_info.p_data[0] << 8;
frame_index += data_info.p_data[1];
health_api_body_temp_frame_detail_get(BODY_TEMP_DATA_FRAME_NUMBER_MAX, frame_index, &item_num, item_buf);
send_buf[write_idx++] = 7;
send_buf[write_idx++] = 0x02;
send_buf[write_idx++] = frame_index >> 8;
send_buf[write_idx++] = frame_index;
send_buf[write_idx++] = item_num >> 8;
send_buf[write_idx++] = item_num;
send_buf[write_idx++] = 8;
body_temp_data_len = 2 + 8 * item_num;
if (body_temp_data_len <= 127) {
send_buf[write_idx++] = body_temp_data_len;
} else {
body_temp_data_len += 1;
send_buf[write_idx++] = 0x80 | (body_temp_data_len >> 7);
send_buf[write_idx++] = body_temp_data_len & 0x7F;
}
send_buf[write_idx++] = 0x03;
for (i = 0; i < item_num; i++) {
send_buf[write_idx++] = item_buf[i].timestamp >> 24;
send_buf[write_idx++] = item_buf[i].timestamp >> 16;
send_buf[write_idx++] = item_buf[i].timestamp >> 8;
send_buf[write_idx++] = item_buf[i].timestamp;
send_buf[write_idx++] = item_buf[i].body_temp >> 8;
send_buf[write_idx++] = item_buf[i].body_temp;
send_buf[write_idx++] = item_buf[i].hr;
send_buf[write_idx++] = item_buf[i].temp_type;
}
static_print_info("ble_get_body_temp_measure_frame_detail ***write_idx %d\n", write_idx);
BLE_SendFrameById(BODY_TEMP_SERVER, GET_BODY_TEMP_MEASURE_FRAME_DETAIL_ID, send_buf, write_idx);
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);
vPortFree(item_buf);
vPortFree(send_buf);
*out_len = 0;
}
/* 5.23.13 体温连续检测开关 */
void ble_set_body_temp_continue_measure_switch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len)
{
protocol_data_info_t data_info = {0};
uint8_t body_temp_continue_measure_switch = 0;
uint16_t write_idx = 0;
data_info.error = FENDA_SUCCESS;
do {
user_get_data_info(&data_info, &in_data, &in_len);
switch (data_info.type & 0x7F) {
case 0x01:
body_temp_continue_measure_switch = data_info.p_data[0];
health_api_set_body_temp_cont_measure_sw(body_temp_continue_measure_switch);
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, BODY_TEMP_SERVER, data_info.error);
*out_len = write_idx;
}
/* 5.23.14 体温过高提醒 */
void ble_set_body_temp_upper_remind(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len)
{
protocol_data_info_t data_info = {0};
uint16_t remind_value = 0;
uint16_t write_idx = 0;
data_info.error = FENDA_SUCCESS;
do {
user_get_data_info(&data_info, &in_data, &in_len);
switch (data_info.type & 0x7F) {
case 0x01:
remind_value += data_info.p_data[0] << 8;
remind_value += data_info.p_data[1];
if (remind_value) {
health_api_set_body_temp_upper_remind(1, remind_value * 10);
} else {
health_api_set_body_temp_upper_remind(0, 0);
}
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, BODY_TEMP_SERVER, data_info.error);
*out_len = write_idx;
}
/* 5.23.15 体温过低提醒 */
void ble_set_body_temp_lower_remind(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len)
{
protocol_data_info_t data_info = {0};
uint16_t remind_value = 0;
uint16_t write_idx = 0;
data_info.error = FENDA_SUCCESS;
do {
user_get_data_info(&data_info, &in_data, &in_len);
switch (data_info.type & 0x7F) {
case 0x01:
remind_value += data_info.p_data[0] << 8;
remind_value += data_info.p_data[1];
if (remind_value) {
health_api_set_body_temp_lower_remind(1, remind_value * 10);
} else {
health_api_set_body_temp_lower_remind(0, 0);
}
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, BODY_TEMP_SERVER, data_info.error);
*out_len = write_idx;
}
const p_func_t body_temp_server_func[BODY_TEMP_SERVER_MAX_ID] = {
user_null_func,
user_null_func, //5.23.1
user_null_func, //5.23.2
user_null_func, //5.23.3
user_null_func, //5.23.4
user_null_func, //5.23.5
user_null_func, //5.23.6
user_null_func, //5.23.7
user_null_func, //5.23.8
user_null_func, //5.23.9
user_null_func, //5.23.a
user_null_func, //5.23.b
user_null_func, //5.23.c
user_null_func, //5.23.d
user_null_func, //5.23.e
user_null_func, //5.23.f
user_null_func, //5.23.10
ble_get_body_temp_measure_frame_number, //5.23.11 获取体温历史帧数
ble_get_body_temp_measure_frame_detail, //5.23.12 获取体温历史详情数据
ble_set_body_temp_continue_measure_switch, //5.23.13 体温连续检测开关
ble_set_body_temp_upper_remind, //5.23.14 体温过高提醒
ble_set_body_temp_lower_remind, //5.23.15 体温过低提醒
};