AAOS CarPowerManager

文章目录

      • 提供什么服务? 如何提供的?
      • 基础的carpowerpolicyd的服务

提供什么服务? 如何提供的?

  • 作用是什么?

电源管理, 车上面的状态可能有很多中,比如在车库,停车,短时间停车等等。每种模式可能需要的功耗策略都不一样。
就需要一个模块对车的各个部分进行控制。

  • 基本原理

车辆的状态停车、熄火等等状态通过vehicle hal 通知到carpowerservice, 在service 中去控制各个模块的on off。
(音频模块的on off 是通过设置stric mode 的方式 控制carauioservice, 具体就是不是safe 和emergency的音频流类型 请求焦点都会失败,也就是这些类型的声音类型都播放不出来)

基础的carpowerpolicyd的服务

  • 对应的carpowerpolicyd.rc文件
    属于early_hal. service名字为carpowerpolicyd
  • 对应的main函数

启动CarPowerPolicyServer,传递是外部创建好的looper,启动调用iniit进行初始化。
init包括PolicyManager的init、componetHandlder的注册、然后将服务注册到serviceMananger。最后调用ConnetcToVhal。

    mHandlerLooper = looper;mPolicyManager.init();mComponentHandler.init();mSilentModeHandler.init();connectToVhal();
  • PolicyManager的init
  1. mRegisteredPowerPolicies构造,主要是构造两个默认的regular的powerPolicy
    一个policy 的id是kSystemPolicyIdAllOn,这里所有component都是on的状态。
    一个polocy的id是kSystemPolicyIdInitialOn,这里打开kInitialOnComponents里面定义的Component。

  2. mPreemptivePowerPolicies的构造,这个是抢占式的powerPolicy。
    也是创建两个powerPolicy 分别为 kSystemPolicyIdNoUserInteraction、kSystemPolicyIdSuspendToRam
    两个policy都有默认的

  3. 从文件中读取powerpolicy配置
    是从/vendor/etc/automotive/power_policy.xml读取配置,其中配置是按照具体的policy id 和 模块的open 和on
    读取的配置存储在
    mRegisteredPowerPolicies 和 mPolicyGroups。
    其中mRegisteredPowerPolicies存储 policy的名字policy_id_other_untouched和具体的policy。
    mPolicyGroups存储policyGroup的名字

  • connect to vhal
  1. vhal的连接 获取vehicle的服务,连接不上时候 会间隔200ms进行尝试,最多尝试25次。也就是1s连接不上就直接返回失败了。
  2. 配置默认的powerpolicy, 这个powerpolicy是之前init从文件power_policy.xml中读取到的。
  3. subscribe
    VehicleProperty::POWER_POLICY_GROUP_REQ
    VehicleProperty::POWER_POLICY_REQ
    这两个属性,当vhal有这两个属性变化的时间上报的时候,获取属性的值,并设置对应的powerpolicy。

其存储的xml

<powerPolicy version="1.0"><policyGroups>
<policyGroup id="mixed_policy_group">
<defaultPolicy state="WaitForVHAL" id="policy_id_other_on"/>
<noDefaultPolicy state="On"/>
</policyGroup>
</policyGroups><policy id="policy_id_other_untouched">
<otherComponents behavior="untouched"/>
<component id="POWER_COMPONENT_AUDIO">on</component>
<component id="POWER_COMPONENT_DISPLAY">on</component>
<component id="POWER_COMPONENT_BLUETOOTH">on</component>
<component id="POWER_COMPONENT_WIFI">on</component>
<component id="POWER_COMPONENT_VOICE_INTERACTION">on</component>
<component id="POWER_COMPONENT_VISUAL_INTERACTION">on</component>
<component id="POWER_COMPONENT_TRUSTED_DEVICE_DETECTION">on</component>
</policies></powerPolicy>

