AUTOSAR_EXP_ARAComAPI的5章笔记(14)

☞返回总目录

关联博文:骨架侧字段的总结

5.4.8 字段(Fields)

在骨架侧,服务实现负责以下内容:

  • 更新并通知字段值的变化。
  • 处理传入的 Get () 调用。
  • 处理传入的 Set () 调用。

如 RadarService Skeleton Class 示例中所示,骨架为每个提供的字段提供一个字段包装类的成员。在骨架 / 字段提供方一侧的字段包装类与在代理 / 字段消费方一侧明显不同。

在服务提供方 / 骨架侧,特定于服务的字段包装类在骨架命名空间下的fields命名空间内定义。以示例事件UpdateRate的字段包装类为例:

class UpdateRate 
{
public:
    // 使用FieldType = uint32_t;
    using FieldType = uint32_t;

    /**
     * Update等同于事件的发送方法。这会触发(如果配置了)通知的传输到订阅的客户端。
     * 
     * 如果配置了Getter,至少必须调用一次以设置初始值。
     */
    ara::core::Result<void> Update(const FieldType& data);

    /**
     * 注册GetHandler是可选的。如果注册,每当接收到get请求时,该函数将被调用。
     * 
     * 如果没有注册Getter,ara::com负责使用update设置的最后一个值响应请求。
     * 
     * 这隐含地要求在服务初始化后,在提供服务之前,至少调用一次update。这取决于服务的实现者。
     * 
     * GetHandler应返回一个future。
     */
    ara::core::Result<void> RegisterGetHandler(
    std::function<ara::core::Future<FieldType>()> getHandler);

    /**
     * 如果字段支持,注册SetHandler是强制性的。
     * 
     * 处理程序获取发送方请求设置的数据。
     * 
     * 它必须验证设置并执行其内部数据的更新。然后应在未来设置该字段的新值。
     * 
     * 返回的值将发送给请求者,并通过通知发送给所有订阅的实体。
     */
    ara::core::Result<void> RegisterSetHandler(
    std::function<ara::core::Future<FieldType>(const FieldType& data)> setHandler);
};

和事件类以及在代理侧一样,using指令只是为字段的具体数据类型引入通用名称FieldType

我们提供了一个Update()方法,服务实现者可以通过该方法更新字段的当前值。它与事件类中Send()方法的第一种变体非常相似:字段数据已由服务应用程序开发人员在某处分配,并通过引用传递给Update()的绑定实现。在对Update()的调用返回后,调用者一侧的数据可能会被删除或更改。绑定实现将在调用中进行(通常是序列化的)复制。如果为该字段配置了 “变化通知”,则在Update()调用过程中,绑定实现将触发对此字段订阅者的通知。

5.4.8.1 注册 getter

RegisterGetHandler()方法为服务实现者提供了注册方法实现的可能性,当任何代理实例发出Get()调用时,绑定实现将调用该方法。

在生成的骨架代码中,仅在 IDL 中为字段配置了 “字段 getter” 可用性时RegisterGetHandler()方法才存在!注册这样的 “GetHandler” 是可选的!通常,服务实现者无需提供这样的处理程序。绑定实现始终可以访问通过Update()设置的最新值。因此,任何传入的Get()调用都可以由通信管理实现独立处理。

服务实现者仍然提供 “GetHandler” 的一个理论原因可能是:计算字段的新 / 当前值代价高昂 / 耗时。因此,服务实现者 / 字段提供者希望将此过程(计算当前值)推迟到确实需要该值时(由 getter 调用指示)。在这种情况下,他可以在其 “获取处理程序” 实现中计算新的字段值,并通过已知的ara::com承诺 / 未来模式将其返回。

从更大的角度来看,如果字段也配置了 “on-change-notification”,那么服务实现者提供并注册 “GetHandler” 的这种设置实际上没有意义。on-change-notification 和 GetHandler 都可以获取字段最新值,只是 GetHandler 延时获取了。在这种情况下,新的订阅者在订阅时可能会获得过时的字段值,因为字段值的更新被推迟到显式调用 “获取处理程序”。

你还必须记住:在这种设置中,启用 “on-change-notification” 并注册 “GetHandler” 时,通信管理实现不会自动确保开发人员从 “获取处理程序” 返回的值与订阅者通过 “变化通知” 事件获得的值同步!如果 “获取处理程序” 的实现内部没有使用相同的值调用Update(),而该值将通过ara::com承诺返回,那么通过 “变化通知” 事件传递的字段值将与Get()调用返回的值不同。即,通信管理实现不会自动 / 内部地使用 “获取处理程序” 返回的值调用Update()

总之:使用RegisterGetHandler()是一个相当特殊的用例,开发人员应该意识到其内在影响。

