404_C++_[通道][AI类型][bit位],设备侧获取“AI能力互斥关系(mutex relation)”,解析后填充到本地能力结构DEVICE_ABILITY_S::MutexType 中

张开发
2026/5/4 17:34:39 15 分钟阅读
404_C++_[通道][AI类型][bit位],设备侧获取“AI能力互斥关系(mutex relation)”,解析后填充到本地能力结构DEVICE_ABILITY_S::MutexType 中
--------------- 这段代码本质是在做一件事从设备侧获取“AI能力互斥关系mutex relation”解析后填充到本地能力结构DEVICE_ABILITY_S::MutexType中。我按执行路径 数据结构 关键设计点给你拆开讲。一、整体流程高层逻辑函数分三阶段1️⃣ 发送请求API_SEND_MSG(/API/AIMutexRelation/Get,_jdDt);向设备请求 AI 能力之间的互斥关系。2️⃣ JSON解析协议校验逐层校验data → channel_info → 每个channel → category[]任何结构异常直接 return / continue。 说明这是一个严格依赖协议格式的解析函数。3️⃣ 构建互斥关系矩阵 写入能力结构核心变量RS_U8 _ar2ucMt[m_uiFtChnCnt][ASSIGN_4_BYTES(AIMT_ALL)][BITS_2_BYTES(AIMT_ALL)]{0}; 这是关键三维bit矩阵二、核心数据结构解析重点_ar2ucMt三维含义_ar2ucMt[通道][AI类型][bit位]可以理解为维度含义第1维前端通道channel第2维AI功能类型人形检测/车检等第3维位图bitset表示互斥关系位语义非常关键1️⃣ ENABLE位SET_BIT(_ar2ucMt[i][_iMd],AIMT_ENABLE); 表示该AI能力在该通道上是支持/可用的2️⃣ mutex_typeSET_BIT(_ar2ucMt[i][_iMd],_iMt); 表示当前 AI 功能_iMd与_iMt互斥3️⃣ 跨通道互斥SET_BIT(_ar2ucMt[_iChn][_iMd],_iMt); 表示通道 A 的某 AI 功能与通道 B 的某 AI 功能互斥三、关键逻辑拆解1️⃣ 初始化逻辑⚠️ 有坑for(i0;im_uiFtChnCnt;i){memset(_ar2ucMt,0,sizeof(_ar2ucMt));_ar2ucMt[i][0][0]1;问题点 每次循环都memset整个矩阵意味着只保留当前 i 通道的计算结果前面的全部被清掉推测设计意图这个函数是按通道逐个构建完整矩阵然后拷贝而不是一次构建所有通道 所以_ar2ucMt实际是一个临时buffer2️⃣ AI类型索引映射GetIndexBySrc(_srTp,_iMd,0) 把字符串转成 index例如字符串index“face”0“vehicle”13️⃣ 三种AI来源统一处理intelligent_type encode_type babymode_type 三类来源统一映射到_iMd说明不同模块的AI能力最终统一到同一套枚举空间4️⃣ 通道内互斥mutex_type:[xxx,yyy]处理SET_BIT(_ar2ucMt[i][_iMd],_iMt); 表示同一个通道中AI功能之间互斥5️⃣ 跨通道互斥重点mutex_type_between_channel结构{channel:CH01,mutex_type:[xxx]}处理_ar2ucMt[_iChn][_iMd] 注意这里写入的是目标通道_iChn的矩阵说明当前通道的AI能力会影响其他通道四、最终写入能力结构memcpy((*it)-MutexType,_ar2ucMt,...)条件if(i*it1) 映射关系ltuiFtChnltspstAbl通道ID列表能力结构列表 本质是根据通道号把计算好的互斥矩阵写入对应能力结构五、你可以这样理解核心总结这段代码本质在构建✅ 一个 AI互斥关系模型MutexType[channel][AI_type] bitmaskbitmask含义bit0是否支持ENABLEbitX与第X个AI互斥✅ 支持两类互斥1️⃣ 通道内互斥Channel 0: 人形检测 ⟂ 车检2️⃣ 跨通道互斥Channel 0 人形检测 ⟂ Channel 1 车检六、工程视角评价很关键 优点使用 bitset空间效率高支持扩展AIMT_ALL支持跨通道复杂约束⚠️ 风险点1️⃣ 每轮 memset设计隐晦容易误以为是全局矩阵2️⃣ memcpy尺寸判断sizeof((*it)-MutexType[0])sizeof(_ar2ucMt[0]) 这是在防止结构定义不一致导致越界3️⃣ atoi解析 channelCH01→1→-1 强依赖格式风险非标准字符串会出错七、如果你要进一步深入我可以帮你可以继续帮你分析MutexType内存布局非常关键SET_BIT/ASSIGN_4_BYTES宏实现AIMT_ALL枚举设计AI能力体系GUI如何利用这个互斥矩阵做控制比如灰掉选项如果你愿意可以把DEVICE_ABILITY_S结构体贴出来我可以帮你把这套“互斥模型”彻底画清楚包括bit级别。-------- “前置调用逻辑”其实非常关键它决定了 _getAiMutexRelation() 什么时候会被触发这段“前置调用逻辑”其实非常关键它决定了_getAiMutexRelation()什么时候会被触发。如果只看你前面那段函数很容易误以为它是“每次都拉取互斥关系”但这里实际上做了条件触发 避免重复请求。我帮你拆成几个核心点讲清楚。一、整体流程调用侧逻辑1.从 m_ltspstChIf 收集-通道号 _ltuiFtChn-能力结构 _ltspstAbl2.判断是否需要调用_getAiMutexRelation()3.如果需要 → 拉取互斥关系4.最后统一上报 GUI二、第一步收集通道 能力线程安全pthread_rwlock_rdlock(m_rwCtl);for(...){_ltuiFtChn.push_back((*it)-uiFtChn);_ltspstAbl.push_back((*it)-spstAbl);}pthread_rwlock_unlock(m_rwCtl);关键点使用读锁rwlock_rdlock说明当前只是读取通道能力信息不修改数据结构对应关系列表含义_ltuiFtChn前端通道号_ltspstAbl对应能力结构 两个 list 是一一对应的位置对齐三、关键触发条件核心逻辑autoit1_ltuiFtChn.begin();if(*it14) 第一层判断只有当“第一个通道号 4”才会继续❗ 这句的工程含义很关键通常表示只对“本地/前几个通道”做互斥关系拉取常见推测0~3本地IPC / 主码流通道≥4扩展通道 / 远端设备 结论不是所有通道都支持 AIMutexRelation四、第二层判断是否需要拉取for(...){if((*it2)-MutexType[*it1][AIMT_ENABLE][0]){_getAiMutexRelation(...);break;}}⚠️ 这一句是核心中的核心(*it2)-MutexType[*it1][AIMT_ENABLE][0]五、这个判断到底在检查什么回忆你前面分析的结构MutexType[channel][AI_type][bit]这里访问的是MutexType[通道][AIMT_ENABLE][0] 含义可以翻译为该通道是否已经“标记为支持 AI互斥能力”⚠️ 但这里有个“反直觉点”正常理解应该是如果“还没获取互斥关系” → 才去拉但代码写的是if(已 ENABLE)去拉取 正确理解应该是✔ 这里不是判断“是否已获取互斥关系”而是判断这个通道是否支持 AI能力ENABLE六、完整触发逻辑总结只有满足以下条件才会调用_getAiMutexRelation✅ 条件1存在本地通道*it14✅ 条件2至少有一个通道支持 AI能力MutexType[chn][AIMT_ENABLE][0]1 组合起来如果 当前设备有本地通道4 并且 至少一个通道支持AI能力 那么 才去拉 AI互斥关系七、设计意图非常重要这段逻辑的核心目的✅ 1. 避免无效请求如果设备没有 AI能力或不支持互斥关系 就不会调用_getAiMutexRelation()✅ 2. 延迟加载Lazy Load互斥关系数据量较大使用频率较低 只有“确定需要”才拉取✅ 3. 性能优化避免每次刷新能力都请求一次接口网络 / IPC 负担八、一个隐藏的设计问题你应该注意❗ 这里用的是MutexType[...][AIMT_ENABLE][0]而这个字段正是_getAiMutexRelation()填的 潜在问题如果初始时 MutexType 没初始化→ 条件判断失败 → 不会调用 _getAiMutexRelation → 永远不会填充 MutexType 为什么还能正常工作说明✔MutexType在别的地方已经初始化过 ENABLE 位可能来源能力同步接口非 mutex默认能力填充九、最后一步上报 GUICNetObj::rptAblToGui(); 无论是否调用_getAiMutexRelation都会把当前能力上报给 GUIGUI侧效果如果没拉 mutex只能显示 AI能力不能做互斥控制灰掉选项如果拉了 mutex可以做互斥禁用自动切换冲突提示十、一句话总结本质这段前置代码的本质是在“设备具备AI能力”的前提下 按需触发一次 AI互斥关系的拉取 并避免无意义的接口调用。如果你想继续深入推荐接下来最值得看的三块DEVICE_ABILITY_S::MutexType具体定义决定bit语义SET_BIT宏实现bit布局关键GUI 如何利用 MutexType 做互斥控制非常有意思你可以把结构体贴出来我可以帮你把**整套 AI能力约束系统含GUI行为**完整还原出来。----------- 整个“互斥模型”就可以彻底讲清楚了。我们直接从内存布局 → 语义 → 使用方式 → 设计优缺点四个层面拆很好这个结构体一出来整个“互斥模型”就可以彻底讲清楚了。我们直接从内存布局 → 语义 → 使用方式 → 设计优缺点四个层面拆。一、结构体本质RS_U8 MutexType[4][ASSIGN_4_BYTES(AIMT_ALL)][BITS_2_BYTES(AIMT_ALL)]; 可以抽象为MutexType[通道][AI类型][bitset]二、三维含义精确定义1️⃣ 第一维[4]MutexType[4] 表示最多支持 4 个前端通道对应你前面的判断if(*it14)✔ 完全一致说明只处理 0~3 通道是固定上限设计编译期定死2️⃣ 第二维ASSIGN_4_BYTES(AIMT_ALL) 本质AI能力类型索引INT_TYPES_E例如indexAI类型0人形检测1车检2区域入侵……❗ 为什么是ASSIGN_4_BYTES说明每个 AI类型的bitset按4字节对齐常见实现类似#defineASSIGN_4_BYTES(x)(((x)31)/32) 即每32个AI类型占1个uint323️⃣ 第三维BITS_2_BYTES(AIMT_ALL) 本质bit位存储互斥关系可能实现#defineBITS_2_BYTES(x)(((x)7)/8) 即每个AI类型对应一个 bitset bit0 ~ bitN → 表示与哪些AI互斥三、最终模型核心理解你可以把它理解为✅ 一个“邻接矩阵Adjacency Matrix”MutexType[channel][i][j] 1表示在 channel 上AI类型 i 和 AI类型 j互斥✅ 再加一个特殊bitbit(AIMT_ENABLE)表示该 AI类型是否支持四、结合代码还原真实语义1️⃣ ENABLE 位SET_BIT(_ar2ucMt[i][_iMd],AIMT_ENABLE); 等价于MutexType[channeli][AI_iMd][ENABLE] 1✔ 表示这个AI在这个通道上是“存在的”2️⃣ 通道内互斥SET_BIT(_ar2ucMt[i][_iMd],_iMt); 表示MutexType[i][Md][Mt] 1✔ 含义同一个通道内AI Md ⟂ AI Mt3️⃣ 跨通道互斥SET_BIT(_ar2ucMt[_iChn][_iMd],_iMt); 注意这里写的是_iChn目标通道✔ 含义通道A的 Md 影响 → 通道B的 Mt五、一个具体例子你可以脑补假设AIMT_ALL 8场景通道0 人形检测 (0) 车检 (1) 互斥 人形 ⟂ 车检存储结果MutexType[0][0][1] 1 // 人形 ⟂ 车检 MutexType[0][1][0] 1 // 车检 ⟂ 人形是否对称取决于协议ENABLEMutexType[0][0][ENABLE] 1 MutexType[0][1][ENABLE] 1六、为什么用这种结构设计意图✅ 1. 空间效率极高假设AIMT_ALL 64传统bool矩阵64 × 64 4096 bytesbitset64 × (64 bit) 512 bytes 节省 8 倍✅ 2. 查询效率 O(1)判断互斥if(TEST_BIT(MutexType[ch][i],j)) 直接位运算✅ 3. 易扩展新增 AI类型只需扩大 AIMT_ALL不改结构七、隐藏设计点非常关键❗ 1. ENABLE 也是一个“AI类型”MutexType[ch][AIMT_ENABLE][0] 说明ENABLE 被当作“虚拟AI类型”使用❗ 2. 不是严格对称矩阵MutexType[i][j] ! MutexType[j][i] 是否对称取决于协议返回代码没有强制对称❗ 3. 跨通道写入方式_ar2ucMt[_iChn][_iMd] 实际是把“影响”写到目标通道而不是当前通道八、结合前置逻辑再解释一次闭环之前你问的(*it2)-MutexType[*it1][AIMT_ENABLE][0]现在可以精准解释检查 当前通道是否“存在至少一个AI能力” 如果成立 才去拉互斥关系九、一句话总结工程视角MutexType 本质是一个 “按通道划分的 AI能力互斥位图矩阵” 其中 行 AI能力 列 被互斥的AI能力 值 bit标记十、如果你要继续深入强烈推荐接下来可以深入这几个关键点都很有价值1️⃣SET_BIT/TEST_BIT实现 决定 bit 排布高位/低位2️⃣ AIMT_ALL / INT_TYPES_E 枚举 决定 AI能力体系人形、车、人脸等3️⃣ GUI 使用方式重点通常会做如果 AI_A 启用 灰掉所有 MutexType[A][*] 1 的选项如果你把SET_BIT宏或者INT_TYPES_E枚举贴出来我可以帮你把bit级别 GUI行为彻底还原包括实际UI如何联动。

更多文章