public AxisStatus GetStatus(int axis) { var raw = GetRawStatus(axis); var status = new AxisStatus(); Action <int, AxisStatus> check_1 = (bit, s) => { if (CheckBit(raw, bit)) { status |= s; } }; Action <int, AxisStatus> check_0 = (bit, s) => { if (!CheckBit(raw, bit)) { status |= s; } }; check_1(1, AxisStatus.ALM); check_1(5, AxisStatus.PEL); check_1(6, AxisStatus.MEL); check_1(8, AxisStatus.EMG); check_1(4, AxisStatus.ORG); check_0(10, AxisStatus.INP); check_1(9, AxisStatus.RDY); return(status); }
/// <summary> /// Returns string representation of a given status enumerator. /// </summary> public static string GetStatusString(AxisStatus status) { switch (status) { case AxisStatus.OK: return("OK"); case AxisStatus.NotFound: return("NOT FOUND"); case AxisStatus.Unavailable: return("NOT AVAILABLE"); case AxisStatus.Disconnected: return("NOT CONNECTED"); case AxisStatus.NotRunning: return("NOT RUNNING"); case AxisStatus.Error: return("ERROR"); case AxisStatus.NoLink: return("NO LINK"); default: return("UNKNOWN"); } }
public AxisStatus GetStatus(int axis) { uint raw = 0; Api.p9014_get_io_status(GetAxis(axis), ref raw).Verify(); AxisStatus status = 0; Action <int, AxisStatus> CheckBit1 = (bit, mask) => { if ((raw & (1u << bit)) != 0u) { status |= mask; } }; Action <int, AxisStatus> CheckBit0 = (bit, mask) => { if ((raw & (1u << bit)) == 0u) { status |= mask; } }; CheckBit1(0, AxisStatus.PEL); CheckBit1(1, AxisStatus.MEL); CheckBit1(2, AxisStatus.ORG); CheckBit0(4, AxisStatus.EMG); if ((status & AxisStatus.PEL) == AxisStatus.PEL) { status |= AxisStatus.ALM; } if ((status & AxisStatus.MEL) == AxisStatus.MEL) { status |= AxisStatus.ALM; } return(status); }
/// <summary> /// /// </summary> /// <param name="axis"></param> /// <param name="speed"></param> /// <returns>If stopping was required</returns> private async Task <bool> StopAxisIfRequiredAsync(MountAxis axis, double speed, double absoluteSpeed) { AxisStatus mountInfoAxisStatus = this._mountInfo.MountState.AxesStatus[(int)axis]; if (!mountInfoAxisStatus.FullStop) { if (!mountInfoAxisStatus.Tracking) { await this._mountControl.SetAxisStop(axis).ConfigureAwait(false); } else if (mountInfoAxisStatus.HighSpeed) { await this._mountControl.SetAxisStop(axis).ConfigureAwait(false); } // Moving to ludicrous speed else if (absoluteSpeed >= MountControlConstants.LOW_SPEED_MARGIN) { await this._mountControl.SetAxisStop(axis).ConfigureAwait(false); } // Changing direction else if (mountInfoAxisStatus.SlewingClockWise && speed < 0) { await this._mountControl.SetAxisStop(axis).ConfigureAwait(false); } // Changing direction else if (mountInfoAxisStatus.SlewingClockWise && speed > 0) { await this._mountControl.SetAxisStop(axis).ConfigureAwait(false); } else { // All checks passed, safe to set motion mode return(false); } // Wait until the axis stops while (true) { await this._mountControl.QueryStatus(axis).ConfigureAwait(false); // Return if the axis has stopped. if (mountInfoAxisStatus.FullStop) { break; } Thread.Sleep(100); } } return(true); }
private async Task QueryStatus(IMountInfo mountInfo, MountAxis axis) { byte[] command = this._commonCommandBuilder.BuildGetStatusCommand(axis); byte[] response = await this.SendRecieveCommand(mountInfo.WifiMount, command).ConfigureAwait(false); if (!base.ValidateResponse(response)) { return; } if (response.Length != 5) { Debug.WriteLine($"Got malformed response to status query {response.Length} bytes"); return; } AxisStatus status = this._commonCommandParser.ParseStatusResponse(response); mountInfo.MountState.AxesStatus[(int)axis] = status; }
public AxisStatus ParseStatusResponse(byte[] response) { response = base.StripGrammar(response); var axisStatus = new AxisStatus(); if ((response[1] & (int)StatusMidBitFlags.Running) == 0) { axisStatus.FullStop = true; axisStatus.Tracking = false; axisStatus.Goto = false; } else { // Axis is running axisStatus.FullStop = false; if ((response[0] & (int)StatusLoBitFlags.Tracking) == 0) { // Axis in Goto mode. axisStatus.Goto = true; axisStatus.Tracking = false; } else { // Axis in slewing(AstroMisc speed) mode. axisStatus.Tracking = true; axisStatus.Goto = false; } } if ((response[1] & (int)StatusMidBitFlags.Blocked) == 0) { axisStatus.Blocked = false; } else { axisStatus.Blocked = true; } if ((response[0] & (int)StatusLoBitFlags.Direction) == 0) { axisStatus.SlewingClockWise = true; } else { axisStatus.SlewingClockWise = false; } if ((response[0] & (int)StatusLoBitFlags.Speed) == 0) { axisStatus.HighSpeed = false; } else { axisStatus.HighSpeed = true; } if ((response[2] & (int)StatusHiBitFlags.InitDone) == 0) { axisStatus.NotInitialized = true; } else { axisStatus.NotInitialized = false; } if ((response[2] & (int)StatusHiBitFlags.LevelSwitch) == 1) { axisStatus.LevelSwitchOn = true; } else { axisStatus.NotInitialized = false; } return(axisStatus); }