此外,如果用户提供的 “获取处理程序” 仅返回已经由服务实现通过Update()更新的当前值,那么通常效率非常低!在任何传入的Get()调用中,通信管理都必须调用用户空间,并对返回的值额外应用字段序列化。如果开发人员不注册 “获取处理程序”,并将Get()调用的处理完全留给通信管理实现,那么这两件事都可以完全 “优化掉”。

5.4.8.2 注册设置器

RegisterGetHandler()相反,如果服务实现存在(即字段启用设置器),则必须调用RegisterSetHandler()API。

我们决定强制注册 “SetHandler” 的原因很简单:我们期望服务器实现始终需要检查由任何匿名客户端设置的新 / 更新的字段值的有效性。

查看 “SetHandler” 的签名std::function<ara::core::Future<FieldType>(const FieldType& data)>可以发现,注册的处理程序将新值作为输入参数,并期望返回一个值。其背后的语义是:“SetHandler” 始终必须返回有效的(最终被替换 / 纠正的)值。这允许服务端实现者验证 / 否决客户端提供的新字段值。

“SetHandler” 返回的有效字段值被通信管理实现隐式接管,就好像服务实现者自己使用有效值显式调用了Update()一样。这意味着:在 “SetHandler” 内部进行显式的Update()调用是多余的,因为通信管理无论如何都会使用 “SetHandler” 的返回值更新字段值。

5.4.8.3 确保 “SetHandler” 的存在

通过返回可恢复错误来确保已注册 “SetHandler” 的存在:如果开发人员在骨架实现上调用OfferService(),并且尚未为每个启用设置器的字段注册 “SetHandler”,则通信管理实现应返回一个ComErrc::kSetHandlerNotSet的错误,在ara::core::Result中指示此错误。

5.4.8.4 确保有效字段值的存在

由于字段的最基本保证是在任何时候都具有有效值,因此ara::com必须以某种方式确保,提供字段的服务实现必须在服务(及其字段)对潜在消费者可见之前提供一个值,这些消费者在订阅字段后,期望在(如果字段配置了通知)获得初始值通知事件时,或者在(如果字段启用了 getter 但尚未注册 “GetHandler”)时,使用Get()调用中获得有效值。

因此,ara::com通信管理实现需要以下方式行为:如果开发人员在骨架实现上调用OfferService(),并且尚未在任何字段上调用Update(),而该字段

  • 已启用通知。
  • 或已启用 getter 但尚未注册 “GetHandler”。

则通信管理实现应返回一个错误(ComErrc::kFieldValueIsNotValid),在ara::core::Result中指示此错误。

注意:AUTOSAR 元模型支持以所谓的PPortPrototypeFieldSenderComSpec的形式为字段定义这样的初始值。因此,调用Update()的应用代码应考虑此模型元素。

5.4.8.5 从 GetHandler/SetHandler 访问当前字段值

由于底层字段值仅为中间件所知,因此当前字段值无法从位于应用程序级别的 “GetHandler/SetHandler” 实现中访问。如果 “GetHandler/SetHandler” 需要读取当前字段值,则骨架实现必须提供一个可从应用程序级别访问的字段值副本。

