AndroidP HAL Vehicle

我们上一篇简要分析了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显示。
AndroidP HAL Vehicle_第1张图片
围绕着两个问题,我们就来到了重点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和报文的转换

AndroidP HAL Vehicle_第2张图片

你可能感兴趣的:(AndroidP HAL Vehicle)