VehicleHal.java - fwk层对应VehicleService

news/2024/12/23 7:47:50/

VehicleHal.java - fwk层对应VehicleService

  • 1、VehicleHal.java初始化
    • 1.1 hal服务区分
    • 1.2 简要时序图
  • 2、PowerHalService为例
    • 2.1 PowerHalService初始化和订阅
    • 2.2 简要时序图

android12-release
【IVI】VehicleService启动
【IVI】车载设备硬件抽象层VHAL
【IVI】CarService启动


在这里插入图片描述

1、VehicleHal.java初始化

  • CarService: 位于 /platform/packages/services/Car/
  1. 流程主要有两个,一是创建CarService.java#onCreate() -> ICarImpl.java#new -> VehicleHal.java#new,而是初始化CarService.java#onCreate() -> ICarImpl.java#init -> VehicleHal.java#init
  2. android.hardware.automotive.vehicle.V2_0.IVehicle.getService(instanceName)获取底层服务VehicleService.cpp/IVehicle.hal
    在这里插入图片描述
  3. VehicleHal.java创建初始化,此类处理与本机HAL的接口,并对接收的数据进行基本解析(类型检查)。然后将每个事件发送到相应的HalServiceBase实现。HalServiceBase负责将数据转换为相应的Car*ServiceCar*Manager API
    在这里插入图片描述

1.1 hal服务区分

hal服务区分相关属性types.hal说明对应API Manager和service
PowerHalServiceAP_POWER_STATE_REQAP_POWER_STATE_REPORTDISPLAY_BRIGHTNESS将 HAL 电源事件转换为更高级别的语义信息CarPowerManagementService - CarPowerManager
PropertyHalService此车辆 HAL 支持的所有属性配置的列表。mAllPropertiesgetAllPropConfigs()HAL 服务的通用接口,通过 ICarProperty 来回发送车辆属性。通过 ICarProperty 来回传递车辆属性进行通信的服务应扩展此类。CarPropertyService - CarPropertyManager
InputHalServiceHW_KEY_INPUTHW_ROTARY_INPUTHW_CUSTOM_INPUT将 HAL 输入事件转换为更高级别的语义信息。CarInputService - CarInputManager
VmsHalServiceVEHICLE_MAP_SERVICEVMS 客户端实现,它使用特定于 HAL 的消息编码代理 VmsPublisher/VmsSubscriber API 对车辆 HAL 的调用。
UserHalServiceCREATE_USERINITIAL_USER_INFOREMOVE_USERSWITCH_USERUSER_IDENTIFICATION_ASSOCIATION用于将OEM的自定义用户管理与Android集成的服务。CarUserService - CarUserManager
DiagnosticHalServiceOBD2_LIVE_FRAMEOBD2_FREEZE_FRAMEOBD2_FREEZE_FRAME_INFOOBD2_FREEZE_FRAME_CLEAR诊断 HAL 服务支持从 VHAL 收集诊断信息并将其转换为更高级别的语义信息CarDiagnosticService - CarDiagnosticManager
ClusterHalServiceCLUSTER_SWITCH_UICLUSTER_DISPLAY_STATECLUSTER_REPORT_STATECLUSTER_REQUEST_DISPLAYCLUSTER_NAVIGATION_STATE将 HAL 输入事件转换为更高级别的语义信息。ClusterHomeService - ClusterHomeManager
EvsHalServiceEVS_SERVICE_REQUEST将CarEvsService感兴趣的HAL事件转换为更高级别的语义信息。CarEvsService - CarEvsManager
HalClient区别以上hal服务,VehicleHal.java通过HalClient底层IVehicle.hal交互车辆 HAL 客户端。直接与车辆 HAL 接口 IVehicle 交互。包含一些可重试属性的逻辑,将车辆通知重定向到给定的活套线程。

1.2 简要时序图

在这里插入图片描述

2、PowerHalService为例

2.1 PowerHalService初始化和订阅

  • VehicleHal.java#init -> PowerHalService#init订阅最终调用到mVehicle.subscribe(),并注册监听回调IVehicleCallbackVehicleHal extends IVehicleCallback.Stub
    在这里插入图片描述
  • IVehicleCallback.hal#onPropertyEvent -> VehicleHal.java#onPropertyEvent -> PowerHalService.java#onHalEvents -> PowerEventListener 属性监听最终传递给APP等注册的监听PowerEventListener
    在这里插入图片描述
