Пример #1
0
 public bool Start()
 {
     if (IsWorking())
     {
         return(false);
     }
     Messenger.AddMessage(MessageToMainForm.ClearConnectedDevicesList);
     if (_mode == Mode.Stop)
     {
         HardwareManager.Connect();
         var devices = HardwareManager.GetConnectedDevices();
         foreach (var device in devices)
         {
             Messenger.AddMessage(MessageToMainForm.ChangeConnectedDevice, device);
         }
     }
     else
     {
         Profile.AccessDescriptor.InitializeAccessDescriptors();
     }
     // Запускаем роутер после дампа, чтобы не получилось, что индикаторы и лампы не зажигаются, хотя фактически режимы включены
     _mode             = Mode.Work;
     _routerCoreThread = new Thread(ThreadLoop)
     {
         IsBackground = true
     };
     _routerCoreThread.Start();
     Messenger.AddMessage(MessageToMainForm.RouterStarted);
     if (_mode == Mode.Stop)
     {
         Profile.AccessDescriptor.InitializeAccessDescriptors();
         Dump();
     }
     return(true);
 }
Пример #2
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();
        }
Пример #3
0
 private bool Stop(bool pause)
 {
     if (!IsWorking())
     {
         return(false);
     }
     _mode = pause ? Mode.Pause : Mode.Stop;
     _routerCoreThread.Join();
     if (_mode == Mode.Stop)
     {
         ShutDownOutputHardware();
         HardwareManager.Disconnect();
         Messenger.AddMessage(MessageToMainForm.RouterStopped);
     }
     else
     {
         Messenger.AddMessage(MessageToMainForm.RouterPaused);
     }
     return(true);
 }