一、服务接口级别的数据类型概述
介绍了在ara::com
中服务接口用户定义数据类型的 C++ 语言映射,其中 “用户定义” 数据类型是由用户定义的服务接口描述(IDL)提供,而非由ara::com
API 定义。在 AUTOSAR 元模型中引入了CppImplementationDataTypes
以支持 C++14 数据类型系统特定要求。
二、可选数据元素
- 在元模型中,
StructureImplementationDataType
内部的记录元素可定义为可选的,在ara::com
API 中由模板类ara::core::Optional
表示。可选元素的序列化基于标签 - 长度 - 值原则,无可选元素的StructureImplementationDataTypes
无需使用标签,其序列化方式在 [9] 中有详细说明。ara::core::Optional
模板参数可包含记录元素的ImplementationDataType
或应用数据类型,如uint32
。可选记录元素可用于服务接口(SI)的字段、事件和方法等元素的结构中,这种可选性在 SI 级别定义。 - 给出了示例代码中的结构体
BatteryState
,其中包含可选元素current
和health
。客户端应用程序在运行时需检查可选元素是否包含值,其取决于服务端应用程序的设置。这种可选包含元素的特性为 SI 提供了向前和向后兼容性,新添加的记录元素可被旧应用程序忽略。
示例代码
/*** \brief 具有可选包含值的数据结构。*/
struct BatteryState {Voltage_t voltage;Temperature_t temperature;ara::core::Optional<Current_t> current;ara::core::Optional<Health> health;
};using namespace ara::com;class BatteryStateImpl : public BatteryStateSkeleton
{
public:Future<BatteryState> GetBatteryState() {// 为简单起见,没有异步调用ara::core::Promise<BatteryState> promise;// 填充数据结构BatteryState state;state.voltage = 14;state.temperature = 35;state.current = 0;// state.health 未设置,因此不会被传输promise.set_value(state);auto future = promise.get_future();return future;}
};int main() {// 一些获取句柄的代码//...BatteryStateProxy bms_service(handle);Future<BatteryState> stateFuture = bms_service.GetBatteryState();// 接收 BatteryStateBatteryState state = stateFuture.get();// 检查可选包含元素是否存在if(state.current) {// 使用 optional::operator*访问可选元素的值if(*state.current >= MAX_CURRENT) {// 用这个信息做一些事情}}// 使用 optional::has_value()方法检查if(state.health.has_value()){// 使用 optional::value()方法访问可选元素的值if(state.health.value() >= BAD_HEALTH) {// 用这个信息做一些事情}}
}