Files
JBao_Temp_Humi_Fan_FW/apps/usr_app/app_arbiter.c
T

125 lines
3.7 KiB
C
Raw 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.
/******************************************************************************
* @file app_arbiter.c
* @brief CBR3 模式仲裁器实现(规格书第 12 章:手动 > 定时 > 联动)
* @author cyWu <1917507415@qq.com>
* @date 2026.09.02
* @version V2.0.0(规格书 V3.0.0):owner COND → LINKAGE,删除档位快照
*
* @note 本模块是唯一占用源,运行在 usr_timer_loop(任务上下文)。
* 规则落地(规格书 12 章):
* - 手动动作 → manual_intervene()owner=NONE + 转调
* app_linkage_void()(联动作废本轮,RAM,不写 VM);
* 定时引擎感知后本窗剩余时间不自动抢回(等下一窗开始沿)。
* - 定时窗开始 → timer_take()(定时 > 联动,窗内联动不插嘴);
* - 联动触发 → linkage_take()owner==TIMER 时返回 0);
* 占用成功**不存档位快照**(联动开=写1、关=写0,不恢复)。
* - 联动自然失效 → linkage_release()。
* 作废标志不存 VM;再武装由 app_linkage 走到 10.3「关」条件后完成。
******************************************************************************/
#include "app_arbiter.h"
#include "app_linkage.h"
#define LOG_TAG_CONST APP
#define LOG_TAG "[ARB]"
#define LOG_INFO_ENABLE
#include "debug.h"
/** 仲裁器上下文:V2.0.0 起只有 owner(快照整段删除) */
static uint8_t s_owner;
/**
* @brief 初始化仲裁器
* @return 无
*/
void app_arbiter_init(void)
{
s_owner = ARB_OWNER_NONE;
log_info("arbiter init\n");
}
/**
* @brief 当前风扇占用者
* @return ArbOwner_t
*/
uint8_t app_arbiter_get_owner(void)
{
return s_owner;
}
/**
* @brief 手动动作统一入口:释放一切自动化占用 + 作废本轮联动
* @note 联动的作废标志放在 app_linkage(本是联动自己的状态),这里只是
* **唯一转调点**:手动介入的三个入口(短按 / APP 写 mode / APP 写档)
* 都只调本函数,业务规则就不会被后来的功能漏掉。
* @return 无
*/
void app_arbiter_manual_intervene(void)
{
if (s_owner != ARB_OWNER_NONE) {
log_info("manual intervene, owner %d -> none\n", s_owner);
}
s_owner = ARB_OWNER_NONE;
app_linkage_void(); /* 12 章规则 1:手动 vs 联动 → 手动,本轮联动作废 */
}
/**
* @brief 联动引擎尝试占用
* @return 1=成功;0=定时占用中(规格书 12:定时 vs 联动 → 定时胜)
*/
uint8_t app_arbiter_linkage_take(void)
{
if (s_owner == ARB_OWNER_TIMER) {
return 0; /* 定时窗内联动不开、不改档(11.3 / 12 章) */
}
if (s_owner != ARB_OWNER_LINKAGE) {
log_info("linkage take\n");
}
s_owner = ARB_OWNER_LINKAGE;
return 1;
}
/**
* @brief 联动是否仍在占用
* @return 1=owner==LINKAGE
*/
uint8_t app_arbiter_linkage_active(void)
{
return (s_owner == ARB_OWNER_LINKAGE) ? 1 : 0;
}
/**
* @brief 联动自然失效:让出占用(档位由调用方写)
* @return 无
*/
void app_arbiter_linkage_release(void)
{
if (s_owner == ARB_OWNER_LINKAGE) {
s_owner = ARB_OWNER_NONE;
}
}
/**
* @brief 定时窗开始占用(优先级高于联动)
* @return 1=成功
*/
uint8_t app_arbiter_timer_take(void)
{
if (s_owner != ARB_OWNER_TIMER) {
log_info("timer take\n");
}
s_owner = ARB_OWNER_TIMER;
return 1;
}
/**
* @brief 定时窗结束释放(调用方负责收口:风扇 0、mode 0 + 联动重判)
* @return 无
*/
void app_arbiter_timer_release(void)
{
if (s_owner == ARB_OWNER_TIMER) {
s_owner = ARB_OWNER_NONE;
}
}