#include "samplesubscription.h"
#include <stdlib.h>
#include <opcua_datetime.h>
#include <opcua_memory.h>
#include <opcua_trace.h>
OpcUa_Void *a_pUserData)
{
SampleSubscription *pSampleSubscription = a_pUaSubscription->
pUserData;
OpcUa_ReferenceParameter(a_pResponseHeader);
OpcUa_ReferenceParameter(a_pUserData);
if (OpcUa_IsGood(a_status))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_Created_CB succeeded (0x%08x)\n", a_status);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
" Revised LifetimeCount: %u\n", a_pUaSubscription->
RevisedLifetimeCount);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
" Revised MaxKeepAliveCount: %u\n", a_pUaSubscription->
RevisedMaxKeepAliveCount);
if (pSampleSubscription->State == State_SampleSubscription_SubscriptionCreate)
pSampleSubscription->State = State_SampleSubscription_SubscriptionCreateDone;
else
pSampleSubscription->State = State_SampleSubscription_Error;
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_Created_CB failed (0x%08x)\n", a_status);
pSampleSubscription->State = State_SampleSubscription_Error;
}
}
OpcUa_Void *a_pUserData)
{
SampleSubscription *pSampleSubscription = a_pUaSubscription->
pUserData;
OpcUa_ReferenceParameter(a_pResponseHeader);
OpcUa_ReferenceParameter(a_pUserData);
if (OpcUa_IsGood(a_status))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_Deleted_CB succeeded (0x%08x)\n", a_status);
if (pSampleSubscription->State == State_SampleSubscription_SubscriptionDelete)
pSampleSubscription->State = State_SampleSubscription_SubscriptionDeleteDone;
else
pSampleSubscription->State = State_SampleSubscription_Error;
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_Deleted_CB failed (0x%08x)\n", a_status);
pSampleSubscription->State = State_SampleSubscription_Error;
}
}
{
OpcUa_ReferenceParameter(a_pSubscription);
OpcUa_ReferenceParameter(a_status);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_StatusChanged_CB (0x%08x)\n", a_status);
}
OpcUa_Int32 a_noOfMonitoredItems,
OpcUa_MonitoredItemNotification *a_pMonitoredItems,
OpcUa_Int32 a_noOfDiagnosticInfos,
{
SampleSubscription *pSampleSubscription = a_pSubscription->
pUserData;
OpcUa_Int32 i;
OpcUa_ReferenceParameter(a_noOfDiagnosticInfos);
OpcUa_ReferenceParameter(a_pDiagnosticInfos);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_DataChange_CB\n");
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " noOfMonitoredItems: %i\n", a_noOfMonitoredItems);
for (i = 0; i < a_noOfMonitoredItems; i++)
{
OpcUa_CharA szDateTime[64] = {0};
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [%i]:\n", i);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " ClientHandle: %u\n", a_pMonitoredItems[i].ClientHandle);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " StatusCode: 0x%08x\n", a_pMonitoredItems[i].Value.StatusCode);
if (OpcUa_IsGood(a_pMonitoredItems[i].Value.StatusCode))
{
OpcUa_DateTime_GetStringFromDateTime(a_pMonitoredItems[i].Value.SourceTimestamp, szDateTime, sizeof(szDateTime));
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " SourceTimestamp: %s\n", szDateTime);
OpcUa_DateTime_GetStringFromDateTime(a_pMonitoredItems[i].Value.ServerTimestamp, szDateTime, sizeof(szDateTime));
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " ServerTimestamp: %s\n", szDateTime);
if (a_pMonitoredItems[i].ClientHandle == 0 &&
a_pMonitoredItems[i].Value.Value.Datatype == OpcUaType_DateTime &&
a_pMonitoredItems[i].Value.Value.ArrayType == OpcUa_VariantArrayType_Scalar)
{
OpcUa_DateTime_GetStringFromDateTime(a_pMonitoredItems[i].Value.Value.Value.DateTime, szDateTime, sizeof(szDateTime));
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " Value: %s\n", szDateTime);
}
else if (a_pMonitoredItems[i].ClientHandle == 1 &&
a_pMonitoredItems[i].Value.Value.Datatype == OpcUaType_Int32 &&
a_pMonitoredItems[i].Value.Value.ArrayType == OpcUa_VariantArrayType_Scalar)
{
const char *szState = "Invalid state value";
switch (a_pMonitoredItems[i].Value.Value.Value.Int32)
{
default: break;
}
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " Value: %s\n", szState);
}
pSampleSubscription->uDataCount++;
}
}
}
static OpcUa_Void SampleSubscription_MonitoredItems_Created_CB(
const UaClient_Subscription *a_pSubscription,
OpcUa_Int32 a_NoOfResults,
OpcUa_Int32 a_NoOfDiagnosticInfos,
OpcUa_Void *a_pUserData)
{
SampleSubscription *pSampleSubscription = a_pSubscription->
pUserData;
OpcUa_ReferenceParameter(a_pUserData);
OpcUa_ReferenceParameter(a_NoOfDiagnosticInfos);
OpcUa_ReferenceParameter(a_pDiagnosticInfos);
if (OpcUa_IsGood(a_pResponseHeader->
ServiceResult) && a_NoOfResults == 2)
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_MonitoredItems_Created_CB succeeded\n");
if (OpcUa_IsGood(a_pResults[0].StatusCode))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [0]: ClientHandle: 0\n");
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " MonitoredItemId: %u\n", a_pResults[0].MonitoredItemId);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " RevisedSamplingInterval: %f\n", a_pResults[0].RevisedSamplingInterval);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " RevisedQueueSize: %u\n", a_pResults[0].RevisedQueueSize);
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [0]: failed with status 0x%08x\n", a_pResults[0].StatusCode);
}
if (OpcUa_IsGood(a_pResults[1].StatusCode))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [1]: ClientHandle: 1\n");
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " MonitoredItemId: %u\n", a_pResults[1].MonitoredItemId);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " RevisedSamplingInterval: %f\n", a_pResults[1].RevisedSamplingInterval);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " RevisedQueueSize: %u\n", a_pResults[1].RevisedQueueSize);
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [1]: failed with status 0x%08x\n", a_pResults[1].StatusCode);
}
if (pSampleSubscription->State == State_SampleSubscription_MonitoredItemCreate)
pSampleSubscription->State = State_SampleSubscription_MonitoredItemCreateDone;
else
pSampleSubscription->State = State_SampleSubscription_Error;
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
"SampleSubscription_MonitoredItems_Created_CB failed (0x%08x)\n", a_pResponseHeader->
ServiceResult);
pSampleSubscription->State = State_SampleSubscription_Error;
}
}
static OpcUa_Void SampleSubscription_MonitoredItems_Deleted_CB(
const UaClient_Subscription *a_pSubscription,
OpcUa_Int32 a_NoOfResults,
OpcUa_Int32 a_NoOfDiagnosticInfos,
OpcUa_Void *a_pUserData)
{
SampleSubscription *pSampleSubscription = a_pSubscription->
pUserData;
OpcUa_ReferenceParameter(a_pUserData);
OpcUa_ReferenceParameter(a_NoOfDiagnosticInfos);
OpcUa_ReferenceParameter(a_pDiagnosticInfos);
if (OpcUa_IsGood(a_pResponseHeader->
ServiceResult) && a_NoOfResults == 2)
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_MonitoredItems_Deleted_CB succeeded\n");
if (OpcUa_IsGood(a_pResults[0]))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [0]: succeeded\n");
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [0]: failed with status 0x%08x\n", a_pResults[0]);
}
if (OpcUa_IsGood(a_pResults[1]))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [1]: succeeded\n");
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " [1]: failed with status 0x%08x\n", a_pResults[1]);
}
if (pSampleSubscription->State == State_SampleSubscription_MonitoredItemDelete)
pSampleSubscription->State = State_SampleSubscription_MonitoredItemDeleteDone;
else
pSampleSubscription->State = State_SampleSubscription_Error;
}
else
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
"SampleSubscription_MonitoredItems_Deleted_CB failed (0x%08x)\n", a_pResponseHeader->
ServiceResult);
pSampleSubscription->State = State_SampleSubscription_Error;
}
}
{
SampleSubscription *pSampleSubscription = OpcUa_Null;
pSampleSubscription = OpcUa_Alloc(sizeof(*pSampleSubscription));
if (pSampleSubscription == OpcUa_Null)
{
return OpcUa_Null;
}
OpcUa_MemSet(&subscriptionCallback, 0, sizeof(subscriptionCallback));
subscriptionCallback.pfStatusChanged_CB = SampleSubscription_StatusChanged_CB;
subscriptionCallback.pfDataChange_CB = SampleSubscription_DataChange_CB;
if (OpcUa_IsBad(uStatus))
{
OpcUa_Free(pSampleSubscription);
return OpcUa_Null;
}
pSampleSubscription->pSubscription = pSubscription;
pSampleSubscription->uDataCount = 0;
pSampleSubscription->uMonitoredItemId0 = 0;
pSampleSubscription->uMonitoredItemId1 = 0;
pSampleSubscription->State = State_SampleSubscription_Idle;
pSubscription->
pUserData = pSampleSubscription;
return pSampleSubscription;
}
OpcUa_Void SampleSubscription_Delete(SampleSubscription **a_ppSampleSubscription)
{
SampleSubscription *pSampleSubscription = *a_ppSampleSubscription;
if (pSampleSubscription == OpcUa_Null)
return;
OpcUa_Free(pSampleSubscription);
*a_ppSampleSubscription = OpcUa_Null;
}
OpcUa_StatusCode SampleSubscription_CreateSubscription(SampleSubscription *a_pSampleSubscription)
{
a_pSampleSubscription->State = State_SampleSubscription_SubscriptionCreate;
OpcUa_Null,
SampleSubscription_Created_CB,
OpcUa_Null);
}
OpcUa_StatusCode SampleSubscription_DeleteSubscription(SampleSubscription *a_pSampleSubscription)
{
a_pSampleSubscription->State = State_SampleSubscription_SubscriptionDelete;
OpcUa_Null,
SampleSubscription_Deleted_CB,
OpcUa_Null);
}
OpcUa_StatusCode SampleSubscription_CreateMonitoredItem(SampleSubscription *a_pSampleSubscription)
{
OpcUa_Int32 i;
OpcUa_Int32 numItemsToCreate = 2;
a_pSampleSubscription->State = State_SampleSubscription_MonitoredItemCreate;
for (i = 0; i < numItemsToCreate; i++)
{
OpcUa_MonitoredItemCreateRequest_Initialize(&createRequest[i]);
}
createRequest[0].
ItemToMonitor.
NodeId.Identifier.Numeric = OpcUaId_Server_ServerStatus_CurrentTime;
OpcUa_Null,
numItemsToCreate,
createRequest,
SampleSubscription_MonitoredItems_Created_CB,
OpcUa_Null);
}
OpcUa_StatusCode SampleSubscription_DeleteMonitoredItem(SampleSubscription *a_pSampleSubscription)
{
OpcUa_Int32 numItemsToDelete = 2;
OpcUa_UInt32 MonitoredItemIds[2];
a_pSampleSubscription->State = State_SampleSubscription_MonitoredItemDelete;
MonitoredItemIds[0] = a_pSampleSubscription->uMonitoredItemId0;
MonitoredItemIds[1] = a_pSampleSubscription->uMonitoredItemId1;
OpcUa_Null,
numItemsToDelete,
MonitoredItemIds,
SampleSubscription_MonitoredItems_Deleted_CB,
OpcUa_Null);
}