Files
JBao_Sprayer_FW/apps/usr_app/app_arbiter.c
T
wuchuyuan 0dd65e1552 1、喷淋器 P1/P2功能实现
2、红灯按连接态慢闪
2026-09-09 19:57:00 +08:00

83 lines
2.6 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 CBR2 喷淋仲裁(规格书第 13 章):手动 > 计划队列 > 联动
* @author cyWu <1917507415@qq.com>
* @date 2026.09.09
* @version V1.0.0, 首次发布
*
* @note 决策落点(13 章冲突表逐条对应):
* 手动开 vs 任何轮 → req_restart/req_start10.5+ 作废联动
* 手动停 vs 任何轮 → req_stop + 本模块 intervene(作废联动)
* 计划到点 vs 在跑 → 计划入队不插队(app_timer_task 排队)
* 计划轮 vs 联动 → 联动查 owner==PLAN / 队列让位(app_linkage
* 联动 vs 空闲 → 联动开/停(app_linkage
* 本模块只做两件事:手动作废转调 + 轮结束边沿分发(计划自毁 /
* 出队续跑 / 联动补判),避免收口逻辑散落在调用点。
* 全部接口只在任务上下文调用。
******************************************************************************/
#include "system/includes.h"
#include "app_arbiter.h"
#include "app_spray.h"
#include "app_linkage.h"
#include "app_timer_task.h"
#define LOG_TAG_CONST APP
#define LOG_TAG "[ARB]"
#define LOG_INFO_ENABLE
#include "debug.h"
/**
* @brief 初始化仲裁器
* @return 无
*/
void app_arbiter_init(void)
{
log_info("arbiter init\n");
}
/**
* @brief 消费轮结束事件并收口(500ms 任务上下文)
* @return 无
*/
void app_arbiter_poll(void)
{
uint8_t owner;
uint8_t slot;
while (app_spray_pop_done(&owner, &slot)) {
app_arbiter_on_round_done(owner, slot);
}
}
/**
* @brief 手动介入:作废联动轮(RAM 标志,不写 VM;规格书 13 章)
* @return 无
*/
void app_arbiter_manual_intervene(void)
{
app_linkage_void();
}
/**
* @brief 轮结束边沿收口(规格书 12.4 / 13 章)
* @param owner 结束轮来源
* @param slot 结束轮槽位(owner==PLAN 时有效)
* @return 无
*/
void app_arbiter_on_round_done(uint8_t owner, uint8_t slot)
{
if (owner == (uint8_t)APP_SPRAY_OWNER_PLAN) {
/* 单次计划:正常跑完或被手动停都清该条使能(12.3-4 / 10.4 */
app_timer_on_plan_done(slot);
}
/* 计划队列优先于联动:队列非空立刻续跑(不插队当前轮的承诺由
* "只在空闲 kick"保证);否则计划/手动/联动轮结束后补判联动 */
if (app_timer_has_pending()) {
app_timer_kick();
} else {
app_linkage_reeval();
}
}