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()),
203 contexts = std::move(contexts)](
const auto& response)
mutable {
204 detail::storeMonitoredItemContexts(connection, subscriptionId, response, contexts);
206 std::forward<CompletionToken>(token)
209 std::move(contextsPtr),
210 std::move(dataChangeCallbacks),
211 std::move(deleteCallbacks)
241#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
249template <
typename CompletionToken>
258 CompletionToken&& token
260 auto item = detail::makeMonitoredItemCreateRequest(itemToMonitor, monitoringMode, parameters);
261 const auto request = detail::makeCreateMonitoredItemsRequest(
262 subscriptionId, parameters.
timestamps, {&item, 1}
266 asWrapper<CreateMonitoredItemsRequest>(request),
267 std::move(dataChangeCallback),
268 std::move(deleteCallback),
269 detail::TransformToken(
270 detail::wrapSingleResultWithStatus<
273 std::forward<CompletionToken>(token)
295#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
302template <
typename CompletionToken>
308 CompletionToken&& token
310 auto contexts = detail::makeMonitoredItemContexts(
311 connection, request, {}, std::move(eventCallback), std::move(deleteCallback)
313 std::vector<void*> contextsPtr{contexts.size()};
314 std::vector<UA_Client_EventNotificationCallback> eventCallbacks{contexts.size()};
315 std::vector<UA_Client_DeleteMonitoredItemCallback> deleteCallbacks{contexts.size()};
316 detail::convertMonitoredItemContexts(
317 contexts, contextsPtr, {}, eventCallbacks, deleteCallbacks
319 return detail::AsyncServiceAdapter<CreateMonitoredItemsResponse>::initiate(
330 opcua::detail::getHandle(connection),
333 const_cast<void**
>(innerContextsPtr.
data()),
345 contexts = std::move(contexts)](
const auto& response)
mutable {
346 detail::storeMonitoredItemContexts(connection, subscriptionId, response, contexts);
348 std::forward<CompletionToken>(token)
351 std::move(contextsPtr),
352 std::move(eventCallbacks),
353 std::move(deleteCallbacks)
380#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
387template <
typename CompletionToken>
396 CompletionToken&& token
398 auto item = detail::makeMonitoredItemCreateRequest(itemToMonitor, monitoringMode, parameters);
399 const auto request = detail::makeCreateMonitoredItemsRequest(
400 subscriptionId, parameters.
timestamps, {&item, 1}
404 asWrapper<CreateMonitoredItemsRequest>(request),
405 std::move(eventCallback),
406 std::move(deleteCallback),
407 detail::TransformToken(
408 detail::wrapSingleResultWithStatus<
411 std::forward<CompletionToken>(token)
435#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
441template <
typename CompletionToken>
445 return detail::AsyncServiceAdapter<ModifyMonitoredItemsResponse>::initiate(
453 opcua::detail::getHandle(connection),
460 std::forward<CompletionToken>(token),
480 auto item = detail::makeMonitoredItemModifyRequest(monitoredItemId, parameters);
481 auto request = detail::makeModifyMonitoredItemsRequest(subscriptionId, parameters, item);
483 connection, asWrapper<ModifyMonitoredItemsRequest>(request)
485 return detail::wrapSingleResultWithStatus<MonitoredItemModifyResult>(response);
488#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
494template <
typename CompletionToken>
500 CompletionToken&& token
502 auto item = detail::makeMonitoredItemModifyRequest(monitoredItemId, parameters);
503 auto request = detail::makeModifyMonitoredItemsRequest(subscriptionId, parameters, item);
506 asWrapper<ModifyMonitoredItemsRequest>(request),
507 detail::TransformToken(
508 detail::wrapSingleResultWithStatus<
511 std::forward<CompletionToken>(token)
540template <
typename CompletionToken>
544 return detail::sendRequestAsync<SetMonitoringModeRequest, SetMonitoringModeResponse>(
545 connection, request, std::forward<CompletionToken>(token)
563 const auto request = detail::makeSetMonitoringModeRequest(
564 subscriptionId, {&monitoredItemId, 1}, monitoringMode
566 return detail::getSingleStatus(
576template <
typename CompletionToken>
582 CompletionToken&& token
584 const auto request = detail::makeSetMonitoringModeRequest(
585 subscriptionId, {&monitoredItemId, 1}, monitoringMode
589 asWrapper<SetMonitoringModeRequest>(request),
590 detail::TransformToken(
591 detail::getSingleStatus<SetMonitoringModeResponse>, std::forward<CompletionToken>(token)
622template <
typename CompletionToken>
626 return detail::sendRequestAsync<SetTriggeringRequest, SetTriggeringResponse>(
627 connection, request, std::forward<CompletionToken>(token)
649#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
655template <
typename CompletionToken>
659 return detail::AsyncServiceAdapter<DeleteMonitoredItemsResponse>::initiate(
667 opcua::detail::getHandle(connection),
674 std::forward<CompletionToken>(token),
691#if UAPP_HAS_ASYNC_SUBSCRIPTIONS
697template <
typename CompletionToken>
701 const auto request = detail::makeDeleteMonitoredItemsRequest(
702 subscriptionId, {&monitoredItemId, 1}
706 asWrapper<DeleteMonitoredItemsRequest>(request),
707 detail::TransformToken(
708 detail::getSingleStatus<DeleteMonitoredItemsResponse>,
709 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.