返回总目录

相关总结:AutoSar AP CM服务接口级别的数据类型总结

5.5 服务接口级别的数据类型

以下章节描述了在ara::com中服务接口用户定义数据类型的 C++ 语言映射。这里的 “用户定义” 是指那些不是由ara::com API 定义(例如InstanceIdentifierFindServiceHandleServiceHandleContainerara::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(以下示例代码) 中,结构具有声明为可选的元素currenthealth,这些元素不是强制存在的。

客户端应用程序必须在运行时检查可选元素是否包含值。一个可选元素是否包含值取决于服务端应用程序。服务端应用程序可以为这个特定实例是否设置值。可选包含元素的特性为 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结构。骨架实现知道两个可选标记元素currenthealth。在访问可选元素之前,骨架实现必须检查可选元素是否真有值。因此,可选 API 提供了两种方法:operator boolhas_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代码示例   

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部