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:
wangfq
2026-08-25 11:52:14 +08:00
parent fad99a550b
commit bbf5492fe2
9 changed files with 167 additions and 7 deletions
@@ -111,7 +111,7 @@ typedef enum
typedef struct
{
uint8_t sensitvity; // 高四位表示灵敏度的数量,低四位表示当前灵敏度的序号(从0开始)
uint8_t sensitvity; // 灵敏度序号: 4级制 0~3 (值越大越灵敏, 默认2); 9级制后续版本实现
uint8_t delay_time;
uint8_t output_mode;
uint8_t direction_mode; // 方向判别模式,0 触发模式, 非0 表示方向判别模式
@@ -171,6 +171,9 @@ typedef struct _DBN_BLE_STATE_
void set_flp_level(uint8_t loop_num, uint8_t freq_level);
/* 灵敏度配置 → 检测档位映射 (4级制: 0~3 一一对应; 9级制后续实现) */
uint8_t sens_level_from_config(uint8_t sensitvity);
void set_factory_param(void);
void storage_dev(void);
void para_store_init(void);
@@ -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;