前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CommonAPI C++(fidl)介绍

CommonAPI C++(fidl)介绍

作者头像
李小白是一只喵
发布2021-12-08 17:11:12
3K0
发布2021-12-08 17:11:12
举报
文章被收录于专栏:算法微时光

image.png

CommonAPI的基础部分

image.png

  • 第一部分是由CommonAPI代码生成器生成的基于Franca的部分,也就是根据*.fidl文件生成的部分。那是接口的一部分,它是根据FrancaIDL文件中的规范生成的,指数据类型,数组,枚举和接口等基础知识,包含属性,方法,回调,错误处理,广播等方面。
  • 第二个固定部分,是基于CommonAPIRuntime的功能,且独立于接口的规范。它们主要与基于中间件(someip/d-bus)提供的运行时环境有关。此外,此部分包含常见的类型定义和基类。也就是CommonAPI源代码库与所选中间件(someip/d-bus)的源代码库,供代码生成器生成的代码调用。

通用API运行时是从其开始所有类加载的基类。通用API运行时访问配置文件,以确定应加载哪个特定的中间件运行时库。中间件库是静态链接的,或者是作为共享库(文件扩展名.so)提供的,因此可用动态加载它们。

Franca 基础部分

fild文件的基本构成

类别1

类别2

说明

举例

package

限定包名,与命名空间(namespace)有关,必须包含

Package commonapi.examples

interface

接口,提供一个接口名称,用于包含接口函数等,当定义接口时需要

Interface Methods

version

版本号,同命名空间(namespace)有关,必须包含

version{major 0 minor 1}

method

方法,定义供应用程序所调用的输入输出接口函数,具有in,out,error三种参数,这三种参数都是可选的,可以只有in和out,或只有in等多种组合。

method foo { in { Int32 x1 String x2 } out { Int32 y1 String y2} error{ stdErrorTypeEnum } }

broadcast

广播,定义供应用程序调用的广播类接口函数;只有out参数。

broadcast myStatus { out { Int32 myCurrentValue } }

attribute

属性,对各种属性进行定义,可用于获取或设置属性值

attribute Int32 x

typedef

定义类型别名

typedef MyType is Int32

array

数组

array myArray of UInt16

enumeration

枚举类型

enumeration stdErrorTypeEnum { NO_FAULT MY_FAULT }

union

联合类型

union MyUnion {UInt32 MyUIntString MyString}

struct

结构体

struct a2Struct { Int32 a Boolean b Double d}

map

一种STL关联容器,以一种键值-对的机制存储数据

map MyMap {UInt32 to String}

typeCollection

类型集合,用户根据自己的需要添加的数据类型的集合,各种数据结构在同一个文件中进行扩展等

typeCollection CommonTypes

version

同interface::version

同interface::version

typedef

同interface::typedef

同interface::typedef

array

同interface::array

同interface::array

enumeration

同interface::enumeration

同interface::enumeration

union

同interface::union

同interface::union

struct

同interface::struct

同interface::struct

map

同interface::map

同interface::map

