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

AUTOSAR_EXP_ARAComAPI的5章笔记(9)

☞ 返回总目录

5.4 骨架类(Skeleton Class)

骨架类是由AUTOSAR 元模型的服务接口描述SI description)生成的。ara::com对生成的骨架类的接口进行了标准化。自适应平台(AP)产品供应商的工具链将生成一个完全实现此接口的骨架实现类。

生成的骨架类是一个抽象类。它不能直接实例化,因为它不包含服务应提供的服务方法的实现。因此,服务实现者必须继承骨架类并在子类中提供服务方法的实现。

注意:与代理类一样,骨架类必须提供的接口由ara::com定义,一个通用(与产品无关)的生成器可以生成一个抽象类或模拟类,应用程序开发人员可以针对其实现他的服务提供者应用程序。这非常适合独立于平台供应商的自适应 AUTOSAR 软件组件(SWC)的开发。

ara::com期望在命名空间 “skeleton” 中包含与骨架相关的工件。这个命名空间通常包含在从服务定义及其上下文推导出来的命名空间层次结构中。

5.4.1 Skeleton Class API

  • OfferService():提供服务实例。

  • StopOfferService():停止提供服务实例。

  • Send():发送。

  • Allocate():分配。

  • ProcessNextMethodCall():处理下一个方法调用。

  • RegisterGetHandler():注册获取处理程序。

  • RegisterSetHandler():注册设置处理程序。

  • Field::Update():更新字段。

5.4.2 RadarService Skeleton Class 示例

class RadarServiceSkeleton 
{
public:
    /**
     * 构造函数,以实例标识符为参数,具有默认的请求处理模式 kEvent。
     */
    RadarServiceSkeleton(ara::com::InstanceIdentifier instanceId,
                         ara::com::MethodCallProcessingMode mode = ara::com::MethodCallProcessingMode::kEvent);

    /**
     * 无异常构造函数,以实例标识符为参数,具有默认的请求处理模式 kEvent。
     */
    static ara::core::Result<RadarServiceSkeleton> Create(
        const ara::core::InstanceIdentifier &instanceID,
        ara::com::MethodCallProcessingMode mode = ara::com::MethodCallProcessingMode::kEvent) noexcept;

    /**
     * 构造函数,以实例标识符容器为参数,具有默认的请求处理模式 kEvent。
     * 这个特别支持多绑定。
     */
    RadarServiceSkeleton(ara::com::InstanceIdentifierContainer instanceIds,
                         ara::com::MethodCallProcessingMode mode = ara::com::MethodCallProcessingMode::kEvent);

    /**
     * 无异常构造函数,以实例标识符容器为参数,具有默认的请求处理模式 kEvent。
     */
    static ara::core::Result<RadarServiceSkeleton> Create(
        const ara::core::InstanceIdentifierContainer &instanceIDs,
        ara::com::MethodCallProcessingMode mode = ara::com::MethodCallProcessingMode::kEvent) noexcept;

    /**
     * 构造函数,以实例说明符为参数,具有默认的请求处理模式 kEvent。
     */
    RadarServiceSkeleton(ara::core::InstanceSpecifier instanceSpec,
                         ara::com::MethodCallProcessingMode mode = ara::com::MethodCallProcessingMode::kEvent);

    /**
     * 无异常构造函数,以实例说明符为参数,具有默认的请求处理模式 kEvent。
     */
    static ara::core::Result<RadarServiceSkeleton> Create(
        const ara::core::InstanceSpecifier &instanceSpec,
        ara::com::MethodCallProcessingMode mode = ara::com::MethodCallProcessingMode::kEvent) noexcept;

    /**
     * 骨架实例不可复制构造。
     */
    RadarServiceSkeleton(const RadarServiceSkeleton& other) = delete;

    /**
     * 骨架实例不可复制赋值。
     */
    RadarServiceSkeleton& operator=(const RadarServiceSkeleton& other) = delete;

    /**
     * 通信管理实现者应在其析构函数实现中注意,如果此服务实例之前已提供,则内部触发 StopOfferService()的功能。这是一个方便的清理功能。
     */
    ~RadarServiceSkeleton();

    /**
     * 提供服务实例。
     * 方法是幂等的 - 可以重复调用。
     */
    ara::core::Result<void> OfferService();

    /**
     * 停止提供服务实例。
     * 方法是幂等的 - 可以重复调用。
     *
     * 如果服务实例被销毁 - 期望通信管理实现内部调用 StopOfferService()。
     */
    void StopOfferService();

    /**
     * 对于所有输出和非空返回参数,生成一个封闭结构,其中包含非空返回值和/或输出参数。
     */
    struct CalibrateOutput {
        bool result;
    };