CarPowerManagerService 与其他服务和 HAL 协调电源状态。CPMS 实现上述状态机,并在发生电源状态转换时向每个观察者发送通知。carPower服务会通过VHAL 和硬件的MCU进行通信。

###  整体的框架

carPowerManager(java/c++) ——> CarPowerManagerService

跟CarAudioSevice框架类型,提供给外部的carPowerMananger,(java和c++两套接口)。
然后通过AIDL调用到CarPowerManangerService 中。

  • 常用接口 设置carPowerPolicy的监听
    carAudioService 根据电源的状态做相应的处理。
    获取service 然后设置监听。 当power policy发生变化的时候回调到onPolicyChanged
    在onPolicyChanged 中 将音频关闭,通过CarAudioService设置标志位,让不是safe 和 emergancy
    的音频 请求焦点都失败。

同样 在 CarMediaService 中也会监听powerchange的事件,对于powerpolicy中componet状态变化进行处理。 比如component off状态的,设置状态为pause。在播放的MediaSession进行暂停。

    void startListeningForPolicyChanges() {if (mCarPowerManagementService == null) {Slog.w(TAG, "Cannot find CarPowerManagementService");mCarAudioService.setAudioEnabled(/* isAudioEnabled= */ true);return;}CarPowerPolicyFilter filter = new CarPowerPolicyFilter.Builder().setComponents(AUDIO).build();mCarPowerManagementService.addPowerPolicyListener(filter, mChangeListener);initializePowerState();}private final ICarPowerPolicyListener mChangeListener =new ICarPowerPolicyListener.Stub() {@Overridepublic void onPolicyChanged(CarPowerPolicy policy,CarPowerPolicy accumulatedPolicy) {synchronized (mLock) {if (mIsAudioEnabled != accumulatedPolicy.isComponentEnabled(AUDIO)) {updateAudioPowerStateLocked(accumulatedPolicy);}}}};@GuardedBy("mLock")private void updateAudioPowerStateLocked(CarPowerPolicy policy) {mIsAudioEnabled = policy.isComponentEnabled(AUDIO);Slog.w(TAG, "Policy mIsAudioEnabled" + mIsAudioEnabled);mCarAudioService.setAudioEnabled(mIsAudioEnabled);}
}void setAudioEnabled(boolean isAudioEnabled) {if (Slogf.isLoggable(CarLog.TAG_AUDIO, Log.DEBUG)) {Slogf.d(CarLog.TAG_AUDIO, "Setting isAudioEnabled to %b", isAudioEnabled);}mFocusHandler.setRestrictFocus(/* isFocusRestricted= */ !isAudioEnabled);if (mUseCarVolumeGroupMuting) {mCarVolumeGroupMuting.setRestrictMuting(/* isMutingRestricted= */ !isAudioEnabled);}// TODO(b/176258537) if not using group volume, then set master mute accordingly}carAudioFocus.javavoid setRestrictFocus(boolean isFocusRestricted) {synchronized (mLock) {mIsFocusRestricted = isFocusRestricted;if (mIsFocusRestricted) {abandonNonCriticalFocusLocked();}}}public void onAudioFocusRequest(AudioFocusInfo afi, int requestResult) {int response;AudioPolicy policy;AudioFocusInfo replacedDelayedAudioFocusInfo = null;synchronized (mLock) {policy = mAudioPolicy;response = evaluateFocusRequestLocked(afi);}// Post our reply for delivery to the original focus requestermAudioManager.setFocusRequestResult(afi, response, policy);logFocusEvent("onAudioFocusRequest for client " + afi.getClientId()+ " with gain type " + focusEventToString(afi.getGainRequest())+ " resulted in " + focusRequestResponseToString(response));}private int evaluateFocusRequestLocked(AudioFocusInfo afi) {Slog.i(TAG, "Evaluating  + focusEventToString(afi.getGainRequest())+ " request for client " + afi.getClientId()+ " with usage " + afi.getAttributes().usageToString());Slog.i(TAG, "mIsFocusRestricted  " + mIsFocusRestricted);      if (mIsFocusRestricted) {int audioContext = CarAudioContext.getContextForAttributes(afi.getAttributes());if (!isCriticalAudioContext(audioContext)) {Slog.i(TAG, "audioContext " + audioContext + "request failed");return AudioManager.AUDIOFOCUS_REQUEST_FAILED;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

douyin ios六神

抖音 ios六神算法&#xff0c; x-gorgon x-khronos x-ladon x-argus x-helios x-medusaios版本的六神算法&#xff0c;以及ios越狱过检测抓包logs插件 {x-helios: xnamv9MBKpjSfng4vnl1kCue1d0RPzLcHcU06Ww7CdrYV6d2, x-gorgon: 840460970000aa8ffefc2ed82fff5b7e9eaefd00598…

贴片电容规格怎么看?

贴片电容规格怎么看&#xff1f; 原理图中的电容参数给的数值&#xff0c;目的是便于分析电路。而采购的电容&#xff0c;所给的参数是一串字母和数字组成的字符串&#xff0c;来料检查人员必须根据料单&#xff0c;判断来料是否合格。有时&#xff0c;在一些面试场合&#xf…

vue3的自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (CustomDirectives)。 1.自定义指令的目的和简单介绍 自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 一个自定义指令由一个包含类似组件生命周期钩子的对象…

字符串混淆

IDA打开so&#xff0c;在Export里面搜索.datadiv 跟进可以找到混淆的字符串 异或加密的字符串可以直接手动异或恢复 Export里面搜索JNI_OnLoad 如果没有将变量类型改为JavaVM *vm, void *reserved 在这里Load jni.h 一些OLLVM加密的字符串可以直接用Frida来hook function h…

蓝桥杯每日一题2023.11.3

题目描述 承压计算 - 蓝桥云课 (lanqiao.cn) 题目分析 将重量存入a中&#xff0c;每一层从上到下进行计算&#xff0c;用d进行计算列的重量&#xff0c;当前d的重量应为正上数组和右上数组的个半和并加上自身的重量 计算到30层记录最大最小值&#xff0c;进行比例运算即可 …

centos 搭建内网ntp时间服务器

在 CentOS 搭建内网 NTP 时间服务器&#xff0c;你可以按照以下步骤操作&#xff1a; 安装 NTP 服务&#xff1a; 打开终端并以 root 用户身份登录。使用以下命令安装 NTP 服务&#xff1a; sudo yum install ntp配置 NTP 服务器&#xff1a; 打开 NTP 配置文件 /etc/ntp.conf&…

Verilog刷题[hdlbits] :Alwaysblock1

题目&#xff1a;Alwaysblock1 Since digital circuits are composed of logic gates connected with wires, any circuit can be expressed as some combination of modules and assign statements. However, sometimes this is not the most convenient way to describe the…

后端配置跨域怎么配置

在后端配置跨域&#xff0c;需要在服务器的代码中添加相应的设置。以下是几种常见的后端语言的跨域配置方式&#xff1a; Node.js 在使用 Node.js 的 Express 框架时&#xff0c;可以使用 cors 中间件来处理跨域问题。安装 cors 中间件后&#xff0c;在代码中添加如下设置&am…

shopee虾皮跨境电商网站商品数据支持网站后缀(.com.my;.vn;.ph)

作为一名技术爱好者&#xff0c;我们总会遇到各种各样的技术问题&#xff0c;需要寻找合适的技术解决方案。而在互联网时代&#xff0c;我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而&#xff0c;在不同的技术分享中&#xff0c;我们常常会遇到质量参差不齐的文…

2024泰安高企认定从何认定?

企业申请认定时须注册成立一年以上&#xff1b; 注意事项&#xff1a; “须注册成立一年以上”是指企业注册成立365个日历天数以上。 相关证明材料&#xff1a; 证明事项告知承诺书或营业执照。 02企业通过自主研发、受让、受赠、并购等方式&#xff0c;获得对其主要产品&…

日常踩坑-[sass]Error: Expected newline

在学习sass的时候&#xff0c;运行时发现报错 经过网上冲浪知道&#xff0c;原来在声明语言的时候 lang 不能声明为 sass &#xff0c;而是 scss ,这就有点坑了 原因&#xff1a; scss是sass3引入进来的&#xff0c;scss语法有"{}“,”;"而sass没有&#xff0c;所以…

黑芝麻智能与香港科技园签订合作备忘录,迈向全球化发展新阶段

11月6日&#xff0c;黑芝麻智能与香港科技园公司举行合作签约仪式&#xff0c;双方将合力推动黑芝麻智能香港科技创新研发中心在科技园落地&#xff0c;并促进园区打造车规级高性能智能汽车计算芯片平台。黑芝麻智能首席市场营销官杨宇欣、香港科技园公司首席企业发展总监姚庆良…

Unity之NetCode多人网络游戏联机对战教程(6)--NetworkTransform组件

文章目录 前言NetworkTransform是什么玩家移动脚本NetworkTransform字段讲解Synchronizing ("Syncing")ThresholdsLocal spaceInterpolationSlerp PositionUse Quaternion SynchronizationUse Quaternion CompressionUse Half Float PrecisionAuthority modesServer …

Linux多线程编程- pthread_detach()

基本概念 pthread_detach 函数是 POSIX 线程&#xff08;pthreads&#xff09;库的一部分&#xff0c;它用于将指定的线程置于分离状态&#xff08;detached state&#xff09;。分离状态的线程在终止时会自动释放其资源回操作系统&#xff0c;包括线程的堆栈和线程描述符。这…

Excel中截取特殊字符之前、之间、之后的数据

1、第一个数据&#xff0c;“*” 之前的数据&#xff0c; 公式 &#xff1a;LEFT(J2,FIND("*",J2)-1) 2、第二个数据&#xff0c;两个 “*” 之中的数据&#xff0c; 公式 &#xff1a;MID(J2,FIND("*",J2)1,FIND("*",J2,FIND("*",…

ZZULIOJ 1108: 打印数字图形(函数专题) (C/C++)

1108: 打印数字图形&#xff08;函数专题&#xff09; 题目描述 从键盘输入一个整数n(1≤n≤9),打印出指定的数字图形。要求在程序中定义并调用如下函数&#xff1a;PrintSpace(m)用来输出m个空格&#xff1b;PrintDigit(m)来输出一行中的数字串"12…m…21"&#xff…

IP协议汇总

IP协议 1.基本概念 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;” ,IP协议是TCP/IP体系中的网络层协议。 总的来说&#xff0c;IP协议的最重要功能是提供了一种标准化的方式来路由和传输数据包&#xff0c;以实现全球互联网上的通信。 &#xff…

CJSON解析json字符串示例

cJSON 作为 Json 格式的解析库,其主要功能就是构建和解析 Json 格式 CJSON解析json字符串 {"action":"started","code":"0","data":"","desc":"success","sid":"a8"} …

图的结构模板及遍历

图&#xff1a;由点的集合和边的集合组成。 常用的表示图的方法有两种&#xff1a; 1、邻接表法 将一个点的邻居都列出来。有向图只列出从这个点出发向外发散的点 2、邻接矩阵法 将点集列出一列行&#xff0c;列出一列列&#xff0c;在矩阵中填两点之间的权值&#xff08;距…

SpringBoot集成-阿里云对象存储OSS

文章目录 阿里云 OSS 介绍准备工作SpringBoot 集成 OSS 阿里云 OSS 介绍 阿里云对象存储 OSS &#xff08;Object Storage Service&#xff09;&#xff0c;是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS&#xff0c;你可以通过网络随时存储和调用包括文本、图片、…