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");
            }
        }
Exemple #3
0
            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);
            }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        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);
        }