private IRate[] AxisRatesToArray(IAxisRates axisRates) { List <IRate> tempList = new List <IRate>(); foreach (IRate rate in axisRates) { tempList.Add(rate); } return(tempList.ToArray()); }
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); } } }
// 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); }
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); }
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(); }