ANSI C Based OPC UA Client/Server/PubSub SDK  1.9.1.442
uaprovider_demo_methods_1.c
/*****************************************************************************
*
* Copyright (c) 2006-2020 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_methods_1.h"
#include <opcua_guid.h>
#include <opcua_timer.h>
#include <opcua_statuscodes.h>
#include <opcua_memory.h>
#include <uabase_p_atomic.h>
#include <uaserver_instance.h>
#include <uaserver_call.h>
#include "uaprovider_demo_simulation.h"
#include "uaprovider_demo_identifiers_1.h"
/* dynamic node variables */
static int g_iDynNodeId = 8001;
static OpcUa_Boolean g_bDynNodeIdExists = OpcUa_False;
static OpcUa_UInt32 iNodeVersion = 0;
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_References_Has3ForwardReferences2_Method1(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_References_Has3ForwardReferences2_Method2(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_References_Has3ForwardReferences2_Method3(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_References_Has3ForwardReferences5_ReferencedNode3(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_Methods_MethodIO(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus ,
/* in */ OpcUa_UInt32 a_Summand1,
/* in */ OpcUa_UInt32 a_Summand2,
/* out */ OpcUa_UInt32 *a_Sum)
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
*a_Sum = a_Summand1 + a_Summand2;
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_NodeClasses_Method(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_DynamicNodes_CreateDynamicNode(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_BaseNode *pNode = OpcUa_Null, *pParentNode = OpcUa_Null;
OpcUa_NodeId nodeId, typeId;
OpcUa_Variant *pValue = OpcUa_Null;
char szVersion[11];
OpcUa_ReferenceParameter(a_pCallContext);
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
if (g_bDynNodeIdExists) return OpcUa_BadInvalidState;
UaBase_SetDefaultNamespace(g_UaProviderDemo_uNamespaceIndex1);
UaBase_CreateNumericNodeId(&nodeId, g_iDynNodeId);
UaBase_CreateNumericNodeId(&typeId, Demo_TemperatureSensorTypeId);
&nodeId,
&typeId,
"DynamicNode",
"DynamicNode",
0,
OpcUa_Null,
OpcUa_False);
OpcUa_ReturnErrorIfBad(ret);
UaBase_CreateStringNodeId(&nodeId, Demo_Objects_Demo_DynamicNodes);
pParentNode = UaServer_GetNodeById(&nodeId);
UaBase_CreateNumericNodeIdEx(&typeId, OpcUaId_HasComponent, 0);
ret = OpcUa_BaseNode_AddReferenceToNode(pParentNode, pNode, &typeId, OpcUa_True);
OpcUa_ReturnErrorIfBad(ret);
#if UASERVER_SUPPORT_EVENTS
/* send ModelChangeEvent */
UaProvider_Demo_SendModelChangeEvent(pParentNode, OpcUa_ModelChangeStructureVerbMask_ReferenceAdded);
#endif /* UASERVER_SUPPORT_EVENTS */
g_bDynNodeIdExists = OpcUa_True;
/* update NodeVersion property */
UaBase_CreateNumericNodeId(&nodeId, Demo_Objects_Demo_DynamicNodes_NodeVersion);
pNode = UaServer_GetNodeById(&nodeId);
if (pNode)
{
pValue = OpcUa_Variable_GetValue(pNode);
OpcUa_String_Clear(&pValue->Value.String);
OpcUa_SnPrintfA(szVersion, 11, "%u", iNodeVersion++);
szVersion[10] = 0;
OpcUa_String_AttachCopy(&pValue->Value.String, szVersion);
}
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_DynamicNodes_DeleteDynamicNode(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_BaseNode *pNode = OpcUa_Null, *pParentNode = OpcUa_Null;
OpcUa_NodeId nodeId;
OpcUa_Variant *pValue = OpcUa_Null;
char szVersion[11];
OpcUa_ReferenceParameter(a_pCallContext);
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
if (!g_bDynNodeIdExists) return OpcUa_BadInvalidState;
UaBase_SetDefaultNamespace(g_UaProviderDemo_uNamespaceIndex1);
UaBase_CreateNumericNodeId(&nodeId, g_iDynNodeId);
/* remove node */
ret = UaServer_DeleteInstance(&nodeId);
OpcUa_ReturnErrorIfBad(ret);
UaBase_CreateStringNodeId(&nodeId, Demo_Objects_Demo_DynamicNodes);
pParentNode = UaServer_GetNodeById(&nodeId);
#if UASERVER_SUPPORT_EVENTS
/* send ModelChangeEvent */
UaProvider_Demo_SendModelChangeEvent(pParentNode, OpcUa_ModelChangeStructureVerbMask_ReferenceDeleted);
#endif /* UASERVER_SUPPORT_EVENTS */
g_bDynNodeIdExists = OpcUa_False;
/* update NodeVersion property */
UaBase_CreateNumericNodeIdEx(&nodeId, Demo_Objects_Demo_DynamicNodes_NodeVersion, g_UaProviderDemo_uNamespaceIndex1);
pNode = UaServer_GetNodeById(&nodeId);
if (pNode)
{
pValue = OpcUa_Variable_GetValue(pNode);
OpcUa_String_Clear(&pValue->Value.String);
OpcUa_SnPrintfA(szVersion, 11, "%u", iNodeVersion++);
szVersion[10] = 0;
OpcUa_String_AttachCopy(&pValue->Value.String, szVersion);
}
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_History_StartLogging(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
#if HAVE_DATA_LOGGER
ret = UaProvider_Demo_StartLogging();
#endif /* HAVE_DATA_LOGGER */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_History_StopLogging(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
#if HAVE_DATA_LOGGER
ret = UaProvider_Demo_StopLogging();
#endif /* HAVE_DATA_LOGGER */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_Images_Dynamic_SetAnimationSpeed(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus ,
/* in */ OpcUa_UInt32 a_AnimationSpeed )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
#if UAPROVIDER_DEMO_HAVE_ANIMATION_ITEM && UABASE_USE_FILESYSTEM
ret = UaProvider_Demo_SetAnimationSpeed(a_AnimationSpeed);
#else /* UAPROVIDER_DEMO_HAVE_ANIMATION_ITEM && UABASE_USE_FILESYSTEM */
OpcUa_ReferenceParameter(a_AnimationSpeed);
ret = OpcUa_BadConfigurationError;
#endif /* UAPROVIDER_DEMO_HAVE_ANIMATION_ITEM && UABASE_USE_FILESYSTEM */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_Timer g_methodTimer;
typedef struct _UaProvider_Demo_Method_CB_Data
{
OpcUa_StatusCode *pCallStatus;
} UaProvider_Demo_Method_CB_Data;
OpcUa_StatusCode OPCUA_DLLCALL UaProvider_Demo_Method_DoSomethingAfter10s_CB(OpcUa_Void* pvCallbackData,
OpcUa_Timer hTimer,
OpcUa_UInt32 msecElapsed)
{
UaProvider_Demo_Method_CB_Data *pCBData = pvCallbackData;
OpcUa_ReferenceParameter(hTimer);
OpcUa_ReferenceParameter(msecElapsed);
pCBData->pCallStatus = OpcUa_Good;
UaServer_CallComplete(pCBData->pCallContext);
OpcUa_Timer_Delete(&g_methodTimer);
OpcUa_Free(pCBData);
return OpcUa_Good;
}
OpcUa_StatusCode UaProvider_Demo_Demo_Method_DoSomethingAfter10s(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
UaProvider_Demo_Method_CB_Data *pCBData;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReturnErrorIfTrue(g_methodTimer != OpcUa_Null, OpcUa_BadInvalidState);
pCBData = OpcUa_Alloc(sizeof(UaProvider_Demo_Method_CB_Data));
OpcUa_ReturnErrorIfAllocFailed(pCBData);
pCBData->pCallContext = a_pCallContext;
pCBData->pCallStatus = a_pCallStatus;
ret = OpcUa_Timer_Create(&g_methodTimer, 10 * 1000, UaProvider_Demo_Method_DoSomethingAfter10s_CB, OpcUa_Null, pCBData);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_Method_EnumTest(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus ,
/* in */ Demo_HeaterStatus a_HeaterStatus,
/* in */ Demo_Priority a_Priority,
/* out */ Demo_HeaterStatus *a_RetHeaterStatus,
/* out */ Demo_Priority *a_RetPriority)
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
*a_RetHeaterStatus = a_HeaterStatus;
*a_RetPriority = a_Priority;
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_CTT_Methods_MethodNoArgs(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_Method_Multiply(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus ,
/* in */ OpcUa_Double a_a ,
/* in */ OpcUa_Double a_b ,
/* out */ OpcUa_Double *a_result )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
*a_result = a_a * a_b;
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_Method_VectorAdd(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus ,
/* in */ Demo_Vector *a_v1,
/* in */ Demo_Vector *a_v2,
/* out */ Demo_Vector *a_result)
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
a_result->X = a_v1->X + a_v2->X;
a_result->Y = a_v1->Y + a_v2->Y;
a_result->Z = a_v1->Z + a_v2->Z;
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_SetSimulationSpeed(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus ,
/* in */ OpcUa_UInt32 a_speed )
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
ret = UaProvider_Demo_SetSimulationSpeed(a_speed);
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_StartSimulation(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret, ret2;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
ret = UaProvider_Demo_StartSimulation();
ret2 = UaProvider_Demo_StartAnimation();
if (OpcUa_IsGood(ret))
ret = ret2;
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}
OpcUa_StatusCode UaProvider_Demo_Demo_StopSimulation(
/* in */ UaServer_ProviderCallContext *a_pCallContext ,
/* in */ OpcUa_NodeId *a_pObjectId,
/* out */ OpcUa_StatusCode *a_pCallStatus )
{
OpcUa_StatusCode ret, ret2;
OpcUa_ReferenceParameter(a_pObjectId);
OpcUa_ReferenceParameter(a_pCallStatus);
/* we will send exactly one callback */
ret = UaProvider_Demo_StopSimulation();
ret2 = UaProvider_Demo_StopAnimation();
if (OpcUa_IsGood(ret))
ret = ret2;
/* send callback */
UaServer_CallComplete(a_pCallContext);
return ret;
}