#include "samplesubscription.h"
#include <stdlib.h>
#include <opcua_datetime.h>
#include <opcua_memory.h>
#include <opcua_trace.h>
#include <opcua_errorhandling.h>
#include <opcua_string.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_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, " 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);
OpcUa_DateTime_GetStringFromDateTime(a_pMonitoredItems[i].Value.Value.Value.DateTime, szDateTime, sizeof(szDateTime));
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " Value: %s\n", szDateTime);
pSampleSubscription->uDataCount++;
}
}
}
OpcUa_Int32 a_noOfEvents,
OpcUa_EventFieldList *a_pEvents)
{
SampleSubscription *pSampleSubscription = a_pSubscription->
pUserData;
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "\n--> SampleSubscription_NewEvent_CB\n\n");
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, " noOfEvents: %i\n", a_noOfEvents);
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
"Message = %s\n", OpcUa_String_GetRawString(&message.
Value.LocalizedText->Text));
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
"SourceName = %s\n", OpcUa_String_GetRawString(&sourceName.
Value.String));
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING,
"Severity = %u\n", severity.
Value.UInt16);
if (pSampleSubscription->State == State_SampleSubscription_WaitForNewEvent)
pSampleSubscription->State = State_SampleSubscription_NewEventReceived;
else
pSampleSubscription->State = State_SampleSubscription_Error;
}
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 (a_NoOfResults == 1 && OpcUa_IsGood(a_pResponseHeader->
ServiceResult) && OpcUa_IsGood(a_pResults[0].StatusCode))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_MonitoredItems_Created_CB succeeded (0x%08x)\n", a_pResults[0].StatusCode);
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);
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 (a_NoOfResults == 1 && OpcUa_IsGood(a_pResponseHeader->
ServiceResult) && OpcUa_IsGood(a_pResults[0]))
{
OpcUa_Trace(OPCUA_TRACE_LEVEL_WARNING, "SampleSubscription_MonitoredItems_Deleted_CB succeeded (0x%08x)\n", a_pResults[0]);
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;
subscriptionCallback.pfNewEvents_CB = SampleSubscription_NewEvent_CB;
if (OpcUa_IsBad(uStatus))
{
OpcUa_Free(pSampleSubscription);
return OpcUa_Null;
}
pSampleSubscription->pSubscription = pSubscription;
pSampleSubscription->uDataCount = 0;
pSampleSubscription->uMonitoredItemId = 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 = 1;
OpcUa_LiteralOperand *pRawOperand = OpcUa_Null;
OpcUa_Int32 noOfSelectClauses = 3;
OpcUa_InitializeStatus(OpcUa_Module_Client, "SampleSubscription_CreateMonitoredItem");
a_pSampleSubscription->State = State_SampleSubscription_MonitoredItemCreate;
OpcUa_MonitoredItemCreateRequest_Initialize(&itemsToCreate);
(OpcUa_Void**)&pEventFilter);
OpcUa_GotoErrorIfBad(uStatus);
pEventFilter->NoOfSelectClauses = noOfSelectClauses;
for (i = 0; i < noOfSelectClauses; i++)
{
OpcUa_SimpleAttributeOperand_Initialize(&pEventFilter->
SelectClauses[i]);
}
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_GotoErrorIfBad(uStatus);
(OpcUa_Void**)&pRawOperand);
OpcUa_GotoErrorIfBad(uStatus);
pRawOperand->Value.Datatype = OpcUaType_NodeId;
OpcUa_GotoErrorIfAllocFailed(pRawOperand->Value.Value.NodeId);
OpcUa_NodeId_Initialize(pRawOperand->Value.Value.NodeId);
pRawOperand->Value.Value.NodeId->NamespaceIndex = 4;
pRawOperand->Value.Value.NodeId->Identifier.Numeric = 2;
OpcUa_Null,
numItemsToCreate,
&itemsToCreate,
SampleSubscription_MonitoredItems_Created_CB,
OpcUa_Null);
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_MonitoredItemCreateRequest_Clear(&itemsToCreate);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_MonitoredItemCreateRequest_Clear(&itemsToCreate);
OpcUa_FinishErrorHandling;
}
OpcUa_StatusCode SampleSubscription_DeleteMonitoredItem(SampleSubscription *a_pSampleSubscription)
{
OpcUa_Int32 numItemsToDelete = 1;
OpcUa_UInt32 MonitoredItemIds[1];
a_pSampleSubscription->State = State_SampleSubscription_MonitoredItemDelete;
MonitoredItemIds[0] = a_pSampleSubscription->uMonitoredItemId;
OpcUa_Null,
numItemsToDelete,
MonitoredItemIds,
SampleSubscription_MonitoredItems_Deleted_CB,
OpcUa_Null);
}