95 lines
2.1 KiB
C
95 lines
2.1 KiB
C
#ifndef RADAR_REPORT_SERVICE_H
|
||
#define RADAR_REPORT_SERVICE_H
|
||
|
||
#include "typedef.h"
|
||
#include "radar_manager.h"
|
||
|
||
/*
|
||
* radar_report_service 的职责:
|
||
*
|
||
* 1. 从 radar_manager 获取统一业务快照
|
||
* 2. 判断当前是否需要上报
|
||
* 3. 在真正上报成功后推进“已上报”状态
|
||
*
|
||
* 它不知道:
|
||
* - UART
|
||
* - R60 CTRL/CMD
|
||
* - WiFi
|
||
* - MQTT
|
||
* - JSON
|
||
* - Flash
|
||
*
|
||
* 本模块不创建任务。
|
||
* 由未来的上报/网络执行流主动调用。
|
||
*/
|
||
|
||
enum radar_report_reason {
|
||
RADAR_REPORT_REASON_NONE = 0,
|
||
RADAR_REPORT_REASON_INITIAL,
|
||
RADAR_REPORT_REASON_CHANGE,
|
||
RADAR_REPORT_REASON_PERIODIC,
|
||
};
|
||
|
||
struct radar_report_service_config {
|
||
/*
|
||
* manager 快照允许的最大数据年龄。
|
||
* 超过这个时间的数据不提交给上层上报。
|
||
*/
|
||
u32 max_age_ms;
|
||
|
||
/*
|
||
* 即使没有 meaningful change,
|
||
* 也允许按周期强制产生一次快照。
|
||
*
|
||
* 设为 0 表示关闭周期强制上报。
|
||
*/
|
||
u32 periodic_interval_ms;
|
||
};
|
||
|
||
/*
|
||
* 初始化上报决策层。
|
||
*/
|
||
int radar_report_service_init(
|
||
const struct radar_report_service_config *config
|
||
);
|
||
|
||
/*
|
||
* 检查当前是否存在待上报快照。
|
||
*
|
||
* return:
|
||
* 1 有快照需要上报,out/reason 有效
|
||
* 0 当前不需要上报
|
||
* <0 错误
|
||
*
|
||
* 注意:
|
||
* 一旦产生 pending snapshot,
|
||
* 在 radar_report_service_mark_reported() 成功调用前,
|
||
* 后续 check 会返回同一份 pending snapshot。
|
||
*
|
||
* 这样上层发送失败时可以重试,
|
||
* 不会因为 manager 又更新而偷偷替换发送内容。
|
||
*/
|
||
int radar_report_service_check(
|
||
u32 now_ms,
|
||
struct radar_report_snapshot *out,
|
||
u8 *reason
|
||
);
|
||
|
||
/*
|
||
* 只有“上层已经真正发送成功”后才调用。
|
||
*
|
||
* 该函数会:
|
||
* - 清除 pending snapshot
|
||
* - 记录成功上报时间
|
||
* - 在安全情况下推进 manager 的 consumed baseline
|
||
*
|
||
* 如果 pending 产生以后 manager 又发生了有意义字段变化,
|
||
* 本函数不会把那个新变化错误地消费掉;
|
||
* 下一次 check 仍会重新产生 CHANGE 上报。
|
||
*/
|
||
int radar_report_service_mark_reported(
|
||
u32 now_ms
|
||
);
|
||
|
||
#endif
|