/// <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()); }
/// <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); }
/// <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); } }
/// <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()); }