10#include "open62541pp/config.hpp"
22#ifdef UA_ENABLE_SUBSCRIPTIONS
111std::vector<std::unique_ptr<MonitoredItemContext>> makeMonitoredItemContexts(
119void convertMonitoredItemContexts(
120 Span<
const std::unique_ptr<MonitoredItemContext>> contexts,
127void storeMonitoredItemContexts(
131 Span<std::unique_ptr<MonitoredItemContext>> contexts
152#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
159template <
typename CompletionToken>
165 CompletionToken&& token
167 auto contexts = detail::makeMonitoredItemContexts(
168 connection, request, std::move(dataChangeCallback), {}, std::move(deleteCallback)
170 std::vector<void*> contextsPtr{contexts.size()};
171 std::vector<UA_Client_DataChangeNotificationCallback> dataChangeCallbacks{contexts.size()};
172 std::vector<UA_Client_DeleteMonitoredItemCallback> deleteCallbacks{contexts.size()};
173 detail::convertMonitoredItemContexts(
174 contexts, contextsPtr, dataChangeCallbacks, {}, deleteCallbacks
176 return detail::AsyncServiceAdapter<CreateMonitoredItemsResponse>::initiate(
187 opcua::detail::getHandle(connection),
190 const_cast<void**
>(innerContextsPtr.
data()),
192 innerDataChangeCallbacks.
data()
204 contexts = std::move(contexts)](
const auto& response)
mutable {
205 detail::storeMonitoredItemContexts(connection, subscriptionId, response, contexts);
207 std::forward<CompletionToken>(token)
210 std::move(contextsPtr),
211 std::move(dataChangeCallbacks),
212 std::move(deleteCallbacks)
242#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
250template <
typename CompletionToken>
259 CompletionToken&& token
261 auto item = detail::makeMonitoredItemCreateRequest(itemToMonitor, monitoringMode, parameters);
262 const auto request = detail::makeCreateMonitoredItemsRequest(
263 subscriptionId, parameters.
timestamps, {&item, 1}
267 asWrapper<CreateMonitoredItemsRequest>(request),
268 std::move(dataChangeCallback),
269 std::move(deleteCallback),
270 detail::TransformToken(
271 detail::wrapSingleResultWithStatus<
274 std::forward<CompletionToken>(token)
296#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
303template <
typename CompletionToken>
309 CompletionToken&& token
311 auto contexts = detail::makeMonitoredItemContexts(
312 connection, request, {}, std::move(eventCallback), std::move(deleteCallback)
314 std::vector<void*> contextsPtr{contexts.size()};
315 std::vector<UA_Client_EventNotificationCallback> eventCallbacks{contexts.size()};
316 std::vector<UA_Client_DeleteMonitoredItemCallback> deleteCallbacks{contexts.size()};
317 detail::convertMonitoredItemContexts(
318 contexts, contextsPtr, {}, eventCallbacks, deleteCallbacks
320 return detail::AsyncServiceAdapter<CreateMonitoredItemsResponse>::initiate(
331 opcua::detail::getHandle(connection),
334 const_cast<void**
>(innerContextsPtr.
data()),
346 contexts = std::move(contexts)](
const auto& response)
mutable {
347 detail::storeMonitoredItemContexts(connection, subscriptionId, response, contexts);
349 std::forward<CompletionToken>(token)
352 std::move(contextsPtr),
353 std::move(eventCallbacks),
354 std::move(deleteCallbacks)
381#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
388template <
typename CompletionToken>
397 CompletionToken&& token
399 auto item = detail::makeMonitoredItemCreateRequest(itemToMonitor, monitoringMode, parameters);
400 const auto request = detail::makeCreateMonitoredItemsRequest(
401 subscriptionId, parameters.
timestamps, {&item, 1}
405 asWrapper<CreateMonitoredItemsRequest>(request),
406 std::move(eventCallback),
407 std::move(deleteCallback),
408 detail::TransformToken(
409 detail::wrapSingleResultWithStatus<
412 std::forward<CompletionToken>(token)
436#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
442template <
typename CompletionToken>
446 return detail::AsyncServiceAdapter<ModifyMonitoredItemsResponse>::initiate(
454 opcua::detail::getHandle(connection),
461 std::forward<CompletionToken>(token),
481 auto item = detail::makeMonitoredItemModifyRequest(monitoredItemId, parameters);
482 auto request = detail::makeModifyMonitoredItemsRequest(subscriptionId, parameters, item);
484 connection, asWrapper<ModifyMonitoredItemsRequest>(request)
486 return detail::wrapSingleResultWithStatus<MonitoredItemModifyResult>(response);
489#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
495template <
typename CompletionToken>
501 CompletionToken&& token
503 auto item = detail::makeMonitoredItemModifyRequest(monitoredItemId, parameters);
504 auto request = detail::makeModifyMonitoredItemsRequest(subscriptionId, parameters, item);
507 asWrapper<ModifyMonitoredItemsRequest>(request),
508 detail::TransformToken(
509 detail::wrapSingleResultWithStatus<
512 std::forward<CompletionToken>(token)
541template <
typename CompletionToken>
545 return detail::sendRequestAsync<SetMonitoringModeRequest, SetMonitoringModeResponse>(
546 connection, request, std::forward<CompletionToken>(token)
564 const auto request = detail::makeSetMonitoringModeRequest(
565 subscriptionId, {&monitoredItemId, 1}, monitoringMode
567 return detail::getSingleStatus(
577template <
typename CompletionToken>
583 CompletionToken&& token
585 const auto request = detail::makeSetMonitoringModeRequest(
586 subscriptionId, {&monitoredItemId, 1}, monitoringMode
590 asWrapper<SetMonitoringModeRequest>(request),
591 detail::TransformToken(
592 detail::getSingleStatus<SetMonitoringModeResponse>, std::forward<CompletionToken>(token)
623template <
typename CompletionToken>
627 return detail::sendRequestAsync<SetTriggeringRequest, SetTriggeringResponse>(
628 connection, request, std::forward<CompletionToken>(token)
650#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
656template <
typename CompletionToken>
660 return detail::AsyncServiceAdapter<DeleteMonitoredItemsResponse>::initiate(
668 opcua::detail::getHandle(connection),
675 std::forward<CompletionToken>(token),
692#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
698template <
typename CompletionToken>
702 const auto request = detail::makeDeleteMonitoredItemsRequest(
703 subscriptionId, {&monitoredItemId, 1}
707 asWrapper<DeleteMonitoredItemsRequest>(request),
708 detail::TransformToken(
709 detail::getSingleStatus<DeleteMonitoredItemsResponse>,
710 std::forward<CompletionToken>(token)
UA_DataValue wrapper class.
UA_ExtensionObject wrapper class.
View to a contiguous sequence of objects, similar to std::span in C++20.
constexpr pointer data() const noexcept
UA_StatusCode wrapper class.
UA_CreateMonitoredItemsRequest wrapper class.
IntegerId subscriptionId() const noexcept
UA_CreateMonitoredItemsResponse wrapper class.
UA_DeleteMonitoredItemsRequest wrapper class.
UA_DeleteMonitoredItemsResponse wrapper class.
UA_ModifyMonitoredItemsRequest wrapper class.
UA_CreateMonitoredItemsResponse wrapper class.
UA_MonitoredItemCreateResult wrapper class.
UA_MonitoredItemModifyResult wrapper class.
UA_ReadValueId wrapper class.
UA_SetMonitoringModeRequest wrapper class.
UA_SetMonitoringModeResponse wrapper class.
UA_SetTriggeringRequest wrapper class.
UA_SetTriggeringResponse wrapper class.
void(* UA_ClientAsyncServiceCallback)(UA_Client *client, void *userdata, UA_UInt32 requestId, void *response)
UA_StatusCode UA_Client_MonitoredItems_modify_async(UA_Client *client, const UA_ModifyMonitoredItemsRequest request, UA_ClientAsyncServiceCallback callback, void *userdata, UA_UInt32 *requestId)
void(* UA_Client_EventNotificationCallback)(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, size_t nEventFields, UA_Variant *eventFields)
void(* UA_Client_DeleteMonitoredItemCallback)(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext)
UA_StatusCode UA_Client_MonitoredItems_createEvents_async(UA_Client *client, const UA_CreateMonitoredItemsRequest request, void **contexts, UA_Client_EventNotificationCallback *callbacks, UA_Client_DeleteMonitoredItemCallback *deleteCallbacks, UA_ClientAsyncServiceCallback createCallback, void *userdata, UA_UInt32 *requestId)
void(* UA_Client_DataChangeNotificationCallback)(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, UA_DataValue *value)
UA_StatusCode UA_Client_MonitoredItems_delete_async(UA_Client *client, const UA_DeleteMonitoredItemsRequest request, UA_ClientAsyncServiceCallback callback, void *userdata, UA_UInt32 *requestId)
UA_StatusCode UA_Client_MonitoredItems_createDataChanges_async(UA_Client *client, const UA_CreateMonitoredItemsRequest request, void **contexts, UA_Client_DataChangeNotificationCallback *callbacks, UA_Client_DeleteMonitoredItemCallback *deleteCallbacks, UA_ClientAsyncServiceCallback createCallback, void *userdata, UA_UInt32 *requestId)
CreateMonitoredItemsResponse createMonitoredItemsDataChange(Client &connection, const CreateMonitoredItemsRequest &request, DataChangeNotificationCallback dataChangeCallback, DeleteMonitoredItemCallback deleteCallback)
Create and add monitored items to a subscription for data change notifications.
MonitoredItemCreateResult createMonitoredItemEvent(Client &connection, IntegerId subscriptionId, const ReadValueId &itemToMonitor, MonitoringMode monitoringMode, const MonitoringParametersEx ¶meters, EventNotificationCallback eventCallback, DeleteMonitoredItemCallback deleteCallback={})
Create and add a monitored item to a subscription for event notifications.
auto createMonitoredItemsEventAsync(Client &connection, const CreateMonitoredItemsRequest &request, EventNotificationCallback eventCallback, DeleteMonitoredItemCallback deleteCallback, CompletionToken &&token)
Create and add monitored items to a subscription for event notifications.
auto createMonitoredItemEventAsync(Client &connection, IntegerId subscriptionId, const ReadValueId &itemToMonitor, MonitoringMode monitoringMode, const MonitoringParametersEx ¶meters, EventNotificationCallback eventCallback, DeleteMonitoredItemCallback deleteCallback, CompletionToken &&token)
Create and add a monitored item to a subscription for event notifications.
std::function< void(IntegerId subId, IntegerId monId)> DeleteMonitoredItemCallback
MonitoredItem deletion callback.
MonitoredItemCreateResult createMonitoredItemDataChange(T &connection, IntegerId subscriptionId, const ReadValueId &itemToMonitor, MonitoringMode monitoringMode, const MonitoringParametersEx ¶meters, DataChangeNotificationCallback dataChangeCallback, DeleteMonitoredItemCallback deleteCallback)
Create and add a monitored item to a subscription for data change notifications.
auto createMonitoredItemDataChangeAsync(Client &connection, IntegerId subscriptionId, const ReadValueId &itemToMonitor, MonitoringMode monitoringMode, const MonitoringParametersEx ¶meters, DataChangeNotificationCallback dataChangeCallback, DeleteMonitoredItemCallback deleteCallback, CompletionToken &&token)
std::function< void(IntegerId subId, IntegerId monId, Span< const Variant > eventFields)> EventNotificationCallback
Event notification callback.
CreateMonitoredItemsResponse createMonitoredItemsEvent(Client &connection, const CreateMonitoredItemsRequest &request, EventNotificationCallback eventCallback, DeleteMonitoredItemCallback deleteCallback)
Create and add monitored items to a subscription for event notifications.
std::function< void(IntegerId subId, IntegerId monId, const DataValue &value)> DataChangeNotificationCallback
Data change notification callback.
auto createMonitoredItemsDataChangeAsync(Client &connection, const CreateMonitoredItemsRequest &request, DataChangeNotificationCallback dataChangeCallback, DeleteMonitoredItemCallback deleteCallback, CompletionToken &&token)
Create and add monitored items to a subscription for data change notifications.
StatusCode deleteMonitoredItem(T &connection, IntegerId subscriptionId, IntegerId monitoredItemId)
Delete a monitored item from a subscription.
auto deleteMonitoredItemAsync(Client &connection, IntegerId subscriptionId, IntegerId monitoredItemId, CompletionToken &&token)
Delete a monitored item from a subscription.
DeleteMonitoredItemsResponse deleteMonitoredItems(Client &connection, const DeleteMonitoredItemsRequest &request) noexcept
Delete monitored items from a subscription.
auto deleteMonitoredItemsAsync(Client &connection, const DeleteMonitoredItemsRequest &request, CompletionToken &&token)
Delete monitored items from a subscription.
ModifyMonitoredItemsResponse modifyMonitoredItems(Client &connection, const ModifyMonitoredItemsRequest &request) noexcept
Modify monitored items of a subscription.
MonitoredItemModifyResult modifyMonitoredItem(Client &connection, IntegerId subscriptionId, IntegerId monitoredItemId, const MonitoringParametersEx ¶meters) noexcept
Modify a monitored item of a subscription.
auto modifyMonitoredItemsAsync(Client &connection, const ModifyMonitoredItemsRequest &request, CompletionToken &&token)
Modify monitored items of a subscription.
auto modifyMonitoredItemAsync(Client &connection, IntegerId subscriptionId, IntegerId monitoredItemId, const MonitoringParametersEx ¶meters, CompletionToken &&token)
auto setMonitoringModeAsync(Client &connection, const SetMonitoringModeRequest &request, CompletionToken &&token)
Set the monitoring mode of monitored items.
SetMonitoringModeResponse setMonitoringMode(Client &connection, const SetMonitoringModeRequest &request) noexcept
Set the monitoring mode of monitored items.
SetTriggeringResponse setTriggering(Client &connection, const SetTriggeringRequest &request) noexcept
Add and delete triggering links of monitored items.
auto setTriggeringAsync(Client &connection, const SetTriggeringRequest &request, CompletionToken &&token)
Add and delete triggering links of monitored items.
constexpr T::NativeType * asNative(T *wrapper) noexcept
Cast Wrapper object pointers to native object pointers.
MonitoringMode
Monitoring mode.
TimestampsToReturn
Timestamps to return.
OPC UA services as free functions.
uint32_t IntegerId
IntegerId.
constexpr void throwIfBad(UA_StatusCode code)
Check the status code and throw a BadStatus exception if the status code is bad.
Extended monitoring parameters with default values from open62541.
uint32_t queueSize
Size of the MonitoringItem queue.
TimestampsToReturn timestamps
Timestamps to be transmitted.
ExtensionObject filter
Filter is used by the server to determine if the MonitoredItem should generate notifications.
double samplingInterval
Interval in milliseconds that defines the fastest rate at which the MonitoredItem should be accessed ...
bool discardOldest
Discard policy when the queue is full.