代码解析:安卓VHAL的AIDL参考实现

以下内容基于安卓14的VHAL代码。

总体架构

参考实现采用双层架构。上层是 DefaultVehicleHal,实现了 VHAL AIDL 接口,并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware,实现了 IVehicleHardware 接口。此类可模拟与实际硬件或车载总线交互的 VHAL 逻辑,并且特定于设备。供应商也可以视需要调整这一架构,重复使用同一 DefaultVehicleHal 类(扩展该类以覆盖某个方法),并提供自己的 IVehicleHardware 实现。

图1

DefaultVehicleHal 包含以下被认为适用于任何 VHAL 实现的通用逻辑:

  1. 实现 IVehicle 接口。
  2. 执行基本的输入检查,包括检查是否存在重复 ID。
  3. 为每个 binder 客户端的每个操作分配客户端对象(例如 GetValuesClient),并将每个对象添加到全局池。
  4. 管理异步回调逻辑,例如将待处理请求添加到待处理请求池。在我们收到结果时解决待处理的请求,或者在某个待处理的请求超时时返回错误。
  5. 序列化和反序列化 LargeParcelable(详见 ParcelableUtils.h)。
  6. 管理订阅(详见 SubscriptionManager.h)。
  7. 检查权限(详见 checkReadPermission 和 checkWritePermission 函数)。
  8. 定期调用 IVehicleHardware.checkHealth 并发送检测信号(详见 checkHealth 函数)。

IVehicleHardware 是一个通用接口,用于表示 VHAL 的硬件专用实现。IVehicleHardware 的参考实现是 FakeVehicleHardware,它使用内存中映射存储属性值,并且不与实际车载总线通信。其目的是在模拟器上运行,不依赖特定硬件。供应商实现不能直接使用它,而必须添加车载总线特定的逻辑。

调用时序

下面以setValues()接口为例进行说明:

FakeVehicleHardware实现了IVehicleHardware。

图2

PendingRequestHandler中有一个线程,一直在处理request。

图3

最终,FakeVehicleHardware将value写入VehiclePropertyStore::Record中保存。这里只是参考实现,所以没有实际发送给对手件,只是将数值存入VHAL。

图4

接口文件定义

HIDL VHAL中接口定义文件为types.hal,IVehicle.hal和IVehicleCallback.hal。

AIDL VHAL中,IVehicle .aidl和IVehicleCallback.aidl对应IVehicle.hal和IVehicleCallback.hal。

types.hal中的内容则是拆分到VehicleProperty.aidl,VehiclePropertyGroup.aidl, VehicleArea.aidl, VehiclePropertyType.aidl等等多个aidl文件中。其中VehicleProperty.aidl是用来添加信号ID的。

下面是VehicleProperty.aidl中一个原生的信号

HVAC_FAN_SPEED = 0x0500 + 0x10000000 + 0x05000000  + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32

信号ID的计算方式从types.hal中的或运算改为了更直观的加法,但信号ID的结构并没有发生变化,还是由4位的ID、VehiclePropertyGroup 、VehicleArea 、VehiclePropertyType 这4个部分组成。

默认值定义

HIDL VHAL中,定义默认值使用的文件为DefaultConfig.h,格式

        {.config = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED),

                    .access = VehiclePropertyAccess::READ_WRITE,

                    .changeMode = VehiclePropertyChangeMode::ON_CHANGE,

                    .areaConfigs = {VehicleAreaConfig{

                            .areaId = HVAC_ALL, .minInt32Value = 1, .maxInt32Value = 7}}},

         .initialValue = {.int32Values = {3}}},

AIDL VHAL中,定义默认值使用的文件为DefaultProperties.json,格式

        {

            "property": "VehicleProperty::HVAC_FAN_SPEED",

            "defaultValue": {

                "int32Values": [

                    3

                ]

            },

            "areas": [

                {

                    "areaId": "Constants::SEAT_1_LEFT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_1_RIGHT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_LEFT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_RIGHT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_CENTER",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                }

            ]

        },

interfaces\automotive\vehicle\aidl\impl\default_config\config\README.md在README文件中有对json的格式有具体说明。

附录

最后附上本文中plantuml流程图的代码:

图2:

@startuml
'https://plantuml.com/sequence-diagram
'AIDL setValueautonumberAIDL_Client -> DefaultVehicleHal: setValues
DefaultVehicleHal -> FakeVehicleHardware: setValues
FakeVehicleHardware -> PendingRequestHandler: addRequest@enduml