    /**
     * 对于所有输出和非空返回参数,生成一个封闭结构,其中包含非空返回值和/或输出参数。
     */
    struct AdjustOutput {
        bool success;
        Position effective_position;
    };

    /**
     * 此方法从通信管理中获取下一个调用并执行它。返回值是一个 ara::core::Future。
     * 在应用程序错误的情况下,一个 ara::core::ErrorCode 存储在 ara::core::Promise 中,从该 Promise 返回 ara::core::Future 给调用者。
     * 仅在轮询模式下可用。
     */
    ara::core::Future<bool> ProcessNextMethodCall();

    /**
     * \brief 公共成员用于 BrakeEvent。
     */
    events::BrakeEvent BrakeEvent;

    /**
     * \brief 公共成员用于 UpdateRate。
     */
    fields::UpdateRate UpdateRate;

    /**
     * 以下方法是纯虚函数,必须实现。
     */
    virtual ara::core::Future<CalibrateOutput> Calibrate(std::string configuration) = 0;
    virtual ara::core::Future<AdjustOutput> Adjust(const Position& position) = 0;
    virtual void LogCurrentState() = 0;
};

5.4.3 实例化(构造函数)

正如你在上面的RadarServiceSkeleton Class的示例代码中看到的,服务实现者必须从其派生服务实现的骨架类提供了三种不同的构造函数变体,它们主要在确定要使用的实例标识符的方式上有所不同。

由于你可以部署同一类型(因此也是同一骨架类)的许多不同实例,因此在创建时必须给出一个实例标识符是很直接的。这个标识符必须是唯一的。在使用命名构造函数方法无异常地创建服务骨架时,静态成员函数Create()检查提供的标识符是否不唯一或是否有其他错误。如果发现错误,将在返回的ara::core::Result中设置错误代码。否则,返回创建的骨架实例。

如果要使用相同的标识符创建一个新实例,则需要先销毁现有的实例。

正是出于这个原因,骨架类(就像代理类一样)既不支持复制构造也不支持复制赋值!否则,对于一段时间内会存在两个具有相同实例标识符的 “相同” 实例,并且方法调用的路由将是不确定的。

关于实例标识符定义的不同构造函数变体反映了它们不同的性质,这在 4.8.1 小节中进行了描述。

  • 带有ara::com::InstanceIdentifier的变体:服务实例将使用一个特定于绑定的实例标识符创建。

  • 带有ara::com::InstanceIdentifierContainer的变体:服务实例将使用绑定到多个不同的实例标识符创建。这在本文档中被称为 “多绑定”,并在 7.3 节中进行了更详细的解释。

  • 带有ara::core::InstanceSpecifier的变体:服务实例将使用在给定的ara::core::InstanceSpecifier进行 “服务清单” 查找后找到的实例标识符(多个)创建。请注意,这也可能意味着 “多绑定”,因为集成商可以在 “服务清单” 中将给定的ara::core::InstanceSpecifier映射到多个特定于技术 / 绑定的实例标识符。

构造函数的第二个参数类型为ara::com::MethodCallProcessingMode有一个默认值,并在 5.4.5 小节中进行了详细解释。

注意:直接在实现骨架的子类的实例创建后,这个实例对于潜在的消费者是不可见的,因此不会在其上调用任何方法。只有在使用OfferService API 使服务实例可见后(见下文)才可能。


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

相关文章:

  • 面试爱考 | 设计模式
  • 线程(三) 线程的互斥
  • 一些常用的 Docker 命令
  • Android外接USB扫码枪
  • android google play应用发布上架流程PDF下载
  • Spring Boot和AOP将API输入输出数据存入数据库
  • 测试工具笔记
  • MATLAB窗口操作常用命令
  • Leetcode 144. 二叉树的前序遍历(Easy)
  • vscode c++编译环境配置
  • 【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣99, 1305, 230, 897
  • 在线免费公共DNS解析服务器列表
  • 计算机毕业设计 基于Python的校园个人闲置物品换购平台 闲置物品交易平台 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • 信息安全数学基础(19)同余式的基本概念及一次同余式
  • 【Java】关键字-final【主线学习笔记】
  • Java 数据结构 最小栈的实现
  • ES6的简单介绍
  • C++: 类和对象(上)
  • 【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统
  • 深耕电通二十年,崔光荣升电通中国首席执行官
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾回收算法
  • 机器学习-点击率预估-论文速读-20240916
  • markdown-it:将Markdown文本转换为HTML格式,展示在页面,怎么自定义里面的a标签设置为在新标签页打开
  • GEE 案例:如何利用LST脚本快速计算指定区域的LST和时序的LST
  • 14 vue3之内置组件trastion全系列
  • pandas 生成excel多级表头
  • [Java]SpringBoot能力进阶
  • 九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”
  • 面向对象例题之例题的特性
  • 在Android中fragment的生命周期