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

AUTOSAR_EXP_ARAComAPI的5章笔记(8)

☞ 返回总目录

5.3.7 Fields

从概念上讲,与 Event 不同,Field 在任何时候都具有一定的值。这与 Event 相比,带来了以下附加内容:

  • 如果对 Field 进行了订阅,“立即” 会以类似事件通知的模式将当前值发送回订阅者。
  • 当前 Field 的值可以通过调用 Get () 方法进行查询,或者通过 Set () 方法进行更新。

请注意,Field 提供的所有功能都是可选的:在 Field 的配置(IDL)中,您可以决定它是否具有 “on-change-notification”、Get () 或 Set ()。在我们的示例 Field(见下文)中,我们配置了所有这三种机制。

对于远程服务提供的每个字段,Proxy Class 都包含一个特定于该字段的包装类的成员。在我们的示例中,该成员的名称为 UpdateRate(类型为 fields::UpdateRate)。

与 Event 和 Method 的包装类一样,Proxy Class 所需的 Field 包装类在特定的命名空间 fields 中生成,该命名空间包含在代理命名空间内。

故意把 Field 的解释放在 Event 和 Method 的解释之后,因为 Field 的概念大致是一个包含相关 get ()/set () 方法的 Event 的聚合。因此,从技术上讲,我们也将 ara::com 字段的表示实现为 ara::com 事件和方法的组合。

因此,代理中的 Field 成员用于:

  • 使用与常规方法完全相同的机制调用 Field 的 Get () 或 Set () 方法。
  • 以事件 / 事件数据的形式访问 Field 更新通知,这些通知由我们的代理连接的服务实例发送,其机制与常规事件完全相同。

让我们看一下为我们的示例 UpdateRate 字段生成的 Field 包装类:

class UpdateRate 
{ 
    /**
     * \brief 事件数据类型的快捷方式。
     */
    using FieldType = uint32_t;

    /**
     * \brief 有关详细信息,请参阅 Events,因为字段包含通知的可能性,其中包含在那里描述的接口的详细信息。
     */
    ara::core::Result<void> Subscribe(size_t maxSampleCount);
    size_t GetFreeSampleCount() const noexcept;
    ara::com::SubscriptionState GetSubscriptionState() const;
    void Unsubscribe();
    ara::core::Result<void> SetReceiveHandler(ara::com::EventReceiveHandler handler);
    ara::core::Result<void> UnsetReceiveHandler();
    ara::core::Result<void> SetSubscriptionStateChangeHandler(ara::com::SubscriptionStateChangeHandler handler);
    void UnsetSubscriptionStateChangeHandler();
    template <typename F>
    ara::core::Result<size_t> GetNewSamples(
        F&& f,
        size_t maxNumberOfSamples = std::numeric_limits<size_t>::max());

    /**
     * 该 getter 允许请求服务提供者的实际值。
     * 
     * 有关 future 的描述,请参阅该方法。
     * 它应该表现得像一个方法。
     */
    ara::core::Future<FieldType> Get();

    /**
     * 该 setter 允许请求设置一个新值。
     * 由服务提供者决定是否接受请求或修改它。
     * 新值应作为响应发送回请求者。
     * 
     * 有关 future 的描述,请参阅该方法。
     * 它应该表现得像一个方法。
     */
    ara::core::Future<FieldType> Set(const FieldType& value);
};

这里没有更多要描述的内容了。关于该字段中类似 Event 的部分的机制文档,请查看 5.3.5 小节;关于该 Field 中类似方法的部分的文档,请查看 5.3.6 小节。

5.3.8 触发器(Triggers)

触发器只是一类无数据的事件。这意味着 5.3.5 小节中的所有文档也适用于触发器,除了与数据相关的部分在本节中进行描述。从代理的角度来看,订阅触发器与 5.3.5.1 小节中描述的相同,但没有本地缓存部分。

/**
 * 应用程序期望通信管理(CM)订阅该事件。
 */
ara::core::Result<void> Subscribe();

一个Subscribe()调用将通知通信管理接收触发器更新。其他订阅功能(例如SubscribeChangeSetSubscriptionHandler()、Unsubscribe())与事件相同。

与事件的一个很大区别是接收触发器更新。与事件不同,在事件中我们对接收的数据感兴趣,而对于触发器,我们只对自上次检查以来接收到的触发器数量感兴趣。因此,GetNewTriggers()GetNewSamples()更简单:

/**
 * 获取如果有接收到的触发器的数量。
 * 
 * 返回结果,表示新触发器的数量(零意味着没有新的触发器已被接收)。
 */
size_t GetNewTriggers();

返回值表示自上次调用GetNewTriggers()以来发生的已接收触发器的数量。如 5.3.5.5 小节中提到的基于轮询和事件驱动的访问也适用于触发器。


http://www.kler.cn/news/312589.html

相关文章:

  • Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW
  • docker- No space left on device
  • 去耦合的一些建议
  • 基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)
  • CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task
  • 云原生-Quarkus
  • 基于Benes网络的SIMD同态密文任意重排
  • HarmonyOS NEXT应用开发案例实践总结合集
  • 【C++笔记】类和对象的深入理解(三)
  • 练习题 - Django 4.x Overviewses 框架概述
  • 1. TypeScript基本语法
  • LangChain 和 Elasticsearch 加速构建 AI 检索代理
  • 练习题 - Django 4.x Models Relationship fields 字段关联关
  • 等保测评中的关键技术挑战与应对策略
  • three.js shader 实现天空中白云
  • 用 Docker 部署 Seafile 社区版
  • C++学习指南(六)----list
  • 【docker】阿里云使用docker,2024各种采坑
  • 【笔记】扩散模型(八):DALL-E 2 (unCLIP) 论文解读与代码实现
  • C++设计模式——Interpreter解释器模式
  • 科技修复记忆:轻松几步,旧照变清晰
  • Android mmap分析
  • Linux进阶命令-scp
  • k8s快速搭建+prometheus部署及使用(纯干货!!!)
  • 基于正点原子Linux开发板的智能监控与家电控制系统设计:深度解析Video4Linux和TCP/IP技术栈
  • android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
  • Web开发:Thymeleaf模板引擎
  • Redis系列之底层数据结构SDS
  • 编程技巧:SQL 处理超大查询
  • 对商品分类系统的若干问题的思考