返回总目录
相关总结:AutoSar AP CM服务接口级别的数据类型总结
5.5 服务接口级别的数据类型
以下章节描述了在ara::com
中服务接口用户定义数据类型的 C++ 语言映射。这里的 “用户定义” 是指那些不是由ara::com
API 定义(例如InstanceIdentifier
、FindServiceHandle
、ServiceHandleContainer
或ara::com
在其自己的命名空间中定义)的数据类型,而是由用户定义的服务接口描述(IDL)专门提供的。
在 AUTOSAR 元模型([2])中引入了CppImplementationDataTypes
以适当地支持 C++14 数据类型系统的特定要求。
5.5.1 可选数据元素
在元模型中,StructureImplementationDataType
内部的记录元素可以被定义为可选的,参见 [2]。这种可选性在ara::com
API 中由模板类ara::core::Optional
表示。
可选元素的序列化基于标签 - 长度 - 值(Tag-Length-Value)原则,而没有可选元素的StructureImplementationDataTypes
不必使用标签。关于这种序列化如何工作的详细信息在 [9] 中指定。
ara::core::Optional
模板参数可以包含记录元素的ImplementationDataType
(或者应用数据类型),例如uint32
。
可选记录元素可用于每个服务接口(SI)元素(例如字段、事件和方法)的结构中,这种可选性定义在 SI 级别上。
如在 5.21(以下示例代码) 中,结构具有声明为可选的元素current
和health
,这些元素不是强制存在的。
客户端应用程序必须在运行时检查可选元素是否包含值。一个可选元素是否包含值取决于服务端应用程序。服务端应用程序可以为这个特定实例是否设置值。可选包含元素的特性为 SI 提供了向前和向后兼容性,因为新添加的记录元素可以被旧应用程序忽略。
/**
* \brief 具有可选包含值的数据结构。
*/
struct BatteryState {
Voltage_t voltage;
Temperature_t temperature;
ara::core::Optional<Current_t> current;
ara::core::Optional<Health> health;
};
5.21 代码示例
在 5.22 中的骨架实现提供了在 5.21 中定义的BatteryState
结构。实现知道可选标记元素current
,但由于服务接口的新版本,不知道可选标记元素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;
}
};
5.22 代码示例
在 5.23 中的代理消费在 5.21 中定义的BatteryState
结构。骨架实现知道两个可选标记元素current
和health
。在访问可选元素之前,骨架实现必须检查可选元素是否真有值。因此,可选 API 提供了两种方法:operator bool
和has_value
方法。
using namespace ara::com;
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) {
// 用这个信息做一些事情
}
}
}
5.23代码示例
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » AUTOSAR_EXP_ARAComAPI的5章笔记(15)
发表评论 取消回复