我们上一篇简要分析了Java framework层对于property的处理和如何接收HAL Vehicle的通知进行dispatch的。
**见 **
这篇简要分析HAL Vehicle
我们知道HAL Vehicle是一个HAL的hidl service。
hardware/interfaces/automotive/vehicle/2.0 目录下有三个 hal文件
IVehicleCallback.hal IVehicle.hal types.hal
简要说一下这三个文件。
1.1、IVehicleCallback.hal:
interface IVehicleCallback {
oneway onPropertyEvent(vec<VehiclePropValue> propValues);
oneway onPropertySet(VehiclePropValue propValue);
oneway onPropertySetError(StatusCode errorCode,
int32_t propId,
int32_t areaId);
};
这个文件的三个方法都是需要java 层进行实现的, 然后 HAL Vehicle Service 进行回调。我们从上一篇的分析就可以知道,在HALClient中的内部类 private static class VehicleCallback 就继承了 IVehicleCallback.Stub,实现了上面的三个方法。
1.2、 IVehicle.hal:
package android.hardware.automotive.vehicle@2.0;
import IVehicleCallback;
interface IVehicle {
getAllPropConfigs() generates (vec<VehiclePropConfig> propConfigs);
getPropConfigs(vec<int32_t> props)
generates (StatusCode status, vec<VehiclePropConfig> propConfigs);
get(VehiclePropValue requestedPropValue)
generates (StatusCode status, VehiclePropValue propValue);
set(VehiclePropValue propValue) generates (StatusCode status);
subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
generates (StatusCode status);
unsubscribe(IVehicleCallback callback, int32_t propId)
generates (StatusCode status);
debugDump() generates (string s);
};
这个文件的里面的这些方法都是需要HAL 层来实现的,供Java 层来调用。比如上面的 subscribe(),就是java 层继承自IVehicleCallback.Stub的类注册回调的。具体调用都在 HalClient.java 中。
1.3、 types.hal :定义的是一些数据结构,这里面内容比较多。大致了解一下就行了。
1.4、至于hal层 vehicle的主要功能就是去实现vehicle提供出来的这些接口。
到这里我们要思考两个问题了,一是、我们如何从can盒拿报文信息。 二是、围绕前面的拿到了can盒的报文信息如何解析呈现给UI显示。
围绕着两个问题,我们就来到了重点vehicle hal的实现。
1.4.1 、实现can和vehicle hal的通信问题
我们实现这一步是通过can socket来和can 盒通信的。因为这部分牵扯到了公司的代码所以我就不能详细的贴出了,只能大致的说一下。
其实can socket和普通的socket用法基本差不多,只是service和client都是在can总线上
具体的实现可以参考一下文章,在接受和发送can 信号的时候,注意线程同步的问题,最好用线程队列实现。
1.4.2、实现将报文转换为android应用可以识别的property id
这部分也是公司代码了,也是不方便透露的,就大致的说一下。首先我们会有一个can信号的,can 矩阵表如下样式
我们这边肯定需要写一个python脚本来讲Excel表格转换为c++代码可以操作的结构体。
{ “IVI_TSRActiveSet”,7,2,big_endian,False,2,2,1,0,0,3,0x19500000000 },
当can报文过来通过can socket接收到的时候。我们就会将这个报文的can_id和这个提前保存和报文结构体进行对比,得到报文名和其他信息,
我们在两一个文件中人工维护一个文件里面有 IVI_TSRActiveSet,557847360,0, 这个557847360就是我们在type.hal中定义的property value。
我们拿到557847360的时候就可以往 vehicle client 抛送了。vehicle client 往 can 盒发送信息也是同一套逻辑。
下面是我用模拟器跑的时候画的时序图。没有牵扯 can socket和报文的转换