图4:

@startuml
'https://plantuml.com/sequence-diagramautonumberPendingRequestHandler -> PendingRequestHandler: handleRequestsOnce
PendingRequestHandler -> FakeVehicleHardware: handleSetValueRequest
FakeVehicleHardware -> FakeVehicleHardware: setValue
FakeVehicleHardware -> VehiclePropertyStore: writeValue
@enduml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497796.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容,它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型,以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

【前端,TypeScript】TypeScript速成(二):逻辑控制与循环

TypeScript 当中的逻辑控制 if-else if-else 的使用和其它语言非常相似: let answer: yes|no|maybe|undefined undefinedlet httpStatus: 200 | 404 | 500 | 200 | 404 | 500 200function processHttpStatus(s: 200 | 404 | 500 | 200 | 404 | 500) {// 一律使…

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767&a…

TOGAF之架构标准规范-业务架构

TOGAF标准规范中,业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示,业务架构(Business Architecture)在TOGAF标准规范中处于B阶段,该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…

科技创新 数智未来|清科·沙丘投研院走进竹云

12月20日,清科沙丘投研院带领企投家团队走进竹云交流分享,聚焦技术创新、企业数字化管理、行业前沿应用案例等热点议题,深入探讨数字技术如何点燃企业高质量发展的澎湃动力,共话企业数字化、智能化发展之道。 达晨财智股权管理部…

【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。

概括 本篇笔记涵盖基础查询、视图、存储过程、函数、索引、优化、分库分表。适合在学完mysql后进行时常观看。下面展示部分内容。如果需要可以在文章底部的链接进行下载查看。 简介 数据库 数据库:DataBase,简称 DB,存储和管理数据的仓库…

Docker 安装全攻略:从入门到上手

Docker 安装全攻略:从入门到上手 在当今的软件开发与部署领域,Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器,极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…

mysql建立主从集群

mysql建立主从集群需要多个mysql服务器,主从数据库是通过log日志来进行同步的,所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件,给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…

curl+openssl 踩坑笔记

curl编译:点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …

【开源免费】基于SpringBoot+Vue.JS租房管理系统(JAVA毕业设计)

本文项目编号 T 102 ,文末自助获取源码 \color{red}{T102,文末自助获取源码} T102,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…

BLE core 内容整理解释

本文内容比较杂散,只是做记录使用,后续会整理的有条理些 link layer 基本介绍 **Link Layer Control(链路层控制)**是蓝牙低功耗(BLE)协议栈的核心部分,负责实现设备间可靠、安全、低功耗的数…

【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL

前言 本系统是基于YOLOv11SpringBootVueFlaskMySQL的人流计数、人流热图系统(包含YOLO全系列) 系统可以上传视频选择yolo模型进行人流计数。还支持自主划定检测区域,行人轨迹追踪、查看计数结果等功能。 可支持人流计数、人流热图以及人流热…

vuex - 第一天

思维逻辑 解决问题 代码能力2 vue2的项目 北京前端鸿蒙6期 语雀 vuex 在组件中使用 插件支持v2和v3 宏任务 和 微任务 多问问自己为什么 new的四步

什么是网络安全(Cybersecurity)?

不同组织机构对网络安全(Cybersecurity或Cyber Security)的定义不尽相同。从目标上来说,网络安全主要用于保护网络、计算机、移动设备、应用程序及数据等资产免受网络攻击,避免造成数据泄露、业务中断等安全问题。 网络钓鱼、勒索…

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…

虚拟机网络配置

【1】虚拟机提供的网络 桥接模式:可以联网,和主机不是同一个ip地址 NAT模式:可以联网,虚拟机和主机是同一个ip地址 仅主机模式:不能联网,可以实现虚拟机和主机之间的通信 【2】虚拟机是否能连接网络 …

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器 1、按键控制 LED 按键:常见的输入设备,按下导通,松手断开 按键抖动:由子按键内部使用的是机械式弹簧片来进行通断的、所以在按下和松手的瞬间会伴随有一连串的抖动 按键控制LED接线图: 要有工程…

2024/12/29周报

文章目录 摘要Abstract粒子群优化文献研究背景污水处理面临的挑战现有优化方法的局限性 研究方法基于BSM1仿真平台的污水处理建模动态多目标粒子群优化算法(DMOPSO-CD)多目标优化控制架构(SOFNN) 研究过程研究结果与分析总结 摘要…

C#冒泡排序

一、冒泡排序基本原理 冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 以一个简单的整数数…