ua_subscription.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef UA_SUBSCRIPTION_H_
  2. #define UA_SUBSCRIPTION_H_
  3. #include "ua_util.h"
  4. #include "ua_types.h"
  5. #include "ua_types_generated.h"
  6. #include "ua_nodes.h"
  7. #include "ua_session.h"
  8. /*****************/
  9. /* MonitoredItem */
  10. /*****************/
  11. typedef enum {
  12. UA_MONITOREDITEMTYPE_CHANGENOTIFY = 1,
  13. UA_MONITOREDITEMTYPE_STATUSNOTIFY = 2,
  14. UA_MONITOREDITEMTYPE_EVENTNOTIFY = 4
  15. } UA_MonitoredItemType;
  16. typedef struct MonitoredItem_queuedValue {
  17. TAILQ_ENTRY(MonitoredItem_queuedValue) listEntry;
  18. UA_UInt32 clientHandle;
  19. UA_DataValue value;
  20. } MonitoredItem_queuedValue;
  21. typedef struct UA_MonitoredItem {
  22. LIST_ENTRY(UA_MonitoredItem) listEntry;
  23. /* Settings */
  24. UA_Subscription *subscription;
  25. UA_UInt32 itemId;
  26. UA_MonitoredItemType monitoredItemType;
  27. UA_TimestampsToReturn timestampsToReturn;
  28. UA_MonitoringMode monitoringMode;
  29. UA_NodeId monitoredNodeId;
  30. UA_UInt32 attributeID;
  31. UA_UInt32 clientHandle;
  32. UA_Double samplingInterval; // [ms]
  33. UA_UInt32 currentQueueSize;
  34. UA_UInt32 maxQueueSize;
  35. UA_Boolean discardOldest;
  36. UA_String indexRange;
  37. // TODO: dataEncoding is hardcoded to UA binary
  38. /* Sample Job */
  39. UA_Guid sampleJobGuid;
  40. UA_Boolean sampleJobIsRegistered;
  41. /* Sample Queue */
  42. UA_ByteString lastSampledValue;
  43. TAILQ_HEAD(QueueOfQueueDataValues, MonitoredItem_queuedValue) queue;
  44. } UA_MonitoredItem;
  45. UA_MonitoredItem *UA_MonitoredItem_new(void);
  46. void MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem);
  47. UA_StatusCode MonitoredItem_registerSampleJob(UA_Server *server, UA_MonitoredItem *mon);
  48. UA_StatusCode MonitoredItem_unregisterSampleJob(UA_Server *server, UA_MonitoredItem *mon);
  49. /****************/
  50. /* Subscription */
  51. /****************/
  52. typedef struct UA_NotificationMessageEntry {
  53. LIST_ENTRY(UA_NotificationMessageEntry) listEntry;
  54. UA_NotificationMessage message;
  55. } UA_NotificationMessageEntry;
  56. /* We use only a subset of the states defined in the standard */
  57. typedef enum {
  58. /* UA_SUBSCRIPTIONSTATE_CLOSED */
  59. /* UA_SUBSCRIPTIONSTATE_CREATING */
  60. UA_SUBSCRIPTIONSTATE_NORMAL,
  61. UA_SUBSCRIPTIONSTATE_LATE,
  62. UA_SUBSCRIPTIONSTATE_KEEPALIVE
  63. } UA_SubscriptionState;
  64. struct UA_Subscription {
  65. LIST_ENTRY(UA_Subscription) listEntry;
  66. /* Settings */
  67. UA_Session *session;
  68. UA_UInt32 lifeTimeCount;
  69. UA_UInt32 maxKeepAliveCount;
  70. UA_Double publishingInterval; // [ms]
  71. UA_UInt32 subscriptionID;
  72. UA_UInt32 notificationsPerPublish;
  73. UA_Boolean publishingEnabled;
  74. UA_UInt32 priority;
  75. UA_UInt32 sequenceNumber;
  76. /* Runtime information */
  77. UA_SubscriptionState state;
  78. UA_UInt32 currentKeepAliveCount;
  79. UA_UInt32 currentLifetimeCount;
  80. /* Publish Job */
  81. UA_Guid publishJobGuid;
  82. UA_Boolean publishJobIsRegistered;
  83. LIST_HEAD(UA_ListOfUAMonitoredItems, UA_MonitoredItem) MonitoredItems;
  84. LIST_HEAD(UA_ListOfNotificationMessages, UA_NotificationMessageEntry) retransmissionQueue;
  85. };
  86. UA_Subscription *UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionID);
  87. void UA_Subscription_deleteMembers(UA_Subscription *subscription, UA_Server *server);
  88. UA_StatusCode Subscription_registerPublishJob(UA_Server *server, UA_Subscription *sub);
  89. UA_StatusCode Subscription_unregisterPublishJob(UA_Server *server, UA_Subscription *sub);
  90. UA_StatusCode
  91. UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub,
  92. UA_UInt32 monitoredItemID);
  93. UA_MonitoredItem *
  94. UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemID);
  95. void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub);
  96. #endif /* UA_SUBSCRIPTION_H_ */