private IRate[] AxisRatesToArray(IAxisRates axisRates)
        {
            List <IRate> tempList = new List <IRate>();

            foreach (IRate rate in axisRates)
            {
                tempList.Add(rate);
            }

            return(tempList.ToArray());
        }
예제 #2
0
 internal AxisRates(IAxisRates AxisRates, TraceLogger traceLogger)
 {
     this.TL          = traceLogger;
     this.AxisRatesP5 = AxisRates;
     this.Reset();
     foreach (IRate axisRate in AxisRates)
     {
         if (this.TL != null)
         {
             this.TL.LogMessage("AxisRates Class P5 New", "Adding rate: - Minimum: " + (object)axisRate.Minimum + ", Maximum: " + (object)axisRate.Maximum);
         }
     }
 }
예제 #3
0
        // here are some useful properties and methods that can be used as required
        // to help with driver development

        //#region ASCOM Registration

        //// Register or unregister driver for ASCOM. This is harmless if already
        //// registered or unregistered.
        ////
        ///// <summary>
        ///// Register or unregister the driver with the ASCOM Platform.
        ///// This is harmless if the driver is already registered/unregistered.
        ///// </summary>
        ///// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param>
        //private static void RegUnregASCOM(bool bRegister)
        //{
        //    using (var P = new ASCOM.Utilities.Profile())
        //    {
        //        P.DeviceType = "Telescope";
        //        if (bRegister)
        //        {
        //            P.Register(driverID, driverDescription);
        //        }
        //        else
        //        {
        //            P.Unregister(driverID);
        //        }
        //    }
        //}

        ///// <summary>
        ///// This function registers the driver with the ASCOM Chooser and
        ///// is called automatically whenever this class is registered for COM Interop.
        ///// </summary>
        ///// <param name="t">Type of the class being registered, not used.</param>
        ///// <remarks>
        ///// This method typically runs in two distinct situations:
        ///// <list type="numbered">
        ///// <item>
        ///// In Visual Studio, when the project is successfully built.
        ///// For this to work correctly, the option <c>Register for COM Interop</c>
        ///// must be enabled in the project settings.
        ///// </item>
        ///// <item>During setup, when the installer registers the assembly for COM Interop.</item>
        ///// </list>
        ///// This technique should mean that it is never necessary to manually register a driver with ASCOM.
        ///// </remarks>
        //[ComRegisterFunction]
        //public static void RegisterASCOM(Type t)
        //{
        //    RegUnregASCOM(true);
        //}

        ///// <summary>
        ///// This function unregisters the driver from the ASCOM Chooser and
        ///// is called automatically whenever this class is unregistered from COM Interop.
        ///// </summary>
        ///// <param name="t">Type of the class being registered, not used.</param>
        ///// <remarks>
        ///// This method typically runs in two distinct situations:
        ///// <list type="numbered">
        ///// <item>
        ///// In Visual Studio, when the project is cleaned or prior to rebuilding.
        ///// For this to work correctly, the option <c>Register for COM Interop</c>
        ///// must be enabled in the project settings.
        ///// </item>
        ///// <item>During uninstall, when the installer unregisters the assembly from COM Interop.</item>
        ///// </list>
        ///// This technique should mean that it is never necessary to manually unregister a driver from ASCOM.
        ///// </remarks>
        //[ComUnregisterFunction]
        //public static void UnregisterASCOM(Type t)
        //{
        //    RegUnregASCOM(false);
        //}

        //#endregion

        private void CheckRate(TelescopeAxes axis, double rate)
        {
            IAxisRates rates    = AxisRates(axis);
            string     ratesStr = string.Empty;

            foreach (Rate item in rates)
            {
                if (Math.Abs(rate) >= item.Minimum && Math.Abs(rate) <= item.Maximum)
                {
                    return;
                }
                ratesStr = string.Format("{0}, {1} to {2}", ratesStr, item.Minimum, item.Maximum);
            }
            throw new InvalidValueException("MoveAxis", rate.ToString(CultureInfo.InvariantCulture), ratesStr);
        }
        public MockTelescopeService()
        {
            Initialized       = false;
            Connected         = false;
            MockAlignmentMode = AlignmentModes.algGermanPolar;
            MockAltAz         = new Vector {
                X = Double.NaN, Y = Double.NaN
            };
            MockAtHome         = false;
            MockAtPark         = true;
            MockIsPulseGuiding = false;
            MockRaDec          = new Vector {
                X = Double.NaN, Y = Double.NaN
            };
            MockTracking      = false;
            MockTrackingRate  = DriveRates.driveSidereal;
            MockUTCDate       = DateTime.Now;
            MockMoveAxisRates = new Vector {
                X = 0.0, Y = 0.0
            };
            MockCanMoveAxes         = new bool[] { true, true, false };
            DoesRefraction          = false;
            GuideRateDeclination    = 0.004178;
            GuideRateRightAscension = 0.004178;
            MockSideOfPier          = PierSide.pierUnknown;
            SiteElevation           = 1370;
            SiteLatitude            = 31.48417;
            SiteLongitude           = -110.19783;
            MockSlewing             = false;
            SlewSettleTime          = 0;
            _targetDeclination      = Double.NaN;
            _targetRightAscension   = Double.NaN;
            TrackingRates           = new TrackingRates();
            guideRate = new Vector();

            Unit_Tests.AxisRates.ResetRates();
            MockPrimaryAxisRates   = new AxisRates(TelescopeAxes.axisPrimary);
            MockSecondaryAxisRates = new AxisRates(TelescopeAxes.axisSecondary);
            MockTertiaryAxisRates  = new AxisRates(TelescopeAxes.axisTertiary);
        }
