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"); } }
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)); //} }
internal void CheckAndClearHalt() { //читает состояние пресса и если оно есть Halt - сбрасывает его HWDeviceState devState = (HWDeviceState)ReadRegister(REG_DEVICE_STATE); if (devState == HWDeviceState.Halt) { Clear_Halt(); } }
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); } }
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); }