Пример #1
0
        /// <summary>
        /// Gets all overall information tags of this controller tree.
        /// </summary>
        /// <returns>An <see cref="IReadOnlyCollection{T}"/> of <see cref="Tag"/> instances.</returns>
        public IReadOnlyCollection <Tag> GetOverallInformationTags()
        {
            var overallInformationTags = new List <Tag>();

            RootController.VisitAllNodes(
                c => c.ChildsCollection,
                c => overallInformationTags.AddRange(c.GetOverallInformationTags()));
            return(overallInformationTags.ToReadOnly());
        }
Пример #2
0
        /// <summary>
        /// Gets all <see cref="IAlarm"/> instances assigned to controller in this tree.
        /// </summary>
        /// <returns>An <see cref="IEnumerable{T}"/> of <see cref="IAlarm"/> implementations.</returns>
        public IEnumerable <IAlarm> GetAllAlarms()
        {
            var alarms = new List <IAlarm>();

            lock (_lockObject)
            {
                RootController.VisitAllNodes(c => c.ChildsCollection, c => alarms.AddRange(c.Alarms));
            }

            return(alarms);
        }
Пример #3
0
        /// <summary>
        /// Updates the alarms in any controller. Compares the alarms of all controllers with
        /// <paramref name="currentPlcAlarms"/>. Removes alarms from controllers that doesn't exist
        /// in the <paramref name="currentPlcAlarms"/> anymore.
        /// Add alarms from <paramref name="currentPlcAlarms"/> to controllers that not already were added.
        /// </summary>
        /// <param name="currentPlcAlarms">The current pending alarms from PLC.</param>
        public void UpdateAlarms(IEnumerable <Alarm> currentPlcAlarms)
        {
            List <Alarm> currentAlarmsList = currentPlcAlarms.ToList();
            List <Alarm> removedAlarms, addedAlarms, changedAlarms;

            lock (_lockObject)
            {
                // iterate through all controllers and get the alarms
                var curControllersByAlarmId = new Dictionary <uint, List <IController> >();
                var collectAlarmsById       = new Action <Controller>(c =>
                {
                    foreach (var alarm in c.Alarms)
                    {
                        if (!curControllersByAlarmId.ContainsKey(alarm.Id))
                        {
                            var ctrlList = new List <IController> {
                                c
                            };
                            curControllersByAlarmId.Add(alarm.Id, ctrlList);
                        }
                        else
                        {
                            curControllersByAlarmId[alarm.Id].Add(c);
                        }
                    }
                });

                RootController.VisitAllNodes(c => c.ChildsCollection, collectAlarmsById);

                // remove alarms
                removedAlarms = RemoveAlarms(currentAlarmsList, curControllersByAlarmId);

                // add or replace alarms
                AddOrReplaceAlarms(currentAlarmsList, out addedAlarms, out changedAlarms);
            }

            // raise event
            if (addedAlarms.Count > 0)
            {
                AlarmsAdded(addedAlarms);
            }

            // raise event
            if (removedAlarms.Count > 0)
            {
                AlarmsRemoved(removedAlarms);
            }

            // raise event
            if (changedAlarms.Count > 0)
            {
                AlarmsChanged(changedAlarms);
            }
        }
Пример #4
0
        /// <summary>
        /// Gets all controller instances in this tree as a collection.
        /// </summary>
        /// <returns>An <see cref="IReadOnlyCollection{T}"/> of <see cref="IController"/> instances.</returns>
        public IReadOnlyCollection <IController> GetAllControllers()
        {
            if (RootController == null)
            {
                return(new IController[0]);
            }
            ICollection <IController> controllersToReturn = new List <IController>();

            RootController.VisitAllNodes(c => c.ChildsCollection, controllersToReturn.Add);
            return(controllersToReturn.ToReadOnly());
        }