ua_subscription.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. #define LIST_INITENTRY(item,entry) \
  8. (item)->entry.le_next = NULL; \
  9. (item)->entry.le_prev = NULL;
  10. #define INITPOINTER(src) (src) = NULL;
  11. #define ISNOTZERO(value) ((value == 0) ? 0 : 1)
  12. /*****************/
  13. /* MonitoredItem */
  14. /*****************/
  15. typedef struct {
  16. UA_Int32 currentValue;
  17. UA_Int32 minValue;
  18. UA_Int32 maxValue;
  19. } UA_Int32_BoundedValue;
  20. typedef struct {
  21. UA_UInt32 currentValue;
  22. UA_UInt32 minValue;
  23. UA_UInt32 maxValue;
  24. } UA_UInt32_BoundedValue;
  25. typedef enum {
  26. MONITOREDITEM_TYPE_CHANGENOTIFY = 1,
  27. MONITOREDITEM_TYPE_STATUSNOTIFY = 2,
  28. MONITOREDITEM_TYPE_EVENTNOTIFY = 4
  29. } MONITOREDITEM_TYPE;
  30. typedef struct MonitoredItem_queuedValue {
  31. UA_Variant value;
  32. TAILQ_ENTRY(MonitoredItem_queuedValue) listEntry;
  33. } MonitoredItem_queuedValue;
  34. typedef struct UA_MonitoredItem_s {
  35. UA_UInt32 ItemId;
  36. MONITOREDITEM_TYPE MonitoredItemType;
  37. UA_UInt32 TimestampsToReturn;
  38. UA_UInt32 MonitoringMode;
  39. UA_NodeId monitoredNodeId;
  40. UA_UInt32 AttributeID;
  41. UA_UInt32 ClientHandle;
  42. UA_UInt32 SamplingInterval;
  43. UA_UInt32_BoundedValue QueueSize;
  44. UA_Boolean DiscardOldest;
  45. UA_DateTime LastSampled;
  46. UA_ByteString LastSampledValue;
  47. // FIXME: indexRange is ignored; array values default to element 0
  48. // FIXME: dataEncoding is hardcoded to UA binary
  49. LIST_ENTRY(UA_MonitoredItem_s) listEntry;
  50. TAILQ_HEAD(QueueOfQueueDataValues, MonitoredItem_queuedValue) queue;
  51. } UA_MonitoredItem;
  52. UA_MonitoredItem *UA_MonitoredItem_new(void);
  53. void MonitoredItem_delete(UA_MonitoredItem *monitoredItem);
  54. void MonitoredItem_QueuePushDataValue(UA_Server *server, UA_MonitoredItem *monitoredItem);
  55. void MonitoredItem_ClearQueue(UA_MonitoredItem *monitoredItem);
  56. UA_Boolean MonitoredItem_CopyMonitoredValueToVariant(UA_UInt32 AttributeID, const UA_Node *src,
  57. UA_Variant *dst);
  58. int MonitoredItem_QueueToDataChangeNotifications(UA_MonitoredItemNotification *dst,
  59. UA_MonitoredItem *monitoredItem);
  60. /****************/
  61. /* Subscription */
  62. /****************/
  63. typedef struct UA_unpublishedNotification_s {
  64. UA_NotificationMessage *notification;
  65. LIST_ENTRY(UA_unpublishedNotification_s) listEntry;
  66. } UA_unpublishedNotification;
  67. typedef struct UA_Subscription_s {
  68. UA_UInt32_BoundedValue LifeTime;
  69. UA_Int32_BoundedValue KeepAliveCount;
  70. UA_DateTime PublishingInterval;
  71. UA_DateTime LastPublished;
  72. UA_Int32 SubscriptionID;
  73. UA_Int32 NotificationsPerPublish;
  74. UA_Boolean PublishingMode;
  75. UA_UInt32 Priority;
  76. UA_UInt32 SequenceNumber;
  77. LIST_ENTRY(UA_Subscription_s) listEntry;
  78. LIST_HEAD(UA_ListOfUnpublishedNotifications, UA_unpublishedNotification_s) unpublishedNotifications;
  79. LIST_HEAD(UA_ListOfUAMonitoredItems, UA_MonitoredItem_s) MonitoredItems;
  80. } UA_Subscription;
  81. UA_Subscription *UA_Subscription_new(UA_Int32 SubscriptionID);
  82. void Subscription_updateNotifications(UA_Subscription *subscription);
  83. UA_UInt32 Subscription_queuedNotifications(UA_Subscription *subscription);
  84. UA_UInt32 *Subscription_getAvailableSequenceNumbers(UA_Subscription *sub);
  85. void Subscription_copyTopNotificationMessage(UA_NotificationMessage *dst, UA_Subscription *sub);
  86. UA_UInt32 Subscription_deleteUnpublishedNotification(UA_UInt32 seqNo, UA_Subscription *sub);
  87. void Subscription_generateKeepAlive(UA_Subscription *subscription);
  88. #endif //UA_SUBSCRIPTION_H_