使用例子
代码语言:javascript
复制
/* Copyright (C) 2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package commonapi.examples

interface E02Attributes {
    version { major 1 minor 0 }

    attribute Int32 x
    attribute CommonTypes.a1Struct a1
}

typeCollection CommonTypes {
    version { major 1 minor 0 }
    
    struct a1Struct {
        String s
        a2Struct a2
    }

    struct a2Struct {
        Int32 a
        Boolean b
        Double d
    }
}

语法讲解

命名空间

Common API基本函数的名称空间是Common API;

Common API应用程序的名称空间取决于Franca IDL中定义接口规范和接口版本的限定包名。

Franca IDL文件中显示:

image.png

生成的代码中显示(CommonAPI C++):

image.png

namespace 每个文件的开头都有,代表这个文件所在的src-gen下面的路径,每个namespace代表一层目录;

如果接口没有版本,则省略名称空间中与版本有关的部分(例如图中的namespace v0)。

代码语言:javascript
复制
Version {major 1 minor 0} -- namespace v1 { }
Version {major 0 minor 1} -- namespace v0 { }
Version {major 0 minor 0} -- 无与版本相关的namespce
接口interface

Franca IDL文件中显示:

image.png

生成代码中的显示:

image.png

IDL文件中的版本号也会映射到代码中。

类型集合Type Collection

在Franca中,可以将一组用户定义的类型定义为type collection。

类型集合的名称称为typecollectionname,可以为空。CommonAPI为空类型集合使用默认名称Anonymous。CommonAPI代码生成器生成头文件Anonymous.hpp,并为类型集合创建C++ struct。

如果类型集合的名称不为空(例如:CommonTypes),则CommonAPI代码生成器生成头文件CommonTypes.hpp。

Franca IDL文件中显示:

image.png

生成代码中的显示:

image.png

方法Method

方法具有in和out参数,并且可以返回可选的应用程序错误error。

如果指定了附加标志fireAndForget,则不允许使用out参数,它指示既不返回值也不表示调用状态。没有fireAndForget标志的方可能返回error,可以在Franca IDL中将其指定为枚举。

对于没有fireAndForget标志的方法,提供了一个附加的返回值CallStatus,它被定义为枚举.

Franca IDL文件中显示:

image.png

在Franca IDL中,方法的异步或同步调用之间没有区别。

CommonAPI将同时提供两者。API的用户可以决定他调用哪个变体。含有fireAndForget标志的method,只有同步调用,没有异步调用。

image.png

广播Broadcast

广播只能有out参数。对于广播,可以定义一个附加标志selective。该标志指示该消息不应该发送给所有注册的参与者,而是该服务进行选择,表示只有选定的客户端才能在广播中注册。

Franca IDL文件中显示:

image.png

属性Attributes

接口的属性由名称和类型定义。另外,属性的规范可以具有两个标志: ·noSubscriptions ·readonly

标志

说明

none

没有附加任何标志的标准属性,默认允许所有内容

readonly

只读属性

noSubscriptions

不可观察的属性

readonly onSubscriptions

不可观察和不可写的属性

可观察的属性提供了一个ChangedEvent,可用于订阅对该属性的更新。此事件与所有其他事件完全一样。 头文件Attribute.h中定义了这四种类型的每种属性的模板类。

代码语言:javascript
复制
/**
 * \brief Class representing a read only attribute
 *
 * Class representing a read only attribute
 */
template <typename ValueType_>
class ReadonlyAttribute {
 public:
    typedef ValueType_ ValueType;

    typedef std::function<void(const CallStatus &, ValueType_)> AttributeAsyncCallback;

    virtual ~ReadonlyAttribute() { }

    /**
     * \brief Get value of attribute, usually from remote. Synchronous call.
     *
     * Get value of attribute, usually from remote. Synchronous call.
     *
     * @param value Reference to be filled with value.
     * @param callStatus call status reference will be filled with status of the operation
     */
    virtual void getValue(CallStatus &_status,
                          ValueType_ &_value,
                          const CallInfo *_info = nullptr) const = 0;

    /**
     * \brief Get value of attribute, usually from remote. Asynchronous call.
     *
     * Get value of attribute, usually from remote. Asynchronous call.
     *
     * @param attributeAsyncCallback std::function object for the callback to be invoked.
     * @return std::future containing the call status of the operation.
     */
    virtual std::future<CallStatus> getValueAsync(AttributeAsyncCallback attributeAsyncCallback,
                                                  const CallInfo *_info = nullptr) = 0;
};

/**
 * \brief Class representing a read and writable attribute
 *
 * Class representing a read and writable attribute
 */
template <typename ValueType_>
class Attribute: public ReadonlyAttribute<ValueType_> {
 public:
    typedef typename ReadonlyAttribute<ValueType_>::ValueType ValueType;
    typedef typename ReadonlyAttribute<ValueType_>::AttributeAsyncCallback AttributeAsyncCallback;

