删除条件配置功能,修改成联动配置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
+47 -80
View File
@@ -1,38 +1,32 @@
/******************************************************************************
* @file app_arbiter.c
* @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 本模块是唯一模式占用源,运行在 usr_timer_loop(任务上下文)。
* @note 本模块是唯一占用源,运行在 usr_timer_loop(任务上下文)。
* 规则落地(规格书 12 章):
* - 手动动作 → manual_intervene()owner=NONE
* 条件引擎感知后作废本轮RAM须回安全再满时长才重新触发);
* - 手动动作 → manual_intervene()owner=NONE + 转调
* app_linkage_void()(联动作废本轮RAM不写 VM);
* 定时引擎感知后本窗剩余时间不自动抢回(等下一窗开始沿)。
* - 定时窗开始 → timer_take()(定时 > 条件,条件即使满时长也不开);
* - 条件触发 → cond_take()owner!=TIMER 允许;快照只存第一次);
* - 两路条件后触发覆盖 → 仍走 cond_take(),快照不变(不回栈)。
* - 定时窗开始 → timer_take()(定时 > 联动,窗内联动不插嘴);
* - 联动触发 → linkage_take()owner==TIMER 时返回 0);
* 占用成功**不存档位快照**(联动开=写1、关=写0,不恢复)。
* - 联动自然失效 → linkage_release()。
* 作废标志不存 VM;再武装由 app_linkage 走到 10.3「关」条件后完成。
******************************************************************************/
#include "app_arbiter.h"
#include "app_mode.h"
#include "app_fan.h"
#include "app_linkage.h"
#define LOG_TAG_CONST APP
#define LOG_TAG "[ARB]"
#define LOG_INFO_ENABLE
#include "debug.h"
/** 仲裁器上下文 */
typedef struct {
ArbOwner_t owner; /**< 当前占用者 */
uint8_t snap_valid; /**< 条件快照是否有效 */
uint8_t snap_mode; /**< 快照模式(第一次条件抢权前) */
uint8_t snap_gear; /**< 快照档位 */
} AppArbiterCtx_t;
static AppArbiterCtx_t s_arb;
/** 仲裁器上下文V2.0.0 起只有 owner(快照整段删除) */
static uint8_t s_owner;
/**
* @brief 初始化仲裁器
@@ -40,118 +34,91 @@ static AppArbiterCtx_t s_arb;
*/
void app_arbiter_init(void)
{
s_arb.owner = ARB_OWNER_NONE;
s_arb.snap_valid = 0;
s_arb.snap_mode = 0;
s_arb.snap_gear = 0;
s_owner = ARB_OWNER_NONE;
log_info("arbiter init\n");
}
/**
* @brief 当前模式占用者
* @brief 当前风扇占用者
* @return ArbOwner_t
*/
uint8_t app_arbiter_get_owner(void)
{
return (uint8_t)s_arb.owner;
return s_owner;
}
/**
* @brief 手动动作统一入口:释放一切自动化占用
* @note 条件/定时引擎下个 tick 查 owner 感知后各自作废;不恢复快照
* (手动已接管,快照对应的用户状态已过时
* @brief 手动动作统一入口:释放一切自动化占用 + 作废本轮联动
* @note 联动的作废标志放在 app_linkage(本是联动自己的状态),这里只是
* **唯一转调点**:手动介入的三个入口(短按 / APP 写 mode / APP 写档
* 都只调本函数,业务规则就不会被后来的功能漏掉。
* @return 无
*/
void app_arbiter_manual_intervene(void)
{
if (s_arb.owner != ARB_OWNER_NONE) {
log_info("manual intervene, owner %d -> none\n", s_arb.owner);
if (s_owner != ARB_OWNER_NONE) {
log_info("manual intervene, owner %d -> none\n", s_owner);
}
s_arb.owner = ARB_OWNER_NONE;
s_owner = ARB_OWNER_NONE;
app_linkage_void(); /* 12 章规则 1:手动 vs 联动 → 手动,本轮联动作废 */
}
/**
* @brief 条件引擎尝试占用
* @return 1=成功;0=定时占用中(规格书 12:定时 vs 条件 → 定时胜)
* @brief 联动引擎尝试占用
* @return 1=成功;0=定时占用中(规格书 12:定时 vs 联动 → 定时胜)
*/
uint8_t app_arbiter_cond_take(void)
uint8_t app_arbiter_linkage_take(void)
{
if (s_arb.owner == ARB_OWNER_TIMER) {
return 0; /* 定时窗内条件不触发 */
if (s_owner == ARB_OWNER_TIMER) {
return 0; /* 定时窗内联动不开、不改档(11.3 / 12 章) */
}
if (!s_arb.snap_valid) {
/* 第一次条件抢权前快照用户状态;后覆盖/多次触发不改快照(10.3-6) */
s_arb.snap_mode = app_mode_get_active();
s_arb.snap_gear = app_fan_get_gear();
s_arb.snap_valid = 1;
log_info("cond take, snapshot mode=%d gear=%d\n", s_arb.snap_mode, s_arb.snap_gear);
if (s_owner != ARB_OWNER_LINKAGE) {
log_info("linkage take\n");
}
s_arb.owner = ARB_OWNER_COND;
s_owner = ARB_OWNER_LINKAGE;
return 1;
}
/**
* @brief 条件是否仍在占用
* @return 1=owner==COND
* @brief 联动是否仍在占用
* @return 1=owner==LINKAGE
*/
uint8_t app_arbiter_cond_active(void)
uint8_t app_arbiter_linkage_active(void)
{
return (s_arb.owner == ARB_OWNER_COND) ? 1 : 0;
return (s_owner == ARB_OWNER_LINKAGE) ? 1 : 0;
}
/**
* @brief 条件自然失效:恢复快照后调用(清 owner 与快照
* @brief 联动自然失效:让出占用(档位由调用方写
* @return 无
*/
void app_arbiter_cond_release(void)
void app_arbiter_linkage_release(void)
{
if (s_arb.owner == ARB_OWNER_COND) {
s_arb.owner = ARB_OWNER_NONE;
if (s_owner == ARB_OWNER_LINKAGE) {
s_owner = ARB_OWNER_NONE;
}
s_arb.snap_valid = 0;
}
/**
* @brief 取条件快照
* @param mode 输出模式
* @param gear 输出档位
* @return 无
*/
void app_arbiter_cond_get_snapshot(uint8_t *mode, uint8_t *gear)
{
*mode = s_arb.snap_mode;
*gear = s_arb.snap_gear;
}
/**
* @brief 条件被手动打断:只清快照(不恢复、不清 owner)
* @return 无
*/
void app_arbiter_cond_snapshot_clear(void)
{
s_arb.snap_valid = 0;
}
/**
* @brief 定时窗开始占用(优先级高于条件)
* @brief 定时窗开始占用(优先级高于联动)
* @return 1=成功
*/
uint8_t app_arbiter_timer_take(void)
{
if (s_arb.owner != ARB_OWNER_TIMER) {
if (s_owner != ARB_OWNER_TIMER) {
log_info("timer take\n");
}
s_arb.owner = ARB_OWNER_TIMER;
s_owner = ARB_OWNER_TIMER;
return 1;
}
/**
* @brief 定时窗结束释放(调用方负责收口:风扇 0、mode 0)
* @brief 定时窗结束释放(调用方负责收口:风扇 0、mode 0 + 联动重判
* @return 无
*/
void app_arbiter_timer_release(void)
{
if (s_arb.owner == ARB_OWNER_TIMER) {
s_arb.owner = ARB_OWNER_NONE;
if (s_owner == ARB_OWNER_TIMER) {
s_owner = ARB_OWNER_NONE;
}
}