bool WaitForLongtimeOperation(int AxisIndex, byte CommandOrderExpected, out AxisStateReport AxisState) { bool timeout = false; int lastPosition = 0; DateTime reqStart = DateTime.Now; do { if (RequestAxisState(AxisIndex, out AxisState)) { var axisStateInReport = HidReport.AxisStateCollection[AxisIndex]; axisStateInReport.IsRunning = AxisState.IsRunning; axisStateInReport.IsHomed = AxisState.IsHomed; axisStateInReport.AbsPosition = AxisState.AbsPosition; axisStateInReport.Error = AxisState.Error; OnReportUpdated?.Invoke(this, HidReport); // Check whether the home process is alive if (lastPosition != AxisState.AbsPosition) { reqStart = DateTime.Now; lastPosition = AxisState.AbsPosition; } //Trace.WriteLine(string.Format("{0:mm:ss.ffffff}\tCommandOrder in Report {1}, Desired {2} ...", DateTime.Now, AxisState.CommandOrder, CommandOrderExpected)); if (AxisState.CommandOrder == CommandOrderExpected) { // the operation is done break; } } // check if it's timeout if ((DateTime.Now - reqStart).TotalSeconds > 5) { timeout = true; break; } Thread.Sleep(20); } while (true); if (timeout) { return(false); } else { return(true); } }
bool RequestAxisState(int AxisIndex, out AxisStateReport AxisState) { bool ret = false; AxisState = new AxisStateReport(); lockUSBPort.Wait(); //Trace.WriteLine(string.Format("Thread {0}, Enter request axis {1} ...", Thread.CurrentThread.ManagedThreadId, AxisIndex)); try { CommandStruct cmd = new CommandStruct() { Command = EnumCommand.REQ_AXIS_STATE, AxisIndex = AxisIndex }; if (hidPort.WriteData(cmd.ToBytes())) { var buff = hidPort.ReadData(); if (buff != null) { if (buff[0] == REPORT_ID_AXISSTATE) { var buffAvailable = new byte[buff.Length - 1]; Buffer.BlockCopy(buff, 1, buffAvailable, 0, buffAvailable.Length); AxisState.Parse(buffAvailable); ret = true; } } } } catch { ret = false; } finally { lockUSBPort.Release(); } //Trace.WriteLine(string.Format("Thread {0}, Exit request ...", Thread.CurrentThread.ManagedThreadId)); return(ret); }
public object Clone() { AxisStateReport state = new AxisStateReport { AbsPosition = this.AbsPosition, AxisIndex = this.AxisIndex, IsHomed = this.IsHomed, IsRunning = this.IsRunning, Error = this.Error, CWLS = this.CWLS, CCWLS = this.CCWLS, ORG = this.ORG, ZeroOut = this.ZeroOut, IN_A = this.IN_A, IN_B = this.IN_B, OUT_A = this.OUT_A, OUT_B = this.OUT_B }; return(state); }