Files

160 lines
2.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "system/includes.h"
#include "app_log.h"
#include "radar_data_service.h"
#include "r60abd1.h"
#include "radar_manager.h"
#include <string.h>
/*
* 已经成功同步到radar_manager的
* R60 data_update_count。
*
* 不使用frame_count
* 未知但checksum正确的合法帧只增加frame_count
* 不应该触发manager业务状态更新。
*/
static u32 radar_data_service_last_update_count;
/*
* 把R60协议层的公开快照
* 映射成manager通用输入结构。
*
* 这里不做:
* - 合法性判断
* - meaningful change判断
* - freshness判断
*
* 这些都属于radar_manager职责。
*/
static void radar_data_service_build_manager_input(
const struct radar_r60abd1_data *r60,
struct radar_manager_input *input
)
{
memset(input, 0, sizeof(*input));
input->presence =
r60->presence;
input->motion =
r60->motion;
input->body_movement =
r60->body_movement;
input->distance_cm =
r60->distance_cm;
input->heart_rate_x10 =
r60->heart_rate_x10;
input->breath_rate_x10 =
r60->breath_rate_x10;
input->sleep_state =
r60->sleep_state;
input->pos_x_mm =
r60->pos_x_mm;
input->pos_y_mm =
r60->pos_y_mm;
input->pos_z_mm =
r60->pos_z_mm;
/*
* 当前稳定R60接口没有abnormal_state来源。
* 不猜协议,保持0。
*/
input->abnormal_state = 0;
/*
* 使用协议层“真正业务数据更新”的时间。
*
* manager自身不依赖AC79 timer API。
*/
input->update_ms =
r60->update_ms;
}
int radar_data_service_init(void)
{
radar_data_service_last_update_count = 0;
APP_LOG("[RADAR_DATA] init success\n");
return 0;
}
int radar_data_service_process(void)
{
int ret;
struct radar_r60abd1_data r60;
struct radar_manager_input input;
ret = radar_r60abd1_get_data(&r60);
if (ret != 0) {
return ret;
}
/*
* 没有新的“已识别业务更新”:
* 不重复刷新manager。
*
* 这里直接比较计数即可。
* 即使u32未来发生回绕,也仍能识别下一次变化。
*/
if (r60.data_update_count ==
radar_data_service_last_update_count) {
return 0;
}
radar_data_service_build_manager_input(
&r60,
&input
);
ret = radar_manager_update(&input);
if (ret != 0) {
/*
* manager更新失败时不要推进last_update_count
* 下次process还能重试同一份最新数据。
*/
return ret;
}
/*
* 只有manager真正接收成功后,
* 才认为这次R60更新已被消费。
*/
radar_data_service_last_update_count =
r60.data_update_count;
return 1;
}