Qualcomm在2016年6月的CES展会上,带来了骁龙 820A 车载芯片,这款芯片可以看作是骁龙 602A 的升级版。与 2014 年发布的 602A 相比,820A 更加强调安全性,计算能力更强大。小编在公司有幸参与利用骁龙820A开发板进行二次开发工作。
前面小编讲解了车载hal的集大成者-VehicleHal.java,今天小编给大家带来VehicleHal的hal的组成部分。 VehicleHal.java中定义和实现了vehicle HAL的抽象。 该类实现了与native HAL 的接口并对接收到的数据进行基本的解析(类型检查),然后将对应时间发送给对应的基类HalServiceBase。由基类HalServiceBase实现数据转换到对应的Service的API.
VehicleHal的主要组成图:
使用方式
通过VehicleHal构造函数创建了HandlerThread并启动线程。该线程的处理函数HandlerThread.getLooper()将会作为VehicleNetwork创建时的参数。
vehicleHal是在构造函数中创建了(new SensorHalService)车载各种HalService的实例(mSensorHal),并初始化了HalServiceBase服务列表,最后VehicleNetWork.createVehicleNetWork()方法构造VehicleNetwork。
这里我们就可以清晰看出vehicleHal和VehicleNetWork最终是如何关联起来的。
public static VehicleNetwork createVehicleNetwork(VehicleNetworkListener listener,
Looper looper) {
... ...
return new VehicleNetwork(service, listener, looper);
}
private VehicleNetwork(IVehicleNetwork service, VehicleNetworkListener listener,
Looper looper) {
mService = service;
mListener = listener;
mEventHandler = new EventHandler(looper);
mVehicleNetworkListener = new IVehicleNetworkListenerImpl(this);
}
VehicleNetWork事件的处理
在VehicleHal的主要组成图中,可以看出VehicleHal中还包括其他成员:CarPropertyUtils和HalServicesBase,但是VehicleHal的构造函数中并没有对其显式的初始化。
public void onVehicleNetworkEvents(VehiclePropValuesParcelable values) {
VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
if (vehicleNetwork != null) {
vehicleNetwork.mEventHandler.notifyEvents(values.values);
}
}
在EventHandler类中调用handleVehicleNetworkEvents,最终调用mListener对应的onVehicleNetworkEvents方法。mListener就是VehicleNetwork初始化构造时赋值的(VehicleHal.java中)。
private void handleVehicleNetworkEvents(VehiclePropValues values) {
mListener.onVehicleNetworkEvents(values);
}
onVehicleNetworkEvents中实现了对具体HalService的分发处理。
我们可以大致看出VehiclePropValues是里面的关键,这个在CarPropertyUtils的函数定义方式是
CarPropertyUtils的结构
由于其中构成的函数过多,小编会选取具有代表性的函数进行分析。
getRawValueList
这个函数的实现方式已经在上文贴过,有读者可能会觉得奇怪,VehicleHal中用到的不是getRawValueList,而是getValuesList,这个不用奇怪,因为别的类里面调用getRawValueList,然后该类中的getValueList的实现方法就是getRawValueList的内容。
toVehiclePropValue
toVehiclePropValue顾名思义,这个函数就是获取各个属性值。
有没有觉得很熟悉,这个是不是和Dump函数差不多。跟踪代码,我们可以看出这个函数主要是把Hal的ID,areaID,halType放到VehiclePropValue的Builder对象里。
getJavaClass
从代码上看,这个是决定halType的数据类型的。类似于_BooLEAN结尾的,我们很容易得知这个返回的是Boolean.calss。但是_ZONE_BOOLEAN结尾的我们却不常见。其实zone是车载特有的属性,和区域有关,座位可以是一个区域,车窗也可以是一个区域,以此类推。有兴趣的话,可以翻阅小编的专门介绍属性的文章。
总结
本文对vehiclehal的消息解析和处理流程梳理了一下,首先介绍了其组成构造,并对每个service处理进行了分析,最后重点介绍了下CarPropertyUtils,希望对大家理解VehicleHal有帮助哦。