☞ 返回总目录
5.3.7 Fields
从概念上讲,与 Event 不同,Field 在任何时候都具有一定的值。这与 Event 相比,带来了以下附加内容:
- 如果对 Field 进行了订阅,“立即” 会以类似事件通知的模式将当前值发送回订阅者。
- 当前 Field 的值可以通过调用 Get () 方法进行查询,或者通过 Set () 方法进行更新。
请注意,Field 提供的所有功能都是可选的:在 Field 的配置(IDL)中,您可以决定它是否具有 “on-change-notification”、Get () 或 Set ()。在我们的示例 Field(见下文)中,我们配置了所有这三种机制。
对于远程服务提供的每个字段,Proxy Class 都包含一个特定于该字段的包装类的成员。在我们的示例中,该成员的名称为 UpdateRate(类型为 fields::UpdateRate)。
与 Event 和 Method 的包装类一样,Proxy Class 所需的 Field 包装类在特定的命名空间 fields 中生成,该命名空间包含在代理命名空间内。
故意把 Field 的解释放在 Event 和 Method 的解释之后,因为 Field 的概念大致是一个包含相关 get ()/set () 方法的 Event 的聚合。因此,从技术上讲,我们也将 ara::com 字段的表示实现为 ara::com 事件和方法的组合。
因此,代理中的 Field 成员用于:
- 使用与常规方法完全相同的机制调用 Field 的 Get () 或 Set () 方法。
- 以事件 / 事件数据的形式访问 Field 更新通知,这些通知由我们的代理连接的服务实例发送,其机制与常规事件完全相同。
让我们看一下为我们的示例 UpdateRate 字段生成的 Field 包装类:
class UpdateRate
{ /*** \brief 事件数据类型的快捷方式。*/using FieldType = uint32_t;/*** \brief 有关详细信息,请参阅 Events,因为字段包含通知的可能性,其中包含在那里描述的接口的详细信息。*/ara::core::Result<void> Subscribe(size_t maxSampleCount);size_t GetFreeSampleCount() const noexcept;ara::com::SubscriptionState GetSubscriptionState() const;void Unsubscribe();ara::core::Result<void> SetReceiveHandler(ara::com::EventReceiveHandler handler);ara::core::Result<void> UnsetReceiveHandler();ara::core::Result<void> SetSubscriptionStateChangeHandler(ara::com::SubscriptionStateChangeHandler handler);void UnsetSubscriptionStateChangeHandler();template <typename F>ara::core::Result<size_t> GetNewSamples(F&& f,size_t maxNumberOfSamples = std::numeric_limits<size_t>::max());/*** 该 getter 允许请求服务提供者的实际值。* * 有关 future 的描述,请参阅该方法。* 它应该表现得像一个方法。*/ara::core::Future<FieldType> Get();/*** 该 setter 允许请求设置一个新值。* 由服务提供者决定是否接受请求或修改它。* 新值应作为响应发送回请求者。* * 有关 future 的描述,请参阅该方法。* 它应该表现得像一个方法。*/ara::core::Future<FieldType> Set(const FieldType& value);
};
这里没有更多要描述的内容了。关于该字段中类似 Event 的部分的机制文档,请查看 5.3.5 小节;关于该 Field 中类似方法的部分的文档,请查看 5.3.6 小节。
5.3.8 触发器(Triggers)
触发器只是一类无数据的事件。这意味着 5.3.5 小节中的所有文档也适用于触发器,除了与数据相关的部分在本节中进行描述。从代理的角度来看,订阅触发器与 5.3.5.1 小节中描述的相同,但没有本地缓存部分。
/*** 应用程序期望通信管理(CM)订阅该事件。*/
ara::core::Result<void> Subscribe();
一个Subscribe()调用将通知通信管理接收触发器更新。其他订阅功能(例如SubscribeChangeSetSubscriptionHandler()、Unsubscribe())与事件相同。
与事件的一个很大区别是接收触发器更新。与事件不同,在事件中我们对接收的数据感兴趣,而对于触发器,我们只对自上次检查以来接收到的触发器数量感兴趣。因此,GetNewTriggers()比GetNewSamples()更简单:
/*** 获取如果有接收到的触发器的数量。* * 返回结果,表示新触发器的数量(零意味着没有新的触发器已被接收)。*/
size_t GetNewTriggers();
返回值表示自上次调用GetNewTriggers()以来发生的已接收触发器的数量。如 5.3.5.5 小节中提到的基于轮询和事件驱动的访问也适用于触发器。