当前位置: 首页 > article >正文

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,我们可以对我们要使用的属性有更全面的认识。


http://www.kler.cn/a/521177.html

相关文章:

  • 虚幻基础08:组件接口
  • golang通过AutoMigrate方法自动创建table详解
  • Kafka运维宝典 (三)- Kafka 最大连接数超出限制问题、连接超时问题、消费者消费时间超过限制问题详细介绍
  • Three.js实战项目02:vue3+three.js实现汽车展厅项目
  • [BSidesCF 2020]Had a bad day1
  • MOS的体二极管能通多大电流
  • AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制
  • 【WebRTC - STUN/TURN服务 - COTURN配置】
  • Linux二进制部署K8s集群的平滑升级教程
  • uniapp版本升级
  • 菜鸟开发之多表联合增删改
  • Crewai框架添加日志功能
  • GD32F470 USB虚拟串口
  • Day40:列表的排序
  • python 变量范围的定义与用法
  • 汽车网络信息安全-ISO/SAE 21434解析(中)
  • 拖拽移动(Semi Design)
  • 《一起做很甜的梦!》
  • sqlite3 学习笔记
  • 数据分箱 baggingboosting onehot独热编码 woe编码 sklearn的ensemble(集成学习)
  • python:taichi 高性能可视化 Demo 展览
  • 基于SpringBoot的母婴护理知识共享管理系统
  • 代码随想录算法【Day32】
  • Go中的Context(上下文)
  • ESP8266基于WiFiManager设置页面添加参数并且掉电不丢失
  • GIT管理指令