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