private ushort ReadDeviceStateWithAlarm(Types.Commutation.HWDeviceState WaitedState, int Timeout) //реализация чтения состояния конечного автомата //в WaitedState принимается состояние, в которое должен перейти конечный автомат //реализация ожидает перехода конечного автомата в состояние WaitedState в течении времени Timeout //реализация возвращает считанный номер состояния конечного автомата //В случаи аларма прекращаем ожидание { if (m_IsCommutationEmulation) { return((ushort)WaitedState); } ushort State = GetDeviceState(); if (State == (ushort)WaitedState) { return(State); } else { //пока не истёк таймаут - будем перечитывать состояние блока коммутации через каждые 100 мс до тех пор, пока не окажемся в ожидаемом состоянии WaitedState var timeStamp = Environment.TickCount + Timeout; while (Environment.TickCount < timeStamp) { Thread.Sleep(100); State = GetDeviceState(); if ((Types.Commutation.HWDeviceState)State == Types.Commutation.HWDeviceState.SafetyTrig) { m_SafetyAlarm = true; FireSafetyEvent(m_SafetyAlarm); return(State); } //считано состояние State, равное ожидаемому состоянию WaitedState - прерываем цикл ожидания if (State == (ushort)WaitedState) { return(State); } } //раз мы здесь - значит наступил таймаут, а состояния WaitedState мы так и не дождались return(State); } }
internal bool IsSafetyAlarm() { //если тип системы безопасности не оптическая шторка - то никакого Alarm и быть не может if ((m_SafetyType != ComplexSafety.Optical) || (m_ID != ComplexParts.Commutation)) { return(false); } //Если безопасность отключенна if (_SafetyMode == SafetyMode.Disabled) { return(false); } //опрашиваем состояние блока коммутации и если оно SafetyTrig (сработала оптическая шторка) - возвращаем true, иначе false Types.Commutation.HWDeviceState devState = (Types.Commutation.HWDeviceState)GetDeviceState(true); return(devState == Types.Commutation.HWDeviceState.SafetyTrig); }