#include <uaserver_config.h>
#include <opcua_statuscodes.h>
#include <uaserver_monitoring.h>
#include <uaserver_monitoreditemmanager.h>
#include <uaserver_basenode.h>
#include <uaserver_utilities.h>
#include <uaserver_p_atomic.h>
#include "custom_provider_helper.h"
OPCUA_BEGIN_EXTERN_C
#define NUM_SAMPLINGRATES 7
static OpcUa_Int g_aiSamplingRates[NUM_SAMPLINGRATES] = {50, 100, 250, 500, 1000, 2500, 5000};
static OpcUa_Timer g_hSamplingTimers[NUM_SAMPLINGRATES];
IFMETHODIMP(CustomProvider_TimerCallback)(OpcUa_Void *a_pvCallbackData,
OpcUa_Timer a_hTimer,
OpcUa_UInt32 a_msecElapsed);
OpcUa_StatusCode CustomProvider_Subscription_Initialize()
{
OpcUa_StatusCode ret = OpcUa_Good;
OpcUa_UInt32 i;
for (i = 0; i < NUM_SAMPLINGRATES; i++)
{
ret = OpcUa_Timer_Create(&g_hSamplingTimers[i],
g_aiSamplingRates[i],
CustomProvider_TimerCallback,
OpcUa_Null,
&g_vecSamplingLists[i]);
if (OpcUa_IsNotGood(ret))
{
break;
}
}
return ret;
}
OpcUa_StatusCode CustomProvider_Subscription_Cleanup()
{
OpcUa_UInt32 i;
for (i = 0; i < NUM_SAMPLINGRATES; i++)
{
OpcUa_Timer_Delete(&g_hSamplingTimers[i]);
}
return OpcUa_Good;
}
{
OpcUa_UInt32 i = 0;
OpcUa_UInt32 iDist = 0;
OpcUa_UInt32 iTmp = 0;
OpcUa_UInt32 iRevised = 0;
OpcUa_BaseNode *pNode = OpcUa_Null;
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_AddItem");
OpcUa_ReturnErrorIfArgumentNull(a_pItem);
iDist =
UaServer_P_Abs(a_pItem->iSamplingInterval - g_aiSamplingRates[0]);
for (i = 1; i < NUM_SAMPLINGRATES; i++)
{
iTmp =
UaServer_P_Abs(a_pItem->iSamplingInterval - g_aiSamplingRates[i]);
if (iTmp < iDist)
{
iDist = iTmp;
iRevised = i;
}
}
a_pItem->uProviderHandle = iRevised;
a_pItem->iSamplingInterval = g_aiSamplingRates[iRevised];
if (pNode)
{
if (a_pItem->ItemType == DATA)
{
if (OpcUa_BaseNode_GetClass(pNode) == OpcUa_NodeClass_Variable &&
pMonitoredItemData->
AttributeId == OpcUa_Attributes_Value)
{
OpcUa_DataVariable* pVariable = (OpcUa_DataVariable*)pNode;
{
}
if (OpcUa_IsGood(uStatus) &&
{
if (pMonitoredItemData->
DataChangeFilter.DeadbandType == OpcUa_DeadbandType_Percent)
{
uStatus = OpcUa_BadMonitoredItemFilterUnsupported;
}
else
{
{
case OpcUaType_SByte:
case OpcUaType_Byte:
case OpcUaType_Int16:
case OpcUaType_UInt16:
case OpcUaType_Int32:
case OpcUaType_UInt32:
case OpcUaType_Int64:
case OpcUaType_UInt64:
case OpcUaType_Float:
case OpcUaType_Double:
break;
default:
uStatus = OpcUa_BadFilterNotAllowed;
break;
}
}
}
if (OpcUa_IsGood(uStatus))
{
}
}
else
{
OpcUa_Variant currentValue;
OpcUa_Variant_Initialize(¤tValue);
if (OpcUa_IsGood(uStatus) &&
{
uStatus = OpcUa_BadFilterNotAllowed;
}
{
uStatus = OpcUa_BadIndexRangeNoData;
}
if (OpcUa_IsGood(uStatus))
{
pNode,
¤tValue,
}
if (OpcUa_IsGood(uStatus))
{
}
OpcUa_Variant_Clear(¤tValue);
}
}
}
else
{
uStatus = OpcUa_BadNodeIdUnknown;
}
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
{
OpcUa_UInt32 size;
OpcUa_UInt32 i;
OpcUa_Boolean bFound = OpcUa_False;
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_RemoveItem");
OpcUa_ReturnErrorIfArgumentNull(a_pItem);
if (a_pItem->ItemType == DATA)
{
for (i = 0; i < size; i++)
{
{
bFound = OpcUa_True;
break;
}
}
if (bFound != OpcUa_False)
{
for (; i < size - 1; i++)
{
}
}
else
{
uStatus = OpcUa_BadNotFound;
}
}
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_Subscribe");
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
OpcUa_Void CustomProvider_SampleData(OpcUa_Void* a_pvCallbackData)
{
unsigned int i = 0;
OpcUa_Variable *pVariable = OpcUa_Null;
unsigned int size;
for (i = 0; i < size; i++)
{
if (pMonitoredItemData->
MonitoringMode == OpcUa_MonitoringMode_Disabled)
{
continue;
}
(OpcUa_BaseNode**)&pVariable);
if (pVariable)
{
OpcUa_DataValue *pValue = (OpcUa_DataValue*)OpcUa_Alloc(sizeof(OpcUa_DataValue));
OpcUa_DataValue_Initialize(pValue);
if (pMonitoredItemData->
AttributeId == OpcUa_Attributes_Value)
{
}
else
{
(OpcUa_BaseNode*)pVariable,
&pValue->Value,
}
pValue->ServerTimestamp = OpcUa_DateTime_UtcNow();
if (pMonitoredItemData->
AttributeId == OpcUa_Attributes_Value)
{
pValue->SourceTimestamp = pValue->ServerTimestamp;
}
}
}
}
IFMETHODIMP(CustomProvider_TimerCallback)(OpcUa_Void *a_pvCallbackData,
OpcUa_Timer a_hTimer,
OpcUa_UInt32 a_msecElapsed)
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_TimerCallback");
OpcUa_ReferenceParameter(a_hTimer);
OpcUa_ReferenceParameter(a_msecElapsed);
CustomProvider_SampleData(a_pvCallbackData);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
OPCUA_END_EXTERN_C