Ejemplo n.º 1
0
        private void scopeBackgroundMover_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker           bgw     = sender as BackgroundWorker;
            List <TimedMovementResult> results = MakeStepsInTheBackground(bgw, (TimedMovementArg)e.Argument);
            TimedMovementResult        lastRes = results[results.Count - 1];

            if (lastRes.cancelled)
            {
                e.Cancel = true;
            }
            else
            {
                e.Result = results;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// For movement-study ONLY.  Implements a timed-movement (as opposed to a measured-movement in the driver)
        /// </summary>
        /// <returns></returns>
        List <TimedMovementResult> MakeStepsInTheBackground(BackgroundWorker bgw, TimedMovementArg arg)
        {
            List <TimedMovementResult> bgResults = new List <TimedMovementResult>();

            Const.AxisDirection direction = arg.rate < 0 ? Const.AxisDirection.Decreasing : Const.AxisDirection.Increasing;

            for (int stepNo = 0; stepNo < arg.nsteps; stepNo++)
            {
                int selector;
                TimedMovementResult res = new TimedMovementResult(arg.axis);
                res.cancelled = false;

                res.threadId = Thread.CurrentThread.ManagedThreadId;

                selector           = (int)TimedMovementResult.ResultSelector.AtStart;
                res.time[selector] = DateTime.Now; res.encoder_angle[selector] = arg.axis == TelescopeAxes.axisPrimary ?
                                                                                 Angle.FromHours(wisetele.RightAscension) :
                                                                                 Angle.FromDegrees(wisetele.Declination);

                if (bgw.CancellationPending)
                {
                    res.cancelled = true;
                    bgResults.Add(res);
                    break;
                }

                wisetele.MoveAxis(arg.axis, arg.rate);
                for (long endTicks = DateTime.Now.Ticks + 10000 * arg.millis; DateTime.Now.Ticks < endTicks; Thread.Sleep(1))
                {
                    if (bgw.CancellationPending)
                    {
                        wisetele.Stop();
                        res.cancelled = true;
                        bgResults.Add(res);
                        goto Out;
                    }
                }

                selector           = (int)TimedMovementResult.ResultSelector.AtStop;
                res.time[selector] = DateTime.Now; res.encoder_angle[selector] = arg.axis == TelescopeAxes.axisPrimary ?
                                                                                 Angle.FromHours(wisetele.RightAscension) :
                                                                                 Angle.FromDegrees(wisetele.Declination);

                if (wisetele.Simulated)    // move some more, to simulate telescope inertia
                {
                    wisetele.MoveAxis(arg.axis, arg.rate);
                    long deltaTicks = 10000 * (long)(WiseTele.Instance.movementParameters[arg.axis][arg.rate].stopMovement.Degrees * WiseTele.Instance.movementParameters[arg.axis][arg.rate].millisecondsPerDegree);
                    for (long endTicks = DateTime.Now.Ticks + deltaTicks; DateTime.Now.Ticks < endTicks; Thread.Sleep(10))
                    {
                        if (bgw.CancellationPending)
                        {
                            wisetele.Stop();
                            res.cancelled = true;
                            bgResults.Add(res);
                            goto Out;
                        }
                    }
                }

                wisetele.Stop();

                if (bgw.CancellationPending)
                {
                    res.cancelled = true;
                    bgResults.Add(res);
                    goto Out;
                }

                while (wisetele.AxisIsMoving(arg.axis))
                {
                    if (bgw.CancellationPending)
                    {
                        res.cancelled = true;
                        bgResults.Add(res);
                        goto Out;
                    }
                    Thread.Sleep(500);
                }

                selector           = (int)TimedMovementResult.ResultSelector.AtIdle;
                res.time[selector] = DateTime.Now; res.encoder_angle[selector] = arg.axis == TelescopeAxes.axisPrimary ?
                                                                                 Angle.FromHours(wisetele.RightAscension) :
                                                                                 Angle.FromDegrees(wisetele.Declination);

                bgResults.Add(res);
            }

Out:
            return(bgResults);
        }