我爱蓝牙网 - 52Bluetooth - 最具人气蓝牙技术交流网站

 找回密码
 立即注册

只需一步,快速开始

使用微信账号登录

qcc304x笔记之规则(rules)机制详解

2020-11-23 21:24| 发布者: csdn| 查看: 452| 评论: 0|来自: csdn

摘要: 代码逻辑分析(注:由于SDK在持续更新,有些接口可能会有些变化,所以仅供参考)/*目前使用的rules 容器有*/ Common_rules_set primary_rules_set secondary_rules_set hstop_rules_set tws_topology_primary_rules ...

代码逻辑分析

(注:由于SDK在持续更新,有些接口可能会有些变化,所以仅供参考)

/*目前使用的rules 容器有*/
Common_rules_set
primary_rules_set
secondary_rules_set
hstop_rules_set
tws_topology_primary_rules
tws_topology_secondary_rules
 
 
/*rules的通用实现,包含创建、注销,执行和取消规则*/
//rules_engine.c 
/*创建一个规则容器,将一个规则的table注册(容器与table关联)*/
RulesEngine_CreateRuleSet
/*删除一个规则容器*/
RulesEngine_DestroyRuleSet
/*运行一个规则,供模块外部调用*/
RulesEngine_SetEvent
	/*运行一个规则,供模块内部调用*/
	RulesEngine_RunRules
/*当一个规则运行完之后,清除相应事件mask及状态位*/
RulesEngine_SetRuleComplete
	RulesEngine_SetRuleWithEventComplete
/*取消一个规则,清除相应事件mask及状态位*/	
RulesEngine_ResetEvent	
 
 
/*通用规则*/
//earbud_common_rules.c
/*earbud通用规则初始化*/
CommonRules_Init
	/*创建Common rules实体*/
	RulesEngine_CreateRuleSet(Common_rules_set)
/*调用rule engine中的接口,执行相应操作,上面已经描述过,这里就不多说了*/
CommonRules_SetEvent
	RulesEngine_SetEvent
CommonRules_ResetEvent
	RulesEngine_ResetEvent
CommonRules_SetRuleComplete
	RulesEngine_SetRuleComplete
 
 
/*earbud primary 相关规则*/
//earbud_primary_rules.c
PrimaryRules_Init
	RulesEngine_CreateRuleSet(primary_rules_set)
 
 
/*earbud secondary 相关规则*/
//earbud_secondary_rules.c
SecondaryRules_Init
	RulesEngine_CreateRuleSet(secondary_rules_set)
 
 
//headset_topology_rules.c
HeadsetTopologyRules_Init	
	RulesEngine_CreateRuleSet(hstop_rules_set)
 
 
//tws_topology_primary_ruleset.c
TwsTopologyPrimaryRules_Init
	RulesEngine_CreateRuleSet(tws_topology_primary_rules)
 
 
//tws_topology_secondary_ruleset.c
TwsTopologySecondaryRules_Init
	RulesEngine_CreateRuleSet(tws_topology_secondary_rules)


规则运行流程实例分析

下面针对一个一条规则执行的的流程做详细说明:

上图为通用(common)的规则table,我们以第一条来做说明:

/*有两个地方会调用rules,初始化以及earbud出耳朵的时候*/
appSmSetInitialCoreState
appExitParentStateInEar
	appSmRulesSetEvent(RULE_EVENT_OUT_EAR);
		CommonRules_SetEvent
			RulesEngine_SetEvent
				RulesEngine_Check
					/*这里去用函数指针调用规则检查函数,即Common_rules_set中RULE_EVENT_OUT_EAR事件对于的函数,这里为ruleOutOfEarLedsEnable*/
					RulesEngine_RunRules
						ruleOutOfEarLedsEnable
							    if (!appConfigInEarLedsEnabled())
									/*这里的消息为什么发给appsm,是根据初始化的时候rule_params.event_task所指定的task*/
									MessageSend(&app_sm.task, CONN_RULES_LED_ENABLE, NULL)
								else
									/*do nothing*/
/*处理由规则发来的事件*/
appSmHandleMessage
	CONN_RULES_LED_ENABLE
		appSmHandleConnRulesLedEnable
			/*使能led的使用,并结束规则*/
			LedManager_Enable(TRUE);
			appSmRulesSetRuleComplete(CONN_RULES_LED_ENABLE);


从上面的逻辑看,我们实际的功能需求是为了在耳机离开耳朵的时候,使能led显示。但是是否使能led基于,是否进行了相关的配置(appConfigInEarLedsEnabled)

因此所谓的规则,即是判断我将要执行的动作(这里为使能led),前置条件是否满足,规则则使用来判断条件的,所以上面的逻辑实际上可以简化为如下形式:

appSmSetInitialCoreState
	appExitParentStateInEar
		if (!appConfigInEarLedsEnabled())
			/*这里的消息为什么发给appsm,是根据初始化的时候rule_params.event_task所指定的task*/
			LedManager_Enable(TRUE);
			appSmRulesSetRuleComplete(CONN_RULES_LED_ENABLE);
		else
			/*do nothing*/


单从上面的实例看来,似乎增加了代码复杂度,但是这里为什么要引入规则机制呢?

我个人猜测是,当在很多个地方共用同一个判断条件时,一个规则就搞定了,不用在每个地方都加判断条件,整体代码结构就可以得到优化

来源:https://blog.csdn.net/ylangeia/article/details/109136265
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

免责声明

1.本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
2.如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

发布主题 客服中心 搜索 官方QQ群

QQ|小黑屋|简约版|手机版|我爱蓝牙网 - 52Bluetooth ( 粤ICP备16101765号 )

GMT+8, 2021-2-27 17:50 , Processed in 0.099494 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部