#include <uaserver_config.h>
#include <opcua_statuscodes.h>
#include <uabase_p_atomic.h>
#include <uaserver_write.h>
#include <uaserver_basenode.h>
#include <uaserver_utilities.h>
#include "custom_provider_helper.h"
OPCUA_BEGIN_EXTERN_C
IFMETHODIMP(CustomProvider_WriteAsync)(UaServer_ProviderWriteContext* a_pWriteCtx)
{
OpcUa_Int32 i;
OpcUa_BaseNode *pNode;
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_WriteAsync");
OpcUa_ReturnErrorIfArgumentNull(a_pWriteCtx);
pReq = a_pWriteCtx->pRequest;
pRes = a_pWriteCtx->pResponse;
for (i = 0; i < pReq->NoOfNodesToWrite; i++)
{
{
if (pNode)
{
UserDataCommon *pUserData = OpcUa_Null;
if ( (a_pWriteCtx->pRequest->NodesToWrite[i].AttributeId == OpcUa_Attributes_Value &&
OpcUa_BaseNode_GetType(pNode) == eVariable &&
{
pRes->
Results[i] = OpcUa_BadNotWritable;
continue;
}
if (pUserData != OpcUa_Null &&
a_pWriteCtx->pRequest->NodesToWrite[i].AttributeId == OpcUa_Attributes_Value)
{
switch (pUserData->Type)
{
case UserDataTemperature:
{
if (pValue->
ArrayType == OpcUa_VariantArrayType_Scalar &&
{
TemperatureSensor *pSensor = (TemperatureSensor*)pUserData;
*pSensor->pValue = pValue->
Value.Double;
}
else
{
pRes->
Results[i] = OpcUa_BadTypeMismatch;
}
break;
}
case UserDataMachineSwitch:
{
if (pValue->
ArrayType == OpcUa_VariantArrayType_Scalar &&
{
MachineSwitch *pSwitch = (MachineSwitch*)pUserData;
*pSwitch->pValue = pValue->
Value.Boolean;
}
else
{
pRes->
Results[i] = OpcUa_BadTypeMismatch;
}
break;
}
default:
{
pRes->
Results[i] = OpcUa_BadNotWritable;
break;
}
}
}
else
{
}
}
else
{
pRes->
Results[i] = OpcUa_BadNodeIdUnknown;
}
}
}
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
OPCUA_END_EXTERN_C