blob: a752eff0471b424dd7719e45843426fb35f90d42 [file] [log] [blame]
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
* Copyright (c) 2019 Kalycito Infotech Private Limited
*/
#ifndef UA_PUBSUB_H_
#define UA_PUBSUB_H_
#include <open62541/plugin/pubsub.h>
#include <open62541/server.h>
#include <open62541/server_pubsub.h>
#include "open62541_queue.h"
#include "ua_pubsub_networkmessage.h"
_UA_BEGIN_DECLS
#ifdef UA_ENABLE_PUBSUB /* conditional compilation */
/* forward declarations */
struct UA_WriterGroup;
typedef struct UA_WriterGroup UA_WriterGroup;
/* Declaration for ReaderGroup */
struct UA_ReaderGroup;
typedef struct UA_ReaderGroup UA_ReaderGroup;
/* The configuration structs (public part of PubSub entities) are defined in include/ua_plugin_pubsub.h */
/**********************************************/
/* PublishedDataSet */
/**********************************************/
typedef struct{
UA_PublishedDataSetConfig config;
UA_DataSetMetaDataType dataSetMetaData;
LIST_HEAD(UA_ListOfDataSetField, UA_DataSetField) fields;
UA_NodeId identifier;
UA_UInt16 fieldSize;
UA_UInt16 promotedFieldsCount;
} UA_PublishedDataSet;
UA_StatusCode
UA_PublishedDataSetConfig_copy(const UA_PublishedDataSetConfig *src, UA_PublishedDataSetConfig *dst);
UA_PublishedDataSet *
UA_PublishedDataSet_findPDSbyId(UA_Server *server, UA_NodeId identifier);
void
UA_PublishedDataSet_deleteMembers(UA_Server *server, UA_PublishedDataSet *publishedDataSet);
/**********************************************/
/* Connection */
/**********************************************/
//the connection config (public part of connection) object is defined in include/ua_plugin_pubsub.h
typedef struct{
UA_PubSubConnectionConfig *config;
//internal fields
UA_PubSubChannel *channel;
UA_NodeId identifier;
LIST_HEAD(UA_ListOfWriterGroup, UA_WriterGroup) writerGroups;
LIST_HEAD(UA_ListOfPubSubReaderGroup, UA_ReaderGroup) readerGroups;
size_t readerGroupsSize;
} UA_PubSubConnection;
UA_StatusCode
UA_PubSubConnectionConfig_copy(const UA_PubSubConnectionConfig *src, UA_PubSubConnectionConfig *dst);
UA_PubSubConnection *
UA_PubSubConnection_findConnectionbyId(UA_Server *server, UA_NodeId connectionIdentifier);
void
UA_PubSubConnectionConfig_deleteMembers(UA_PubSubConnectionConfig *connectionConfig);
void
UA_PubSubConnection_deleteMembers(UA_Server *server, UA_PubSubConnection *connection);
/* Register channel for given connectionIdentifier */
UA_StatusCode
UA_PubSubConnection_regist(UA_Server *server, UA_NodeId *connectionIdentifier);
/**********************************************/
/* DataSetWriter */
/**********************************************/
#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
typedef struct UA_DataSetWriterSample{
UA_Boolean valueChanged;
UA_DataValue value;
} UA_DataSetWriterSample;
#endif
typedef struct UA_DataSetWriter{
UA_DataSetWriterConfig config;
//internal fields
LIST_ENTRY(UA_DataSetWriter) listEntry;
UA_NodeId identifier;
UA_NodeId linkedWriterGroup;
UA_NodeId connectedDataSet;
UA_ConfigurationVersionDataType connectedDataSetVersion;
#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
UA_UInt16 deltaFrameCounter; //actual count of sent deltaFrames
size_t lastSamplesCount;
UA_DataSetWriterSample *lastSamples;
#endif
UA_UInt16 actualDataSetMessageSequenceCount;
} UA_DataSetWriter;
UA_StatusCode
UA_DataSetWriterConfig_copy(const UA_DataSetWriterConfig *src, UA_DataSetWriterConfig *dst);
UA_DataSetWriter *
UA_DataSetWriter_findDSWbyId(UA_Server *server, UA_NodeId identifier);
/**********************************************/
/* WriterGroup */
/**********************************************/
struct UA_WriterGroup{
UA_WriterGroupConfig config;
//internal fields
LIST_ENTRY(UA_WriterGroup) listEntry;
UA_NodeId identifier;
UA_NodeId linkedConnection;
LIST_HEAD(UA_ListOfDataSetWriter, UA_DataSetWriter) writers;
UA_UInt32 writersCount;
UA_UInt64 publishCallbackId;
UA_Boolean publishCallbackIsRegistered;
};
UA_StatusCode
UA_WriterGroupConfig_copy(const UA_WriterGroupConfig *src, UA_WriterGroupConfig *dst);
UA_WriterGroup *
UA_WriterGroup_findWGbyId(UA_Server *server, UA_NodeId identifier);
/**********************************************/
/* DataSetField */
/**********************************************/
typedef struct UA_DataSetField{
UA_DataSetFieldConfig config;
//internal fields
LIST_ENTRY(UA_DataSetField) listEntry;
UA_NodeId identifier;
UA_NodeId publishedDataSet; //ref to parent pds
UA_FieldMetaData fieldMetaData;
UA_UInt64 sampleCallbackId;
UA_Boolean sampleCallbackIsRegistered;
} UA_DataSetField;
UA_StatusCode
UA_DataSetFieldConfig_copy(const UA_DataSetFieldConfig *src, UA_DataSetFieldConfig *dst);
UA_DataSetField *
UA_DataSetField_findDSFbyId(UA_Server *server, UA_NodeId identifier);
/**********************************************/
/* DataSetReader */
/**********************************************/
/* SubscribedDataSetDataType Definition */
typedef enum {
UA_PUBSUB_SDS_TARGET,
UA_PUBSUB_SDS_MIRROR
}UA_SubscribedDataSetEnumType;
/* DataSetReader Type definition */
typedef struct UA_DataSetReader {
UA_DataSetReaderConfig config;
/* implementation defined fields */
UA_NodeId identifier;
UA_NodeId linkedReaderGroup;
LIST_ENTRY(UA_DataSetReader) listEntry;
UA_SubscribedDataSetEnumType subscribedDataSetType;
UA_TargetVariablesDataType subscribedDataSetTarget;
/* To Do UA_SubscribedDataSetMirrorDataType subscribedDataSetMirror */
}UA_DataSetReader;
/* Delete DataSetReader */
void UA_DataSetReader_delete(UA_Server *server, UA_DataSetReader *dataSetReader);
/* Process Network Message using DataSetReader */
void UA_Server_DataSetReader_process(UA_Server *server, UA_DataSetReader *dataSetReader, UA_DataSetMessage* dataSetMsg);
/* Copy the configuration of DataSetReader */
UA_StatusCode UA_DataSetReaderConfig_copy(const UA_DataSetReaderConfig *src, UA_DataSetReaderConfig *dst);
/* Add TargetVariables */
UA_StatusCode
UA_Server_DataSetReader_addTargetVariables(UA_Server* server, UA_NodeId* parentNode, UA_NodeId dataSetReaderIdentifier, UA_SubscribedDataSetEnumType sdsType);
/**********************************************/
/* ReaderGroup */
/**********************************************/
/* ReaderGroup Type Definition*/
struct UA_ReaderGroup {
UA_ReaderGroupConfig config;
UA_NodeId identifier;
UA_NodeId linkedConnection;
LIST_ENTRY(UA_ReaderGroup) listEntry;
LIST_HEAD(UA_ListOfPubSubDataSetReader, UA_DataSetReader) readers;
/* for simplified information access */
UA_UInt32 readersCount;
UA_UInt64 subscribeCallbackId;
UA_Boolean subscribeCallbackIsRegistered;
};
/* Delete ReaderGroup */
void UA_Server_ReaderGroup_delete(UA_Server *server, UA_ReaderGroup *readerGroup);
/* Copy configuration of ReaderGroup */
UA_StatusCode
UA_ReaderGroupConfig_copy(const UA_ReaderGroupConfig *src, UA_ReaderGroupConfig *dst);
/* Process Network Message */
UA_StatusCode
UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage* pMsg, UA_PubSubConnection *pConnection);
/* Prototypes for internal util functions - some functions maybe removed later
*(currently moved from public to internal)*/
UA_ReaderGroup *UA_ReaderGroup_findRGbyId(UA_Server *server, UA_NodeId identifier);
UA_DataSetReader *UA_ReaderGroup_findDSRbyId(UA_Server *server, UA_NodeId identifier);
/*********************************************************/
/* PublishValues handling */
/*********************************************************/
UA_StatusCode
UA_WriterGroup_addPublishCallback(UA_Server *server, UA_WriterGroup *writerGroup);
void
UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup);
/*********************************************************/
/* SubscribeValues handling */
/*********************************************************/
UA_StatusCode
UA_ReaderGroup_addSubscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup);
void
UA_ReaderGroup_subscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup);
#endif /* UA_ENABLE_PUBSUB */
_UA_END_DECLS
#endif /* UA_PUBSUB_H_ */