代码解析:安卓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.mzph.cn/diannao/65851.shtml

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

相关文章

vLLM结构化输出(Guided Decoding)

简介 vLLM 的结构化输出特性是通过“引导式解码”(Guided Decoding)实现的,这一功能允许模型在生成文本时遵循特定的格式约束,例如 JSON 模式或正则表达式,从而确保生成的内容符合预期的结构化要求。 后端引擎 启动…

部署SenseVoice

依赖 Conda cuda pythor 查看GPU版本-CSDN博客 创建虚拟conda环境 conda create --name deeplearn python3.10 conda activate deeplearn git clone https://github.com/FunAudioLLM/SenseVoice.git cd SenseVoice pip install -r requirements.txt pip install gradio pip …

基于51单片机(STC32G12K128)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键模块3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。 以《贪吃蛇》为载体,熟悉各种屏幕…

关于flinkCDC监控mysql binlog时,datetime类型自动转换成时间戳类型问题

flinkCDC监控mysql binlog时,datetime类型自动转换成时间戳类型 问题解决1.自定义转换器类2.代码引用 结果 问题 flink版本:1.18.1,mysql版本:8.0.40 使用FlinkCDC的MySqlSource 连接mysql,对于datetime 类型字段&…

SwiftUI 撸码常见错误 2 例漫谈

概述 在 SwiftUI 日常撸码过程中,头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单,但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览(Preview)表现的行为不甚…

【Unity】 HTFramework框架(五十八)【进阶篇】资源及代码热更新实战演示(Deployment + HybridCLR)

更新日期:2025年1月2日。 Github源码:[点我获取源码] 索引 资源及代码热更新实战演示运行演示Demo1.克隆项目工程2.更新子模块3.打开项目4.打开入口场景5.设置远端资源服务器地址6.导入HybridCLR7.初始化HybridCLR8.发布项目9.部署资源版本10.运行Exe11.…

SpringCloud源码分析-nacos与eureka

一、高版本为什么优先用nacos 如果用alibaba springcloud,那么就是阿里的技术体系。nacos属于阿里的原生技术栈,所以阿里更偏向于用nacos作为服务发现注册。 二、对比分析 Spring Cloud Alibaba 推荐使用 Nacos 作为服务发现和配置管理的首选组件&…

(五)人工智能进阶:基础概念解释

前面我们介绍了人工智能是如何成为一个强大函数。接下来,搞清损失函数、优化方法和正则化等核心概念,才能真正驾驭它! 1. 什么是网络模型? 网络模型就像是一个精密的流水线工厂,由多个车间(层&#xff0…

级联配准learning

1.定义 级联配准(Cascade Registration)是一种在图像处理、计算机视觉等领域广泛应用的技术。它主要用于将不同视角、不同模态或者不同时间获取的图像进行精确的对齐,并且是通过多个阶段(级联)的处理来逐步优化配准的精…

初学STM32 --- 外部SRAM

SRAM简介 静态随机存取存储器(Static Random-Access Memory,SRAM) 1M字节容量的SRAM芯片XM8A51216为例介绍。 SRAM特性: 高速:具有最高访问速度15ns 低功耗:80MHz时55mA,待机电流 20mA TTL电平兼容 …

leetcode hot 100 前k个高平元素

347. 前 K 个高频元素 已解答 中等 相关标签 相关企业 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 class Solution(object):def topKFrequent(self, nums, k):""":type nums: Lis…

Zabbix:自动发现功能讲解,包括网络发现、自动注册、低级别自动发现以及案例分享。

ZBX:自动发现功能讲解 视频讲解:Zabbix 自动发现网络发现概述操作方法 自动注册概述操作方法 低级别自动发现概述工作原理及工作流程案例1,base进程监控要求:步骤: 案例2,磁盘IO监控要求:步骤&a…

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量; Go语言版本:1.23.2 Windows版本:win11(win10通用) 下载Go环境 下载go环境:Go下载官网链接(https://golang.google.cn/dl/) 等待…

python3.x支持,但python2.7不支持的语法

python3.x支持,但python2.7不支持的语法 1.属性访问的问题&#xff1a; 你可能是在 params 中直接使用了某个对象的属性&#xff0c;而不是该属性的值。在你提供的信息中&#xff0c;<slot wrapper next of instance objects> 指的是一个对象的槽位&#xff08;slot wra…

开源GTKSystem.Windows.Forms框架:C# Winform跨平台运行深度解析

开源GTKSystem.Windows.Forms框架&#xff1a;C# Winform跨平台运行深度解析 一、跨平台框架的崛起 1.1 跨平台技术的现状与需求 在当今快速发展的科技时代&#xff0c;软件开发的需求日益多样化。随着移动设备和操作系统的不断涌现&#xff0c;开发者面临着前所未有的挑战&…

#端云一体化开发# #HarmonyOS Next#《说书人》鸿蒙原生基于角色的对话式文本编辑开发方案

1、写在前面 过去的一百年里&#xff0c;在“编程”的这个行业诞生之初&#xff0c;人们采用面向过程的方式进行开发&#xff0c;但是&#xff0c;伴随着程序规模的日益增大&#xff0c;程序的复杂度也随之增加&#xff0c;使用结构化编程方法来管理复杂的程序逻辑变得越来越困…

xadmin后台首页增加一个导入数据按钮

xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang

【AimRT】现代机器人通信中间件 AimRT

目录 一、什么是AimRT二、AimRT与ROS22.1 定位与设计2.2 组成与通信方式对比 三、AimRT基本概念3.1 Node、Pkg 和 Module3.2 Protocol、Channel、Rpc 和 Filter3.3 App模式 和 Pkg模式3.4 Executor3.5 Plugin 一、什么是AimRT AimRT 是智元机器人公司自主研发的一款机器人通信…

mysql系列7—Innodb的redolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过&#xff1a;数据和索引保存在磁盘上…

Swift Combine 学习(二):发布者 Publisher

Swift Combine 学习&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 学习&#xff08;二&#xff09;&#xff1a;发布者 PublisherSwift Combine 学习&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 学习&#xff08;四&…