// // // COV subscriptions // public void addCovSubscription(Address from, OctetString linkService, UnsignedInteger subscriberProcessIdentifier, BBoolean issueConfirmedNotifications, UnsignedInteger lifetime) { //synchronized (covSubscriptions) { ObjectCovSubscription sub = findCovSubscription(from, subscriberProcessIdentifier); bool confirmed = issueConfirmedNotifications.Value; if (sub == null) { // Ensure that this object is valid for COV notifications. if (!ObjectCovSubscription.SendCovNotification(Id.ObjectType, null, this.getCovIncrement())) { throw new BACnetServiceException(ErrorClass.Services, ErrorCode.CovSubscriptionFailed, "Object is invalid for COV notifications"); } if (confirmed) { // If the peer wants confirmed notifications, it must be in the remote device list. RemoteDevice d = localDevice.getRemoteDevice(from); if (d == null) { throw new BACnetServiceException(ErrorClass.Services, ErrorCode.CovSubscriptionFailed, "From address not found in remote device list. Cannot send confirmed notifications"); } } sub = new ObjectCovSubscription(from, linkService, subscriberProcessIdentifier, this.getCovIncrement()); covSubscriptions.Add(sub); } sub.SetIssueConfirmedNotifications(issueConfirmedNotifications.Value); sub.SetExpiryTime((int)lifetime.Value); // } }
private void setPropertyImpl(PropertyIdentifier pid, Encodable value) { Encodable oldValue = (Encodable)properties[pid]; properties[pid] = value; if (!value.Equals(oldValue)) { // Check for subscriptions. if (ObjectCovSubscription.SendCovNotification(Id.ObjectType, pid, this.getCovIncrement())) { //synchronized(covSubscriptions) { long now = System.DateTime.Now.Ticks; ObjectCovSubscription sub; for (int i = covSubscriptions.Count - 1; i >= 0; i--) { sub = (ObjectCovSubscription)covSubscriptions[i]; if (sub.HasExpired(now)) { covSubscriptions.RemoveAt(i); } else if (sub.IsNotificationRequired(pid, value)) { sendCovNotification(sub, now); } } //} } } }