5.4.9 触发器(Triggers

正如在 5.3.8 小节中所述,触发器基于事件,但不包含任何数据。关注与骨架侧的区别,只有Send()与事件不同。其他事件 API 是不必要的,因为它们与触发器中不存在的数据相关。

ara::core::Result<void> Send();

这将简单地发送一个触发器。由于触发器没有数据,所以不需要进行分配。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dyna批处理代码,无需蹲守,自行连续计算

用此代码即可 上面一行是模型位置 下面一行是DYNA模拟器位置 第三个框框是K文件名称 上述三者改成自己的 然后复制修改即可 复制几个就几个进行批处理

深入理解伪元素与伪类元素

在“探秘盒子浮动&#xff0c;破解高度塌陷与文字环绕难题&#xff0c;清除浮动成关键&#xff01;”中&#xff0c;我们讲到如果父盒由于各种原因未设置高度&#xff0c; 子盒的浮动会导致父盒的高度塌陷。为了解决高度塌陷的问题&#xff0c;我们可以添加伪元素。 一、伪元素…

Android 内存优化——常见内存泄露及优化方案

看到了一篇关于内存泄漏的文章后&#xff0c;就想着分享给大家&#xff0c;最后一起学习&#xff0c;一起进步&#xff1a; 如果一个无用对象&#xff08;不需要再使用的对象&#xff09;仍然被其他对象持有引用&#xff0c;造成该对象无法被系统回收&#xff0c;以致该对象在…

【element-tiptap】如何修改选中内容时的背景颜色?

前言&#xff1a;element-tiptap 用鼠标选中内容的时候&#xff0c;背景颜色跟系统设置的主题有关&#xff0c;比如的我的就是卡哇伊的pink&#xff0c;默认是淡蓝色 但是我们观察一下语雀&#xff0c;背景颜色是它规定好的颜色 这篇文章来探索一下&#xff0c;怎么自己规定选…

教学平台的智能化升级:Spring Boot应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…

数据结构4——栈

1. 栈的概念及结构 栈的概念&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则…

【SuperHotSwap】IDEA零配置热更新插件升级

往期往期插件v1.0.0发布的时候我发表了一篇文章&#xff0c;如下&#xff1a; 支持功能 如今插件迭代了数个版本&#xff0c;现在迎来了v1.9.0版本的重大升级。如下是支持功能。 支持功能是否支持说明MybatisXML热更新√Class热更新√增强功能需安装dcevm补丁。支持动态新增类…

git rebase的常用场景: 交互式变基, 变基和本地分支基于远端分支的变基

文章目录 作用应用场景场景一&#xff1a;交互式变基(合并同一条线上的提交记录) —— git rebase -i HEAD~2场景二&#xff1a;变基(合并分支) —— git rebase [其他分支名称]场景三&#xff1a;本地分支与远端分支的变基 作用 使git的提交记录变得更加简洁 应用场景 场景…

Java爬虫:获取数据的入门详解

在数字化时代&#xff0c;数据已成为最宝贵的资产之一。无论是市场研究、客户洞察还是产品开发&#xff0c;获取大量数据并从中提取有价值的信息变得至关重要。Java&#xff0c;作为一种成熟且功能强大的编程语言&#xff0c;为编写爬虫提供了强大的支持。Java爬虫可以帮助我们…

如何提高外贸网站在谷歌的收录速度?

外贸企业在进行网络推广时&#xff0c;经常遇到网站页面无法被谷歌快速收录的问题。即使你的网站内容优质、设计精美&#xff0c;如果没有被谷歌收录&#xff0c;就等于失去了被客户发现的机会&#xff0c;GSI谷歌快速收录服务就是为了解决这一问题而诞生的。它不仅能够帮助网站…

5G智慧医疗的实践先锋:SR830-E工业路由器的理性应用

在医疗科技日新月异的今天&#xff0c;5G技术无疑为智慧医疗注入了新的活力。然而&#xff0c;技术的进步不应仅停留在理论层面&#xff0c;更应该在实践中发挥其真正价值。今天&#xff0c;我们就来探讨SR830-E工业路由器如何在实际医疗场景中扮演关键角色&#xff0c;推动5G智…

vscode 远程linux服务器 连接git

vscode 远程linux服务器 连接git 1. git 下载2. git 配置1&#xff09;github 设置2&#xff09;与github建立连接linux端&#xff1a;创建密钥github端&#xff1a;创建ssh key 3. 使用1&#xff09;初始化repository2&#xff09;commit 输入本次提交信息&#xff0c;提交到本…

UE5 圆周运动、贝塞尔曲线运动、贝塞尔曲线点

圆周运动 贝塞尔曲线路径运动 蓝图函数库创建贝塞尔曲线点 // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "MyBlu…

从MySQL到OceanBase离线数据迁移的实践

本文作者&#xff1a;玉璁&#xff0c;OceanBase 生态产品技术专家。工作十余年&#xff0c;一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作&#xff0c;致力于为 OceanBase 建设一套完善的生态工具体系。 背景介绍 在互联网与云数据库技…

【码农必备】CasaOS香橙派安装Code server+cpolar让远程开发更轻松

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于Spring Boot、Vue和MyBatis的前后端分离座位管理系统:增删改查功能入门指南

在项目开发和工作实践中&#xff0c;创作灵感往往来自于对日常经验的总结与反思。通过记录技术难点和解决方案&#xff0c;不仅可以加深对问题的理解&#xff0c;还能为后续项目的优化提供参考。与此同时&#xff0c;撰写技术笔记、分享职场心得&#xff0c;不仅是对自己成长的…

一款基于 Vue 3 的现代化数据可视化组件库,功能强大,颜值爆表,开发者必备!(带私活源码)

Vue Data UI 是一款基于 Vue 3 的现代化数据可视化组件库&#xff0c;专为开发者提供强大的数据展示功能&#xff0c;旨在帮助用户通过图形化手段生动地讲述数据故事。该库由开源开发者 Graphieros 创建和维护&#xff0c;专注于提升图形渲染性能与交互体验&#xff0c;并致力于…

基于SSM汽车零部件加工系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;经理管理&#xff0c;零件材料管理&#xff0c;产品类型管理&#xff0c;产品信息管理&#xff0c;产品出库管理&#xff0c;产品入库管理 员工账号功能包括&#xff1a;系统首页…

linuxdeployqt打包发布软件

文章目录 参考一、安装linuxdeployqt二、配置Qt的环境变量三、打包应用程序四、打包成deb包配置*.desktop桌面快捷方式文件五、创建deb包之control文件六、创建deb包之postrm文件(可以不创建)七、使用dpkg命令构建deb包八、deb包的安装与卸载参考 使用linuxdeployqt在linux下…