☞ 返回总目录
1. Filed的部分
一、Field 的概念特点
与 Event 不同,Field 在任何时候都有确定的值。它相比 Event 有额外的特性:若订阅 Field,会立即以类似事件通知模式将当前值发给订阅者;可以通过 Get () 方法查询当前值,通过 Set () 方法更新值。Field 的这些功能是可选的,可在配置中决定是否具有 “on-change-notification”、Get () 或 Set ()。
二、Field 在 Proxy Class 中的体现
对于远程服务提供的每个字段,Proxy Class 包含特定的包装类成员。其包装类在特定命名空间 fields 中生成,该命名空间包含在代理命名空间内。Field 的概念大致是包含相关 get ()/set () 方法的 Event 的聚合,所以 ara::com 字段的表示实现为 ara::com 事件和方法的组合。代理中的 Field 成员可用于以常规方法机制调用 Get () 或 Set () 方法,以及以事件形式接收 Field 更新通知。
三、示例 UpdateRate 字段包装类
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);
};
以示例 UpdateRate 字段的包装类展示了其具体的方法,包括订阅相关方法、获取样本计数、获取订阅状态、设置接收和订阅状态变化处理器、获取新样本以及 Get () 和 Set () 方法用于获取服务提供者的实际值和设置新值。
最后提到关于该字段中类似 Event 的部分机制参考 5.3.5 小节,类似方法的部分参考 5.3.6 小节。
2. Triggers的部分
一、触发器的性质
触发器是一类无数据的事件,5.3.5 小节中的大部分文档适用于触发器,但数据相关部分在本节描述。
二、从代理角度看触发器订阅
从代理角度,订阅触发器与 5.3.5.1 小节描述相似,但没有本地缓存部分。调用Subscribe()
函数可通知通信管理接收触发器更新,其他订阅功能(如SubscribeChangeSetSubscriptionHandler()
、Unsubscribe()
)与事件的相同。
三、触发器与事件的区别及GetNewTriggers()
方法
与事件的主要区别在于对更新的关注点不同。事件中关注接收的数据,而对于触发器,只关注自上次检查以来接收到的触发器数量。GetNewTriggers()
方法用于获取自上次调用该方法以来接收到的触发器数量,比用于事件的GetNewSamples()
方法更简单。
四、访问方式
如 5.3.5.5 小节提到的基于轮询和事件驱动的访问方式也适用于触发器。