private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {for (VehiclePropValue v : values) {switch (v.prop) {case AP_POWER_STATE_REPORT:// Ignore this property event. It was generated inside of CarService.break;case AP_POWER_STATE_REQ:int state = v.value.int32Values.get(VehicleApPowerStateReqIndex.STATE);int param = v.value.int32Values.get(VehicleApPowerStateReqIndex.ADDITIONAL);Slog.i(CarLog.TAG_POWER, "Received AP_POWER_STATE_REQ="+ powerStateReqName(state) + " param=" + param);listener.onApPowerStateChange(new PowerState(state, param));break;case DISPLAY_BRIGHTNESS:{int maxBrightness;synchronized (mLock) {maxBrightness = mMaxDisplayBrightness;}int brightness = v.value.int32Values.get(0) * MAX_BRIGHTNESS / maxBrightness;if (brightness < 0) {Slog.e(CarLog.TAG_POWER, "invalid brightness: " + brightness+ ", set to 0");brightness = 0;} else if (brightness > MAX_BRIGHTNESS) {Slog.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to "+ MAX_BRIGHTNESS);brightness = MAX_BRIGHTNESS;}Slog.i(CarLog.TAG_POWER, "Received DISPLAY_BRIGHTNESS=" + brightness);listener.onDisplayBrightnessChange(brightness);}break;}}
}

2.2 简要时序图

在这里插入图片描述


http://www.ppmy.cn/news/102614.html

相关文章

累积运行时间功能块(SCL语言)

设备累积运行时间功能块梯形图源代码请参看下面的文章博客: SMART PLC设备累计运行时间功能块_RXXW_Dor的博客-CSDN博客功能块非常简单,没有什么特别需要说明的,方法不唯一仅供参考。https://blog.csdn.net/m0_46143730/article/details/129170452方法始终不唯一,受限于当…

机器学习基础知识之多模型性能对比评价方法

文章目录 1、交叉验证t检验2、Friedman检验与Nemenyi后续检验 在进行预测或分类对比实验时&#xff0c;通常需要比较两个或两个以上的模型性能&#xff0c;因此&#xff0c;下面将介绍两个常用的多模型性能对比评价方法&#xff0c;一种是交叉验证t检验&#xff0c;该方法主要用…

python使用hTTP方法

Python中可以使用requests库来发送HTTP请求&#xff0c;其中包括GET、POST、PUT、DELETE等方法。下面是一个使用requests库发送HTTP请求的示例&#xff1a; python import requests # 发送GET请求 response requests.get(Example Domain) # 发送POST请求 data {key1: valu…

opencv_c++学习(二十八)

一、单目相机位姿估计 如上图所示&#xff0c;根据图像的情况反推相机的运动情况。 如实现上述功能则需要拍摄当前物体的图像&#xff0c;然后拍摄一段时间之后物体的图像&#xff0c;然后联合两张图像则可以获取两个时刻的相机位姿关系。 位姿估计函数&#xff1a; bool cv:s…

01.GATK肿瘤基因变异最佳实践SnakeMake流程:WorkFlow简介

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> 代码地址 https://jihulab.com/BioQuest/smkhsshttps://github.com/BioQuestX/smkhss GATK best practices workflow Pipeline summary SnakeMake workflow for Human Somatic short variants (SNPINDEL) Expected fa…

JavaScript中几个不常用的绑定事件

目录 一、fullscreenchange事件 二、pagehide事件 三、pageshow事件 四、hashchange事件 五、online事件 六、offline事件 七、popstate事件 八、devicemotion事件 九、deviceorientation事件 一、fullscreenchange事件 fullscreenchange 事件是一个浏览器事件&#…

使用 LSSVM 的 Matlab 演示求解反常微分方程问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【人脸识别】insightface 使用记录和搭建服务注意点 从0到1

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.开始1.1 前置1.2 再次运行&#xff0c;人脸检测跑通 前言 人脸识别项目&#xff0c;再走一遍。之前是公司老人留下的&#xff0c;没部署过&#xff0c;没交付…