Пример #1
0
//
//
// 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);
            // }
        }
Пример #2
0
        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);
                        }
                    }
                    //}
                }
            }
        }