自学内容网 自学内容网

Android AutoMotive--CarPropertyService

1、CarPropertyService

CarPropertyService是AAOS中非常重要的一个服务,它与车辆各ECU的功能密切关联,如空调控制、座椅调节、车窗调节、充放电控制、车辆传感器数据等,都是通过CarPropertyService来获取值以及设置值。
CarpropertyService运行在CarService进程,CarpropertyManager是CarpropertyService的客户端API,供上层APP使用,他们之间使用Binder连接;而VehicleHAL则是在CarpropertyService的下层,通常是需要OEM厂商自己实现这个模块,适配AIDL for HAL接口,并通过MCU打通和各ECU之间的通信链路,软件架构如下:
在这里插入图片描述

2、CarPropertyManager

我们再来看看CarPropertyManager常用的方法:

// packages/services/Car/car-lib/src/android/car/hardware/property/CarPropertyManager.java
// 设置一个属性值
public <E> void setProperty(@NonNull Class<E> clazz, int propertyId, int areaId,@NonNull E val)

// 获取到一个属性值
public <E> CarPropertyValue<E> getProperty(@NonNull Class<E> clazz, int propertyId,int areaId)

// 获取所有的属性值配置集合
public List<CarPropertyConfig> getPropertyList()

// 属性值是否被现有的硬件条件支持
public boolean isPropertyAvailable(int propertyId, int areaId)

// 对某个属性id做监听,并且指定上报的频率
public boolean subscribePropertyEvents(int propertyId, int areaId,
            @FloatRange(from = 0.0, to = 100.0) float updateRateHz,
            @NonNull CarPropertyEventCallback carPropertyEventCallback)

以上方法中涉及到propertyId、areaId、CarPropertyValue和CarPropertyConfig,接下来具体分析一下。

3、VehiclePropertyIds

每一个propertyId都是对应的车辆中具体的电子控制单元(Electronic Control Unit,ECU)。
具体的property属性值在VehiclePropertyIds中有定义,示例如下:

// packages/services/Car/car-lib/src/android/car/VehiclePropertyIds.java
@RequiresPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
public static final int HVAC_AC_ON = 354419973;  //空调开关
@RequiresPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
public static final int HVAC_SEAT_TEMPERATURE = 356517131; //座椅温度
@RequiresPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
public static final int HVAC_ACTUAL_FAN_SPEED_RPM = 356517135; //空调风量

4、areaId

由于有一些属性ID,比如座椅温度,它可能还会细分第一排左边座椅温度、第一排右边座椅温度、第二排左边座椅温度等等,所以在property的基础上,又增加了一个areaId的概念。
当property的值是对应唯一确定属性时,那么areaId不能细分,需要写成VehicleAreaType. VEHICLE_AREA_TYPE_GLOBAL;如果property下面还能细分,那么areaId就会根据具体的细分场景赋值。在AAOS中,谷歌已经帮我们定义了常用的areaId细分场景,有车窗(VEHICLE_AREA_TYPE_WINDOW)、座椅(VEHICLE_AREA_TYPE_SEAT)、车门(VEHICLE_AREA_TYPE_DOOR)、后视镜(VEHICLE_AREA_TYPE_MIRROR)、车轮(VEHICLE_AREA_TYPE_WHEEL)等,如座椅:

// packages/services/Car/car-lib/src/android/car/VehicleAreaSeat.java
public final class VehicleAreaSeat {
    /** List of vehicle's seats. */
    public static final int SEAT_UNKNOWN = 0;
    /** Row 1 left side seat*/
    public static final int SEAT_ROW_1_LEFT = 0x0001;
    /** Row 1 center seat*/
    public static final int SEAT_ROW_1_CENTER = 0x0002;
    /** Row 1 right side seat*/
    public static final int SEAT_ROW_1_RIGHT = 0x0004;
    /** Row 2 left side seat*/
    public static final int SEAT_ROW_2_LEFT = 0x0010;
    /** Row 2 center seat*/
    public static final int SEAT_ROW_2_CENTER = 0x0020;
    /** Row 2 right side seat*/
    public static final int SEAT_ROW_2_RIGHT = 0x0040;
    /** Row 3 left side seat*/
    public static final int SEAT_ROW_3_LEFT = 0x0100;
    /** Row 3 center seat*/
    public static final int SEAT_ROW_3_CENTER = 0x0200;
    /** Row 3 right side seat*/
public static final int SEAT_ROW_3_RIGHT = 0x0400;
}

5、CarPropertyValue和CarPropertyConfig

有了propertyId和areaId之后,我们就可以定位到唯一的属性,接下来就是获取和设置对应的值。虽然我们可以直接操作基本数据类型,但是谷歌给我们封装了CarPropertyValue,它不仅包含值,还包含了值是否有效的状态,无效的值是不能使用的,更利于程序的稳健。
CarPropertyConfig则是对propertyId做了更加详细规定描述,它内部的字段包括:

//packages/services/Car/car-lib/src/android/car/hardware/CarPropertyConfig.java
private final int mAccess; 属性是否可读可写,1可读;2可写;3可读可写
private final int mAreaType; 区域类型,对应areaId
private final int mChangeMode; 变化模式,0始终不变;1变化时通知;2一定频率持续上报
private final float mMaxSampleRate; 持续上报最大频率
private final float mMinSampleRate; 持续上报最小频率
private final int mPropertyId; 属性Id
private final Class<T> mType; 值类型,如BooleanFloatInt

通过CarPropertyConfig,我们可以对我们要使用的属性有更全面的认识。


原文地址:https://blog.csdn.net/yus201120/article/details/145294241

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!