AUTOSAR_EXP_ARAComAPI的5章笔记(8)
☞ 返回总目录
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 小节中提到的基于轮询和事件驱动的访问也适用于触发器。