private void Work() { if (!_isDumpedOnce) { Dump(); _isDumpedOnce = true; } var events = HardwareManager.GetIncomingEvents(); // Обрабатываем все события foreach (var controlEvent in events) { Profile.ControlProcessor.SendEvent(controlEvent); //if(controlEvent.Hardware.ModuleType!=HardwareModuleType.Axis) Messenger.AddMessage(MessageToMainForm.NewHardwareEvent, controlEvent); } var outgoing = new List <ControlEventBase>(); var outputWasOn = new List <string>(); var newOutgoingEvents = Profile.ControlProcessor.GetNewEvents(); foreach (var newOutgoingEvent in newOutgoingEvents) { // В том случае, когда на один индикатор назначены 2 деcкриптора. Переключение "коммутатором" // более ранний по ID дескриптор установил текст при переключении коммутатора, а более поздний выключил питание. В итоге индикатор пуст if (newOutgoingEvent.Hardware.ModuleType == HardwareModuleType.LedMatrixIndicator || newOutgoingEvent.Hardware.ModuleType == HardwareModuleType.Indicator || newOutgoingEvent.Hardware.ModuleType == HardwareModuleType.BinaryOutput) { var isPowerOff = false; var indicatorEvent = newOutgoingEvent as IndicatorEvent; if (indicatorEvent != null && string.IsNullOrWhiteSpace(indicatorEvent.IndicatorText)) { isPowerOff = true; } var lampEvent = newOutgoingEvent as LampEvent; if (lampEvent != null && !lampEvent.IsOn) { isPowerOff = true; } var hwGuid = newOutgoingEvent.Hardware.GetHardwareGuid(); if (isPowerOff && outputWasOn.Contains(hwGuid)) { continue; } if (!isPowerOff && !outputWasOn.Contains(hwGuid)) { outputWasOn.Add(hwGuid); } } outgoing.Add(newOutgoingEvent); } outputWasOn.Clear(); HardwareManager.PostOutgoingEvents(outgoing); Profile.ControlProcessor.Tick(); }
/// <summary> /// Гасим все лампы и индикаторы, присутствующие в профиле /// </summary> private void ShutDownOutputHardware() { var clearEvents = Profile.ControlProcessor.GetShutDownEventsForAllControlProcessors(); HardwareManager.PostOutgoingEvents(clearEvents.ToList()); }