diff --git a/apps/usr_app/app_linkage.c b/apps/usr_app/app_linkage.c index e29a5e8..ee6e421 100644 --- a/apps/usr_app/app_linkage.c +++ b/apps/usr_app/app_linkage.c @@ -41,9 +41,10 @@ typedef struct { uint8_t hmax; /**< Byte5 % */ } LinkageCfg_t; -/** 联动运行时(RAM,不作废标志不落 VM) */ +/** 联动运行时(RAM,作废标志不落 VM) */ typedef struct { - uint8_t voided; /**< 1=被手动作废,须走到「关」条件才再武装 */ + uint8_t voided; /**< 1=被手动作废,须走到「关」条件才再武装 */ + uint8_t cfg_rewritten; /**< 1=DP6 刚重写,本拍区间内按「该关」而不是回差保持 */ } LinkageCtx_t; static LinkageCtx_t s_lk; @@ -144,6 +145,9 @@ void app_linkage_reeval(void) uint8_t valid = lk_parse(gDevData.linkage_config, &cfg); uint8_t over_max; uint8_t under_min; + uint8_t cfg_rewritten = s_lk.cfg_rewritten; + + s_lk.cfg_rewritten = 0; /* 只作用本拍,避免下一拍把回差冲掉 */ /* ── 8.4:采样失败 "--" 期间联动视为不成立;若联动占着 → 关掉,避免盲吹 ── */ if (app_th_is_fault()) { @@ -202,8 +206,9 @@ void app_linkage_reeval(void) app_fan_set_gear(BOARD_LINKAGE_OPEN_GEAR); log_info("linkage open, gear=%d\n", BOARD_LINKAGE_OPEN_GEAR); } - } else if (under_min) { - /* 10.3 关:没有一侧超最高且至少一侧 < min → 关 */ + } else if (under_min || cfg_rewritten) { + /* 10.3 关:没有一侧超最高且至少一侧 < min → 关。 + * 10.5 重写 DP6:新 min/max 下已不超最高 → 该关(不再用旧开态做回差) */ lk_stop(); } /* 否则:两侧都在 [min,max] 闭区间(含等于)→ 保持上一态(回差) */ @@ -249,8 +254,9 @@ void app_linkage_set_config(void) /* 引擎关掉也要落盘;开停判定仅在 BOARD_LINKAGE_ENABLE=1 时跑 */ app_nvm_mark_dirty(); #if BOARD_LINKAGE_ENABLE - s_lk.voided = 0; /* 10.5:清手动作废标志 */ - app_linkage_reeval(); /* 该开开、该关关 */ + s_lk.voided = 0; /* 10.5:清手动作废标志 */ + s_lk.cfg_rewritten = 1; /* 新阈值当新局面:不超最高则关,不用旧开态回差 */ + app_linkage_reeval(); /* 该开开、该关关 */ #endif log_info("linkage_config stored\n"); }