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示例
cpp
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 使服务实例可见后(见下文)才可能。