Пример #1
0
        private void WaitState(HWDeviceState needState)
        {
            var           timeStamp = Environment.TickCount + m_Timeout;
            HWDeviceState devState;

            while (Environment.TickCount < timeStamp)
            {
                Thread.Sleep(100);

                devState = (HWDeviceState)
                           ReadRegister(REG_DEV_STATE);

                if (devState == needState)
                {
                    break;
                }

                CheckDevStateThrow(devState);
            }

            if (Environment.TickCount > timeStamp)
            {
                throw new Exception("Timeout while waiting for device to power up");
            }
        }
Пример #2
0
        private void CheckDevStateThrow(HWDeviceState devState)
        {
            //if (devState == HWDeviceState.Fault)
            //    throw new Exception(string.Format("TOU is in fault state, reason: {0}",
            //                                      (HWFaultReason)ReadRegister(REG_FAULT_REASON)));
            //if (devState == HWDeviceState.Disabled)
            //    throw new Exception(string.Format("TOU is in disabled state, reason: {0}",
            //                                      (HWDisableReason)ReadRegister(REG_DISABLE_REASON)));

            if (devState == HWDeviceState.Fault)
            {
                var faultReason = (HWFaultReason)ReadRegister(REG_FAULT_REASON);
                FireNotificationEvent(HWProblemReason.None, HWWarningReason.None, faultReason,
                                      HWDisableReason.None);

                throw new Exception(string.Format("TOU is in fault state, reason: {0}", faultReason));
            }

            //if (devState == HWDeviceState.Disabled)
            //{
            //    var disableReason = (HWDisableReason)ReadRegister(REG_DISABLE_REASON);
            //    FireNotificationEvent(HWWarningReason.None,
            //                          HWFaultReason.None, disableReason);

            //    throw new Exception(string.Format("TOU is in disabled state, reason: {0}", disableReason));
            //}
        }
Пример #3
0
        internal void CheckAndClearHalt()
        {
            //читает состояние пресса и если оно есть Halt - сбрасывает его
            HWDeviceState devState = (HWDeviceState)ReadRegister(REG_DEVICE_STATE);

            if (devState == HWDeviceState.Halt)
            {
                Clear_Halt();
            }
        }
Пример #4
0
        internal ushort ReadDeviceState(HWDeviceState WaitedState, int Timeout)
        //реализация чтения состояния конечного автомата.
        //в WaitedState принимается состояние, в которое должен перейти конечный автомат ATU
        //реализация ожидает перехода конечного автомата в состояние WaitedState в течении времени Timeout
        //реализация возвращает считанный номер состояния конечного автомата
        {
            ushort State = ReadRegister(REG_DEV_STATE);

            if (State == (ushort)WaitedState)
            {
                return(State);
            }
            else
            {
                //пока не истёк таймаут - будем перечитывать состояние блока ATU через каждые 100 мс до тех пор, пока не окажемся в ожидаемом состоянии WaitedState
                var timeStamp = Environment.TickCount + Timeout;

                while (Environment.TickCount < timeStamp)
                {
                    if (m_Stop)
                    {
                        //ATU умеет команду Stop. при этом ATU перейдёт в состояние DS_Ready
                        CallAction(ACT_STOP_TEST);
                    }

                    Thread.Sleep(100);

                    State = ReadRegister(REG_DEV_STATE);

                    //считано состояние State, равное ожидаемому состоянию WaitedState - прерываем цикл ожидания
                    if (State == (ushort)WaitedState)
                    {
                        return(State);
                    }
                }

                //раз мы здесь - значит наступил таймаут, а состояния WaitedState мы так и не дождались
                return(State);
            }
        }
Пример #5
0
        internal DeviceConnectionState Initialize(bool Enable, int Timeout)
        {
            m_IsATUEmulation = m_IsATUEmulationHard || !Enable;

            m_ConnectionState = DeviceConnectionState.ConnectionInProcess;
            FireConnectionEvent(m_ConnectionState, "ATU initializing");

            if (m_IsATUEmulation)
            {
                m_ConnectionState = DeviceConnectionState.ConnectionSuccess;
                FireConnectionEvent(m_ConnectionState, "ATU initialized");

                return(m_ConnectionState);
            }

            try
            {
                //для исполнения процедуры инициализации необходимо, чтобы блок ATU находился в состоянии DS_NONE, поэтому прежде чем мы начнём исполнять цикл конечного автомата, реализующий инициализацию ATU переведём ATU в состояние DS_None
                if (ReadRegister(REG_DEV_STATE) != (ushort)HWDeviceState.DS_None)
                {
                    CallAction(ACT_DISABLE_POWER);
                }

                //ATU должен быть в состоянии DS_NONE. в принципе можно было бы сразу проверить состояние блока ATU, но мы будем выдерживать таймаут m_Timeout, за время истечения которого блок ATU должен выйти в состояние DS_None. если такового не случится - будем возбуждать исключительную ситуацию
                HWDeviceState WaitedState = HWDeviceState.DS_None;
                ushort        State;
                bool          End = false;

                while (!End)
                {
                    //чтение переменных конечного автомата
                    State = ReadDeviceState(WaitedState, Timeout);

                    if (State == (ushort)WaitedState)
                    {
                        switch (State)
                        {
                        case (ushort)HWDeviceState.DS_None:
                            //блок ATU перешёл в состояние DS_None
                            //очищаем ошибки блока ATU
                            ClearErrors();

                            //включаем заряд внутренних накопителей
                            EnablePower();

                            //из данного состояния ATU должен перейти в состояние DS_BatteryCharge но см. http://elma.pe.local/Projects/ProjectTask/Execute/82923 комментарий (Мороз Е. В. 13.04.2017 13:00:51)
                            WaitedState = HWDeviceState.DS_Ready;
                            break;

                        case (ushort)HWDeviceState.DS_BatteryCharge:
                            //из данного состояния ATU должен перейти в состояние DS_Ready
                            WaitedState = HWDeviceState.DS_Ready;
                            break;

                        case (ushort)HWDeviceState.DS_Ready:
                            //блок ATU перешёл в состояние DS_Ready - завершаем процесс инициализации
                            m_ConnectionState = DeviceConnectionState.ConnectionSuccess;
                            End = true;
                            FireConnectionEvent(m_ConnectionState, "ATU successfully initialized.");
                            break;
                        }
                    }
                    else
                    {
                        //состояние блока ATU отличное от ожидаемого: ожидалось состояние WaitedState, а по факту оказалось состояние State
                        switch (State)
                        {
                        case (ushort)HWDeviceState.DS_Fault:
                            //сбрасываем состояние DS_Fault
                            ClearFault();

                            //после сброса состояния DS_Fault оно всегда будет DS_None
                            WaitedState = HWDeviceState.DS_None;
                            break;

                        case (ushort)HWDeviceState.DS_Disabled:
                            throw new Exception(string.Format("state is 'DS_Disabled', reason: {0}", ReadRegister(REG_DISABLE_REASON)));

                        default:
                            throw new Exception(string.Format("state is '{0}', waited state is '{1}'", ((HWDeviceState)State).ToString(), ((HWDeviceState)WaitedState).ToString()));
                        }
                    }
                }
            }
            catch (Exception e)
            {
                m_ConnectionState = DeviceConnectionState.ConnectionFailed;
                FireConnectionEvent(m_ConnectionState, String.Format("ATU initialization error: {0}.", e.Message));
            }

            return(m_ConnectionState);
        }