一、服务接口级别的数据类型概述
介绍了在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 提供了向前和向后兼容性,新添加的记录元素可被旧应用程序忽略。
示例代码
cpp
/**
* \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();
// 接收 BatteryState
BatteryState 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) {
// 用这个信息做一些事情
}
}
}