ANSI C Based OPC UA Client/Server SDK  1.9.0.430
uaprovider_demo.c
/*****************************************************************************
*
* Copyright (c) 2006-2019 Unified Automation GmbH. All rights reserved.
*
* Software License Agreement ("SLA") Version 2.7
*
* Unless explicitly acquired and licensed from Licensor under another
* license, the contents of this file are subject to the Software License
* Agreement ("SLA") Version 2.7, or subsequent versions as allowed by the
* SLA, and You may not copy or use this file in either source code or
* executable form, except in compliance with the terms and conditions of
* the SLA.
*
* All software distributed under the SLA is provided strictly on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
* AND LICENSOR HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
* LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, QUIET ENJOYMENT, OR NON-INFRINGEMENT. See the SLA for specific
* language governing rights and limitations under the SLA.
*
* The complete license agreement can be found here:
* http://unifiedautomation.com/License/SLA/2.7/
*
* Project: OPC Ansi C DemoProvider for namespace
* 'http://www.unifiedautomation.com/DemoServer/'
*
****************************************************************************/
#include "uaprovider_demo.h"
#include <opcua_proxystub.h>
#include <opcua_errorhandling.h>
#include <opcua_identifiers.h>
#include <opcua_string.h>
#include <opcua_pki.h>
#include <opcua_trace.h>
#include <uabase_p_utilities.h>
#include <uaserver_utilities.h>
#include "uaprovider_demo_hooks.h"
#include "uaprovider_demo_nodes_1.h"
#include "uaprovider_demo_identifiers_1.h"
#include "uaprovider_demo_types_1.h"
#if UASERVER_SUPPORT_EVENTS
#include "uaprovider_demo_events_1.h"
#endif /* UASERVER_SUPPORT_EVENTS */
/* Global Provider data */
UaServer_Provider* g_pDemoProvider;
UaServer_pProviderInterface* g_pDemoProviderInterface;
OpcUa_UInt16 g_UaProviderDemo_uNamespaceIndex1 = OpcUa_UInt16_Max;
/* The number of nodes managed by the server. */
#if HAVE_ENCODING_BINARY
#define UAPROVIDER_DEMO_NUMBEROFNODES1 569
#define UAPROVIDER_DEMO_NUMBEROFREFERENCES1 1199
#else
#define UAPROVIDER_DEMO_NUMBEROFNODES1 557
#define UAPROVIDER_DEMO_NUMBEROFREFERENCES1 1170
#endif
#define UAPROVIDER_DEMO_NUMBEROFMETHODS1 23
static OpcUa_UInt32 g_UaProvider_Demo_HashTableSize = 1009;
IFMETHODIMP(UaProvider_Demo_ReadAsync)(UaServer_ProviderReadContext* a_pReadCtx);
IFMETHODIMP(UaProvider_Demo_WriteAsync)(UaServer_ProviderWriteContext* a_pWriteCtx);
#if UASERVER_SERVICES_HISTORYREAD
IFMETHODIMP(UaProvider_Demo_HistoryReadRawModifiedAsync)(UaServer_ProviderHistoryReadRawModifiedContext* a_pReadCtx);
IFMETHODIMP(UaProvider_Demo_HistoryReadEventAsync)(UaServer_ProviderHistoryReadEventContext* a_pReadCtx);
IFMETHODIMP(UaProvider_Demo_HistoryReadProcessedAsync)(UaServer_ProviderHistoryReadProcessedContext* a_pHistoryReadProcessedCtx);
IFMETHODIMP(UaProvider_Demo_HistoryReadAtTimeAsync)(UaServer_ProviderHistoryReadAtTimeContext* a_pHistoryReadAtTimeCtx);
#endif
#if UASERVER_SERVICES_HISTORYUPDATE
IFMETHODIMP(UaProvider_Demo_HistoryUpdateAsync)(UaServer_ProviderHistoryUpdateContext* a_pHistoryUpdateCtx);
#endif
IFMETHODIMP(UaProvider_Demo_BrowseAsync)(UaServer_ProviderBrowseContext* a_pBrowseCtx);
IFMETHODIMP(UaProvider_Demo_TranslateAsync)(UaServer_ProviderTranslateContext* a_pTranslateCtx);
IFMETHODIMP(UaProvider_Demo_RegisterNodesAsync)(UaServer_ProviderRegisterNodesContext* a_pRegisterNodesCtx);
IFMETHODIMP(UaProvider_Demo_UnregisterNodesAsync)(UaServer_ProviderUnregisterNodesContext* a_pUnregisterNodesCtx);
#if UASERVER_SERVICES_CALL
IFMETHODIMP(UaProvider_Demo_CallAsync)(UaServer_ProviderCallContext* a_pCallContext);
#endif
IFMETHODIMP(UaProvider_Demo_AddItem)(UaServer_MonitoredItem* a_pItem);
IFMETHODIMP(UaProvider_Demo_ModifyItem)(UaServer_MonitoredItem* a_pItem, OpcUa_Int32 *a_pSamplingInterval, OpcUa_DataChangeFilter *a_pFilter, OpcUa_MonitoringMode *a_pMonitoringMode);
IFMETHODIMP(UaProvider_Demo_RemoveItem)(UaServer_MonitoredItem* a_pItem);
IFMETHODIMP(UaProvider_Demo_Subscribe)(UaServer_ProviderSubscribeContext *a_pCtx);
OpcUa_StatusCode UaProvider_Demo_Subscription_Initialize();
OpcUa_StatusCode UaProvider_Demo_Subscription_Cleanup();
/*============================================================================
* Internal Helpers For Building And Clearing EventHierarchy
*===========================================================================*/
#if UASERVER_SUPPORT_EVENTS
static OpcUa_StatusCode UaProvider_Demo_BuildEventHierarchy()
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "UaProvider_Demo_BuildEventHierarchy");
uStatus = UaProvider_Demo_BuildEventHierarchy_1();
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
static OpcUa_StatusCode UaProvider_Demo_ClearEventHierarchy()
{
OpcUa_StatusCode tmpStatus;
OpcUa_InitializeStatus(OpcUa_Module_Server, "UaProvider_Demo_ClearEventHierarchy");
tmpStatus = UaProvider_Demo_ClearEventHierarchy_1();
if (OpcUa_IsBad(tmpStatus))
{
uStatus = tmpStatus;
}
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
#endif
IFMETHODIMP(UaProvider_Demo_Cleanup)()
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "Cleanup Demo Provider ...\n");
UaProvider_Demo_BeforeCleanup();
UaProvider_Demo_Subscription_Cleanup();
#if UASERVER_SUPPORT_EVENTS
UaProvider_Demo_ClearEventHierarchy();
UaProvider_Demo_UnregisterEventTypes1();
#endif
UaProvider_Demo_AfterCleanup();
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "Cleanup Demo Provider DONE!\n");
return OpcUa_Good;
}
/*============================================================================
* Internal Helper For Creating The AddressSpace In The Server
*===========================================================================*/
static OpcUa_StatusCode UaProvider_Demo_CreateAddressSpace()
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "UaProvider_Demo_CreateAddressSpace");
uStatus = UaProvider_Demo_CreateAddressSpace1();
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
IFMETHODIMP(UaProvider_Demo_Initialize)(
UaServer_Provider* a_pProvider,
UaServer_pProviderInterface* a_pProviderInterface)
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "UaProvider_Demo_Initialize");
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "Initialize Demo Provider ...\n");
/* store values */
g_pDemoProvider = a_pProvider;
g_pDemoProviderInterface = a_pProviderInterface;
OpcUa_MemSet(g_pDemoProviderInterface, 0, sizeof(UaServer_pProviderInterface));
/* Register Handlers */
a_pProviderInterface->DeleteNodeUserData = UaProvider_Demo_DeleteNodeUserData;
a_pProviderInterface->Cleanup = UaProvider_Demo_Cleanup;
a_pProviderInterface->ReadAsync = UaProvider_Demo_ReadAsync;
a_pProviderInterface->WriteAsync = UaProvider_Demo_WriteAsync;
#if UASERVER_SERVICES_HISTORYREAD
a_pProviderInterface->HistoryReadRawModifiedAsync = UaProvider_Demo_HistoryReadRawModifiedAsync;
a_pProviderInterface->HistoryReadEventAsync = UaProvider_Demo_HistoryReadEventAsync;
a_pProviderInterface->HistoryReadAtTimeAsync = UaProvider_Demo_HistoryReadAtTimeAsync;
a_pProviderInterface->HistoryReadProcessedAsync = UaProvider_Demo_HistoryReadProcessedAsync;
#endif
#if UASERVER_SERVICES_HISTORYUPDATE
a_pProviderInterface->HistoryUpdateAsync = UaProvider_Demo_HistoryUpdateAsync;
#endif
a_pProviderInterface->BrowseAsync = UaProvider_Demo_BrowseAsync;
a_pProviderInterface->TranslateAsync = UaProvider_Demo_TranslateAsync;
a_pProviderInterface->RegisterNodesAsync = UaProvider_Demo_RegisterNodesAsync;
a_pProviderInterface->UnregisterNodesAsync = UaProvider_Demo_UnregisterNodesAsync;
#if UASERVER_SERVICES_CALL
a_pProviderInterface->CallAsync = UaProvider_Demo_CallAsync;
#endif
a_pProviderInterface->AddItem = UaProvider_Demo_AddItem;
a_pProviderInterface->ModifyItem = UaProvider_Demo_ModifyItem;
a_pProviderInterface->RemoveItem = UaProvider_Demo_RemoveItem;
a_pProviderInterface->Subscribe = UaProvider_Demo_Subscribe;
uStatus = UaProvider_Demo_BeforeInitialize(&g_UaProvider_Demo_HashTableSize);
OpcUa_GotoErrorIfBad(uStatus);
uStatus = UaServer_RegisterAddressSpace((OpcUa_Handle *)a_pProvider,
&g_UaProviderDemo_uNamespaceIndex1,
Demo_NamespaceUri1,
g_UaProvider_Demo_HashTableSize);
OpcUa_GotoErrorIfBad(uStatus);
#ifdef UAPROVIDER_DEMO_STACK_STRUCTURE_SERIALIZATION
/* add types */
uStatus = OpcUa_ProxyStub_AddTypes(Demo_KnownEncodeableTypes1);
OpcUa_GotoErrorIfBad(uStatus);
#endif
/* Create Server Managed AddressSpace */
uStatus = UaProvider_Demo_CreateAddressSpace();
OpcUa_GotoErrorIfBad(uStatus);
/* initialize subscriptions */
uStatus = UaProvider_Demo_Subscription_Initialize();
OpcUa_GotoErrorIfBad(uStatus);
#if UASERVER_SUPPORT_EVENTS
/* register event types */
UaProvider_Demo_RegisterEventTypes1();
uStatus = UaProvider_Demo_BuildEventHierarchy();
OpcUa_GotoErrorIfBad(uStatus);
#endif
uStatus = UaProvider_Demo_AfterInitialize();
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "Demo Provider initialized!\n");
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " %d Nodes created\n", a_pProvider->AddressSpace.uNumNodes);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " NS%d:\n", g_UaProviderDemo_uNamespaceIndex1);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " %d static nodes created\n", UAPROVIDER_DEMO_NUMBEROFNODES1);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " %d static references created\n", UAPROVIDER_DEMO_NUMBEROFREFERENCES1);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " %d static methods created\n", UAPROVIDER_DEMO_NUMBEROFMETHODS1);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "Initializing Demo Provider failed!\n");
#if UASERVER_SUPPORT_EVENTS
UaProvider_Demo_ClearEventHierarchy();
UaProvider_Demo_UnregisterEventTypes1();
#endif
UaProvider_Demo_Subscription_Cleanup();
UaServer_Providers_FreeProvider(a_pProvider);
OpcUa_FinishErrorHandling;
}
#ifdef BUILD_SHARED_LIBS
DEMOPROVIDER_API(OpcUa_StatusCode) InitializeProvider(
UaServer_Provider* pProvider,
UaServer_pProviderInterface* pProviderInterface)
{
return UaProvider_Demo_Initialize(pProvider, pProviderInterface);
}
#endif