fix(vd960Loop): 灵敏度收敛 4 级制 + 运行中配置立即生效 (协议 V1.08)
根因: 设置不同灵敏度感应高度无区别 1. unpack_pkg_set_mcjq_param 未同步 loop_SensLevel → 改灵敏度需重启才生效 2. 9级制映射 sensitvity & 0x03 折叠 (默认7→3, 3→3, 8→0) 3. (测试陷阱) 金属块过大信号饱和, 建议小金属块测临界高度 修复: - 提取 sens_level_from_config() 映射函数, 4级制 0~3 一一对应 (9级制后改) - unpack_pkg_set_mcjq_param 补 loop_SensLevel 同步 (运行中立即生效) - para_store_init 上电路径改用同一函数 - 协议 V1.08: Sensitivity 0~9级 → 4级制 0~3 (默认2) - tests/test_sens_mapping.c gcc 隔离单测 PASS (0~3无折叠/兼容旧默认7→3)
This commit is contained in:
@@ -584,8 +584,8 @@ static void unpack_pkg_set_mcjq_param(uint8_t *pkg, uint8_t len)
|
||||
for(j = 0; j < _amount; j++)
|
||||
{
|
||||
k = pkg[i++];
|
||||
unit->sensitvity = k & 0x0F;
|
||||
unit->loopFreq_Level = k >> 4;
|
||||
unit->sensitvity = k & 0x0F; // 低4位: 灵敏度序号 (4级制 0~3)
|
||||
unit->loopFreq_Level = k >> 4; // 高4位: 频率档
|
||||
unit->delay_time = pkg[i++];
|
||||
k = pkg[i++];
|
||||
unit->output_mode = k & 0x03;
|
||||
@@ -593,6 +593,9 @@ static void unpack_pkg_set_mcjq_param(uint8_t *pkg, uint8_t len)
|
||||
unit->exist_mode = pkg[i++];
|
||||
unit->direction_mode = pkg[i++];
|
||||
|
||||
// 同步灵敏度到检测单元 (修复: 运行中配置必须立即生效, 不依赖重启)
|
||||
g_loop_states.loop_unit[j].loop_SensLevel = sens_level_from_config(unit->sensitvity);
|
||||
|
||||
unit++;
|
||||
}
|
||||
|
||||
|
||||
@@ -113,6 +113,12 @@ void storage_dev(void)
|
||||
|
||||
}
|
||||
|
||||
/* 灵敏度配置 → 检测档位映射 (4级制: 0~3 一一对应; 9级制后续实现) */
|
||||
uint8_t sens_level_from_config(uint8_t sensitvity)
|
||||
{
|
||||
return sensitvity & 0x03;
|
||||
}
|
||||
|
||||
// set frequent level
|
||||
void set_flp_level(uint8_t loop_num, uint8_t freq_level)
|
||||
{
|
||||
@@ -181,7 +187,7 @@ void para_store_init(void)
|
||||
set_flp_level(i, unitout->loopFreq_Level);
|
||||
|
||||
// 同步灵敏度到检测单元
|
||||
g_loop_states.loop_unit[i].loop_SensLevel = unitout->sensitvity & 0x03;
|
||||
g_loop_states.loop_unit[i].loop_SensLevel = sens_level_from_config(unitout->sensitvity);
|
||||
g_loop_states.loop_unit[i].SET_PLUS = unitout->output_mode & 0x01;
|
||||
g_loop_states.loop_unit[i].SET_DLY = (unitout->output_mode >> 1) & 0x01;
|
||||
g_loop_states.loop_unit[i].hold_time = unitout->exist_mode * 20 * 5;
|
||||
|
||||
Reference in New Issue
Block a user