    virtual ~Attribute() { }

    /**
     * \brief Set value of attribute, usually to remote. Synchronous call.
     *
     * Set value of attribute, usually to remote. Synchronous call.
     *
     * @param requestValue Value to be set
     * @param callStatus call status reference will be filled with status of the operation
     * @param responseValue Reference which will contain the actuall value set by the remote.
     */
    virtual void setValue(const ValueType_& requestValue,
                          CallStatus& callStatus,
                          ValueType_& responseValue,
                          const CallInfo *_info = nullptr) = 0;

    /**
     * \brief Set value of attribute, usually to remote. Asynchronous call.
     *
     * Set value of attribute, usually to remote. Asynchronous call.
     *
     * @param requestValue Value to be set
     * @param attributeAsyncCallback std::function object for the callback to be invoked.
     * @return std::future containing the call status of the operation.
     */
    virtual std::future<CallStatus> setValueAsync(const ValueType_& requestValue,
                                                  AttributeAsyncCallback attributeAsyncCallback,
                                                  const CallInfo *_info = nullptr) = 0;
};

/**
 * \brief Class representing an observable attribute
 *
 * Class representing an observable attribute
 */
template <typename AttributeBaseClass_>
class ObservableAttributeImpl: public AttributeBaseClass_ {
 public:
    typedef typename AttributeBaseClass_::ValueType ValueType;
    typedef typename AttributeBaseClass_::AttributeAsyncCallback AttributeAsyncCallback;
    typedef Event<ValueType> ChangedEvent;

    virtual ~ObservableAttributeImpl() { }

    /**
     * \brief Returns the event handler for the remote change notification event
     *
     * Returns the event handler for the remote change notification event
     *
     * @return The event handler object
     */
    virtual ChangedEvent& getChangedEvent() = 0;
};

template <typename ValueType_>
struct ObservableReadonlyAttribute: ObservableAttributeImpl< ReadonlyAttribute<ValueType_> > {
};

template <typename ValueType_>
struct ObservableAttribute: ObservableAttributeImpl< Attribute<ValueType_> > {
};

Franca IDL文件中显示:

image.png

事件events

事件为远程触发的动作提供了一个异步接口。

这涵盖了FrancaIDL中的广播,方法和属性的更改,事件每个proxy还提供了一个可用性事件,可用于通知proxy状态。事件提供了订阅和取消订阅的方法,该方法允许注册和注销回调。

事件类的公共接口的相关部分如下:

image.png

数据类型

基本类型 CommonAPI使用的整数数据类型在stdint.h中定义。

Franca

Type Name

CommonAPI C++ Type Notes

UInt8

uint8_t

unsigned 8-bit integer(range 0…255)

Int8

int8_t

signed 8-bit integer(range -128…127)

UInt16

uint16_t

unsigned 16-bit integer(range 0…65535)

Int16

int16_t

signed 16-bit integer(range -32768…32767)

UInt32

uint32_t

unsigned 32-bit integer(range 0…4294967295)

Int32

int32_t

signed 32-bit integer(range -2147483648…2147473647)

UInt64

uint64_t

unsigned 64-bit integer

Int64

int64_t

signed 64-bit integer

Boolean

bool

boolean value, which can take one of two values: false or true

Float

float

Floating point number(4 bytes, range +/3.4e+/-38, ~7 digits).

Double

double

double precision floating point number(8 bytes, range+/-1.7e+/-308, ~15 digits).

String

std::string

character string.

ByteBuffer

std::vector<uint8_t>

buffer of bytes(aka BLOB).

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/7 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CommonAPI的基础部分
  • Franca 基础部分
    • fild文件的基本构成
      • 使用例子
      • 语法讲解
        • 命名空间
          • 接口interface
            • 类型集合Type Collection
              • 方法Method
                • 广播Broadcast
                  • 属性Attributes
                    • 事件events
                    • 数据类型
                    相关产品与服务
                    消息队列 TDMQ
                    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档