예제 #5
0
        public ASCOM.DeviceInterface.IAxisRates AxisRates(ASCOM.DeviceInterface.TelescopeAxes Axis)
        {
            this.TL.LogMessage("AxisRates", "");
            this.TL.LogMessage("AxisRates", Axis.ToString());
            if (!this.memberFactory.IsComObject)
            {
                if (this.isPlatform6Telescope)
                {
                    this.TL.LogMessage("AxisRates", "Platform 6 .NET Telescope");
                    object obj = this.memberFactory.CallMember(3, "AxisRates", new Type[1]
                    {
                        typeof(ASCOM.DeviceInterface.TelescopeAxes)
                    }, (object)Axis);
                    try
                    {
                        ASCOM.DeviceInterface.IAxisRates axisRates = (ASCOM.DeviceInterface.IAxisRates)obj;
                        this.TL.LogMessage("AxisRates", "Number of returned AxisRates: " + (object)axisRates.Count);
                        if (axisRates.Count > 0)
                        {
                            for (int index = 1; index <= axisRates.Count; ++index)
                            {
                                this.TL.LogMessage("AxisRates", "Found Minimim: " + (object)axisRates[index].Minimum + ", Maximum: " + (object)axisRates[index].Maximum);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        this.TL.LogMessageCrLf("AxisRates", ex.ToString());
                    }
                    return((ASCOM.DeviceInterface.IAxisRates)obj);
                }
                if (this.isPlatform5Telescope)
                {
                    this.TL.LogMessage("AxisRates", "Platform 5 .NET Telescope");
                    object obj = this.memberFactory.CallMember(3, "AxisRates", new Type[1]
                    {
                        typeof(ASCOM.DeviceInterface.TelescopeAxes)
                    }, (object)Axis);
                    ASCOM.DeviceInterface.IAxisRates axisRates = (IAxisRates) new AxisRates();
                    try
                    {
                        IAxisRates AxisRates = (IAxisRates)obj;
                        axisRates = (IAxisRates) new AxisRates(AxisRates, this.TL);
                        this.TL.LogMessage("AxisRates", "Number of returned AxisRates: " + (object)AxisRates.Count);
                        if (AxisRates.Count > 0)
                        {
                            for (int index = 1; index <= AxisRates.Count; ++index)
                            {
                                this.TL.LogMessage("AxisRates", "Found Minimim: " + (object)AxisRates[index].Minimum + ", Maximum: " + (object)AxisRates[index].Maximum);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        this.TL.LogMessageCrLf("AxisRates", ex.ToString());
                    }
                    return(axisRates);
                }
                this.TL.LogMessage("AxisRates", "Neither Platform 5 nor Platform 6 .NET Telescope");
                return((ASCOM.DeviceInterface.IAxisRates) new AxisRates());
            }
            this.TL.LogMessage("AxisRates", "Platform 5/6 COM Telescope");
            _AxisRates axisRates1 = new _AxisRates(Axis, this.memberFactory.GetObjType, this.memberFactory.GetLateBoundObject, this.TL);

            try
            {
                if (axisRates1.Count > 0)
                {
                    for (int index = 1; index <= axisRates1.Count; ++index)
                    {
                        this.TL.LogMessage("AxisRates", "Found Minimim: " + (object)axisRates1[index].Minimum + ", Maximum: " + (object)axisRates1[index].Maximum);
                    }
                }
            }
            catch (Exception ex)
            {
                this.TL.LogMessageCrLf("AxisRates", ex.ToString());
            }
            return((ASCOM.DeviceInterface.IAxisRates)axisRates1);
        }
        public void Test_RatesAndMoveAxis()
        {
            // Unsimulated movement causing no M commands, but testing IRates
            device.Connected = true;
            Assert.IsTrue(device.Connected);

            IAxisRates ra_rates  = device.AxisRates(TelescopeAxes.axisPrimary);
            IAxisRates dec_rates = device.AxisRates(TelescopeAxes.axisSecondary);

            Assert.AreEqual(4, ra_rates.Count);
            Assert.AreEqual(5.0 / 3600.0, ra_rates[1].Minimum); // 1-based
            Assert.AreEqual(5.0 / 60.0, ra_rates[2].Minimum);
            Assert.AreEqual(20.0 / 60.0, ra_rates[3].Minimum);
            Assert.AreEqual(5.0, ra_rates[4].Minimum);

            Assert.AreEqual(4, dec_rates.Count);
            Assert.AreEqual(5.0 / 3600.0, dec_rates[1].Minimum);
            Assert.AreEqual(5.0 / 60.0, dec_rates[2].Minimum);
            Assert.AreEqual(20.0 / 60.0, dec_rates[3].Minimum);
            Assert.AreEqual(5.0, dec_rates[4].Minimum);

            device.MoveAxis(TelescopeAxes.axisPrimary, 0.0);
            device.MoveAxis(TelescopeAxes.axisSecondary, 0.0);
            Assert.ThrowsException <ASCOM.InvalidValueException>(() => device.MoveAxis(TelescopeAxes.axisTertiary, 0.0));
            Assert.IsTrue(device.Tracking);

            Assert.IsTrue(ra_rates.Count == dec_rates.Count);
            string[] rates = new string[] { "SLEW_GUIDE", "SLEW_CENTER", "SLEW_FIND", "SLEW_MAX" };

            for (int i = 1; i < ra_rates.Count + 1; i++)
            {
                IRate ra_rate = ra_rates[i];
                Assert.IsTrue(ra_rate.Minimum == ra_rate.Maximum);
                Assert.IsTrue(0 < ra_rate.Minimum);

                IRate dec_rate = dec_rates[i];
                Assert.IsTrue(dec_rate.Minimum == dec_rate.Maximum);
                Assert.IsTrue(0 < dec_rate.Minimum);

                Assert.IsTrue(device.Tracking);
                Assert.AreEqual(rates[3], device.CommandString("getCurrentSlewRate", true));
                Assert.ThrowsException <ASCOM.InvalidValueException>(() => device.MoveAxis(TelescopeAxes.axisPrimary, ra_rate.Minimum + 1 / 3600.0));
                Assert.ThrowsException <ASCOM.InvalidValueException>(() => device.MoveAxis(TelescopeAxes.axisSecondary, dec_rate.Minimum + 1 / 3600.0));

                device.MoveAxis(TelescopeAxes.axisPrimary, ra_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                for (int j = 1; j < ra_rates.Count + 1; j++)
                {
                    if (i != j)
                    {
                        Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.MoveAxis(TelescopeAxes.axisPrimary, ra_rates[((i - 1 + 1) % ra_rates.Count) + 1].Minimum));
                        Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.MoveAxis(TelescopeAxes.axisSecondary, ra_rates[((i - 1 + 1) % ra_rates.Count) + 1].Minimum));
                    }
                }
                device.MoveAxis(TelescopeAxes.axisSecondary, dec_rate.Minimum);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                for (int j = 1; j < ra_rates.Count + 1; j++)
                {
                    if (i != j)
                    {
                        Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.MoveAxis(TelescopeAxes.axisPrimary, ra_rates[((i - 1 + 1) % ra_rates.Count) + 1].Minimum));
                        Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.MoveAxis(TelescopeAxes.axisSecondary, ra_rates[((i - 1 + 1) % ra_rates.Count) + 1].Minimum));
                    }
                }
                Assert.IsTrue(device.Slewing);
                Assert.AreEqual(rates[i - 1], device.CommandString("getCurrentSlewRate", true));

                device.AbortSlew();
                Assert.IsTrue(device.Tracking);

                device.MoveAxis(TelescopeAxes.axisPrimary, -ra_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisSecondary, -dec_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                Assert.AreEqual(rates[i - 1], device.CommandString("getCurrentSlewRate", true));

                device.AbortSlew();
                Assert.IsTrue(device.Tracking);
                Assert.AreEqual(rates[3], device.CommandString("getCurrentSlewRate", true));

                device.MoveAxis(TelescopeAxes.axisPrimary, +ra_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisSecondary, -dec_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                Assert.AreEqual(rates[i - 1], device.CommandString("getCurrentSlewRate", true));

                device.AbortSlew();
                Assert.IsTrue(device.Tracking);
                Assert.AreEqual(rates[3], device.CommandString("getCurrentSlewRate", true));

                device.MoveAxis(TelescopeAxes.axisPrimary, -ra_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisSecondary, +dec_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                Assert.AreEqual(rates[i - 1], device.CommandString("getCurrentSlewRate", true));

                device.AbortSlew();
                Assert.IsTrue(device.Tracking);
                Assert.AreEqual(rates[3], device.CommandString("getCurrentSlewRate", true));

                device.MoveAxis(TelescopeAxes.axisPrimary, +ra_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisSecondary, +dec_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                Assert.AreEqual(rates[i - 1], device.CommandString("getCurrentSlewRate", true));

                device.MoveAxis(TelescopeAxes.axisPrimary, 0);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisSecondary, 0);

                Assert.IsTrue(device.Tracking);
                Assert.AreEqual(rates[3], device.CommandString("getCurrentSlewRate", true));

                device.MoveAxis(TelescopeAxes.axisPrimary, +ra_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisSecondary, +dec_rate.Minimum);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                Assert.AreEqual(rates[i - 1], device.CommandString("getCurrentSlewRate", true));

                device.MoveAxis(TelescopeAxes.axisSecondary, 0);
                Assert.IsTrue(device.Slewing);
                Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.SyncToCoordinates(0, 0));
                device.MoveAxis(TelescopeAxes.axisPrimary, 0);

                Assert.IsTrue(device.Tracking);
                Assert.AreEqual(rates[3], device.CommandString("getCurrentSlewRate", true));
            }

            // One single rate for both axes
            device.MoveAxis(TelescopeAxes.axisPrimary, ra_rates[1].Minimum);
            Assert.IsTrue(device.Slewing);
            Assert.ThrowsException <ASCOM.InvalidOperationException>(() => device.MoveAxis(TelescopeAxes.axisSecondary, dec_rates[2].Minimum));
            Assert.IsTrue(device.Slewing);
            device.AbortSlew();
            Assert.IsTrue(device.Tracking);
        }
예제 #7
0
        static void Main(string[] args)
        {
            string progID;

            Util U = new Util();

            #region Focuser
            Console.WriteLine("\r\nFocuser:"******"ASCOM.Simulator.Focuser");                         // Pre-select simulator (typ.)
            if (progID != "")
            {
                Focuser F = new Focuser(progID);
                F.Link = true;
                Console.WriteLine("  Connected to " + progID);
                Console.WriteLine("  Current position is " + F.Position);
                int nfp = (int)(0.7 * F.Position);
                Console.Write("  Moving to " + nfp);
                F.Move(nfp);
                while (F.IsMoving)
                {
                    Console.Write(".");
                    U.WaitForMilliseconds(333);
                }
                Console.WriteLine("\r\n  Move complete. New position is " + F.Position.ToString());
                F.Link = false;
                F.Dispose();                                                                                    // Release this now, not at exit (typ.)
            }
            #endregion

            #region Telescope
            Console.WriteLine("\r\nTelescope:");
            progID = Telescope.Choose("ASCOM.Simulator.Telescope");
            if (progID != "")
            {
                Telescope T = new Telescope(progID);
                T.Connected = true;
                Console.WriteLine("  Connected to " + progID);
                Console.WriteLine("  Current LST = " + U.HoursToHMS(T.SiderealTime));
                Console.WriteLine("  Current RA  = " + U.HoursToHMS(T.RightAscension));
                Console.WriteLine("  Current DEC = " + U.DegreesToDMS(T.Declination));
                Console.WriteLine("  CanSetTracking = " + T.CanSetTracking);
                if (T.CanSetTracking)
                {
                    Console.WriteLine("  Turning Tracking off...");
                    T.Tracking = false;
                    Console.WriteLine("  Tracking is now " + (T.Tracking ? "on" : "off") + ".");
                    Console.WriteLine("  Wait 5 seconds...");
                    U.WaitForMilliseconds(5000);
                    Console.WriteLine("  Turning Tracking back on...");
                    T.Tracking = true;
                }
                Console.WriteLine("  Latitude = " + U.DegreesToDMS(T.SiteLatitude));
                Console.WriteLine("  Longitude = " + U.DegreesToDMS(T.SiteLongitude));
                Console.Write("  Slewing to point 1");
                T.SlewToCoordinatesAsync(T.SiderealTime - 2, (T.SiteLatitude > 0 ? +55 : -55));
                while (T.Slewing)
                {
                    Console.Write(".");
                    U.WaitForMilliseconds(300);
                }
                Console.WriteLine("\r\n  Slew complete.");
                Console.Write("  Slewing to point 2");
                T.SlewToCoordinatesAsync(T.SiderealTime + 2, (T.SiteLatitude > 0 ? +35 : -35));
                while (T.Slewing)
                {
                    Console.Write(".");
                    U.WaitForMilliseconds(300);
                }
                Console.WriteLine("\r\n  Slew complete.");
                IAxisRates AxR = T.AxisRates(TelescopeAxes.axisPrimary);
                Console.WriteLine("  " + AxR.Count + " rates");
                if (AxR.Count == 0)
                {
                    Console.WriteLine("  Empty AxisRates");
                }
                else
                {
                    foreach (IRate r in AxR)
                    {
                        Console.WriteLine("  Max=" + r.Maximum + " Min=" + r.Minimum);
                    }
                }
                ITrackingRates TrR = T.TrackingRates;
                if (TrR.Count == 0)
                {
                    Console.WriteLine("  Empty TrackingRates!");
                }
                else
                {
                    foreach (DriveRates dr in TrR)
                    {
                        Console.WriteLine("  DriveRate=" + dr);
                    }
                }
                T.Connected = false;
                T.Dispose();
            }
            #endregion

            #region Camera
            Console.WriteLine("\r\nCamera:");
            progID = Camera.Choose("ASCOM.Simulator.Camera");
            if (progID != "")
            {
                Camera C = new Camera(progID);
                C.Connected = true;
                Console.WriteLine("  Connected to " + progID);
                Console.WriteLine("  Description = " + C.Description);
                Console.WriteLine("  Pixel size = " + C.PixelSizeX + " * " + C.PixelSizeY);
                Console.WriteLine("  Camera size = " + C.CameraXSize + " * " + C.CameraYSize);
                Console.WriteLine("  Max Bin = " + C.MaxBinX + " * " + C.MaxBinY);
                Console.WriteLine("  Bin = " + C.BinX + " * " + C.BinY);
                Console.WriteLine("  MaxADU = " + C.MaxADU);
                Console.WriteLine("  CameraState = " + C.CameraState.ToString());
                Console.WriteLine("  CanAbortExposure = " + C.CanAbortExposure);
                Console.WriteLine("  CanAsymmetricBin = " + C.CanAsymmetricBin);
                Console.WriteLine("  CanGetCoolerPower = " + C.CanGetCoolerPower);
                Console.WriteLine("  CanPulseGuide = " + C.CanPulseGuide);
                Console.WriteLine("  CanSetCCDTemperature = " + C.CanSetCCDTemperature);
                Console.WriteLine("  CanStopExposure = " + C.CanStopExposure);
                Console.WriteLine("  CCDTemperature = " + C.CCDTemperature);
                if (C.CanGetCoolerPower)
                {
                    Console.WriteLine("  CoolerPower = " + C.CoolerPower);
                }
                Console.WriteLine("  ElectronsPerADU = " + C.ElectronsPerADU);
                Console.WriteLine("  FullWellCapacity = " + C.FullWellCapacity);
                Console.WriteLine("  HasShutter = " + C.HasShutter);
                Console.WriteLine("  HeatSinkTemperature = " + C.HeatSinkTemperature);
                if (C.CanPulseGuide)
                {
                    Console.WriteLine("  IsPulseGuiding = " + C.IsPulseGuiding);
                }
                Console.Write("  Take 15 second image");
                C.StartExposure(15.0, true);
                while (!C.ImageReady)
                {
                    Console.Write(".");
                    U.WaitForMilliseconds(300);
                }
                Console.WriteLine("\r\n  Exposure complete, ready for download.");
                Console.WriteLine("  CameraState = " + C.CameraState.ToString());
                Console.WriteLine("  LastExposureDuration = " + C.LastExposureDuration);
                Console.WriteLine("  LastExposureStartTime = " + C.LastExposureStartTime);
                int[,] imgArray = (int[, ])C.ImageArray;
                Console.WriteLine("  Array is " + (imgArray.GetUpperBound(0) + 1) + " by " + (imgArray.GetUpperBound(1) + 1));
                C.Connected = false;
                C.Dispose();
            }
            #endregion

            #region FilterWheel
            Console.WriteLine("\r\nFilterWheel:");
            progID = FilterWheel.Choose("ASCOM.Simulator.FilterWheel");
            if (progID != "")
            {
                FilterWheel fw = new FilterWheel(progID);
                fw.Connected = true;
                Console.WriteLine("  Position = " + fw.Position);
                string[] names = fw.Names;
                Console.WriteLine("  There are " + names.Length + " filters:\r\n  ");
                for (int i = 0; i < names.Length; i++)
                {
                    Console.Write(names[i] + " ");
                }
                Console.WriteLine("");
                fw.Connected = false;
                fw.Dispose();
            }
            #endregion

            #region Rotator
            Console.WriteLine("\r\nRotator:");
            progID = Rotator.Choose("ASCOM.Simulator.Rotator");
            if (progID != "")
            {
                Rotator R = new Rotator(progID);
                R.Connected = true;
                Console.WriteLine("  Position = " + R.Position);
                float np = R.Position + 60;
                if (np >= 360)
                {
                    np -= 360;
                }
                Console.Write("  Rotating to " + np.ToString("0"));
                R.MoveAbsolute(np);
                while (R.IsMoving)
                {
                    Console.Write(".");
                    U.WaitForMilliseconds(300);
                }
                Console.WriteLine("\r\n  Rotation complete.");
                R.Connected = false;
                R.Dispose();
            }
            #endregion

            #region Dome
            Console.WriteLine("\r\nDome:");
            progID = Dome.Choose("ASCOM.Simulator.Dome");
            if (progID != "")
            {
                Dome D = new Dome(progID);
                D.Connected = true;
                Console.WriteLine("  Description = " + D.Description);
                Console.WriteLine("  Name = " + D.Name);
                if (D.CanSetAzimuth)
                {
                    Console.WriteLine("  This is a rotatable dome");
                    Console.WriteLine("  Current slit azimuth = " + D.Azimuth.ToString("0.0"));
                    double z = D.Azimuth + 60;
                    if (z >= 360)
                    {
                        z -= 360;
                    }
                    D.SlewToAzimuth(z);
                    Console.Write("  Rotating to azimuth " + z.ToString("0"));
                    while (D.Slewing)
                    {
                        Console.Write(".");
                        U.WaitForMilliseconds(300);
                    }
                    Console.WriteLine("\r\n  Rotation complete.");
                }
                if (D.CanSetShutter)
                {
                    if (D.CanSetAzimuth)
                    {
                        Console.WriteLine("  This dome has a controllable shutter");
                    }
                    else
                    {
                        Console.WriteLine("  This is a roll-off roof");
                    }
                    Console.WriteLine("  It is currently " + D.ShutterStatus.ToString());
                    switch (D.ShutterStatus)
                    {
                    case ShutterState.shutterClosed:
                        Console.Write("  Opening");
                        D.OpenShutter();
                        while (D.ShutterStatus != ShutterState.shutterOpen &&
                               D.ShutterStatus != ShutterState.shutterError)
                        {
                            Console.Write(".");
                            U.WaitForMilliseconds(300);
                        }
                        Console.WriteLine("\r\n  It is now " + D.ShutterStatus.ToString());
                        break;

                    case ShutterState.shutterOpen:
                        Console.Write("  Closing");
                        D.CloseShutter();
                        while (D.ShutterStatus != ShutterState.shutterClosed &&
                               D.ShutterStatus != ShutterState.shutterError)
                        {
                            Console.Write(".");
                            U.WaitForMilliseconds(300);
                        }
                        Console.WriteLine("\r\n  It is now " + D.ShutterStatus.ToString());
                        break;

                    case ShutterState.shutterError:
                        Console.WriteLine("  ** cannot do anything right now **");
                        break;

                    default:
                        Console.WriteLine("  ** it's moving so can't do anythjing else  now **");
                        break;
                    }
                }
                D.Connected = false;
                D.Dispose();
            }
            #endregion

            Console.Write("\r\nPress enter to quit...");
            Console.ReadLine();
        }