删除条件配置功能,修改成联动配置DP,并且增加31天运行记录,修改程序需求

This commit is contained in:
2026-09-03 10:21:11 +08:00
parent 5377186cfb
commit d56d8204e1
31 changed files with 1609 additions and 1430 deletions
+37 -46
View File
@@ -1,21 +1,24 @@
/******************************************************************************
* @file app_arbiter.h
* @brief CBR3 模式仲裁器(规格书第 12 章):手动 > 定时 > 条件
* @brief CBR3 模式仲裁器(规格书第 12 章):手动 > 定时 > 联动
* @author cyWu <1917507415@qq.com>
* @date 2026.08.31
* @version V1.0.0,首次发布(P2
* @date 2026.09.02
* @version V2.0.0(规格书 V3.0.0):owner COND → LINKAGE**删除档位快照**
*
* @note 把"谁在驱动模式"收成一处,避免 mode/cond/timer 互调成环。
* 唯一状态源是 ownerNONE/COND/TIMER+ 条件快照;
* 条件/定时引擎各自维护占用细节,通过查询 owner 感知被打断
* - 手动动作(短按/APP 写档/mode)→ app_arbiter_manual_intervene()
* 清 owner;条件引擎感知后作废本轮(RAM),定时引擎感知后本窗
* 不再抢回(规格书 12 章规则 1/2)。
* - 条件自然失效(比较不成立)→ 条件引擎恢复快照后
* app_arbiter_cond_release()。
* - 定时窗结束 → app_arbiter_timer_release() + 收口。
* 快照:第一次条件抢权前保存用户 mode+gear(规格书 10.3-3),
* 后覆盖/手动介入均不更新它(10.3-6),只在条件自然失效恢复后清空。
* @note 把"谁在驱动风扇"收成一处,避免 mode/linkage/timer 互调成环。
* 唯一状态源是 ownerNONE/LINKAGE/TIMER)。
* - 手动动作(短按/APP 写档/写 mode)→ app_arbiter_manual_intervene()
* 清 owner 并转调 app_linkage_void() 作废本轮联动(RAM,不写 VM);
* 定时引擎下个 tick 感知 owner 后本窗剩余时间不再抢回。
* - 定时窗开始 → app_arbiter_timer_take()(定时 > 联动);
* - 联动触发 → app_arbiter_linkage_take();定时占用中返回 0。
* - 联动自然失效(关条件成立)→ app_arbiter_linkage_release()。
*
* ⚠ V2.0.0 与旧条件引擎的关键差别(规格书 12 章):
* **联动不恢复档位快照**——开只写 fan_gear=1,关只写 0,不存也不恢复
* 进入联动前的 mode/gear。原 cond_get_snapshot / snapshot_clear
* 一组接口整段删除,不要再加回来。
* 作废标志是 RAM、不写 VM,再武装要靠走到第 10.3 节的「关」条件。
******************************************************************************/
#ifndef __APP_ARBITER_H__
@@ -23,11 +26,11 @@
#include <stdint.h>
/** 当前模式占用者 */
/** 当前风扇占用者 */
typedef enum {
ARB_OWNER_NONE = 0, /**< 空闲 / 手动接管 */
ARB_OWNER_COND = 1, /**< 条件引擎占用 */
ARB_OWNER_TIMER = 2 /**< 定时引擎占用 */
ARB_OWNER_NONE = 0, /**< 空闲 / 手动接管 */
ARB_OWNER_LINKAGE = 1, /**< 联动引擎占用 */
ARB_OWNER_TIMER = 2 /**< 定时引擎占用 */
} ArbOwner_t;
/**
@@ -37,65 +40,53 @@ typedef enum {
void app_arbiter_init(void);
/**
* @brief 当前模式占用者
* @brief 当前风扇占用者
* @return ArbOwner_t
*/
uint8_t app_arbiter_get_owner(void);
/**
* @brief 手动动作统一入口(短按 / APP 写 fan_gear / APP 写 mode
* @note 立即释放一切自动化占用;条件/定时引擎下个 tick 感知后各自作废
* @note 立即释放一切自动化占用,并作废本轮联动(12 章规则 1)。
* 定时引擎下个 tick 感知 owner 后本窗剩余时间不再抢回(规则 2)
* @return 无
*/
void app_arbiter_manual_intervene(void);
/* ═══ 条件引擎接口 ═══ */
/* ═══ 联动引擎接口 ═══ */
/**
* @brief 条件引擎尝试占用(触发模式前调用)
* @note 定时占用中返回 0(规格书 12:定时窗 vs 条件 → 定时胜,条件不开);
* 占用成功时若尚无快照则保存当前用户 mode+gear(仅第一次
* @brief 联动引擎尝试占用(超最高要开 1 档前调用)
* @note 定时占用中返回 012:定时窗 vs 联动 → 定时胜,窗内联动不插嘴);
* 占用成功时**不保存任何档位快照**(联动不恢复快照
* @return 1=占用成功,0=被定时占用拒绝
*/
uint8_t app_arbiter_cond_take(void);
uint8_t app_arbiter_linkage_take(void);
/**
* @brief 条件是否仍在占用
* @return 1=owner==COND
* @brief 联动是否仍在占用
* @return 1=owner==LINKAGE
*/
uint8_t app_arbiter_cond_active(void);
uint8_t app_arbiter_linkage_active(void);
/**
* @brief 条件自然失效:恢复快照后调用(清 owner 与快照
* @brief 联动自然失效:让出风扇(只清 owner,档位由调用方写
* @return 无
*/
void app_arbiter_cond_release(void);
/**
* @brief 取条件快照(恢复用)
* @param mode 输出快照模式
* @param gear 输出快照档位
* @return 无
*/
void app_arbiter_cond_get_snapshot(uint8_t *mode, uint8_t *gear);
/**
* @brief 条件被手动打断:只清快照(快照对应的用户状态已过时),
* 不恢复、不清 ownerowner 已被 manual_intervene 清掉)
* @return 无
*/
void app_arbiter_cond_snapshot_clear(void);
void app_arbiter_linkage_release(void);
/* ═══ 定时引擎接口 ═══ */
/**
* @brief 定时引擎窗开始占用
* @return 1=成功(恒成功,定时优先级高于条件
* @return 1=成功(恒成功,定时优先级高于联动
*/
uint8_t app_arbiter_timer_take(void);
/**
* @brief 定时窗结束释放
* @note 调用方负责收口(风扇 0、mode 0),并按 11.3 调
* app_linkage_reeval() 让联动立刻重判
* @return 无
*/
void app_arbiter_timer_release(void);