#include "system/includes.h" #include "app_log.h" #include "radar_data_service.h" #include "r60abd1.h" #include "radar_manager.h" #include /* * 已经成功同步到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; }