private void __RefreshSelection()
        {
            bool AnySelected    = Stations.Any(station => station.IsSelected);
            bool AnyNotSelected = Stations.Any(station => !station.IsSelected);

            if (AnySelected && AnyNotSelected)
            {
                IsSelected = null;
            }
            else if (AnySelected)
            {
                IsSelected = true;
            }
            else
            {
                IsSelected = false;
            }
        }
Exemplo n.º 2
0
        private void runRunningStateMachine()
        {
            switch (RunningState)
            {
            case RunningState.WaitReset:
                //check user event
                if (DiReset.Count > 0 && DiReset.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.RESET, this);
                    OnShowAlarmEvent(string.Empty, LogLevel.None);
                    return;
                }
                else if (DiStop.Count > 0 && DiStop.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.STOP, this);
                    return;
                }
                else if (DiAuto.Count > 0 && !DiAuto.All(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.MANUAL, this);
                    return;
                }

                //pull up stations state
                if (Stations.All(s => !s.Value.Enable || s.Value.RunningState == RunningState.Resetting))
                {
                    _resettingFlashCount = 0;
                    Light(UserEventType.RESET);
                    RunningState = RunningState.Resetting;
                    return;
                }
                break;

            case RunningState.Resetting:
                //check user event
                if (DiStop.Count > 0 && DiStop.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.STOP, this);
                    return;
                }
                else if (DiPauseSignal.Count > 0 && DiPauseSignal.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.STOP, this);
                    OnShowAlarmEvent($"{RunState} 安全信号 {string.Join(",", DiPauseSignal.Select(d => d.Value.Description))} 某一信号触发", LogLevel.Error);
                    return;
                }

                //pull up stations state
                if (Stations.All(s => !s.Value.Enable || s.Value.RunningState == RunningState.WaitRun))
                {
                    Light(UserEventType.START);
                    RunningState = RunningState.WaitRun;
                    return;
                }
                else if (Stations.Any(s => s.Value.Enable && s.Value.RunningState == RunningState.WaitReset))
                {
                    //some station not reset success
                    PostEvent(UserEventType.STOP, this);
                    Beep();
                    return;
                }

                if (_resettingFlashCount++ > 40)
                {
                    _resettingFlashCount = 0;
                    DoLightRed.All(d => d.Value.SetDo(false));
                    DoLightYellow.All(d => d.Value.Toggle());
                    DoLightGreen.All(d => d.Value.SetDo(false));
                }
                break;

            case RunningState.WaitRun:
                //check user event
                if (DiStart.Count > 0 && DiStart.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.START, this);
                    OnShowAlarmEvent(string.Empty, LogLevel.None);
                    return;
                }
                else if (DiStop.Count > 0 && DiStop.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.STOP, this);
                    return;
                }
                else if (DiAuto.Count > 0 && !DiAuto.All(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.MANUAL, this);
                    return;
                }

                //pull up stations state
                if (Stations.All(s => !s.Value.Enable || s.Value.RunningState == RunningState.Running))
                {
                    _runningFlashCount = 0;
                    Light(UserEventType.START);
                    RunningState = RunningState.Running;
                }
                else if (Stations.Any(s => s.Value.Enable && s.Value.RunningState == RunningState.WaitReset))
                {
                    PostEvent(UserEventType.STOP, this);
                    return;
                }
                break;

            case RunningState.Running:
                //check user event
                if (DiStop.Count > 0 && DiStop.Any(e => e.Value.GetDiSts()))
                {
                    //stop button to pause, need manual continue
                    _isPauseSignal = false;
                    PostEvent(UserEventType.PAUSE, this);
                    return;
                }
                else if (DiPauseSignal.Count > 0 && DiPauseSignal.Any(e => e.Value.GetDiSts()))
                {
                    //pause button to pause, auto continue when reset
                    _isPauseSignal = true;
                    PostEvent(UserEventType.PAUSE, this);
                    OnShowAlarmEvent($"{RunState} 暂停信号 {string.Join(",", DiPauseSignal.Values.Select(d => d.Description))} 某一信号触发", LogLevel.Warning);
                    return;
                }

                //pull up stations state
                if (Stations.Any(s => s.Value.Enable && s.Value.RunningState == RunningState.WaitReset))
                {
                    //some station run error
                    PostEvent(UserEventType.STOP, this);
                    Beep();
                    return;
                }
                else if (Stations.Any(s => s.Value.Enable && s.Value.RunningState == RunningState.Pause))
                {
                    //some station pause
                    Light(UserEventType.PAUSE);
                    RunningState = RunningState.Pause;
                    return;
                }

                if (_runningFlashCount++ > 40)
                {
                    _runningFlashCount = 0;
                    DoLightRed.All(d => d.Value.SetDo(false));
                    DoLightYellow.All(d => d.Value.SetDo(false));
                    DoLightGreen.All(d => d.Value.Toggle());
                }
                break;

            case RunningState.Pause:
                //long press stop to change pause to stop
                if (DiStop.Count > 0 && DiStop.Any(e => e.Value.GetDiSts()))
                {
                    if (_pauseStoppingCount++ > 30)
                    {
                        PostEvent(UserEventType.STOP, this);
                        return;
                    }
                }
                else
                {
                    _pauseStoppingCount = 0;
                }

                //check user event
                if (_isPauseSignal && DiPauseSignal.Count > 0 && DiPauseSignal.All(e => !e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.CONTINUE, this);
                    return;
                }
                else if (DiStart.Count > 0 && DiStart.Any(e => e.Value.GetDiSts()))
                {
                    PostEvent(UserEventType.CONTINUE, this);
                    OnShowAlarmEvent(string.Empty, LogLevel.None);
                    return;
                }
                else if (DiReset.Count > 0 && DiReset.Any(e => e.Value.GetDiSts()))
                {
                    //press reset to change pause to stop
                    PostEvent(UserEventType.STOP, this);
                    return;
                }

                //pull up stations state
                if (Stations.All(s => !s.Value.Enable || s.Value.RunningState == RunningState.Running))
                {
                    _runningFlashCount = 0;
                    RunningState       = RunningState.Running;
                }
                else if (Stations.Any(s => s.Value.Enable && s.Value.RunningState == RunningState.WaitReset))
                {
                    //if any station run fail
                    PostEvent(UserEventType.STOP, this);
                    return;
                }
                break;
            }
        }
 public bool HasStation(Station station) => Stations.Any(s => s.Equals(station));