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