+//
+// Edit Log:
+//
+// Date Who Vers Description
+// ----------- --- ----- -------------------------------------------------------
+// dd-mmm-yyyy XXX 6.0.0 Initial edit, created from ASCOM driver template
+// --------------------------------------------------------------------------------
+//
+
+
+// This is used to define code in the template that is specific to one class implementation
+// unused code canbe deleted and this definition removed.
+#define Focuser
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using System.Runtime.InteropServices;
+
+using ASCOM;
+using ASCOM.Astrometry;
+using ASCOM.Astrometry.AstroUtils;
+using ASCOM.Utilities;
+using ASCOM.DeviceInterface;
+using System.Globalization;
+using System.Collections;
+using System.Reflection;
+using ASCOM.Utilities.Interfaces;
+
+namespace ASCOM.Meade.net
+{
+ //
+ // Your driver's DeviceID is ASCOM.Meade.net.Focuser
+ //
+ // The Guid attribute sets the CLSID for ASCOM.Meade.net.Focuser
+ // The ClassInterface/None addribute prevents an empty interface called
+ // _Meade.net from being created and used as the [default] interface
+ //
+ // TODO Replace the not implemented exceptions with code to implement the function or
+ // throw the appropriate ASCOM exception.
+ //
+
+ ///
+ /// ASCOM Focuser Driver for Meade.net.
+ ///
+ [Guid("a32ac647-bf0f-42f9-8ab0-d166fa5884ad")]
+ [ProgId("ASCOM.MeadeGeneric.focuser")]
+ [ServedClassName("Meade.net Focuser")]
+ [ClassInterface(ClassInterfaceType.None)]
+ public class Focuser : ReferenceCountedObjectBase, IFocuserV3
+ {
+ ///
+ /// ASCOM DeviceID (COM ProgID) for this driver.
+ /// The DeviceID is used by ASCOM applications to load the driver at runtime.
+ ///
+ //internal static string driverID = "ASCOM.Meade.net.Focuser";
+ internal static string driverID = Marshal.GenerateProgIdForType(MethodBase.GetCurrentMethod().DeclaringType);
+ // TODO Change the descriptive string for your driver then remove this line
+ ///
+ /// Driver description that displays in the ASCOM Chooser.
+ ///
+ private static string driverDescription = "Meade Generic";
+
+ internal static string comPortProfileName = "COM Port"; // Constants used for Profile persistence
+ internal static string comPortDefault = "COM1";
+ internal static string traceStateProfileName = "Trace Level";
+ internal static string traceStateDefault = "false";
+
+ internal static string comPort; // Variables to hold the currrent device configuration
+
+ ///
+ /// Private variable to hold the connected state
+ ///
+ private bool connectedState;
+
+ ///
+ /// Private variable to hold an ASCOM Utilities object
+ ///
+ private Util utilities;
+
+ ///
+ /// Private variable to hold an ASCOM AstroUtilities object to provide the Range method
+ ///
+ private AstroUtils astroUtilities;
+
+ ///
+ /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify)
+ ///
+ internal static TraceLogger tl;
+
+ ///
+ /// Initializes a new instance of the class.
+ /// Must be public for COM registration.
+ ///
+ public Focuser()
+ {
+ tl = new TraceLogger("", "Meade.net");
+ ReadProfile(); // Read device configuration from the ASCOM Profile store
+
+ tl.LogMessage("Focuser", "Starting initialisation");
+
+ connectedState = false; // Initialise connected to false
+ utilities = new Util(); //Initialise util object
+ astroUtilities = new AstroUtils(); // Initialise astro utilities object
+
+ tl.LogMessage("Focuser", "Completed initialisation");
+ }
+
+
+ //
+ // PUBLIC COM INTERFACE IFocuserV3 IMPLEMENTATION
+ //
+
+ #region Common properties and methods.
+
+ ///
+ /// Displays the Setup Dialog form.
+ /// If the user clicks the OK button to dismiss the form, then
+ /// the new settings are saved, otherwise the old values are reloaded.
+ /// THIS IS THE ONLY PLACE WHERE SHOWING USER INTERFACE IS ALLOWED!
+ ///
+ public void SetupDialog()
+ {
+ SharedResources.SetupDialog();
+ ReadProfile();
+ }
+
+ public ArrayList SupportedActions
+ {
+ get
+ {
+ tl.LogMessage("SupportedActions Get", "Returning empty arraylist");
+ return new ArrayList();
+ }
+ }
+
+ public string Action(string actionName, string actionParameters)
+ {
+ LogMessage("", "Action {0}, parameters {1} not implemented", actionName, actionParameters);
+ throw new ASCOM.ActionNotImplementedException("Action " + actionName + " is not implemented by this driver");
+ }
+
+ public void CommandBlind(string command, bool raw)
+ {
+ CheckConnected("CommandBlind");
+ // Call CommandString and return as soon as it finishes
+ //this.CommandString(command, raw);
+ SharedResources.SendBlind(command);
+ // or
+ //throw new ASCOM.MethodNotImplementedException("CommandBlind");
+ // DO NOT have both these sections! One or the other
+ }
+
+ public bool CommandBool(string command, bool raw)
+ {
+ CheckConnected("CommandBool");
+ //string ret = CommandString(command, raw);
+ // TODO decode the return string and return true or false
+ // or
+ throw new ASCOM.MethodNotImplementedException("CommandBool");
+ // DO NOT have both these sections! One or the other
+ }
+
+ public string CommandString(string command, bool raw)
+ {
+ CheckConnected("CommandString");
+ // it's a good idea to put all the low level communication with the device here,
+ // then all communication calls this function
+ // you need something to ensure that only one command is in progress at a time
+ return SharedResources.SendString(command);
+
+ throw new ASCOM.MethodNotImplementedException("CommandString");
+ }
+
+ public void Dispose()
+ {
+ // Clean up the tracelogger and util objects
+ tl.Enabled = false;
+ tl.Dispose();
+ tl = null;
+ utilities.Dispose();
+ utilities = null;
+ astroUtilities.Dispose();
+ astroUtilities = null;
+ }
+
+ public bool Connected
+ {
+ get
+ {
+ LogMessage("Connected", "Get {0}", IsConnected);
+ return IsConnected;
+ }
+ set
+ {
+ tl.LogMessage("Connected", "Set {0}", value);
+ if (value == IsConnected)
+ return;
+
+ if (value)
+ {
+ LogMessage("Connected Set", "Connecting to port {0}", comPort);
+ SharedResources.Connect("Serial");
+ connectedState = true;
+ }
+ else
+ {
+ LogMessage("Connected Set", "Disconnecting from port {0}", comPort);
+ SharedResources.Disconnect("Serial");
+ connectedState = false;
+ }
+ }
+ }
+
+ public string Description
+ {
+ // TODO customise this device description
+ get
+ {
+ tl.LogMessage("Description Get", driverDescription);
+ return driverDescription;
+ }
+ }
+
+ public string DriverInfo
+ {
+ get
+ {
+ Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
+ // TODO customise this driver description
+ string driverInfo = "Information about the driver itself. Version: " + String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
+ tl.LogMessage("DriverInfo Get", driverInfo);
+ return driverInfo;
+ }
+ }
+
+ public string DriverVersion
+ {
+ get
+ {
+ Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
+ string driverVersion = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
+ tl.LogMessage("DriverVersion Get", driverVersion);
+ return driverVersion;
+ }
+ }
+
+ public short InterfaceVersion
+ {
+ // set by the driver wizard
+ get
+ {
+ LogMessage("InterfaceVersion Get", "3");
+ return Convert.ToInt16("3");
+ }
+ }
+
+ public string Name
+ {
+ get
+ {
+ //string name = "Short driver name - please customise";
+ string name = driverDescription;
+ tl.LogMessage("Name Get", name);
+ return name;
+ }
+ }
+
+ #endregion
+
+ #region IFocuser Implementation
+
+ public bool Absolute
+ {
+ get
+ {
+ tl.LogMessage("Absolute Get", false.ToString());
+ return false; // This is a relative focuser
+ }
+ }
+
+ public void Halt()
+ {
+ tl.LogMessage("Halt", "Halting");
+ SharedResources.SendBlind(":FQ#");
+ //:FQ# Halt Focuser Motion
+ //Returns: Nothing
+ }
+
+ public bool IsMoving
+ {
+ get
+ {
+ tl.LogMessage("IsMoving Get", false.ToString());
+ return false; // This focuser always moves instantaneously so no need for IsMoving ever to be True
+ }
+ }
+
+ public bool Link
+ {
+ get
+ {
+ tl.LogMessage("Link Get", this.Connected.ToString());
+ return this.Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility
+ }
+ set
+ {
+ tl.LogMessage("Link Set", value.ToString());
+ this.Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility
+ }
+ }
+
+ private readonly int _maxIncrement = 7000;
+ public int MaxIncrement
+ {
+ get
+ {
+ tl.LogMessage("MaxIncrement Get", _maxIncrement.ToString());
+ return _maxIncrement; // Maximum change in one move
+ }
+ }
+
+ private readonly int _maxStep = 7000;
+ public int MaxStep
+ {
+ get
+ {
+ tl.LogMessage("MaxStep Get", _maxStep.ToString());
+ return _maxStep;
+ }
+ }
+
+ public void Move(int Position)
+ {
+ tl.LogMessage("Move", Position.ToString());
+
+ //todo implement backlash compensation
+ //todo implement direction reverse
+ //todo implement dynamic braking
+
+ if (Position < -MaxIncrement || Position > MaxIncrement)
+ {
+ throw new ASCOM.InvalidValueException($"position out of range {-MaxIncrement} < {Position} < {MaxIncrement}");
+ }
+
+ if (Position == 0)
+ return;
+
+ if (Position > 0)
+ {
+ //desired move direction is out
+ MoveFocuser(true, Math.Abs(Position));
+ }
+ else
+ {
+ //desired move direction is in
+ MoveFocuser(false, Math.Abs(Position));
+ }
+ }
+
+ private void MoveFocuser(bool directionOut, int steps)
+ {
+ SharedResources.Lock(() =>
+ {
+ SharedResources.SendBlind(directionOut ? ":F+#" : ":F-#");
+ //:F+# Start Focuser moving inward (toward objective)
+ //Returns: None
+
+ //:F-# Start Focuser moving outward (away from objective)
+ //Returns: None
+
+ utilities.WaitForMilliseconds(steps);
+
+ Halt();
+ });
+ }
+
+ public int Position
+ {
+ get
+ {
+ throw new ASCOM.PropertyNotImplementedException("Position", false);
+ //return focuserPosition; // Return the focuser position
+ }
+ }
+
+ public double StepSize
+ {
+ get
+ {
+ tl.LogMessage("StepSize Get", "Not implemented");
+ throw new ASCOM.PropertyNotImplementedException("StepSize", false);
+ }
+ }
+
+ public bool TempComp
+ {
+ get
+ {
+ tl.LogMessage("TempComp Get", false.ToString());
+ return false;
+ }
+ set
+ {
+ tl.LogMessage("TempComp Set", "Not implemented");
+ throw new ASCOM.PropertyNotImplementedException("TempComp", false);
+ }
+ }
+
+ public bool TempCompAvailable
+ {
+ get
+ {
+ tl.LogMessage("TempCompAvailable Get", false.ToString());
+ return false; // Temperature compensation is not available in this driver
+ }
+ }
+
+ public double Temperature
+ {
+ get
+ {
+ tl.LogMessage("Temperature Get", "Not implemented");
+ throw new ASCOM.PropertyNotImplementedException("Temperature", false);
+ }
+ }
+
+ #endregion
+
+ #region Private properties and methods
+ // 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.
+ //
+ ///
+ /// Register or unregister the driver with the ASCOM Platform.
+ /// This is harmless if the driver is already registered/unregistered.
+ ///
+ /// If true, registers the driver, otherwise unregisters it.
+ private static void RegUnregASCOM(bool bRegister)
+ {
+ using (var P = new ASCOM.Utilities.Profile())
+ {
+ P.DeviceType = "Focuser";
+ if (bRegister)
+ {
+ P.Register(driverID, driverDescription);
+ }
+ else
+ {
+ P.Unregister(driverID);
+ }
+ }
+ }
+
+ ///
+ /// This function registers the driver with the ASCOM Chooser and
+ /// is called automatically whenever this class is registered for COM Interop.
+ ///
+ /// Type of the class being registered, not used.
+ ///
+ /// This method typically runs in two distinct situations:
+ ///
+ /// -
+ /// In Visual Studio, when the project is successfully built.
+ /// For this to work correctly, the option Register for COM Interop
+ /// must be enabled in the project settings.
+ ///
+ /// - During setup, when the installer registers the assembly for COM Interop.
+ ///
+ /// This technique should mean that it is never necessary to manually register a driver with ASCOM.
+ ///
+ [ComRegisterFunction]
+ public static void RegisterASCOM(Type t)
+ {
+ RegUnregASCOM(true);
+ }
+
+ ///
+ /// This function unregisters the driver from the ASCOM Chooser and
+ /// is called automatically whenever this class is unregistered from COM Interop.
+ ///
+ /// Type of the class being registered, not used.
+ ///
+ /// This method typically runs in two distinct situations:
+ ///
+ /// -
+ /// In Visual Studio, when the project is cleaned or prior to rebuilding.
+ /// For this to work correctly, the option Register for COM Interop
+ /// must be enabled in the project settings.
+ ///
+ /// - During uninstall, when the installer unregisters the assembly from COM Interop.
+ ///
+ /// This technique should mean that it is never necessary to manually unregister a driver from ASCOM.
+ ///
+ [ComUnregisterFunction]
+ public static void UnregisterASCOM(Type t)
+ {
+ RegUnregASCOM(false);
+ }
+
+ #endregion
+
+ ///
+ /// Returns true if there is a valid connection to the driver hardware
+ ///
+ private bool IsConnected
+ {
+ get
+ {
+ // TODO check that the driver hardware connection exists and is connected to the hardware
+ return connectedState;
+ }
+ }
+
+ ///
+ /// Use this function to throw an exception if we aren't connected to the hardware
+ ///
+ ///
+ private void CheckConnected(string message)
+ {
+ if (!IsConnected)
+ {
+ throw new ASCOM.NotConnectedException(message);
+ }
+ }
+
+ ///
+ /// Read the device configuration from the ASCOM Profile store
+ ///
+ internal void ReadProfile()
+ {
+ var profileProperties = SharedResources.ReadProfile();
+ tl.Enabled = profileProperties.TraceLogger;
+ comPort = profileProperties.ComPort;
+ }
+
+ ///
+ /// Log helper function that takes formatted strings and arguments
+ ///
+ ///
+ ///
+ ///
+ internal static void LogMessage(string identifier, string message, params object[] args)
+ {
+ var msg = string.Format(message, args);
+ tl.LogMessage(identifier, msg);
+ }
+ #endregion
+ }
+}
diff --git a/Meade.net.focuser/Meade.net.focuser.csproj b/Meade.net.focuser/Meade.net.focuser.csproj
new file mode 100644
index 0000000..a082801
--- /dev/null
+++ b/Meade.net.focuser/Meade.net.focuser.csproj
@@ -0,0 +1,151 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}
+ Library
+ Properties
+ ASCOM.Meade.net
+ ASCOM.Meade.net.Focuser
+
+
+
+
+ 3.5
+ v4.7.1
+ ASCOM.ico
+ true
+ ASCOMDriverTemplate.snk
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+
+
+ true
+ full
+ false
+ ..\bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ true
+ x86
+ false
+
+
+ pdbonly
+ true
+ ..\bin\Release\
+ TRACE
+ prompt
+ 4
+ AnyCPU
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ True
+ Settings.settings
+
+
+
+
+ Designer
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ true
+
+
+ False
+ Windows Installer 3.1
+ true
+
+
+
+
+ {3689a2cb-94c5-4012-a5cf-7e7d1dd27143}
+ Meade.net
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.focuser/Properties/AssemblyInfo.cs b/Meade.net.focuser/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0fce7a9
--- /dev/null
+++ b/Meade.net.focuser/Properties/AssemblyInfo.cs
@@ -0,0 +1,39 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+// TODO - Add your authorship information here
+[assembly: AssemblyTitle("ASCOM.Meade.net.Focuser")]
+[assembly: AssemblyDescription("ASCOM Focuser driver for Meade.net")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("cjdawson.com")]
+[assembly: AssemblyProduct("ASCOM Focuser driver for Meade.net")]
+[assembly: AssemblyCopyright("Copyright © 2019 cjdawson.com")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(true)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("4ad7a6d4-6d54-4a9a-bbf3-895353e318f8")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+//
+// TODO - Set your driver's version here
+[assembly: AssemblyVersion("0.4.0.0")]
+[assembly: AssemblyFileVersion("0.4.0.0")]
diff --git a/Meade.net.focuser/Properties/Resources.Designer.cs b/Meade.net.focuser/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..67f90ec
--- /dev/null
+++ b/Meade.net.focuser/Properties/Resources.Designer.cs
@@ -0,0 +1,83 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ASCOM.Meade.net.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ASCOM {
+ get {
+ object obj = ResourceManager.GetObject("ASCOM", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
+ ///
+ internal static System.Drawing.Icon DefaultIcon {
+ get {
+ object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+ }
+}
diff --git a/Meade.net.focuser/Properties/Resources.resx b/Meade.net.focuser/Properties/Resources.resx
new file mode 100644
index 0000000..e522d9e
--- /dev/null
+++ b/Meade.net.focuser/Properties/Resources.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\ASCOM.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Meade.net.focuser/Properties/Settings.Designer.cs b/Meade.net.focuser/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..f1cc444
--- /dev/null
+++ b/Meade.net.focuser/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ASCOM.Meade.net.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Meade.net.focuser/Properties/Settings.settings b/Meade.net.focuser/Properties/Settings.settings
new file mode 100644
index 0000000..8e615f2
--- /dev/null
+++ b/Meade.net.focuser/Properties/Settings.settings
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.focuser/ReadMe.htm b/Meade.net.focuser/ReadMe.htm
new file mode 100644
index 0000000..d0e812e
--- /dev/null
+++ b/Meade.net.focuser/ReadMe.htm
@@ -0,0 +1,147 @@
+
+
+
+
+ Untitled Document
+
+
+
+
+
+
+
+
+
+
+ ASCOM Focuser Driver (C#)
+ |
+
+
+
+
+You have just created the skeleton of an ASCOM
+Focuser driver in C#. It produces an in-process
+(assembly) based driver.
+
+Prior to developing your first driver, please
+familiarize yourself with the developer
+information we've provided at the ASCOM Initiative web site
+(internet required).
+
+You must do the following in order to complete
+your implementation:
+
+ Switch to the Debug configuration
+ and build the template now. It should build without errors.
+
+ Add a test project to the
+ solution. There are templates that can be used to add either a
+ console or a Windows Forms application:
+
+
+ Select the ASCOM
+ Test Forms App (CS) or ASCOM
+ Test Console App (CS) template.
+ Set a name for the test
+ application and click on OK.
+ In the Wizard: set the same device
+ type and model name as for the driver and select Create to build the
+ test project.
+ Set the Test Application to Run at
+ Startup.
+ Click on Debug and the test
+ application should run. You should be able to select your
+ application in the chooser. Selecting Properties should show the
+ default setup dialog for your driver.
+ Trying to continue will generate
+ errors because the additional properties have not been implemented.
+
+
+ Go through the Driver.cs file and
+ replace the System.NotImplemented exceptions with code to implement
+ your driver's functionality. See the ASCOM IFocuserV3
+ spec. If a property or method is not implemented in your driver the
+ System.NotImplemented exception must be replaced by an
+ ASCOM.PropertyNotImplemented or ASCOM.MethodNotImplemented
+ exception.
+ Customize the Setup Dialog (SetupDialogForm) to provide the
+ settings and other controls for your driver. You can bind settings
+ directly to controls on your dialog form, there's no need to manage
+ settings manually. A custom Settings class takes care of managing
+ your settings behind the scenes.
+
+
+Notes:
+
+ Successfully building the driver,
+ as well as using regasm
+ on the assembly, registers it for both COM and ASCOM (the Chooser).
+ See the code in the ASCOM Registration region of Driver.vb.
+
+ Doing a Clean for the project, as
+ well doing a regasm
+ -u on the assembly, unregisters it for both COM and ASCOM
+ (the Chooser).
+
+ Place a breakpoint in your driver class constructor, then
+ start debugging (go, F5). Your breakpoint will be hit when the test
+ application creates an instance of your driver (after selecting it
+ in the Chooser). You can now single step, examine variables, etc.
+ Please review the test application and make changes and additions to
+ activate various parts of your driver during debugging.
+ The project's Debug configuration is already configured (The
+ test application creates an instance of your driver (after selecting
+ it in the Chooser). You can now single step, examine variables, etc.
+ Please review the test application and feel free to make changes and
+ additions to activate various parts of your driver during debugging.
+
+
+
+
+
+
+
+
+
+ ASCOM Initiative
+ |
+
+  |
+
+
+
+
+ |
+
+
+ |
+ The ASCOM Initiative consists of a group of astronomy software
+ developers and instrument vendors whose goals are to promote the
+ driver/client model and scripting automation.
+
+ See the ASCOM
+ web site for more information. Please participate in the
+ ASCOM-Talk
+ Yahoo Group.
+
+ |
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.focuser/Resources/ASCOM.bmp b/Meade.net.focuser/Resources/ASCOM.bmp
new file mode 100644
index 0000000..55516c7
Binary files /dev/null and b/Meade.net.focuser/Resources/ASCOM.bmp differ
diff --git a/Meade.net.focuser/app.config b/Meade.net.focuser/app.config
new file mode 100644
index 0000000..56895a9
--- /dev/null
+++ b/Meade.net.focuser/app.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/Meade.net.sln b/Meade.net.sln
new file mode 100644
index 0000000..4ca39e2
--- /dev/null
+++ b/Meade.net.sln
@@ -0,0 +1,73 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.136
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net", "Meade.net\Meade.net.csproj", "{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.Telescope", "Meade.net.Telescope\Meade.net.Telescope.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.focuser", "Meade.net.focuser\Meade.net.focuser.csproj", "{A97E3AEC-F11D-49DA-B259-DE99DA813A86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelescopeTestConsole", "TelescopeTestConsole\TelescopeTestConsole.csproj", "{D5207217-61C7-4E94-8097-91DBACE57D2A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FocuserTestConsole", "FocuserTestConsole\FocuserTestConsole.csproj", "{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestConsoles", "TestConsoles", "{BF650D97-AF98-4638-9C55-21311C6D88DA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|x86.Build.0 = Debug|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x86.ActiveCfg = Release|Any CPU
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x86.Build.0 = Release|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.Build.0 = Debug|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.ActiveCfg = Release|Any CPU
+ {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.Build.0 = Release|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|x86.Build.0 = Debug|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|x86.ActiveCfg = Release|Any CPU
+ {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|x86.Build.0 = Release|Any CPU
+ {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x86.ActiveCfg = Debug|x86
+ {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x86.Build.0 = Debug|x86
+ {D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|Any CPU.ActiveCfg = Release|x86
+ {D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|x86.ActiveCfg = Release|x86
+ {D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|x86.Build.0 = Release|x86
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Debug|x86.ActiveCfg = Debug|x86
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Debug|x86.Build.0 = Debug|x86
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|Any CPU.ActiveCfg = Release|x86
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|x86.ActiveCfg = Release|x86
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {D5207217-61C7-4E94-8097-91DBACE57D2A} = {BF650D97-AF98-4638-9C55-21311C6D88DA}
+ {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49} = {BF650D97-AF98-4638-9C55-21311C6D88DA}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {3C0509DC-C7F5-48DC-920D-DCFD9C879BD2}
+ EndGlobalSection
+EndGlobal
diff --git a/Meade.net/ASCOM.ico b/Meade.net/ASCOM.ico
new file mode 100644
index 0000000..9bf8f41
Binary files /dev/null and b/Meade.net/ASCOM.ico differ
diff --git a/Meade.net/ASCOM.png b/Meade.net/ASCOM.png
new file mode 100644
index 0000000..a83b77b
Binary files /dev/null and b/Meade.net/ASCOM.png differ
diff --git a/Meade.net/ClassFactory.cs b/Meade.net/ClassFactory.cs
new file mode 100644
index 0000000..1626f5c
--- /dev/null
+++ b/Meade.net/ClassFactory.cs
@@ -0,0 +1,244 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Collections;
+
+namespace ASCOM.Meade.net
+{
+
+ #region C# Definition of IClassFactory
+ //
+ // Provide a definition of theCOM IClassFactory interface.
+ //
+ [
+ ComImport, // This interface originated from COM.
+ ComVisible(false), // Must not be exposed to COM!!!
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown), // Indicate that this interface is not IDispatch-based.
+ Guid("00000001-0000-0000-C000-000000000046") // This GUID is the actual GUID of IClassFactory.
+ ]
+ public interface IClassFactory
+ {
+ void CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject);
+ void LockServer(bool fLock);
+ }
+ #endregion
+
+ //
+ // Universal ClassFactory. Given a type as a parameter of the
+ // constructor, it implements IClassFactory for any interface
+ // that the class implements. Magic!!!
+ //
+ public class ClassFactory : IClassFactory
+ {
+
+ #region Access to ole32.dll functions for class factories
+
+ // Define two common GUID objects for public usage.
+ public static Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
+ public static Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
+
+ [Flags]
+ enum CLSCTX : uint
+ {
+ CLSCTX_INPROC_SERVER = 0x1,
+ CLSCTX_INPROC_HANDLER = 0x2,
+ CLSCTX_LOCAL_SERVER = 0x4,
+ CLSCTX_INPROC_SERVER16 = 0x8,
+ CLSCTX_REMOTE_SERVER = 0x10,
+ CLSCTX_INPROC_HANDLER16 = 0x20,
+ CLSCTX_RESERVED1 = 0x40,
+ CLSCTX_RESERVED2 = 0x80,
+ CLSCTX_RESERVED3 = 0x100,
+ CLSCTX_RESERVED4 = 0x200,
+ CLSCTX_NO_CODE_DOWNLOAD = 0x400,
+ CLSCTX_RESERVED5 = 0x800,
+ CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
+ CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
+ CLSCTX_NO_FAILURE_LOG = 0x4000,
+ CLSCTX_DISABLE_AAA = 0x8000,
+ CLSCTX_ENABLE_AAA = 0x10000,
+ CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
+ CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
+ CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
+ CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
+ }
+
+ [Flags]
+ enum REGCLS : uint
+ {
+ REGCLS_SINGLEUSE = 0,
+ REGCLS_MULTIPLEUSE = 1,
+ REGCLS_MULTI_SEPARATE = 2,
+ REGCLS_SUSPENDED = 4,
+ REGCLS_SURROGATE = 8
+ }
+ //
+ // CoRegisterClassObject() is used to register a Class Factory
+ // into COM's internal table of Class Factories.
+ //
+ [DllImport("ole32.dll")]
+ static extern int CoRegisterClassObject(
+ [In] ref Guid rclsid,
+ [MarshalAs(UnmanagedType.IUnknown)] object pUnk,
+ uint dwClsContext,
+ uint flags,
+ out uint lpdwRegister);
+ //
+ // Called by a COM EXE Server that can register multiple class objects
+ // to inform COM about all registered classes, and permits activation
+ // requests for those class objects.
+ // This function causes OLE to inform the SCM about all the registered
+ // classes, and begins letting activation requests into the server process.
+ //
+ [DllImport("ole32.dll")]
+ static extern int CoResumeClassObjects();
+ //
+ // Prevents any new activation requests from the SCM on all class objects
+ // registered within the process. Even though a process may call this API,
+ // the process still must call CoRevokeClassObject for each CLSID it has
+ // registered, in the apartment it registered in.
+ //
+ [DllImport("ole32.dll")]
+ static extern int CoSuspendClassObjects();
+ //
+ // CoRevokeClassObject() is used to unregister a Class Factory
+ // from COM's internal table of Class Factories.
+ //
+ [DllImport("ole32.dll")]
+ static extern int CoRevokeClassObject(uint dwRegister);
+ #endregion
+
+ #region Constructor and Private ClassFactory Data
+
+ protected Type m_ClassType;
+ protected Guid m_ClassId;
+ protected ArrayList m_InterfaceTypes;
+ protected uint m_ClassContext;
+ protected uint m_Flags;
+ protected UInt32 m_locked = 0;
+ protected uint m_Cookie;
+ protected string m_progid;
+
+ public ClassFactory(Type type)
+ {
+ if (type == null)
+ throw new ArgumentNullException("type");
+ m_ClassType = type;
+
+ //PWGS Get the ProgID from the MetaData
+ m_progid = Marshal.GenerateProgIdForType(type);
+ m_ClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)]
+ m_ClassContext = (uint)CLSCTX.CLSCTX_LOCAL_SERVER; // Default
+ m_Flags = (uint)REGCLS.REGCLS_MULTIPLEUSE | // Default
+ (uint)REGCLS.REGCLS_SUSPENDED;
+ m_InterfaceTypes = new ArrayList();
+ foreach (Type T in type.GetInterfaces()) // Save all of the implemented interfaces
+ m_InterfaceTypes.Add(T);
+ }
+
+ #endregion
+
+ #region Common ClassFactory Methods
+ public uint ClassContext
+ {
+ get { return m_ClassContext; }
+ set { m_ClassContext = value; }
+ }
+
+ public Guid ClassId
+ {
+ get { return m_ClassId; }
+ set { m_ClassId = value; }
+ }
+
+ public uint Flags
+ {
+ get { return m_Flags; }
+ set { m_Flags = value; }
+ }
+
+ public bool RegisterClassObject()
+ {
+ // Register the class factory
+ int i = CoRegisterClassObject
+ (
+ ref m_ClassId,
+ this,
+ m_ClassContext,
+ m_Flags,
+ out m_Cookie
+ );
+ return (i == 0);
+ }
+
+ public bool RevokeClassObject()
+ {
+ int i = CoRevokeClassObject(m_Cookie);
+ return (i == 0);
+ }
+
+ public static bool ResumeClassObjects()
+ {
+ int i = CoResumeClassObjects();
+ return (i == 0);
+ }
+
+ public static bool SuspendClassObjects()
+ {
+ int i = CoSuspendClassObjects();
+ return (i == 0);
+ }
+ #endregion
+
+ #region IClassFactory Implementations
+ //
+ // Implement creation of the type and interface.
+ //
+ void IClassFactory.CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject)
+ {
+ IntPtr nullPtr = new IntPtr(0);
+ ppvObject = nullPtr;
+
+ //
+ // Handle specific requests for implemented interfaces
+ //
+ foreach (Type iType in m_InterfaceTypes)
+ {
+ if (riid == Marshal.GenerateGuidForType(iType))
+ {
+ ppvObject = Marshal.GetComInterfaceForObject(Activator.CreateInstance(m_ClassType), iType);
+ return;
+ }
+ }
+ //
+ // Handle requests for IDispatch or IUnknown on the class
+ //
+ if (riid == IID_IDispatch)
+ {
+ ppvObject = Marshal.GetIDispatchForObject(Activator.CreateInstance(m_ClassType));
+ return;
+ }
+ else if (riid == IID_IUnknown)
+ {
+ ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(m_ClassType));
+ }
+ else
+ {
+ //
+ // Oops, some interface that the class doesn't implement
+ //
+ throw new COMException("No interface", unchecked((int)0x80004002));
+ }
+ }
+
+ void IClassFactory.LockServer(bool bLock)
+ {
+ if (bLock)
+ Server.CountLock();
+ else
+ Server.UncountLock();
+ // Always attempt to see if we need to shutdown this server application.
+ Server.ExitIf();
+ }
+ #endregion
+ }
+}
diff --git a/Meade.net/GarbageCollection.cs b/Meade.net/GarbageCollection.cs
new file mode 100644
index 0000000..99aba52
--- /dev/null
+++ b/Meade.net/GarbageCollection.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Threading;
+
+namespace ASCOM.Meade.net
+{
+ ///
+ /// Summary description for GarbageCollection.
+ ///
+ class GarbageCollection
+ {
+ protected bool m_bContinueThread;
+ protected bool m_GCWatchStopped;
+ protected int m_iInterval;
+ protected ManualResetEvent m_EventThreadEnded;
+
+ public GarbageCollection(int iInterval)
+ {
+ m_bContinueThread = true;
+ m_GCWatchStopped = false;
+ m_iInterval = iInterval;
+ m_EventThreadEnded = new ManualResetEvent(false);
+ }
+
+ public void GCWatch()
+ {
+ // Pause for a moment to provide a delay to make threads more apparent.
+ while (ContinueThread())
+ {
+ GC.Collect();
+ Thread.Sleep(m_iInterval);
+ }
+ m_EventThreadEnded.Set();
+ }
+
+ protected bool ContinueThread()
+ {
+ lock (this)
+ {
+ return m_bContinueThread;
+ }
+ }
+
+ public void StopThread()
+ {
+ lock (this)
+ {
+ m_bContinueThread = false;
+ }
+ }
+
+ public void WaitForThreadToStop()
+ {
+ m_EventThreadEnded.WaitOne();
+ m_EventThreadEnded.Reset();
+ }
+ }
+}
diff --git a/Meade.net/LocalServer.cs b/Meade.net/LocalServer.cs
new file mode 100644
index 0000000..a4fc2c2
--- /dev/null
+++ b/Meade.net/LocalServer.cs
@@ -0,0 +1,642 @@
+//
+// ASCOM.Meade.net Local COM Server
+//
+// This is the core of a managed COM Local Server, capable of serving
+// multiple instances of multiple interfaces, within a single
+// executable. This implementes the equivalent functionality of VB6
+// which has been extensively used in ASCOM for drivers that provide
+// multiple interfaces to multiple clients (e.g. Meade Telescope
+// and Focuser) as well as hubs (e.g., POTH).
+//
+// Written by: Robert B. Denny (Version 1.0.1, 29-May-2007)
+// Modified by Chris Rowland and Peter Simpson to allow use with multiple devices of the same type March 2011
+//
+//
+using System;
+using System.IO;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Collections;
+using System.Runtime.InteropServices;
+using System.Reflection;
+using ASCOM.Utilities;
+using Microsoft.Win32;
+using System.Text;
+using System.Threading;
+using System.Security.Principal;
+using System.Diagnostics;
+using ASCOM;
+
+namespace ASCOM.Meade.net
+{
+ public static class Server
+ {
+
+ #region Access to kernel32.dll, user32.dll, and ole32.dll functions
+ [Flags]
+ enum CLSCTX : uint
+ {
+ CLSCTX_INPROC_SERVER = 0x1,
+ CLSCTX_INPROC_HANDLER = 0x2,
+ CLSCTX_LOCAL_SERVER = 0x4,
+ CLSCTX_INPROC_SERVER16 = 0x8,
+ CLSCTX_REMOTE_SERVER = 0x10,
+ CLSCTX_INPROC_HANDLER16 = 0x20,
+ CLSCTX_RESERVED1 = 0x40,
+ CLSCTX_RESERVED2 = 0x80,
+ CLSCTX_RESERVED3 = 0x100,
+ CLSCTX_RESERVED4 = 0x200,
+ CLSCTX_NO_CODE_DOWNLOAD = 0x400,
+ CLSCTX_RESERVED5 = 0x800,
+ CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
+ CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
+ CLSCTX_NO_FAILURE_LOG = 0x4000,
+ CLSCTX_DISABLE_AAA = 0x8000,
+ CLSCTX_ENABLE_AAA = 0x10000,
+ CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
+ CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
+ CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
+ CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
+ }
+
+ [Flags]
+ enum COINIT : uint
+ {
+ /// Initializes the thread for multi-threaded object concurrency.
+ COINIT_MULTITHREADED = 0x0,
+ /// Initializes the thread for apartment-threaded object concurrency.
+ COINIT_APARTMENTTHREADED = 0x2,
+ /// Disables DDE for Ole1 support.
+ COINIT_DISABLE_OLE1DDE = 0x4,
+ /// Trades memory for speed.
+ COINIT_SPEED_OVER_MEMORY = 0x8
+ }
+
+ [Flags]
+ enum REGCLS : uint
+ {
+ REGCLS_SINGLEUSE = 0,
+ REGCLS_MULTIPLEUSE = 1,
+ REGCLS_MULTI_SEPARATE = 2,
+ REGCLS_SUSPENDED = 4,
+ REGCLS_SURROGATE = 8
+ }
+
+
+ // CoInitializeEx() can be used to set the apartment model
+ // of individual threads.
+ [DllImport("ole32.dll")]
+ static extern int CoInitializeEx(IntPtr pvReserved, uint dwCoInit);
+
+ // CoUninitialize() is used to uninitialize a COM thread.
+ [DllImport("ole32.dll")]
+ static extern void CoUninitialize();
+
+ // PostThreadMessage() allows us to post a Windows Message to
+ // a specific thread (identified by its thread id).
+ // We will need this API to post a WM_QUIT message to the main
+ // thread in order to terminate this application.
+ [DllImport("user32.dll")]
+ static extern bool PostThreadMessage(uint idThread, uint Msg, UIntPtr wParam,
+ IntPtr lParam);
+
+ // GetCurrentThreadId() allows us to obtain the thread id of the
+ // calling thread. This allows us to post the WM_QUIT message to
+ // the main thread.
+ [DllImport("kernel32.dll")]
+ static extern uint GetCurrentThreadId();
+ #endregion
+
+ #region Private Data
+ private static int objsInUse; // Keeps a count on the total number of objects alive.
+ private static int serverLocks; // Keeps a lock count on this application.
+ private static frmMain s_MainForm = null; // Reference to our main form
+ private static ArrayList s_ComObjectAssys; // Dynamically loaded assemblies containing served COM objects
+ private static ArrayList s_ComObjectTypes; // Served COM object types
+ private static ArrayList s_ClassFactories; // Served COM object class factories
+ private static string s_appId = "{4e68ec46-5ffc-49e7-b298-38a548df0bfd}"; // Our AppId
+ private static readonly Object lockObject = new object();
+ #endregion
+
+ // This property returns the main thread's id.
+ public static uint MainThreadId { get; private set; } // Stores the main thread's thread id.
+
+ // Used to tell if started by COM or manually
+ public static bool StartedByCOM { get; private set; } // True if server started by COM (-embedding)
+
+
+ #region Server Lock, Object Counting, and AutoQuit on COM startup
+ // Returns the total number of objects alive currently.
+ public static int ObjectsCount
+ {
+ get
+ {
+ lock (lockObject)
+ {
+ return objsInUse;
+ }
+ }
+ }
+
+ // This method performs a thread-safe incrementation of the objects count.
+ public static int CountObject()
+ {
+ // Increment the global count of objects.
+ return Interlocked.Increment(ref objsInUse);
+ }
+
+ // This method performs a thread-safe decrementation the objects count.
+ public static int UncountObject()
+ {
+ // Decrement the global count of objects.
+ return Interlocked.Decrement(ref objsInUse);
+ }
+
+ // Returns the current server lock count.
+ public static int ServerLockCount
+ {
+ get
+ {
+ lock (lockObject)
+ {
+ return serverLocks;
+ }
+ }
+ }
+
+ // This method performs a thread-safe incrementation the
+ // server lock count.
+ public static int CountLock()
+ {
+ // Increment the global lock count of this server.
+ return Interlocked.Increment(ref serverLocks);
+ }
+
+ // This method performs a thread-safe decrementation the
+ // server lock count.
+ public static int UncountLock()
+ {
+ // Decrement the global lock count of this server.
+ return Interlocked.Decrement(ref serverLocks);
+ }
+
+ // AttemptToTerminateServer() will check to see if the objects count and the server
+ // lock count have both dropped to zero.
+ //
+ // If so, and if we were started by COM, we post a WM_QUIT message to the main thread's
+ // message loop. This will cause the message loop to exit and hence the termination
+ // of this application. If hand-started, then just trace that it WOULD exit now.
+ //
+ public static void ExitIf()
+ {
+ lock (lockObject)
+ {
+ if ((ObjectsCount <= 0) && (ServerLockCount <= 0))
+ {
+ if (StartedByCOM)
+ {
+ UIntPtr wParam = new UIntPtr(0);
+ IntPtr lParam = new IntPtr(0);
+ PostThreadMessage(MainThreadId, 0x0012, wParam, lParam);
+ }
+ }
+ }
+ }
+ #endregion
+
+ // -----------------
+ // PRIVATE FUNCTIONS
+ // -----------------
+
+ #region Dynamic Driver Assembly Loader
+ //
+ // Load the assemblies that contain the classes that we will serve
+ // via COM. These will be located in the same folder as
+ // our executable.
+ //
+ private static bool LoadComObjectAssemblies()
+ {
+ s_ComObjectAssys = new ArrayList();
+ s_ComObjectTypes = new ArrayList();
+
+ // put everything into one folder, the same as the server.
+ string assyPath = Assembly.GetEntryAssembly().Location;
+ assyPath = Path.GetDirectoryName(assyPath);
+
+ DirectoryInfo d = new DirectoryInfo(assyPath);
+ foreach (FileInfo fi in d.GetFiles("*.dll"))
+ {
+ string aPath = fi.FullName;
+ //
+ // First try to load the assembly and get the types for
+ // the class and the class factory. If this doesn't work ????
+ //
+ try
+ {
+ Assembly so = Assembly.LoadFrom(aPath);
+ //PWGS Get the types in the assembly
+ Type[] types = so.GetTypes();
+ foreach (Type type in types)
+ {
+ // PWGS Now checks the type rather than the assembly
+ // Check to see if the type has the ServedClassName attribute, only use it if it does.
+ MemberInfo info = type;
+
+ object[] attrbutes = info.GetCustomAttributes(typeof(ServedClassNameAttribute), false);
+ if (attrbutes.Length > 0)
+ {
+ //MessageBox.Show("Adding Type: " + type.Name + " " + type.FullName);
+ s_ComObjectTypes.Add(type); //PWGS - much simpler
+ s_ComObjectAssys.Add(so);
+ }
+ }
+ }
+ catch (BadImageFormatException)
+ {
+ // Probably an attempt to load a Win32 DLL (i.e. not a .net assembly)
+ // Just swallow the exception and continue to the next item.
+ continue;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show("Failed to load served COM class assembly " + fi.Name + " - " + e.Message,
+ "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+ return false;
+ }
+
+ }
+ return true;
+ }
+ #endregion
+
+ #region COM Registration and Unregistration
+ //
+ // Test if running elevated
+ //
+ private static bool IsAdministrator
+ {
+ get
+ {
+ WindowsIdentity i = WindowsIdentity.GetCurrent();
+ WindowsPrincipal p = new WindowsPrincipal(i);
+ return p.IsInRole(WindowsBuiltInRole.Administrator);
+ }
+ }
+
+ //
+ // Elevate by re-running ourselves with elevation dialog
+ //
+ private static void ElevateSelf(string arg)
+ {
+ ProcessStartInfo si = new ProcessStartInfo();
+ si.Arguments = arg;
+ si.WorkingDirectory = Environment.CurrentDirectory;
+ si.FileName = Application.ExecutablePath;
+ si.Verb = "runas";
+ try { Process.Start(si); }
+ catch (System.ComponentModel.Win32Exception)
+ {
+ MessageBox.Show("The Meade.net was not " + (arg == "/register" ? "registered" : "unregistered") +
+ " because you did not allow it.", "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.ToString(), "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+ }
+ return;
+ }
+
+ //
+ // Do everything to register this for COM. Never use REGASM on
+ // this exe assembly! It would create InProcServer32 entries
+ // which would prevent proper activation!
+ //
+ // Using the list of COM object types generated during dynamic
+ // assembly loading, it registers each one for COM as served by our
+ // exe/local server, as well as registering it for ASCOM. It also
+ // adds DCOM info for the local server itself, so it can be activated
+ // via an outboiud connection from TheSky.
+ //
+ private static void RegisterObjects()
+ {
+ if (!IsAdministrator)
+ {
+ ElevateSelf("/register");
+ return;
+ }
+ //
+ // If reached here, we're running elevated
+ //
+
+ Assembly assy = Assembly.GetExecutingAssembly();
+ Attribute attr = Attribute.GetCustomAttribute(assy, typeof(AssemblyTitleAttribute));
+ string assyTitle = ((AssemblyTitleAttribute)attr).Title;
+ attr = Attribute.GetCustomAttribute(assy, typeof(AssemblyDescriptionAttribute));
+ string assyDescription = ((AssemblyDescriptionAttribute)attr).Description;
+
+ //
+ // Local server's DCOM/AppID information
+ //
+ try
+ {
+ //
+ // HKCR\APPID\appid
+ //
+ using (RegistryKey key = Registry.ClassesRoot.CreateSubKey("APPID\\" + s_appId))
+ {
+ key.SetValue(null, assyDescription);
+ key.SetValue("AppID", s_appId);
+ key.SetValue("AuthenticationLevel", 1, RegistryValueKind.DWord);
+ }
+ //
+ // HKCR\APPID\exename.ext
+ //
+ using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("APPID\\{0}",
+ Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1))))
+ {
+ key.SetValue("AppID", s_appId);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("Error while registering the server:\n" + ex.ToString(),
+ "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+ return;
+ }
+ finally
+ {
+ }
+
+ //
+ // For each of the driver assemblies
+ //
+ foreach (Type type in s_ComObjectTypes)
+ {
+ bool bFail = false;
+ try
+ {
+ //
+ // HKCR\CLSID\clsid
+ //
+ string clsid = Marshal.GenerateGuidForType(type).ToString("B");
+ string progid = Marshal.GenerateProgIdForType(type);
+ //PWGS Generate device type from the Class name
+ string deviceType = type.Name;
+
+ using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("CLSID\\{0}", clsid)))
+ {
+ key.SetValue(null, progid); // Could be assyTitle/Desc??, but .NET components show ProgId here
+ key.SetValue("AppId", s_appId);
+ using (RegistryKey key2 = key.CreateSubKey("Implemented Categories"))
+ {
+ key2.CreateSubKey("{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}");
+ }
+ using (RegistryKey key2 = key.CreateSubKey("ProgId"))
+ {
+ key2.SetValue(null, progid);
+ }
+ key.CreateSubKey("Programmable");
+ using (RegistryKey key2 = key.CreateSubKey("LocalServer32"))
+ {
+ key2.SetValue(null, Application.ExecutablePath);
+ }
+ }
+ //
+ // HKCR\CLSID\progid
+ //
+ using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(progid))
+ {
+ key.SetValue(null, assyTitle);
+ using (RegistryKey key2 = key.CreateSubKey("CLSID"))
+ {
+ key2.SetValue(null, clsid);
+ }
+ }
+ //
+ // ASCOM
+ //
+ assy = type.Assembly;
+
+ // Pull the display name from the ServedClassName attribute.
+ attr = Attribute.GetCustomAttribute(type, typeof(ServedClassNameAttribute)); //PWGS Changed to search type for attribute rather than assembly
+ string chooserName = ((ServedClassNameAttribute)attr).DisplayName ?? "MultiServer";
+ using (var P = new ASCOM.Utilities.Profile())
+ {
+ P.DeviceType = deviceType;
+ P.Register(progid, chooserName);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("Error while registering the server:\n" + ex.ToString(),
+ "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+ bFail = true;
+ }
+ finally
+ {
+ }
+ if (bFail) break;
+ }
+ }
+
+ //
+ // Remove all traces of this from the registry.
+ //
+ // **TODO** If the above does AppID/DCOM stuff, this would have
+ // to remove that stuff too.
+ //
+ private static void UnregisterObjects()
+ {
+ if (!IsAdministrator)
+ {
+ ElevateSelf("/unregister");
+ return;
+ }
+
+ //
+ // Local server's DCOM/AppID information
+ //
+ Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", s_appId), false);
+ Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}",
+ Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)), false);
+
+ //
+ // For each of the driver assemblies
+ //
+ foreach (Type type in s_ComObjectTypes)
+ {
+ string clsid = Marshal.GenerateGuidForType(type).ToString("B");
+ string progid = Marshal.GenerateProgIdForType(type);
+ string deviceType = type.Name;
+ //
+ // Best efforts
+ //
+ //
+ // HKCR\progid
+ //
+ Registry.ClassesRoot.DeleteSubKey(String.Format("{0}\\CLSID", progid), false);
+ Registry.ClassesRoot.DeleteSubKey(progid, false);
+ //
+ // HKCR\CLSID\clsid
+ //
+ Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Implemented Categories\\{{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}}", clsid), false);
+ Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Implemented Categories", clsid), false);
+ Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\ProgId", clsid), false);
+ Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\LocalServer32", clsid), false);
+ Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Programmable", clsid), false);
+ Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}", clsid), false);
+ try
+ {
+ //
+ // ASCOM
+ //
+ using (var P = new ASCOM.Utilities.Profile())
+ {
+ P.DeviceType = deviceType;
+ P.Unregister(progid);
+ }
+ }
+ catch (Exception) { }
+ }
+ }
+ #endregion
+
+ #region Class Factory Support
+ //
+ // On startup, we register the class factories of the COM objects
+ // that we serve. This requires the class facgtory name to be
+ // equal to the served class name + "ClassFactory".
+ //
+ private static bool RegisterClassFactories()
+ {
+ s_ClassFactories = new ArrayList();
+ foreach (Type type in s_ComObjectTypes)
+ {
+ ClassFactory factory = new ClassFactory(type); // Use default context & flags
+ s_ClassFactories.Add(factory);
+ if (!factory.RegisterClassObject())
+ {
+ MessageBox.Show("Failed to register class factory for " + type.Name,
+ "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+ return false;
+ }
+ }
+ ClassFactory.ResumeClassObjects(); // Served objects now go live
+ return true;
+ }
+
+ private static void RevokeClassFactories()
+ {
+ ClassFactory.SuspendClassObjects(); // Prevent race conditions
+ foreach (ClassFactory factory in s_ClassFactories)
+ factory.RevokeClassObject();
+ }
+ #endregion
+
+ #region Command Line Arguments
+ //
+ // ProcessArguments() will process the command-line arguments
+ // If the return value is true, we carry on and start this application.
+ // If the return value is false, we terminate this application immediately.
+ //
+ private static bool ProcessArguments(string[] args)
+ {
+ bool bRet = true;
+
+ //
+ //**TODO** -Embedding is "ActiveX start". Prohibit non_AX starting?
+ //
+ if (args.Length > 0)
+ {
+
+ switch (args[0].ToLower())
+ {
+ case "-embedding":
+ StartedByCOM = true; // Indicate COM started us
+ break;
+
+ case "-register":
+ case @"/register":
+ case "-regserver": // Emulate VB6
+ case @"/regserver":
+ RegisterObjects(); // Register each served object
+ bRet = false;
+ break;
+
+ case "-unregister":
+ case @"/unregister":
+ case "-unregserver": // Emulate VB6
+ case @"/unregserver":
+ UnregisterObjects(); //Unregister each served object
+ bRet = false;
+ break;
+
+ default:
+ MessageBox.Show("Unknown argument: " + args[0] + "\nValid are : -register, -unregister and -embedding",
+ "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ break;
+ }
+ }
+ else
+ StartedByCOM = false;
+
+ return bRet;
+ }
+ #endregion
+
+ #region SERVER ENTRY POINT (main)
+ //
+ // ==================
+ // SERVER ENTRY POINT
+ // ==================
+ //
+ [STAThread]
+ static void Main(string[] args)
+ {
+ if (!LoadComObjectAssemblies()) return; // Load served COM class assemblies, get types
+
+ if (!ProcessArguments(args)) return; // Register/Unregister
+
+ // Initialize critical member variables.
+ objsInUse = 0;
+ serverLocks = 0;
+ MainThreadId = GetCurrentThreadId();
+ Thread.CurrentThread.Name = "Main Thread";
+
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ s_MainForm = new frmMain();
+ if (StartedByCOM) s_MainForm.WindowState = FormWindowState.Minimized;
+
+ // Register the class factories of the served objects
+ RegisterClassFactories();
+
+ // Start up the garbage collection thread.
+ GarbageCollection GarbageCollector = new GarbageCollection(1000);
+ Thread GCThread = new Thread(new ThreadStart(GarbageCollector.GCWatch));
+ GCThread.Name = "Garbage Collection Thread";
+ GCThread.Start();
+
+ //
+ // Start the message loop. This serializes incoming calls to our
+ // served COM objects, making this act like the VB6 equivalent!
+ //
+ try
+ {
+ Application.Run(s_MainForm);
+ }
+ finally
+ {
+ // Revoke the class factories immediately.
+ // Don't wait until the thread has stopped before
+ // we perform revocation!!!
+ RevokeClassFactories();
+
+ // Now stop the Garbage Collector thread.
+ GarbageCollector.StopThread();
+ GarbageCollector.WaitForThreadToStop();
+ }
+ }
+ #endregion
+ }
+}
diff --git a/Meade.net/LocalServer.snk b/Meade.net/LocalServer.snk
new file mode 100644
index 0000000..97e4406
Binary files /dev/null and b/Meade.net/LocalServer.snk differ
diff --git a/Meade.net/Meade.net.csproj b/Meade.net/Meade.net.csproj
new file mode 100644
index 0000000..18957ff
--- /dev/null
+++ b/Meade.net/Meade.net.csproj
@@ -0,0 +1,153 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.50727
+ 2.0
+ {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}
+ WinExe
+ Properties
+ ASCOM.Meade.net
+ ASCOM.Meade.net.Server
+ v4.7.1
+
+
+ 2.0
+
+
+ false
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ true
+
+
+ true
+ full
+ false
+ ..\bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ x86
+ MinimumRecommendedRules.ruleset
+ false
+
+
+ pdbonly
+ true
+ ..\bin\Release\
+ TRACE
+ prompt
+ 4
+ x86
+ false
+
+
+ true
+
+
+ LocalServer.snk
+
+
+ ASCOM.ico
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ frmMain.cs
+
+
+
+
+
+ Designer
+ frmMain.cs
+
+
+ True
+ True
+ Resources.resx
+
+
+
+ Form
+
+
+ SetupDialogForm.cs
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SetupDialogForm.cs
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ true
+
+
+ False
+ Windows Installer 3.1
+ true
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net/Properties/AssemblyInfo.cs b/Meade.net/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..af3da5d
--- /dev/null
+++ b/Meade.net/Properties/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ASCOM Meade.net server")]
+[assembly: AssemblyDescription("ASCOM multi-interface server for Meade.net")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("cjdawson.com")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Copyright © 2019 cjdawson.com")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("0.4.0.0")]
+[assembly: AssemblyFileVersion("0.4.0.0")]
+
+[assembly: ComVisibleAttribute(false)]
diff --git a/Meade.net/Properties/Resources.Designer.cs b/Meade.net/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..0255290
--- /dev/null
+++ b/Meade.net/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ASCOM.Meade.net.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ASCOM {
+ get {
+ object obj = ResourceManager.GetObject("ASCOM", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/Meade.net/Properties/Resources.resx b/Meade.net/Properties/Resources.resx
new file mode 100644
index 0000000..f4cef88
--- /dev/null
+++ b/Meade.net/Properties/Resources.resx
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Meade.net/ReadMe.htm b/Meade.net/ReadMe.htm
new file mode 100644
index 0000000..0a8dc80
--- /dev/null
+++ b/Meade.net/ReadMe.htm
@@ -0,0 +1,666 @@
+
+
+
+
+ Untitled Document
+
+
+
+
+
+
+
+
+
+
+
+
+ ASCOM LocalServer (singleton) Host
+
+ |
+
+
+
+
+
+
+
+
+ You have just created a local server (singleton) host for one or
+ more ASCOM driver classes.
+
+
+
+ This project implements an ASCOM host server for one or more
+ driver classes in a single-instance executable. It can be used to
+ serve multiple instances of a single driver class (hub), provide
+ driver services for multiple devices (e.g., Telescope and Focuser) to
+ multiple applications and allow multiple devices of the same type to
+ be connected. In the latter scenario, the multiple driver classes
+ will often share one or more resources such as the serial connection
+ and a microcontroller in the combined device. From the client's
+ perspective, using the drivers served by the local server is exactly
+ the same as if the drivers are loaded into the client's process space
+ (in-proc servers).
+
+
+
+ NOTE:
+
+
+ Unless you are prepared to handle all of the timing issues that arise
+ when multiple clients are accessing the properties and methods of
+ your driver(s), stop now. Just because the local server serializes
+ the calls to your driver(s)' properties and methods does not mean
+ that there will be no timing or concurrency issues.
+
For
+ example, suppose the hub serves instances of a Telescope driver. One
+ client sets the TargetRightAscension property, then another sets
+ TargetRightAscension to a different value, then the first client sets
+ TargetDeclination, then the first client calls SlewToTarget()
+ followed by the second client calling SlewToTarget(). Besides the
+ first client's slew command sending the scope to the wrong (and
+ possibly dangerous) coordinates, there is the problem of the second
+ client trying to slew a slewing scope. Local server drivers are
+ tricky to get right. There is no such thing as "ignorance is
+ bliss" here.
+
+
+
+
+
+ This implementation has changed
+ from what was defined for Platform 5.5 as follows:
+
+
+
+
+ The drivers are now installed in
+ the same folder as the local server executable. This makes deployment
+ cleaner because the whole driver can exist in a single folder
+ independently of other drivers.
+
+
+
+
+ The ProgId and friendly name as
+ displayed by the Chooser are defined using attributes. This allows
+ driver dlls to be identified clearly and so avoids confusion with
+ other dlls that may be required such as interop dlls.
+
+
+
+
+ Some changes have been made that
+ will facilitate generating multiple drivers of the same type.
+
+
+
+
+ I've put some additional advice and
+ comments in the notes below in italics.
+
+
+
+ You're probably anxious to get going, but you really should read
+ through the Theory of Operation and
+ Detailed
+ Use and Deployment
+ below.
+
+ You must do the following in order to complete your local server:
+
+ -
+
+ In the local server's project
+ properties, Application tab, change BOTH the AssemblyName and the
+ default assembly name to ASCOM.xxx (e.g., ASCOM.SuperScope).
+ This
+ may be done by default now.
+
+
+
+ -
+
+ Add one or more driver skeleton
+ projects using the in-proc templates. You may use either the C# or
+ VB templates. Project name is not important (not used in ProgID)
+ choose something like TelescopeDriver. You will be changing the
+ substituted project name in these projects below. If you ensure that
+ the LocalServer and all the driver projects have the same NameSpace
+ e.g. ASCOM.SuperScope the renaming in section 6a will not be
+ required.
+
+
+ -
+
+ Develop and debug these driver
+ projects as normal in-process assemblies. This will be much simpler
+ because the driver and test code can be debugged in the same
+ process.
+
+
+ -
+
+ Build the LocalServer.
+
+
+ -
+
+ Set a reference to the local
+ server project in each of the driver skeleton
+ projects.
+
+
+ -
+
In each skeleton driver project:
+
+ -
+
+ Do a Find In Files for the
+ project name of the skeleton driver (e.g., TelescopeDriver) and
+ change it to match the project name of your local server (e.g.
+ SuperScope). You don't have to do this in the ReadMe.html file.
+ Everywhere else, however, is IMPORTANT. This sets the correct
+ namespace, progID, etc. If you're a bit more brave, you can use
+ Replace in Files.
+ This may not be needed if the correct
+ namespace and naming conventions have been followed when the
+ drivers and local server were generated.
+
+
+
+ -
+
+ In project properties,
+ Application tab, change the assembly name to
+ ASCOM.localserverprojectname.drivertype,
+ (e.g., ASCOM.SuperScope.Telescope).
+
+
+ -
+
+ In project properties,
+ Application tab, click Assembly Information...
+
+
+ -
+
+ Assure that Make assembly COM
+ visible is on (it should already be on).
+
+
+ -
+
+ Edit the Product Name to be the
+ "friendly name" of your driver as will be shown in the
+ Chooser.
+ Not used now, use the ServedClassName attribute
+ instead.
+
+
+
+
+
+ -
+
+ In project properties, Build tab,
+ turn off Register for COM Interop.
+
+
+ -
+
+ Modify the driver class declaration to inherit from
+ ReferenceCountedObjectBase. Examples:
C#:
+
+
+ public class Telescope :
+ ReferenceCountedObjectBase,
+ ITelescope
+
+
+ VB:
+
+
+ Public Class Telescope
+ '==================================
+ Inherits ReferenceCountedObjectBase
+ Implements ITelescope
+ '==================================
+
+
+ -
+
+ In driver.cs/driver.vb, remove
+ the entire ASCOM Registration region
+
+
+ -
+
+ In driver.cs/driver.vb, remove
+ the private strings for driver ID and driver description.
+ They
+ may be needed internally, and if so should be set from the
+ associated attributes, ServedClassName for the description and
+ ProgId for the driver Id.
+
+
+
+ -
+
+ Modify the class attributes by
+ adding the ServedClassName and ProgID attributes. The
+ ServedClassName attribute must be the friendly name shown as the
+ device name in the Chooser and the ProgId the progid of the driver
+ e.g. ASCOM.SuperScope.Telescope. The class header should look like
+ this:
+
+ C#:
+
+
+ [Guid("0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B")] // set by the template
+ [ProgId("ASCOM.SuperScope.Telescope")]
+ [ServedClassName ("Super Scope Telescope")]
+ [ClassInterface(ClassInterfaceType.None)]
+ public class Telescope : ReferenceCountedObjectBase , ITelescope
+
+
+
+
+
+
+
+
+
+
+
+ VB:
+
+
+ <Guid(“0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B”)>
+ <ProgId(“ASCOM.SuperScope.Telescope”)>
+ <ServedClassName(“Super Scope Telescope”)>
+ Public Class Telescope
+ '==================================
+ Inherits ReferenceCountedObjectBase
+ Implements ITelescope
+ '==================================
+
+
+
+
+
+ Add the following line to the driver
+ constructor, this sets the driver ID using the ProgId Attribute:
+
+
+
+ C#
+
+
+ s_csDriverID = Marshal.GenerateProgIdForType(this.GetType());
+
+
+ VB:
+
+
+ s_csDriverID = Marshal.GenerateProgIdForType(Me.GetType())
+
+
+
+ -
+
+ Unless you're writing a
+ single-driver hub, you will have two or more driver types (e.g.
+ Telescope and Focuser) and thus two or more driver assembly projects
+ added. Presumably, these drivers need to share some resources (e.g.
+ a single COM port via Helper.Serial).
+ Put shared resources into
+ the SharedResources class provided
+ . There are some examples that
+ should give a clue, modify and delete these as required.
+
+
+ -
+
+ A shared serial port is already
+ provided (see SharedResources.cs) as SharedResources.SharedSerial
+ and it is an ASCOM Helper Serial object. You may wish to define
+ additional shared resources in static member variables with public
+ static accessor properties as is already done for SharedSerial.
+ Unfortunately, if you are a Visual Basic programmer, you will have
+ to make these additions in C#.
+
+
+ -
+
+ If you are writing a hub and don't
+ need the serial port, in SharedResources.cs you can remove the
+ public static SharedSerial property, the m_SharedSerial member in
+ the private data region, and the line in main that initializes it.
+ If you don't need any other shared resources for your hub, then you
+ can remove the SharedResources.cs file completely.
+
+
+ -
+
+ If you modified the LocalServer,
+ build it again now. This will refresh the stuff that's visible to
+ the drivers.
+
+
+ -
+
+ Build the driver skeletons to
+ verify that you got all of the namespace and other variable changes.
+
+
+ -
+
+ The local server dynamically loads the driver assemblies from
+ the same folder as the local server executable.
+
During
+ development, you'll need to add a post-build task to each of your
+ driver assembly projects which puts a copy of the driver assembly
+ into the local server executable folder. Here is an example:
+
+ copy "$(TargetPath)" "$(SolutionDir)\SuperScope\$(OutDir)\$(TargetFileName)"
+
+ This assumes that the server project is called “SuperScope”,
+ and handles using the debug or release build.
+ Note the quotes for
+ possible path elements with spaces in them.
+ An alternative is to
+ set the build path to the required destination instead of the
+ default path.
+
+
+
+ -
+
+
+ Make sure the drivers are
+ registered through the local server by running it with the /register
+ parameter, see below for details.
+
+
+
+ -
+
+ IMPORTANT:
+ With a local server based driver (or hub) it is possible for
+ multiple clients to control the device(s). It is up to you to
+ safeguard against abuse.
+ The sort of thing that's needed is to
+ have a counter of the number of connections to a device, the
+ connection is only fully broken when the number of connections is
+ zero. You may also need code to prevent several drivers from talking
+ to the hardware at the same time, the lock pattern is useful for
+ that.
+
+
+
+ -
+
+ You may want to add controls and/or status information to the
+ main form frmMain of the local server. Please resist the temptation
+ to turn the local server's main form into a graphical device control
+ panel. Instead, make a separate application that uses the served
+ driver(s). A driver is not a program!
+
+
+
+ Notes
+
+ -
+
+ The local server handles all of
+ the registration and unregistration for each of its served driver
+ classes, including the ASCOM Chooser info and the DCOM/AppID info
+ needed for activation from TheSky. By running the server from a
+ command line and giving /register or /unregister as the command line
+ option, it will register or unregister all served classes
+ (respectively).
+ Never use REGASM
+ on the local server executable!
+
+ This can be done in the
+ Visual Studio IDE by setting the server project to run as startup
+ and setting the command line argument to /register in Debug –
+ Start Options.
+
+
+
+ -
+
+ When you make the installer for
+ your local server based driver/hub, do not let it register the
+ executable for COM. Instead, have it activate the installed local
+ server with the /register option.
+
+
+ -
+
+ The ASCOM registration uses the ServedClassName attribute as
+ the friendly name that will show in the chooser and the ProgId
+ attribute as the driver Id.
+
+
+ -
+
+ The best deployment way is to install all the files in a
+ folder that's a sub folder of the main driver, so the SuperScope
+ driver files will be in the folder ...\ASCOM\Telescope\SuperScope.
+ This can be done in the Inno script by changing the DefaultDirName
+ like this:
+ DefaultDirName="{cf}\ASCOM\Telescope\SuperScope"
then
+ the files can all be installed with DestDir: {app};
+
+
+
+
+ Theory of Operation
+
+
+ The local server is an executable which can provide multiple
+ instances of multiple drivers to multiple clients. This capability is
+ needed for two applications:
+
+
+ -
+
+ A hub, which allows multiple
+ clients to share a single device
+
+
+ -
+
+ A device which provides multiple services, such as a
+ telescope which has a focuser built-in where both the telescope and
+ focuser are controlled by the same serial connection and different
+ client programs need to control to the focuser and telescope.
+
+
+
+
+ By simply dropping suitably developed driver assemblies into the
+ same folder as the local server executable, the local server will
+ find them and register them for COM and ASCOM and serve any number of
+ instances of the drivers' interfaces to any number of client
+ programs. It does this by locating and loading the driver assemblies,
+ analysing them to detect their classes and interfaces, and
+ implementing a class factory that can create instances of them for
+ clients.
+
+
+ A driver is an assembly which contains a class that implements
+ one of the ASCOM standard driver interfaces and inherits the
+ ReferenceCountedObjectBase class of the local server. Apart from
+ that, driver assemblies are identical to those that are used
+ in-process (DLL-type). The instructions above detail the steps needed
+ to convert an in-process driver into one that can be served by the
+ local server.
+
+
+ The name of the local server is important, so we provide it as a
+ template from which you can create a local server for your
+ produce. To make this clear, let's assume that your company AlphaTech
+ produces a telescope system which contains a microcontroller that is
+ able to control not only the telescope mount, but also a focuser and
+ a camera rotator. The mount, focuser, and rotator are all controlled
+ via commands sent through a common serial line connecting the
+ computer to the microcontroller, so you need a local server. In
+ ASCOM, then, you probably want your system to appear as
+ AlphaTech.Telescope, AlphaTech.Focuser, and AlphaTech.Rotator. Then
+ you would name the local server AlphaTech. Be sure to give this due
+ consideration before creating the template, the project name is the
+ name of your local server.
+ Is this still correct? I get the
+ impression that ASCOM.AlphaTech.Server would be OK.
+
+
+
+ The fact that driver classes inherit from the local server's
+ ReferenceCountedObjectBase class allows the local server to maintain
+ a reference count on the driver class. If a client creates an
+ instance of a served driver, the local server automatically starts up
+ and provides an instance of the class to the client. Once started the
+ local server can provide additional instances of any of its served
+ driver classes. If the reference count of all served classes drops to
+ zero as a result of clients releasing their instances, the local
+ server will automatically exit.
+
+
+ Registration services provided include not only the basic COM
+ class registration, but also DCOM/AppID info needed to use the served
+ classes from outbound connections from Software Bisque's TheSky. It
+ also registers the served classes for the ASCOM Chooser. The
+ "friendly" name of each served driver that appears in the
+ chooser comes from the driver's ServedClassName attribute. This also
+ used to identify a driver so that non driver dlls, such as Interop
+ dlls can be ignored. The COM ProgID for each served driver is
+ specified in the ProgId attribute - ASCOM.localservername.drivertype,
+ for example, ASCOM.AlphaTech.Telescope, where AlphaTech is the local
+ server name and Telescope is the type of the driver. Unregistering
+ removes all of this information from the system. Specifying the
+ ProgId as an attribute allows multiple driver assemblies to be
+ generated using the same source and namespace. This is used to
+ provide multiple instances of the same driver, each with a different
+ ProgId and so able to be registered separately.
+
+
+ Driver DLLs are identified for registering/unregistering because
+ they contain a type with the ServedClassName attribute. Only these
+ will be registered for Com and ASCOM. This has changed; in Platform
+ 5 there was no attribute and the local server attempted to register
+ all dlls. The new behaviour allows support dlls such as interop dlls
+ to be included without them being registered incorrectly. There was
+ also an interim version where the ServedClassName attribute was on
+ the assembly, not the class.
+ All these previous versions, and the
+ new drivers will operate together with Platform 6, the changes are
+ local to the individual drivers.
+
+
+
+ Detailed Use and Deployment
+
+
+ Once you have built your local server and the served driver class
+ assemblies, here's how to use it. To register the served classes,
+ activate the local server from a shell command line with the option
+ /register (or /regserver, for VB6 compatibility):
+
+
+ C:\xxx> localserver.exe /register
+
+
+ To unregister the local server and its drivers, activate the local
+ server from a shell command line with the option /unregister (or
+ /unregserver for VB6 compatibility):
+
+
+ C:\xxx> localserver.exe /unregister
+
+
+ When the operating system starts the local server in response to a
+ client creating one of it's served driver classes, the command option
+ /embedding is included. The local server's code detects this and sets
+ a variable that you can use.
+
+
+ When deploying a hub or set of drivers
+ with the local server, you'll have to arrange for the local server
+ and the driver assemblies to be placed together in a folder in the
+ ASCOM driver folder. Any support files, such as Interop DLLs can be
+ put in the same fiolder. That's all you need to do, the local server
+ will find them in the same folder as it is located in.
+
+
+
+
+
+
+
+
+ ASCOM Initiative
+ |
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+ The ASCOM Initiative consists of a group of astronomy software
+ developers and instrument vendors whose goals are to promote the
+ driver/client model and scripting automation.
+
+
+ See the
+ ASCOM
+ web site
+ for more information. Please participate in the
+
+ ASCOM-Talk
+ Yahoo Group
+ .
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net/ReferenceCountedObject.cs b/Meade.net/ReferenceCountedObject.cs
new file mode 100644
index 0000000..7c7b7f2
--- /dev/null
+++ b/Meade.net/ReferenceCountedObject.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace ASCOM.Meade.net
+{
+ [ComVisible(false)]
+ public class ReferenceCountedObjectBase
+ {
+ public ReferenceCountedObjectBase()
+ {
+ // We increment the global count of objects.
+ Server.CountObject();
+ }
+
+ ~ReferenceCountedObjectBase()
+ {
+ // We decrement the global count of objects.
+ Server.UncountObject();
+ // We then immediately test to see if we the conditions
+ // are right to attempt to terminate this server application.
+ Server.ExitIf();
+ }
+ }
+}
diff --git a/Meade.net/Resources/ASCOM.bmp b/Meade.net/Resources/ASCOM.bmp
new file mode 100644
index 0000000..55516c7
Binary files /dev/null and b/Meade.net/Resources/ASCOM.bmp differ
diff --git a/MeadeAutostar497/AscomClasses/SetupDialogForm.cs b/Meade.net/SetupDialogForm.cs
similarity index 66%
rename from MeadeAutostar497/AscomClasses/SetupDialogForm.cs
rename to Meade.net/SetupDialogForm.cs
index 5091c9a..79b1816 100644
--- a/MeadeAutostar497/AscomClasses/SetupDialogForm.cs
+++ b/Meade.net/SetupDialogForm.cs
@@ -6,9 +6,9 @@ using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using ASCOM.Utilities;
-using ASCOM.MeadeAutostar497;
+using ASCOM.Meade.net;
-namespace ASCOM.MeadeAutostar497
+namespace ASCOM.Meade.net
{
[ComVisible(false)] // Form not registered for COM!
public partial class SetupDialogForm : Form
@@ -16,16 +16,6 @@ namespace ASCOM.MeadeAutostar497
public SetupDialogForm()
{
InitializeComponent();
- // Initialise current values of user settings from the ASCOM Profile
- InitUI();
- }
-
- private void cmdOK_Click(object sender, EventArgs e) // OK button event handler
- {
- // Place any validation constraint checks here
- // Update the state variables with results from the dialogue
- Telescope.comPort = (string)comboBoxComPort.SelectedItem;
- Telescope.tl.Enabled = chkTrace.Checked;
}
private void cmdCancel_Click(object sender, EventArgs e) // Cancel button event handler
@@ -48,19 +38,30 @@ namespace ASCOM.MeadeAutostar497
{
MessageBox.Show(other.Message);
}
- }
+ }
- private void InitUI()
+ public void SetProfile(ProfileProperties profileProperties)
{
- chkTrace.Checked = Telescope.tl.Enabled;
+ chkTrace.Checked = profileProperties.TraceLogger;
// set the list of com ports to those that are currently available
comboBoxComPort.Items.Clear();
comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); // use System.IO because it's static
// select the current port if possible
- if (comboBoxComPort.Items.Contains(Telescope.comPort))
+ if (comboBoxComPort.Items.Contains(profileProperties.ComPort))
{
- comboBoxComPort.SelectedItem = Telescope.comPort;
+ comboBoxComPort.SelectedItem = profileProperties.ComPort;
}
}
+
+ public ProfileProperties GetProfile()
+ {
+ var profileProperties = new ProfileProperties
+ {
+ TraceLogger = chkTrace.Checked,
+ ComPort = comboBoxComPort.SelectedItem.ToString()
+ };
+
+ return profileProperties;
+ }
}
}
\ No newline at end of file
diff --git a/MeadeAutostar497/AscomClasses/SetupDialogForm.designer.cs b/Meade.net/SetupDialogForm.designer.cs
similarity index 96%
rename from MeadeAutostar497/AscomClasses/SetupDialogForm.designer.cs
rename to Meade.net/SetupDialogForm.designer.cs
index 913fdc4..881dfcd 100644
--- a/MeadeAutostar497/AscomClasses/SetupDialogForm.designer.cs
+++ b/Meade.net/SetupDialogForm.designer.cs
@@ -1,4 +1,4 @@
-namespace ASCOM.MeadeAutostar497
+namespace ASCOM.Meade.net
{
partial class SetupDialogForm
{
@@ -48,7 +48,6 @@ namespace ASCOM.MeadeAutostar497
this.cmdOK.TabIndex = 0;
this.cmdOK.Text = "OK";
this.cmdOK.UseVisualStyleBackColor = true;
- this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
//
// cmdCancel
//
@@ -74,7 +73,7 @@ namespace ASCOM.MeadeAutostar497
//
this.picASCOM.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.picASCOM.Cursor = System.Windows.Forms.Cursors.Hand;
- this.picASCOM.Image = global::ASCOM.MeadeAutostar497.Properties.Resources.ASCOM;
+ this.picASCOM.Image = global::ASCOM.Meade.net.Properties.Resources.ASCOM;
this.picASCOM.Location = new System.Drawing.Point(292, 9);
this.picASCOM.Name = "picASCOM";
this.picASCOM.Size = new System.Drawing.Size(48, 56);
@@ -129,7 +128,7 @@ namespace ASCOM.MeadeAutostar497
this.Name = "SetupDialogForm";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "MeadeAutostar497 Setup";
+ this.Text = "Meade.net Setup";
((System.ComponentModel.ISupportInitialize)(this.picASCOM)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
diff --git a/MeadeAutostar497/AscomClasses/SetupDialogForm.resx b/Meade.net/SetupDialogForm.resx
similarity index 100%
rename from MeadeAutostar497/AscomClasses/SetupDialogForm.resx
rename to Meade.net/SetupDialogForm.resx
diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs
new file mode 100644
index 0000000..342e56c
--- /dev/null
+++ b/Meade.net/SharedResources.cs
@@ -0,0 +1,382 @@
+//
+// ================
+// Shared Resources
+// ================
+//
+// This class is a container for all shared resources that may be needed
+// by the drivers served by the Local Server.
+//
+// NOTES:
+//
+// * ALL DECLARATIONS MUST BE STATIC HERE!! INSTANCES OF THIS CLASS MUST NEVER BE CREATED!
+//
+// Written by: Bob Denny 29-May-2007
+// Modified by Chris Rowland and Peter Simpson to hamdle multiple hardware devices March 2011
+//
+using System;
+using System.Collections.Generic;
+using System.Text;
+using ASCOM;
+using ASCOM.Utilities;
+
+namespace ASCOM.Meade.net
+{
+ public class ProfileProperties
+ {
+ // properies that are part of the profile
+ public string ComPort { get; set; }
+ public bool TraceLogger { get; set; }
+ }
+
+ ///
+ /// The resources shared by all drivers and devices, in this example it's a serial port with a shared SendMessage method
+ /// an idea for locking the message and handling connecting is given.
+ /// In reality extensive changes will probably be needed.
+ /// Multiple drivers means that several applications connect to the same hardware device, aka a hub.
+ /// Multiple devices means that there are more than one instance of the hardware, such as two focusers.
+ /// In this case there needs to be multiple instances of the hardware connector, each with it's own connection count.
+ ///
+ public static class SharedResources
+ {
+ // object used for locking to prevent multiple drivers accessing common code at the same time
+ private static readonly object lockObject = new object();
+
+ // Shared serial port. This will allow multiple drivers to use one single serial port.
+ private static ASCOM.Utilities.Serial s_sharedSerial = new ASCOM.Utilities.Serial(); // Shared serial port
+ private static int s_z = 0; // counter for the number of connections to the serial port
+
+ //
+ // Public access to shared resources
+ //
+
+ #region single serial port connector
+
+ //
+ // this region shows a way that a single serial port could be connected to by multiple
+ // drivers.
+ //
+ // Connected is used to handle the connections to the port.
+ //
+ // SendMessage is a way that messages could be sent to the hardware without
+ // conflicts between different drivers.
+ //
+ // All this is for a single connection, multiple connections would need multiple ports
+ // and a way to handle connecting and disconnection from them - see the
+ // multi driver handling section for ideas.
+ //
+
+ ///
+ /// Shared serial port
+ ///
+ public static ASCOM.Utilities.Serial SharedSerial
+ {
+ get { return s_sharedSerial; }
+ }
+
+ ///
+ /// number of connections to the shared serial port
+ ///
+ public static int connections
+ {
+ get { return s_z; }
+ set { s_z = value; }
+ }
+
+ public static void SendBlind(string message)
+ {
+ lock (lockObject)
+ {
+ SharedSerial.ClearBuffers();
+ SharedSerial.Transmit(message);
+ }
+ }
+
+ public static bool SendBool(string message)
+ {
+ SharedSerial.ClearBuffers();
+ return SendChar(message) == "1";
+ }
+
+ ///
+ /// Example of a shared SendMessage method, the lock
+ /// prevents different drivers tripping over one another.
+ /// It needs error handling and assumes that the message will be sent unchanged
+ /// and that the reply will always be terminated by a "#" character.
+ ///
+ ///
+ ///
+ public static string SendString(string message)
+ {
+ lock (lockObject)
+ {
+ SharedSerial.ClearBuffers();
+ SharedSerial.Transmit(message);
+ return SharedSerial.ReceiveTerminated("#").TrimEnd('#');
+ }
+ }
+
+ public static string SendChar(string message)
+ {
+ lock (lockObject)
+ {
+ SharedSerial.ClearBuffers();
+ SharedSerial.Transmit(message);
+ return SharedSerial.ReceiveCounted(1);
+ }
+ }
+
+ public static string ReadTerminated()
+ {
+ lock (lockObject)
+ {
+ return SharedSerial.ReceiveTerminated("#");
+ }
+ }
+
+ ///
+ /// Example of handling connecting to and disconnection from the
+ /// shared serial port.
+ /// Needs error handling
+ /// the port name etc. needs to be set up first, this could be done by the driver
+ /// checking Connected and if it's false setting up the port before setting connected to true.
+ /// It could also be put here.
+ ///
+ public static bool Connected
+ {
+ set
+ {
+ lock (lockObject)
+ {
+ if (value)
+ {
+ if (s_z == 0)
+ SharedSerial.Connected = true;
+ s_z++;
+ }
+ else
+ {
+ s_z--;
+ if (s_z <= 0)
+ {
+ SharedSerial.Connected = false;
+ }
+ }
+ }
+ }
+ get { return SharedSerial.Connected; }
+ }
+
+ #endregion
+
+ #region Profile
+
+ internal static string driverID = "ASCOM.MeadeGeneric.Telescope";
+
+ // Constants used for Profile persistence
+ internal static string comPortProfileName = "COM Port";
+ internal static string traceStateProfileName = "Trace Level";
+
+ public static void WriteProfile(ProfileProperties profileProperties)
+ {
+ using (Profile driverProfile = new Profile())
+ {
+ driverProfile.DeviceType = "Telescope";
+ driverProfile.WriteValue(driverID, traceStateProfileName, profileProperties.TraceLogger.ToString());
+ driverProfile.WriteValue(driverID, comPortProfileName, profileProperties.ComPort);
+ }
+ }
+
+ private static readonly string comPortDefault = "COM1";
+ internal static string traceStateDefault = "false";
+
+ public static ProfileProperties ReadProfile()
+ {
+ ProfileProperties profileProperties = new ProfileProperties();
+ using (Profile driverProfile = new Profile())
+ {
+ driverProfile.DeviceType = "Telescope";
+ profileProperties.ComPort =
+ driverProfile.GetValue(driverID, comPortProfileName, string.Empty, comPortDefault);
+ profileProperties.TraceLogger = Convert.ToBoolean(driverProfile.GetValue(driverID,
+ traceStateProfileName, string.Empty, traceStateDefault));
+ }
+
+ return profileProperties;
+ }
+
+ #endregion
+
+ #region SetupDialog
+
+ public static void SetupDialog()
+ {
+ // consider only showing the setup dialog if not connected
+ // or call a different dialog if connected
+ if (SharedSerial.Connected)
+ {
+ System.Windows.Forms.MessageBox.Show("Already connected, please disconnect before altering settings");
+ return;
+ }
+
+ var profileProperties = ReadProfile();
+
+ using (SetupDialogForm F = new SetupDialogForm())
+ {
+ F.SetProfile(profileProperties);
+
+ var result = F.ShowDialog();
+ if (result == System.Windows.Forms.DialogResult.OK)
+ {
+ profileProperties = F.GetProfile();
+
+ WriteProfile(profileProperties); // Persist device configuration values to the ASCOM Profile store
+ }
+ }
+ }
+
+ #endregion
+
+ #region Multi Driver handling
+
+ // this section illustrates how multiple drivers could be handled,
+ // it's for drivers where multiple connections to the hardware can be made and ensures that the
+ // hardware is only disconnected from when all the connected devices have disconnected.
+
+ // It is NOT a complete solution! This is to give ideas of what can - or should be done.
+ //
+ // An alternative would be to move the hardware control here, handle connecting and disconnecting,
+ // and provide the device with a suitable connection to the hardware.
+ //
+ ///
+ /// dictionary carrying device connections.
+ /// The Key is the connection number that identifies the device, it could be the COM port name,
+ /// USB ID or IP Address, the Value is the DeviceHardware class
+ ///
+ private static Dictionary connectedDevices = new Dictionary();
+
+ ///
+ /// This is called in the driver Connect(true) property,
+ /// it add the device id to the list of devices if it's not there and increments the device count.
+ ///
+ ///
+ public static void Connect(string deviceId)
+ {
+ lock (lockObject)
+ {
+ if (!connectedDevices.ContainsKey(deviceId))
+ connectedDevices.Add(deviceId, new DeviceHardware());
+ connectedDevices[deviceId].count++; // increment the value
+
+ if (deviceId == "Serial")
+ {
+ if (connectedDevices[deviceId].count == 1)
+ {
+ var profileProperties = ReadProfile();
+ SharedResources.SharedSerial.PortName = profileProperties.ComPort;
+ SharedResources.SharedSerial.DTREnable = false;
+ SharedResources.SharedSerial.RTSEnable = false;
+ SharedResources.SharedSerial.DataBits = 8;
+ SharedResources.SharedSerial.StopBits = SerialStopBits.One;
+ SharedResources.SharedSerial.Parity = SerialParity.None;
+ SharedResources.SharedSerial.Speed = SerialSpeed.ps9600;
+ SharedResources.SharedSerial.Handshake = SerialHandshake.None;
+ SharedResources.SharedSerial.Connected = true;
+
+ string firmware = SendString(":GVN#");
+ }
+ }
+ }
+ }
+
+ public static void Disconnect(string deviceId)
+ {
+ lock (lockObject)
+ {
+ if (connectedDevices.ContainsKey(deviceId))
+ {
+ connectedDevices[deviceId].count--;
+ if (connectedDevices[deviceId].count <= 0)
+ {
+ connectedDevices.Remove(deviceId);
+ if (deviceId == "Serial")
+ {
+ SharedResources.SharedSerial.Connected = false;
+ }
+ }
+ }
+ }
+ }
+
+ public static bool IsConnected(string deviceId)
+ {
+ if (connectedDevices.ContainsKey(deviceId))
+ return (connectedDevices[deviceId].count > 0);
+ else
+ return false;
+ }
+
+ #endregion
+
+ public static void Lock(Action action)
+ {
+ lock (lockObject)
+ {
+ action();
+ }
+ }
+
+ public static T Lock(Func func)
+ {
+ lock (lockObject)
+ {
+ return func();
+ }
+ }
+
+ ///
+ /// Skeleton of a hardware class, all this does is hold a count of the connections,
+ /// in reality extra code will be needed to handle the hardware in some way
+ ///
+ public class DeviceHardware
+ {
+ private int _count;
+
+ internal int count
+ {
+ set => _count = value;
+ get => _count;
+ }
+
+ internal DeviceHardware()
+ {
+ count = 0;
+ }
+ }
+
+ //#region ServedClassName attribute
+ /////
+ ///// This is only needed if the driver is targeted at platform 5.5, it is included with Platform 6
+ /////
+ //[global::System.AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
+ //public sealed class ServedClassNameAttribute : Attribute
+ //{
+ // // See the attribute guidelines at
+ // // http://go.microsoft.com/fwlink/?LinkId=85236
+
+ // ///
+ // /// Gets or sets the 'friendly name' of the served class, as registered with the ASCOM Chooser.
+ // ///
+ // /// The 'friendly name' of the served class.
+ // public string DisplayName { get; private set; }
+ // ///
+ // /// Initializes a new instance of the class.
+ // ///
+ // /// The 'friendly name' of the served class.
+ // public ServedClassNameAttribute(string servedClassName)
+ // {
+ // DisplayName = servedClassName;
+ // }
+ //}
+ //#endregion
+ }
+}
\ No newline at end of file
diff --git a/Meade.net/app.config b/Meade.net/app.config
new file mode 100644
index 0000000..70dcdba
--- /dev/null
+++ b/Meade.net/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Meade.net/frmMain.Designer.cs b/Meade.net/frmMain.Designer.cs
new file mode 100644
index 0000000..83c8dd1
--- /dev/null
+++ b/Meade.net/frmMain.Designer.cs
@@ -0,0 +1,63 @@
+using System;
+
+namespace ASCOM.Meade.net
+{
+ partial class frmMain
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.Location = new System.Drawing.Point(12, 10);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(199, 33);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "This is an ASCOM driver, not a program for you to use.";
+ //
+ // frmMain
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(233, 52);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.Name = "frmMain";
+ this.Text = "Meade.net Driver Server";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+
+ }
+}
+
diff --git a/Meade.net/frmMain.cs b/Meade.net/frmMain.cs
new file mode 100644
index 0000000..92b3be7
--- /dev/null
+++ b/Meade.net/frmMain.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace ASCOM.Meade.net
+{
+ public partial class frmMain : Form
+ {
+ delegate void SetTextCallback(string text);
+
+ public frmMain()
+ {
+ InitializeComponent();
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Meade.net/frmMain.resx b/Meade.net/frmMain.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/Meade.net/frmMain.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MeadeAutostar497.UnitTests/BootstrapAscomProfileStore.ps1 b/MeadeAutostar497.UnitTests/BootstrapAscomProfileStore.ps1
deleted file mode 100644
index 213c64d..0000000
--- a/MeadeAutostar497.UnitTests/BootstrapAscomProfileStore.ps1
+++ /dev/null
@@ -1,36 +0,0 @@
-<#
-This script initializes a bare minimum set of registry entries required for ASCOM.Utilities.Profile to work
-without throwing any exceptions. When building on a build server, or on a computer without the ASCOM Platform installed,
-it may be useful to execute this script as a build step prior to running any unit tests, or calling any code that relies on
-ASCOM.Utilities.Profile. The alternative is to install the ASCOM Platform on the build agent.
-
-NOTE: This script equires elevated permissions because it creates registry keys in the LocalMachine hive.
-#>
-
-$wow = Test-Path HKLM:\SOFTWARE\Wow6432Node
-if ($wow)
- {
- $root = "HKLM:\SOFTWARE\Wow6432Node"
- }
-else
- {
- $root = "HKLM:\SOFTWARE"
- }
-$ascomRoot = $root + "\ASCOM"
-
-if (Test-Path $ascomRoot)
- {
- <# Don't upset an already-existing ASCOM registry #>
- exit
- }
-
-<# Create the ASCOM root key and set it's ACL to allow all users read/write access #>
-New-Item -Path $root -Name ASCOM –Force
-$ascomAcl = Get-Acl $ascomRoot
-$aclRule = New-Object System.Security.AccessControl.RegistryAccessRule ("Users","FullControl","Allow")
-$ascomAcl.SetAccessRule($aclRule)
-$ascomAcl | Set-Acl -Path $ascomRoot
-
-<# Now create the bare minimum keys required so that ASCOM.Utilities.Profile doesn't crash and burn #>
-New-ItemProperty -Path $ascomRoot -Name PlatformVersion -Value "6.1" -PropertyType String –Force
-New-ItemProperty -Path $ascomRoot -Name SerTraceFile -Value "C:\SerialTraceAuto.txt" -PropertyType String –Force
diff --git a/MeadeAutostar497.UnitTests/MeadeAutostar497.UnitTests.csproj b/MeadeAutostar497.UnitTests/MeadeAutostar497.UnitTests.csproj
deleted file mode 100644
index 47bf469..0000000
--- a/MeadeAutostar497.UnitTests/MeadeAutostar497.UnitTests.csproj
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
- Debug
- AnyCPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}
- Library
- Properties
- MeadeAutostar497.UnitTests
- MeadeAutostar497.UnitTests
- v4.6.2
- 512
- true
-
-
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
- false
- AnyCPU
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
- false
-
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Astrometry.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Attributes.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Cache.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Controls.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DeviceInterfaces.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DriverAccess.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Exceptions.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Internal.Extensions.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.SettingsProvider.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.dll
-
-
- ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.Video.dll
-
-
- ..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll
-
-
- ..\packages\Moq.4.10.1\lib\net45\Moq.dll
-
-
- ..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll
-
-
-
-
-
-
- ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll
-
-
-
-
- ..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {64308775-bd4a-469c-bcab-3ed830b811af}
- MeadeAutostar497
-
-
-
-
-
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
\ No newline at end of file
diff --git a/MeadeAutostar497.UnitTests/TelescopeControllerUnitTests.cs b/MeadeAutostar497.UnitTests/TelescopeControllerUnitTests.cs
deleted file mode 100644
index 97f4fcf..0000000
--- a/MeadeAutostar497.UnitTests/TelescopeControllerUnitTests.cs
+++ /dev/null
@@ -1,556 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Configuration;
-using System.IO.Ports;
-using ASCOM;
-using ASCOM.DeviceInterface;
-using ASCOM.MeadeAutostar497.Controller;
-using Moq;
-using NUnit.Framework;
-
-namespace MeadeAutostar497.UnitTests
-{
- [TestFixture]
- public class TelescopeControllerUnitTests
- {
- private Mock serialMock;
-
- private readonly List _availableComPorts = new List { "COM1", "COM2", "COM3" };
- private TelescopeController _telescopeController;
-
- private string _stringToRecieve = string.Empty;
- private bool _isConnected = false;
-
- [SetUp]
- public void Setup()
- {
- _stringToRecieve = string.Empty;
- _isConnected = false;
-
- serialMock = new Mock();
- serialMock.SetupAllProperties();
- serialMock.Setup(x => x.GetPortNames()).Returns(() => _availableComPorts.ToArray());
- serialMock.Setup(x => x.CommandTerminated(It.IsAny(), It.IsAny()))
- .Returns(() => _stringToRecieve);
- serialMock.Setup(x => x.IsOpen).Returns(() => _isConnected);
-
- //Todo inject the serialMock instead of using a singleton to increase code stability.
- _telescopeController = TelescopeController.Instance;
- _telescopeController.SerialPort = serialMock.Object;
- }
-
- [TearDown]
- public void TearDown()
- {
- _isConnected = false;
- _telescopeController.Connected = false;
- _telescopeController.Port = "COM1";
- }
-
- [Test]
- public void ImplementsExpectedInterfaces()
- {
- Assert.That(_telescopeController, Is.Not.Null);
- Assert.That(_telescopeController, Is.AssignableTo());
- }
-
- [Test]
- public void NotConnectedByDefault()
- {
- Assert.That(_telescopeController.Connected, Is.False);
- }
-
- [Test]
- public void ConnectedCanBeSetTrue()
- {
- _stringToRecieve = "test#";
- _isConnected = true;
-
- _telescopeController.Connected = true;
- Assert.That(_telescopeController.Connected, Is.True);
- }
-
- [Test]
- public void EnsureThatTheSerialCommunicationsAreSetCorrectly()
- {
- Assert.That(serialMock.Object.IsOpen, Is.False);
-
- _stringToRecieve = "test#";
- _telescopeController.Connected = true;
- _isConnected = true;
- Assert.That(_telescopeController.Connected, Is.True);
-
- serialMock.Verify(x => x.Open(), Times.Once);
-
- Assert.That(serialMock.Object.DtrEnable, Is.False);
- Assert.That(serialMock.Object.RtsEnable, Is.False);
- Assert.That(serialMock.Object.BaudRate, Is.EqualTo(9600));
- Assert.That(serialMock.Object.DataBits, Is.EqualTo(8));
- Assert.That(serialMock.Object.StopBits, Is.EqualTo(StopBits.One));
- Assert.That(serialMock.Object.Parity, Is.EqualTo(Parity.None));
- Assert.That(serialMock.Object.PortName, Is.EqualTo(_telescopeController.Port));
- Assert.That(serialMock.Object.IsOpen, Is.True);
-
- }
-
- [Test]
- public void WhenOpensComPortToNonAutostarThrowException()
- {
- Assert.That(serialMock.Object.IsOpen, Is.False);
- var exception = Assert.Throws(() => { _telescopeController.Connected = true; });
-
- Assert.That(exception.Message, Is.EqualTo("Failed to communicate with telescope."));
-
- Assert.That(_telescopeController.Connected, Is.False);
- }
-
- [Test]
- public void CannotChangeSerialPortObjectWhenConnected()
- {
- _stringToRecieve = "test#";
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- Mock newSerialMock = new Mock();
-
- var exception = Assert.Throws( () => { _telescopeController.SerialPort = newSerialMock.Object; });
-
- Assert.That(exception, Is.Not.Null);
- Assert.That(exception.Message, Is.EqualTo("Please disconnect before changing the serial engine."));
- }
-
- [Test]
- public void PortIsSetToCom1ByDefault()
- {
- Assert.That(_telescopeController.Port, Is.EqualTo("COM1"));
- }
-
- [Test]
- public void SettingPortToValidPortAllowed()
- {
- _telescopeController.Port = "COM2";
-
- Assert.That(_telescopeController.Port, Is.EqualTo("COM2"));
- }
-
- [Test]
- public void SettingPortToValidPortWhenConnectedFails()
- {
- _stringToRecieve = "test#";
- _isConnected = true;
-
- _telescopeController.Connected = true;
- var exception = Assert.Throws( () => _telescopeController.Port = "COM2");
-
- Assert.That(exception.Message, Is.EqualTo("Please disconnect from the scope before changing port."));
-
- Assert.That(_telescopeController.Port, Is.EqualTo("COM1")); //port hasn't changed
- }
-
- [Test]
- public void SettingPortToInvalidPortFails()
- {
- var exception = Assert.Throws(() => _telescopeController.Port = "COM5");
-
- Assert.That(exception.Message, Is.EqualTo("Unable to select port COM5 as it does not exist."));
-
- Assert.That(_telescopeController.Port, Is.EqualTo("COM1")); //port hasn't changed
- }
-
- [Test]
- public void AbortSlewWorks()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.AbortSlew();
-
- serialMock.Verify(x => x.Command("#:Q#"), Times.Once);
- }
-
- [Test]
- public void SlewingReturnTrueAsExpected()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- serialMock.Setup(x => x.CommandTerminated(":D#", "#")).Returns("|");
-
- var slewing = _telescopeController.Slewing;
-
- Assert.That(slewing, Is.True);
- }
-
- [Test]
- public void SlewingReturnFalseAsExpected()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- serialMock.Setup(x => x.CommandTerminated(":D#", "#")).Returns(string.Empty);
-
- var slewing = _telescopeController.Slewing;
-
- Assert.That(slewing, Is.False);
- }
-
- [Test]
- public void utcDate_Get_ReturnsExpectedValue()
- {
- DateTime expectedDate = new DateTime(2019, 04, 30, 11, 32, 24, DateTimeKind.Local);
-
- var dateString = "04/30/19";
- var timeString = "12:32:24";
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
- serialMock.Setup(x => x.CommandTerminated(":GC#", "#")).Returns(dateString);
- serialMock.Setup(x => x.CommandTerminated(":GL#", "#")).Returns(timeString);
-
- var result = _telescopeController.utcDate;
-
- Assert.That(result, Is.EqualTo(expectedDate));
- }
-
- [Test]
- public void utcDate_Set_SetsTelescopeDateAndTime()
- {
- DateTime testDateTime = new DateTime(2019, 04, 30, 19, 53, 32, DateTimeKind.Utc);
-
- serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
- serialMock.Setup(x => x.CommandChar($":SL{testDateTime.Hour+1:00}:{testDateTime.Minute:00}:{testDateTime.Second:00}#")).Returns('1');
- serialMock.Setup(x => x.CommandChar($":SC{testDateTime.Month:00}/{testDateTime.Day:00}/{testDateTime:yy}#")).Returns('1');
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.utcDate = testDateTime;
- }
-
- [Test]
- public void utcDate_Set_ThrowsExceptionWhenTimeInvalid()
- {
- DateTime testDateTime = new DateTime(2019, 04, 30, 19, 53, 32, DateTimeKind.Utc);
-
- serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
- //serialMock.Setup(x => x.CommandChar($":SL{testDateTime.Hour:00}:{testDateTime.Minute:00}:{testDateTime.Second:00}#")).Returns('1');
- serialMock.Setup(x => x.CommandChar($":SC{testDateTime.Month:00}/{testDateTime.Day:00}/{testDateTime:yy}#")).Returns('1');
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws( () => {_telescopeController.utcDate = testDateTime; });
-
- Assert.That( exception.Message, Is.EqualTo("Failed to set local time"));
- }
-
- [Test]
- public void utcDate_Set_ThrowsExceptionWhenDateInvalid()
- {
- DateTime testDateTime = new DateTime(2019, 04, 30, 19, 53, 32, DateTimeKind.Local);
-
- serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
- serialMock.Setup(x => x.CommandChar($":SL{testDateTime.Hour+1:00}:{testDateTime.Minute:00}:{testDateTime.Second:00}#")).Returns('1');
- //serialMock.Setup(x => x.CommandChar($":SC{testDateTime.Month:00}/{testDateTime.Day:00}/{testDateTime:yy}#")).Returns('1');
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws(() => { _telescopeController.utcDate = testDateTime; });
-
- Assert.That(exception.Message, Is.EqualTo("Failed to set local date"));
- }
-
- [TestCase("+12*34", 12.566666666666666)]
- [TestCase("+12*34.56", 12.582222222222223)]
- [TestCase("-67*34.56", -67.582222222222214)]
- public void SiteLatitude_Get_ReturnsExpectedDouble( string latitude, double expectedResult)
- {
- serialMock.Setup(x => x.CommandTerminated(":Gt#", "#")).Returns(latitude);
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var result = _telescopeController.SiteLatitude;
-
- Assert.That(result, Is.EqualTo(expectedResult));
- }
-
- [Test]
- public void SiteLatitude_Set_ThrowsExeptionWhenValueTooSmall()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws( () => { _telescopeController.SiteLatitude = -91;});
-
- Assert.That(exception.Message, Is.EqualTo("Latitude cannot be less than -90 degrees."));
- }
-
- [Test]
- public void SiteLatitude_Set_ThrowsExeptionWhenValueTooLarge()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws(() => { _telescopeController.SiteLatitude = 91; });
-
- Assert.That(exception.Message, Is.EqualTo("Latitude cannot be greater than 90 degrees."));
- }
-
- [Test]
- public void SiteLatitude_Set_ThrowsExeptionWhenTelescopeReportsFail()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws(() => { _telescopeController.SiteLatitude = 10; });
-
- Assert.That(exception.Message, Is.EqualTo("Failed to set site latitude."));
- }
-
- [Test]
- public void SiteLatitude_Set_NoErrorWhenValidValueSentSuccessfully()
- {
- serialMock.Setup(x => x.CommandChar(":Sts10*00#")).Returns('1');
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.SiteLatitude = 10;
- }
-
-
- [TestCase("012*34", 12.566666666666666)]
- [TestCase("012:34.56", 12.582222222222223)]
- [TestCase("350:34.56", -9.4177777777777578)]
- public void SiteLongitude_Get_ReturnsExpectedDouble(string longitude, double expectedResult)
- {
- serialMock.Setup(x => x.CommandTerminated(":Gg#", "#")).Returns(longitude);
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var result = _telescopeController.SiteLongitude;
-
- Assert.That(result, Is.EqualTo(expectedResult));
- }
-
- [Test]
- public void SiteLongitude_Set_ThrowsExeptionWhenValueTooSmall()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws(() => { _telescopeController.SiteLongitude = -181; });
-
- Assert.That(exception.Message, Is.EqualTo("Longitude cannot be lower than -180 degrees."));
- }
-
- [Test]
- public void SiteLongitude_Set_ThrowsExeptionWhenValueTooLarge()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws(() => { _telescopeController.SiteLongitude = 181; });
-
- Assert.That(exception.Message, Is.EqualTo("Longitude cannot be greater than 180 degrees."));
- }
-
- [Test]
- public void SiteLongitude_Set_ThrowsExeptionWhenTelescopeReportsFail()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var exception = Assert.Throws(() => { _telescopeController.SiteLongitude = 10; });
-
- Assert.That(exception.Message, Is.EqualTo("Failed to set site longitude."));
- }
-
- [Test]
- public void SiteLongitude_Set_NoErrorWhenValidValueSentSuccessfully()
- {
- serialMock.Setup(x => x.CommandChar(":Sg010*00#")).Returns('1');
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.SiteLongitude = 10;
- }
-
- [Test]
- public void PulseGuideEast()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.PulseGuide(GuideDirections.guideEast,100);
-
- serialMock.Verify( x => x.Command(":Mge0100#"), Times.Once);
- }
-
- [Test]
- public void PulseGuideWest()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.PulseGuide(GuideDirections.guideWest, 1200);
-
- serialMock.Verify(x => x.Command(":Mgw1200#"), Times.Once);
- }
-
- [Test]
- public void PulseGuideNorth()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.PulseGuide(GuideDirections.guideNorth, 256);
-
- serialMock.Verify(x => x.Command(":Mgn0256#"), Times.Once);
- }
-
- [Test]
- public void PulseGuideSouth()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.PulseGuide(GuideDirections.guideSouth, 1024);
-
- serialMock.Verify(x => x.Command(":Mgs1024#"), Times.Once);
- }
-
- [TestCase('A', AlignmentModes.algAltAz)]
- [TestCase('P', AlignmentModes.algPolar)]
- public void AlignmentMode_Get_ReturnsExpectedValue(char commandResponse, AlignmentModes mode)
- {
- const char ack = (char)6;
-
- serialMock.Setup(x => x.CommandChar(ack.ToString())).Returns(commandResponse);
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var result = _telescopeController.AlignmentMode;
-
- Assert.That(result, Is.EqualTo(mode));
- }
-
- [TestCase(AlignmentModes.algAltAz, ":AA#")]
- [TestCase(AlignmentModes.algPolar, ":AP#")]
- [TestCase(AlignmentModes.algGermanPolar, ":AP#")]
- public void AligmentMode_Set_WorksAsExpected(AlignmentModes mode, string command)
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- _telescopeController.AlignmentMode = mode;
-
- serialMock.Verify( x => x.Command(command), Times.Once);
- }
-
- [Test]
- public void AtParkIsFalseByDefault()
- {
- _isConnected = true;
- _telescopeController.Connected = true;
-
- Assert.That( _telescopeController.AtPark, Is.False );
- }
-
- [Test]
- public void AtParkIsTrueAfterParkingScope()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
- _telescopeController.Park();
-
- Assert.That(_telescopeController.AtPark, Is.True);
- }
-
- [Test]
- public void Park_CallingParkSendsTheParkCommand()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
- _telescopeController.Park();
-
- serialMock.Verify( x => x.Command(":hP#"), Times.Once);
- }
-
- [Test]
- public void Park_ParkingSecondTimeDoesNothing()
- {
- _isConnected = true;
-
- _telescopeController.Connected = true;
- _telescopeController.Park();
-
- _telescopeController.Park();
-
- serialMock.Verify(x => x.Command(":hP#"), Times.Once);
- }
-
- [TestCase("356*13",356.21666666666664)]
- [TestCase("356*13'21", 356.22249999999997)]
- public void Azimuth_CanGetValue( string response, double expectedResult )
- {
- serialMock.Setup(x => x.CommandTerminated(":GZ#", "#")).Returns(response);
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var az = _telescopeController.Azimuth;
-
- Assert.That( az, Is.EqualTo(expectedResult));
- }
-
- [TestCase("+75*13", 75.2166666666666654)]
- [TestCase("+65*13'21", 65.222499999999997)]
- public void Declination_CanGetValue(string response, double expectedResult)
- {
- serialMock.Setup(x => x.CommandTerminated(":GD#", "#")).Returns(response);
-
- _isConnected = true;
-
- _telescopeController.Connected = true;
-
- var result = _telescopeController.Declination;
-
- Assert.That(result, Is.EqualTo(expectedResult));
- }
- }
-}
diff --git a/MeadeAutostar497.UnitTests/packages.config b/MeadeAutostar497.UnitTests/packages.config
deleted file mode 100644
index e7172db..0000000
--- a/MeadeAutostar497.UnitTests/packages.config
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/MeadeAutostar497.sln b/MeadeAutostar497.sln
deleted file mode 100644
index 69570e9..0000000
--- a/MeadeAutostar497.sln
+++ /dev/null
@@ -1,49 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28307.136
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeadeAutostar497", "MeadeAutostar497\MeadeAutostar497.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeadeAutostar497.UnitTests", "MeadeAutostar497.UnitTests\MeadeAutostar497.UnitTests.csproj", "{9638DA27-77C7-4B30-A730-6E7159A4A09F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestConsole", "TestConsole\TestConsole.csproj", "{D5207217-61C7-4E94-8097-91DBACE57D2A}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.ActiveCfg = Debug|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.Build.0 = Debug|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.Build.0 = Release|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.ActiveCfg = Release|Any CPU
- {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.Build.0 = Release|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|x86.Build.0 = Debug|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|Any CPU.Build.0 = Release|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|x86.ActiveCfg = Release|Any CPU
- {9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|x86.Build.0 = Release|Any CPU
- {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|Any CPU.ActiveCfg = Debug|x86
- {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x86.ActiveCfg = Debug|x86
- {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x86.Build.0 = Debug|x86
- {D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|Any CPU.ActiveCfg = Release|x86
- {D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|x86.ActiveCfg = Release|x86
- {D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|x86.Build.0 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {FD610065-5DB2-4D32-8760-4E0552901C28}
- EndGlobalSection
-EndGlobal
diff --git a/MeadeAutostar497/AscomClasses/Telescope.cs b/MeadeAutostar497/AscomClasses/Telescope.cs
deleted file mode 100644
index 5f3c794..0000000
--- a/MeadeAutostar497/AscomClasses/Telescope.cs
+++ /dev/null
@@ -1,1226 +0,0 @@
-//tabs=4
-// --------------------------------------------------------------------------------
-// TODO fill in this information for your driver, then remove this line!
-//
-// ASCOM Telescope driver for MeadeAutostar497
-//
-// Description: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
-// nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
-// erat, sed diam voluptua. At vero eos et accusam et justo duo
-// dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
-// sanctus est Lorem ipsum dolor sit amet.
-//
-// Implements: ASCOM Telescope interface version:
-// Author: (XXX) Your N. Here
-//
-// Edit Log:
-//
-// Date Who Vers Description
-// ----------- --- ----- -------------------------------------------------------
-// dd-mmm-yyyy XXX 6.0.0 Initial edit, created from ASCOM driver template
-// --------------------------------------------------------------------------------
-//
-
-
-// This is used to define code in the template that is specific to one class implementation
-// unused code canbe deleted and this definition removed.
-#define Telescope
-
-using System;
-using System.Runtime.InteropServices;
-using ASCOM;
-using ASCOM.Astrometry;
-using ASCOM.Astrometry.AstroUtils;
-using ASCOM.Utilities;
-using ASCOM.DeviceInterface;
-using System.Globalization;
-using System.Collections;
-using ASCOM.MeadeAutostar497.Controller;
-using static System.String;
-
-namespace ASCOM.MeadeAutostar497
-{
- //
- // Your driver's DeviceID is ASCOM.MeadeAutostar497.Telescope
- //
- // The Guid attribute sets the CLSID for ASCOM.MeadeAutostar497.Telescope
- // The ClassInterface/None addribute prevents an empty interface called
- // _MeadeAutostar497 from being created and used as the [default] interface
- //
- // TODO Replace the not implemented exceptions with code to implement the function or
- // throw the appropriate ASCOM exception.
- //
-
- ///
- /// ASCOM Telescope Driver for MeadeAutostar497.
- ///
- [Guid("58e4fe97-1760-4e22-8ecd-2225876aeefc")]
- [ClassInterface(ClassInterfaceType.None)]
- public class Telescope : ITelescopeV3, IFocuserV3
- {
- private ITelescopeController _telescopeController;
-
- ///
- /// ASCOM DeviceID (COM ProgID) for this driver.
- /// The DeviceID is used by ASCOM applications to load the driver at runtime.
- ///
- internal static string driverID = "ASCOM.MeadeAutostar497.Telescope";
- // TODO Change the descriptive string for your driver then remove this line
- ///
- /// Driver description that displays in the ASCOM Chooser.
- ///
- private static string driverDescription = "Meade Autostar 497 .net";
-
- internal static string comPortProfileName = "COM Port"; // Constants used for Profile persistence
- internal static string comPortDefault = "COM1";
- internal static string traceStateProfileName = "Trace Level";
- internal static string traceStateDefault = "false";
-
- internal static string comPort; // Variables to hold the currrent device configuration
-
- ///
- /// Private variable to hold an ASCOM Utilities object
- ///
- private Util utilities;
-
- ///
- /// Private variable to hold an ASCOM AstroUtilities object to provide the Range method
- ///
- private AstroUtils astroUtilities;
-
- ///
- /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify)
- ///
- internal static TraceLogger tl;
-
- ///
- /// Initializes a new instance of the class.
- /// Must be public for COM registration.
- ///
- public Telescope()
- {
- tl = new TraceLogger("", "MeadeAutostar497");
- ReadProfile(); // Read device configuration from the ASCOM Profile store
-
- tl.LogMessage("Telescope", "Starting initialisation");
-
- utilities = new Util(); //Initialise util object
- astroUtilities = new AstroUtils(); // Initialise astro utilities object
-
- //TODO: Implement your additional construction here
- _telescopeController = TelescopeController.Instance;
-
- tl.LogMessage("Telescope", "Completed initialisation");
- }
-
-
- //
- // PUBLIC COM INTERFACE ITelescopeV3 IMPLEMENTATION
- //
-
- #region Common properties and methods.
-
- ///
- /// Displays the Setup Dialog form.
- /// If the user clicks the OK button to dismiss the form, then
- /// the new settings are saved, otherwise the old values are reloaded.
- /// THIS IS THE ONLY PLACE WHERE SHOWING USER INTERFACE IS ALLOWED!
- ///
- public void SetupDialog()
- {
- // consider only showing the setup dialog if not connected
- // or call a different dialog if connected
- if (IsConnected)
- {
- System.Windows.Forms.MessageBox.Show("Already connected, just press OK");
- return;
- }
-
- using (SetupDialogForm F = new SetupDialogForm())
- {
- var result = F.ShowDialog();
- if (result == System.Windows.Forms.DialogResult.OK)
- {
- WriteProfile(); // Persist device configuration values to the ASCOM Profile store
- }
- }
- }
-
- public ArrayList SupportedActions
- {
- get
- {
- tl.LogMessage("SupportedActions Get", "Returning empty arraylist");
- return new ArrayList();
- }
- }
-
- public string Action(string actionName, string actionParameters)
- {
- LogMessage("", "Action {0}, parameters {1} not implemented", actionName, actionParameters);
- throw new ASCOM.ActionNotImplementedException("Action " + actionName + " is not implemented by this driver");
- }
-
- public void CommandBlind(string command, bool raw)
- {
- tl.LogMessage("CommandBlind", $"command={command} raw={raw}");
-
- CheckConnected("CommandBlind");
- // Call CommandString and return as soon as it finishes
- //this.CommandString(command, raw);
- _telescopeController.CommandBlind(command, raw);
- // or
- //throw new ASCOM.MethodNotImplementedException("CommandBlind");
- // DO NOT have both these sections! One or the other
- }
-
- public bool CommandBool(string command, bool raw)
- {
- tl.LogMessage("CommandBool", $"command={command} raw={raw}");
- CheckConnected("CommandBool");
- string ret = CommandString(command, raw);
- // TODO decode the return string and return true or false
- // or
- throw new ASCOM.MethodNotImplementedException("CommandBool");
- // DO NOT have both these sections! One or the other
- }
-
- public string CommandString(string command, bool raw)
- {
- tl.LogMessage("CommandString", $"command={command} raw={raw}");
- // it's a good idea to put all the low level communication with the device here,
- // then all communication calls this function
- // you need something to ensure that only one command is in progress at a time
- CheckConnected("CommandString");
- //throw new ASCOM.MethodNotImplementedException("CommandString");
- return _telescopeController.CommandString(command, raw);
- }
-
- public void Dispose()
- {
- _telescopeController.Connected = false;
-
- // Clean up the tracelogger and util objects
- tl.Enabled = false;
- tl.Dispose();
- tl = null;
- utilities.Dispose();
- utilities = null;
- astroUtilities.Dispose();
- astroUtilities = null;
- }
-
- public bool Connected
- {
- get
- {
- LogMessage("Connected", "Get {0}", IsConnected);
- return IsConnected;
- }
- set
- {
- tl.LogMessage("Connected", "Set {0}", value);
- if (value == IsConnected)
- return;
-
- if (value)
- {
- LogMessage("Connected Set", "Connecting to port {0}", comPort);
- _telescopeController.Port = comPort;
- _telescopeController.Connected = true;
- }
- else
- {
- LogMessage("Connected Set", "Disconnecting from port {0}", comPort);
- _telescopeController.Connected = false;
- }
- }
- }
-
- public string Description
- {
- // TODO customise this device description
- get
- {
- tl.LogMessage("Description Get", driverDescription);
- return driverDescription;
- }
- }
-
- public string DriverInfo
- {
- get
- {
- Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
- // TODO customise this driver description
- string driverInfo = Format(CultureInfo.InvariantCulture, "Information about the driver itself. Version: {0}.{1}", version.Major, version.Minor);
- tl.LogMessage("DriverInfo Get", driverInfo);
- return driverInfo;
- }
- }
-
- public string DriverVersion
- {
- get
- {
- Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
- string driverVersion = Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
- tl.LogMessage("DriverVersion Get", driverVersion);
- return driverVersion;
- }
- }
-
- public short InterfaceVersion
- {
- // set by the driver wizard
- get
- {
- LogMessage("InterfaceVersion Get", "3");
- return Convert.ToInt16("3");
- }
- }
-
- public string Name
- {
- get
- {
- string name = "Meade Autostar 497 .net";
- tl.LogMessage("Name Get", name);
- return name;
- }
- }
-
- #endregion
-
- #region ITelescope Implementation
- public void AbortSlew()
- {
- tl.LogMessage("AbortSlew", "Aborting slew");
- _telescopeController.AbortSlew();
- }
-
- public AlignmentModes AlignmentMode
- {
- get
- {
- tl.LogMessage("AlignmentMode Get", "Getting alignmode");
- var alignmode = _telescopeController.AlignmentMode;
- tl.LogMessage("AlignmentMode Get", $"alignmode = {alignmode}");
- return alignmode;
- }
- }
-
- public double Altitude
- {
- get
- {
- var alt = _telescopeController.Altitude;
- tl.LogMessage("Altitude", $"{alt}");
- return alt;
- }
- }
-
- public double ApertureArea
- {
- get
- {
- tl.LogMessage("ApertureArea Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("ApertureArea", false);
- }
- }
-
- public double ApertureDiameter
- {
- get
- {
- tl.LogMessage("ApertureDiameter Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("ApertureDiameter", false);
- }
- }
-
- public bool AtHome
- {
- get
- {
- tl.LogMessage("AtHome", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool AtPark
- {
- get
- {
- var atPatk = _telescopeController.AtPark;
- tl.LogMessage("AtPark", "Get - " + atPatk.ToString());
- return atPatk;
- }
- }
-
- public IAxisRates AxisRates(TelescopeAxes Axis)
- {
- tl.LogMessage("AxisRates", "Get - " + Axis.ToString());
- return new AxisRates(Axis);
- }
-
- public double Azimuth
- {
- get
- {
- var az = _telescopeController.Azimuth;
- tl.LogMessage("Azimuth Get", $"{az}");
- return az;
- }
- }
-
- public bool CanFindHome
- {
- get
- {
- tl.LogMessage("CanFindHome", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanMoveAxis(TelescopeAxes Axis)
- {
- tl.LogMessage("CanMoveAxis", "Get - " + Axis.ToString());
- switch (Axis)
- {
- case TelescopeAxes.axisPrimary: return true; //RA or AZ
- case TelescopeAxes.axisSecondary: return true; //Dev or Alt
- case TelescopeAxes.axisTertiary: return false; //rotator / derotator
- default: throw new InvalidValueException("CanMoveAxis", Axis.ToString(), "0 to 2");
- }
- }
-
- public bool CanPark
- {
- get
- {
- tl.LogMessage("CanPark", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanPulseGuide
- {
- get
- {
- tl.LogMessage("CanPulseGuide", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSetDeclinationRate
- {
- get
- {
- tl.LogMessage("CanSetDeclinationRate", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanSetGuideRates
- {
- get
- {
- tl.LogMessage("CanSetGuideRates", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanSetPark
- {
- get
- {
- tl.LogMessage("CanSetPark", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanSetPierSide
- {
- get
- {
- tl.LogMessage("CanSetPierSide", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanSetRightAscensionRate
- {
- get
- {
- tl.LogMessage("CanSetRightAscensionRate", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanSetTracking
- {
- get
- {
- tl.LogMessage("CanSetTracking", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSlew
- {
- get
- {
- tl.LogMessage("CanSlew", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSlewAltAz
- {
- get
- {
- tl.LogMessage("CanSlewAltAz", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSlewAltAzAsync
- {
- get
- {
- tl.LogMessage("CanSlewAltAzAsync", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSlewAsync
- {
- get
- {
- tl.LogMessage("CanSlewAsync", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSync
- {
- get
- {
- tl.LogMessage("CanSync", "Get - " + true.ToString());
- return true;
- }
- }
-
- public bool CanSyncAltAz
- {
- get
- {
- tl.LogMessage("CanSyncAltAz", "Get - " + false.ToString());
- return false;
- }
- }
-
- public bool CanUnpark
- {
- get
- {
- tl.LogMessage("CanUnpark", "Get - " + false.ToString());
- return false;
- }
- }
-
- public double Declination
- {
- get
- {
- double declination = _telescopeController.Declination;
- tl.LogMessage("Declination", "Get - " + utilities.DegreesToDMS(declination, ":", ":"));
- return declination;
- }
- }
-
- public double DeclinationRate
- {
- get
- {
- double declination = 0.0;
- tl.LogMessage("DeclinationRate", "Get - " + declination.ToString());
- return declination;
- }
- set
- {
- tl.LogMessage("DeclinationRate Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("DeclinationRate", true);
- }
- }
-
- public PierSide DestinationSideOfPier(double RightAscension, double Declination)
- {
- tl.LogMessage("DestinationSideOfPier Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("DestinationSideOfPier", false);
- }
-
- public bool DoesRefraction
- {
- get
- {
- tl.LogMessage("DoesRefraction Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("DoesRefraction", false);
- }
- set
- {
- tl.LogMessage("DoesRefraction Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("DoesRefraction", true);
- }
- }
-
- public EquatorialCoordinateType EquatorialSystem
- {
- get
- {
- EquatorialCoordinateType equatorialSystem = EquatorialCoordinateType.equTopocentric;
- tl.LogMessage("DeclinationRate", "Get - " + equatorialSystem.ToString());
- return equatorialSystem;
- }
- }
-
- public void FindHome()
- {
- tl.LogMessage("FindHome", "Not implemented");
- throw new ASCOM.MethodNotImplementedException("FindHome");
- }
-
- public double FocalLength
- {
- get
- {
- tl.LogMessage("FocalLength Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("FocalLength", false);
- }
- }
-
- public double GuideRateDeclination
- {
- get
- {
- tl.LogMessage("GuideRateDeclination Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("GuideRateDeclination", false);
- }
- set
- {
- tl.LogMessage("GuideRateDeclination Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("GuideRateDeclination", true);
- }
- }
-
- public double GuideRateRightAscension
- {
- get
- {
- tl.LogMessage("GuideRateRightAscension Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("GuideRateRightAscension", false);
- }
- set
- {
- tl.LogMessage("GuideRateRightAscension Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("GuideRateRightAscension", true);
- }
- }
-
- public bool IsPulseGuiding
- {
- get
- {
- tl.LogMessage("IsPulseGuiding Get", "pulse guiding is synchronous for this driver");
- //throw new ASCOM.PropertyNotImplementedException("IsPulseGuiding", false);
- return false;
- }
- }
-
- public void MoveAxis(TelescopeAxes Axis, double Rate)
- {
- tl.LogMessage("MoveAxis", $"Axis={Axis} rate={Rate}");
- _telescopeController.MoveAxis(Axis, Rate);
- }
-
- public void Park()
- {
- tl.LogMessage("Park", "Parking telescope");
- _telescopeController.Park();
- }
-
- public void PulseGuide(GuideDirections Direction, int Duration)
- {
- tl.LogMessage("PulseGuide", $"pulse guide direction {Direction} duration {Duration}");
- _telescopeController.PulseGuide(Direction, Duration);
- }
-
- public double RightAscension
- {
- get
- {
- double rightAscension = _telescopeController.RightAscension;
- tl.LogMessage("RightAscension", "Get - " + utilities.HoursToHMS(rightAscension));
- return rightAscension;
- }
- }
-
- public double RightAscensionRate
- {
- get
- {
- double rightAscensionRate = 0.0;
- tl.LogMessage("RightAscensionRate", "Get - " + rightAscensionRate.ToString());
- return rightAscensionRate;
- }
- set
- {
- tl.LogMessage("RightAscensionRate Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("RightAscensionRate", true);
- }
- }
-
- public void SetPark()
- {
- tl.LogMessage("SetPark", "Not implemented");
- throw new ASCOM.MethodNotImplementedException("SetPark");
- }
-
- public PierSide SideOfPier
- {
- get
- {
- tl.LogMessage("SideOfPier Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("SideOfPier", false);
- }
- set
- {
- tl.LogMessage("SideOfPier Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("SideOfPier", true);
- }
- }
-
- public double SiderealTime
- {
- get
- {
- // Now using NOVAS 3.1
- double siderealTime = 0.0;
- using (var novas = new ASCOM.Astrometry.NOVAS.NOVAS31())
- {
- var jd = utilities.DateUTCToJulian(DateTime.UtcNow);
- novas.SiderealTime(jd, 0, novas.DeltaT(jd),
- ASCOM.Astrometry.GstType.GreenwichApparentSiderealTime,
- ASCOM.Astrometry.Method.EquinoxBased,
- ASCOM.Astrometry.Accuracy.Reduced, ref siderealTime);
- }
-
- // Allow for the longitude
- siderealTime += SiteLongitude / 360.0 * 24.0;
-
- // Reduce to the range 0 to 24 hours
- siderealTime = astroUtilities.ConditionRA(siderealTime);
-
- tl.LogMessage("SiderealTime", "Get - " + siderealTime.ToString());
- return siderealTime;
- }
- }
-
- public double SiteElevation
- {
- get
- {
- tl.LogMessage("SiteElevation Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("SiteElevation", false);
- }
- set
- {
- tl.LogMessage("SiteElevation Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("SiteElevation", true);
- }
- }
-
- public double SiteLatitude
- {
- get
- {
- var siteLatitude = _telescopeController.SiteLatitude;
- tl.LogMessage("SiteLatitude Get", $"{utilities.DegreesToDMS(siteLatitude)}");
- return siteLatitude;
- }
- set
- {
- tl.LogMessage("SiteLatitude Set", $"{utilities.DegreesToDMS(value)}");
- _telescopeController.SiteLatitude = value;
- }
- }
-
- public double SiteLongitude
- {
- get
- {
- var siteLongitude = _telescopeController.SiteLongitude;
- tl.LogMessage("SiteLongitude Get", $"{utilities.DegreesToDMS(siteLongitude)}");
- return siteLongitude;
- }
- set
- {
- tl.LogMessage("SiteLongitude Set", $"{utilities.DegreesToDMS(value)}");
- _telescopeController.SiteLongitude = value;
- }
- }
-
- public short SlewSettleTime
- {
- get
- {
- tl.LogMessage("SlewSettleTime Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("SlewSettleTime", false);
- }
- set
- {
- tl.LogMessage("SlewSettleTime Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("SlewSettleTime", true);
- }
- }
-
- public void SlewToAltAz(double Azimuth, double Altitude)
- {
- tl.LogMessage("SlewToAltAz", $"Az=~{Azimuth} Alt={Altitude}");
- _telescopeController.SlewToAltAz(Azimuth, Altitude);
- }
-
- public void SlewToAltAzAsync(double Azimuth, double Altitude)
- {
- tl.LogMessage("SlewToAltAzAsync", $"Az=~{Azimuth} Alt={Altitude}");
- _telescopeController.SlewToAltAzAsync(Azimuth, Altitude);
- }
-
- public void SlewToCoordinates(double RightAscension, double Declination)
- {
- tl.LogMessage("SlewToCoordinates", $"Ra={RightAscension}, Dec={Declination}");
- _telescopeController.SlewToCoordinates(RightAscension, Declination);
- }
-
- public void SlewToCoordinatesAsync(double RightAscension, double Declination)
- {
- tl.LogMessage("SlewToCoordinatesAsync", $"Ra={RightAscension}, Dec={Declination}");
- _telescopeController.SlewToCoordinatesAsync(RightAscension, Declination);
- }
-
- public void SlewToTarget()
- {
- tl.LogMessage("SlewToTarget", "Executing");
- _telescopeController.SlewToTarget();
- }
-
- public void SlewToTargetAsync()
- {
- tl.LogMessage("SlewToTargetAsync", "Executing");
- _telescopeController.SlewToTargetAsync();
- }
-
- public bool Slewing
- {
- get
- {
- tl.LogMessage("Slewing Get", "Started");
- var result = _telescopeController.Slewing;
- tl.LogMessage("Slewing Get", $"Result = {result}");
- return result;
- }
- }
-
- public void SyncToAltAz(double Azimuth, double Altitude)
- {
- tl.LogMessage("SyncToAltAz", "Not implemented");
- throw new ASCOM.MethodNotImplementedException("SyncToAltAz");
- }
-
- public void SyncToCoordinates(double RightAscension, double Declination)
- {
- tl.LogMessage("SyncToCoordinates", $"RA={RightAscension} Dec={Declination}");
- _telescopeController.TargetRightAscension = RightAscension;
- _telescopeController.TargetDeclination = Declination;
-
- SyncToTarget();
- }
-
- public void SyncToTarget()
- {
- tl.LogMessage("SyncToTarget", "Executing");
- _telescopeController.SyncToTarget();
- }
-
- public double TargetDeclination
- {
- get
- {
- var targetDec = _telescopeController.TargetDeclination;
- tl.LogMessage("TargetDeclination Get", $"{targetDec}");
- return targetDec;
- }
- set
- {
- tl.LogMessage("TargetDeclination Set", $"{value}");
- _telescopeController.TargetDeclination = value;
- }
- }
-
- public double TargetRightAscension
- {
- get
- {
- var targetRa = _telescopeController.TargetRightAscension;
- tl.LogMessage("TargetRightAscension Get", $"{targetRa}");
- return targetRa;
- }
- set
- {
- tl.LogMessage("TargetRightAscension Set", $"{value}");
- _telescopeController.TargetRightAscension = value;
- }
- }
-
- private bool _tracking = true;
- public bool Tracking
- {
- get
- {
- //todo implementing this, it exists.
-
- tl.LogMessage("Tracking", $"Get - {_tracking}" );
- return _tracking;
- }
- set
- {
- tl.LogMessage($"Tracking Set", $"{value}");
- _tracking = value;
- }
- }
-
- public DriveRates TrackingRate
- {
- get
- {
- var tr = _telescopeController.TrackingRate;
- tl.LogMessage("TrackingRate Get", $"{tr}");
- return tr;
- }
- set
- {
- tl.LogMessage("TrackingRate Set", $"{value}");
- _telescopeController.TrackingRate = value;
- }
- }
-
- public ITrackingRates TrackingRates
- {
- get
- {
- ITrackingRates trackingRates = new TrackingRates();
- tl.LogMessage("TrackingRates", "Get - ");
- foreach (DriveRates driveRate in trackingRates)
- {
- tl.LogMessage("TrackingRates", "Get - " + driveRate.ToString());
- }
- return trackingRates;
- }
- }
-
- public DateTime UTCDate
- {
- get
- {
- tl.LogMessage("UTCDate", "Get started");
-
- var utcDate = _telescopeController.utcDate;
- tl.LogMessage("UTCDate", "Get - " + Format("MM/dd/yy HH:mm:ss", utcDate));
- return utcDate;
- }
- set
- {
- tl.LogMessage("UTCDate", "Set - " + Format("MM/dd/yy HH:mm:ss", value));
- _telescopeController.utcDate = value;
-
- }
- }
-
- public void Unpark()
- {
- tl.LogMessage("Unpark", "Not implemented");
- throw new ASCOM.MethodNotImplementedException("Unpark");
- }
-
- #endregion
-
- #region IFocuser Implementation
-
- //private int focuserPosition = 0; // Class level variable to hold the current focuser position
- //private const int focuserSteps = 10000;
-
- public bool Absolute
- {
- get
- {
- tl.LogMessage("Absolute Get", false.ToString());
- return false; // This is an absolute focuser
- }
- }
-
- public void Halt()
- {
- tl.LogMessage("Halt", "Halting");
- _telescopeController.FocuserHalt();
- }
-
- public bool IsMoving
- {
- get
- {
- tl.LogMessage("IsMoving Get", false.ToString());
- return false; // This focuser always moves instantaneously so no need for IsMoving ever to be True
- }
- }
-
- public bool Link
- {
- get
- {
- tl.LogMessage("Link Get", this.Connected.ToString());
- return this.Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility
- }
- set
- {
- tl.LogMessage("Link Set", value.ToString());
- this.Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility
- }
- }
-
- public int MaxIncrement
- {
- get
- {
- var maxIncrement = _telescopeController.FocuserMaxIncrement;
- tl.LogMessage("MaxIncrement Get", maxIncrement.ToString());
- return maxIncrement; // Maximum change in one move
- }
- }
-
- public int MaxStep
- {
- get
- {
- var maxStep = _telescopeController.FocuserMaxStep;
- tl.LogMessage("MaxStep Get", maxStep.ToString());
- return maxStep;
- }
- }
-
- public void Move(int Position)
- {
- tl.LogMessage("Move", Position.ToString());
- _telescopeController.FocuserMove(Position);
- //focuserPosition = Position; // Set the focuser position
- }
-
- public int Position
- {
- get
- {
- throw new ASCOM.PropertyNotImplementedException("Position", false);
- //return focuserPosition; // Return the focuser position
- }
- }
-
- public double StepSize
- {
- get
- {
- tl.LogMessage("StepSize Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("StepSize", false);
- }
- }
-
- public bool TempComp
- {
- get
- {
- tl.LogMessage("TempComp Get", false.ToString());
- return false;
- }
- set
- {
- tl.LogMessage("TempComp Set", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("TempComp", false);
- }
- }
-
- public bool TempCompAvailable
- {
- get
- {
- tl.LogMessage("TempCompAvailable Get", false.ToString());
- return false; // Temperature compensation is not available in this driver
- }
- }
-
- public double Temperature
- {
- get
- {
- tl.LogMessage("Temperature Get", "Not implemented");
- throw new ASCOM.PropertyNotImplementedException("Temperature", false);
- }
- }
-
- #endregion
-
- #region Private properties and methods
- // 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.
- //
- ///
- /// Register or unregister the driver with the ASCOM Platform.
- /// This is harmless if the driver is already registered/unregistered.
- ///
- /// If true, registers the driver, otherwise unregisters it.
- 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);
- }
- }
-
- using (var p = new ASCOM.Utilities.Profile())
- {
- p.DeviceType = "Focuser";
- if (bRegister)
- {
- p.Register(driverID, driverDescription);
- }
- else
- {
- p.Unregister(driverID);
- }
- }
- }
-
- ///
- /// This function registers the driver with the ASCOM Chooser and
- /// is called automatically whenever this class is registered for COM Interop.
- ///
- /// Type of the class being registered, not used.
- ///
- /// This method typically runs in two distinct situations:
- ///
- /// -
- /// In Visual Studio, when the project is successfully built.
- /// For this to work correctly, the option Register for COM Interop
- /// must be enabled in the project settings.
- ///
- /// - During setup, when the installer registers the assembly for COM Interop.
- ///
- /// This technique should mean that it is never necessary to manually register a driver with ASCOM.
- ///
- [ComRegisterFunction]
- public static void RegisterASCOM(Type t)
- {
- RegUnregASCOM(true);
- }
-
- ///
- /// This function unregisters the driver from the ASCOM Chooser and
- /// is called automatically whenever this class is unregistered from COM Interop.
- ///
- /// Type of the class being registered, not used.
- ///
- /// This method typically runs in two distinct situations:
- ///
- /// -
- /// In Visual Studio, when the project is cleaned or prior to rebuilding.
- /// For this to work correctly, the option Register for COM Interop
- /// must be enabled in the project settings.
- ///
- /// - During uninstall, when the installer unregisters the assembly from COM Interop.
- ///
- /// This technique should mean that it is never necessary to manually unregister a driver from ASCOM.
- ///
- [ComUnregisterFunction]
- public static void UnregisterASCOM(Type t)
- {
- RegUnregASCOM(false);
- }
-
- #endregion
-
- ///
- /// Returns true if there is a valid connection to the driver hardware
- ///
- private bool IsConnected => _telescopeController.Connected;
-
- ///
- /// Use this function to throw an exception if we aren't connected to the hardware
- ///
- ///
- private void CheckConnected(string message)
- {
- if (!IsConnected)
- {
- throw new ASCOM.NotConnectedException(message);
- }
- }
-
- ///
- /// Read the device configuration from the ASCOM Profile store
- ///
- internal void ReadProfile()
- {
- using (Profile driverProfile = new Profile())
- {
- driverProfile.DeviceType = "Telescope";
- tl.Enabled = Convert.ToBoolean(driverProfile.GetValue(driverID, traceStateProfileName, Empty, traceStateDefault));
- comPort = driverProfile.GetValue(driverID, comPortProfileName, Empty, comPortDefault);
- }
- }
-
- ///
- /// Write the device configuration to the ASCOM Profile store
- ///
- internal void WriteProfile()
- {
- using (Profile driverProfile = new Profile())
- {
- driverProfile.DeviceType = "Telescope";
- driverProfile.WriteValue(driverID, traceStateProfileName, tl.Enabled.ToString());
- driverProfile.WriteValue(driverID, comPortProfileName, comPort.ToString());
- }
- }
-
- ///
- /// Log helper function that takes formatted strings and arguments
- ///
- ///
- ///
- ///
- internal static void LogMessage(string identifier, string message, params object[] args)
- {
- var msg = Format(message, args);
- tl.LogMessage(identifier, msg);
- }
- #endregion
- }
-}
diff --git a/MeadeAutostar497/Controller/FirmwareVersion.cs b/MeadeAutostar497/Controller/FirmwareVersion.cs
deleted file mode 100644
index bdd0976..0000000
--- a/MeadeAutostar497/Controller/FirmwareVersion.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-namespace ASCOM.MeadeAutostar497.Controller
-{
- enum FirmwareVersion
- {
- autostar497_30eb,
- autostar497_30ed,
- autostar497_30ee,
- autostar497_31ee,
- autostar497_32ea,
- //PEC added for Polar mounted scopes
-
- autostar497_32ee,
- autostar497_32eh,
- //Some serial strings fixed.
-
- autostar497_32ei,
- autostar497_33ef,
- //Some serial strings fixed.
-
- autostar497_33el,
- autostar497_40eb,
- autostar497_40ee,
- autostar497_40ef,
- autostar497_41ec,
- autostar497_42ed,
- //Get serial command for daylight savings (:GH# returns 0 for disabled 1 for enabled)
- //Set serial command for daylight savings (:SH0# disables, :SH1# enables)
-
- autostar497_43ea,
- autostar497_43ed,
- autostar497_43eg
- //Added :GW#, :AL#, :AA#, & :AP#
- }
-}
\ No newline at end of file
diff --git a/MeadeAutostar497/Controller/ISerialProcessor.cs b/MeadeAutostar497/Controller/ISerialProcessor.cs
deleted file mode 100644
index 5578bf3..0000000
--- a/MeadeAutostar497/Controller/ISerialProcessor.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System.IO.Ports;
-using System.Runtime.InteropServices;
-
-namespace ASCOM.MeadeAutostar497.Controller
-{
- [ComVisible(false)]
- public interface ISerialProcessor
- {
- bool IsOpen { get; }
- bool DtrEnable { get; set; }
- bool RtsEnable { get; set; }
- int BaudRate { get; set; }
- int DataBits { get; set; }
- StopBits StopBits { get; set; }
- Parity Parity { get; set; }
- string PortName { get; set; }
- string[] GetPortNames();
- void Open();
- void Close();
-
- string CommandTerminated(string command, string terminator);
- char CommandChar(string command);
- string ReadTerminated(string terminator);
- void Command(string command);
- void Lock();
- void Unlock();
- }
-}
\ No newline at end of file
diff --git a/MeadeAutostar497/Controller/ITelescopeController.cs b/MeadeAutostar497/Controller/ITelescopeController.cs
deleted file mode 100644
index 9873c48..0000000
--- a/MeadeAutostar497/Controller/ITelescopeController.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System;
-using ASCOM.DeviceInterface;
-
-namespace ASCOM.MeadeAutostar497.Controller
-{
- public interface ITelescopeController
- {
- string Port { get; set; }
- bool Connected { get; set; }
-
- bool Slewing { get; }
- DateTime utcDate { get; set; }
- double SiteLatitude { get; set; }
- double SiteLongitude { get; set; }
- AlignmentModes AlignmentMode { get; set; }
- bool AtPark { get; }
- double Altitude { get; }
- double Azimuth { get; }
- double RightAscension { get; }
- double Declination { get; }
- double TargetRightAscension { get; set; }
- double TargetDeclination { get; set; }
- DriveRates TrackingRate { get; set; }
- int FocuserMaxIncrement { get; set; }
- int FocuserMaxStep { get; set; }
- void AbortSlew();
- void PulseGuide(GuideDirections direction, int duration);
- void Park();
- void SlewToCoordinates(double rightAscension, double declination);
- void SlewToCoordinatesAsync(double rightAscension, double declination);
- void SlewToAltAz(double azimuth, double altitude);
- void SlewToAltAzAsync(double azimuth, double altitude);
- void SyncToTarget();
- void SlewToTarget();
- void SlewToTargetAsync();
- void MoveAxis(TelescopeAxes axis, double rate);
- void FocuserHalt();
- void FocuserMove(int position);
- string CommandString(string command, bool raw);
- void CommandBlind(string command, bool raw);
- }
-}
\ No newline at end of file
diff --git a/MeadeAutostar497/Controller/SerialProcessor.cs b/MeadeAutostar497/Controller/SerialProcessor.cs
deleted file mode 100644
index 1c77556..0000000
--- a/MeadeAutostar497/Controller/SerialProcessor.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using System;
-using System.IO.Ports;
-using System.Runtime.InteropServices;
-using System.Threading;
-
-namespace ASCOM.MeadeAutostar497.Controller
-{
- [ComVisible(false)]
- public class SerialProcessor : ISerialProcessor
- {
- private SerialPort _serialPort = new SerialPort();
- private Mutex serialMutex = new Mutex();
-
- public bool IsOpen => _serialPort.IsOpen;
-
- public bool DtrEnable
- {
- get => _serialPort.DtrEnable;
- set => _serialPort.DtrEnable = value;
- }
-
- public bool RtsEnable
- {
- get => _serialPort.RtsEnable;
- set => _serialPort.RtsEnable = value;
- }
-
- public int BaudRate
- {
- get => _serialPort.BaudRate;
- set => _serialPort.BaudRate = value;
- }
-
- public int DataBits
- {
- get => _serialPort.DataBits;
- set => _serialPort.DataBits = value;
- }
-
- public StopBits StopBits
- {
- get => _serialPort.StopBits;
- set => _serialPort.StopBits = value;
- }
-
- public Parity Parity
- {
- get => _serialPort.Parity;
- set => _serialPort.Parity = value;
- }
-
- public string PortName
- {
- get => _serialPort.PortName;
- set => _serialPort.PortName = value;
- }
-
- public string[] GetPortNames()
- {
- return SerialPort.GetPortNames();
- }
-
- public void Open()
- {
- _serialPort.ReadTimeout = 5000;
- _serialPort.WriteTimeout = 5000;
- _serialPort.Open();
- }
-
- public void Close()
- {
- _serialPort.Close();
- }
-
- public string CommandTerminated(string command, string terminator)
- {
- Lock();
- try
- {
- _serialPort.Write(command);
- string result = _serialPort.ReadTo("#");
- return result;
- }
- finally
- {
- Unlock();
- }
- }
-
- public char CommandChar(string command)
- {
- Lock();
- try
- {
- _serialPort.Write(command);
- var result = _serialPort.ReadChar();
- return Convert.ToChar(result);
- }
- finally
- {
- Unlock();
- }
- }
-
- public string ReadTerminated(string terminator)
- {
- Lock();
- try
- {
- string result = _serialPort.ReadTo("#");
- return result;
- }
- finally
- {
- Unlock();
- }
- }
-
- public void Command(string command)
- {
- Lock();
- try
- {
- _serialPort.Write(command);
- }
- finally
- {
- Unlock();
- }
- }
-
- public void Lock()
- {
- serialMutex.WaitOne();
- }
-
- public void Unlock()
- {
- serialMutex.ReleaseMutex();
- }
- }
-}
diff --git a/MeadeAutostar497/Controller/TelescopeController.cs b/MeadeAutostar497/Controller/TelescopeController.cs
deleted file mode 100644
index e314982..0000000
--- a/MeadeAutostar497/Controller/TelescopeController.cs
+++ /dev/null
@@ -1,992 +0,0 @@
-using System;
-using System.IO.Ports;
-using System.Linq;
-using System.Threading;
-using ASCOM.DeviceInterface;
-using ASCOM.Utilities;
-using ASCOM.Utilities.Interfaces;
-
-namespace ASCOM.MeadeAutostar497.Controller
-{
- //todo stop this being a singleton, and instead use a server to make only a single instance.
- public sealed class TelescopeController : ITelescopeController
- {
- private const double INVALID_PARAMETER = -1000;
-
- private static readonly Lazy Lazy = new Lazy();
-
- public static TelescopeController Instance => Lazy.Value;
-
- //todo remove this as it can cause problems in production
- private ISerialProcessor _serialPort;
- public ISerialProcessor SerialPort
- {
- get => _serialPort ?? (_serialPort = new SerialProcessor());
- set
- {
- if (_serialPort == value)
- return;
-
- if (_serialPort != null)
- {
- if (_serialPort.IsOpen)
- throw new InvalidOperationException("Please disconnect before changing the serial engine.");
- }
-
- _serialPort = value;
- }
- }
-
- private IUtil _util;
- public IUtil Util
- {
- get => _util ?? (_util = new Util());
- set
- {
- if (Equals(_util, value))
- return;
-
- _util = value;
- }
- }
-
- private string _port = "COM1";
- public string Port
- {
- get => _port;
- set
- {
- if (_port == value) return;
-
- if (Connected)
- throw new InvalidOperationException("Please disconnect from the scope before changing port.");
-
- if (!ValidPort(value))
- throw new InvalidOperationException($"Unable to select port {value} as it does not exist.");
-
- _port = value;
- }
- }
-
- private bool ValidPort(string value)
- {
- return SerialPort.GetPortNames().Contains(value);
- }
-
- public bool Connected
- {
- get => SerialPort.IsOpen;
- set
- {
- if (value == Connected)
- return;
-
- if (value)
- {
- //Connecting
- try
- {
- AtPark = false;
- SerialPort.DtrEnable = false;
- SerialPort.RtsEnable = false;
- SerialPort.BaudRate = 9600;
- SerialPort.DataBits = 8;
- SerialPort.StopBits = StopBits.One;
- SerialPort.Parity = Parity.None;
- SerialPort.PortName = Port;
- SerialPort.Open();
-
- TestConnectionActive();
- SetFocuserSpeedFastest();
- }
- catch (Exception)
- {
- if (SerialPort.IsOpen)
- SerialPort.Close();
- throw;
- }
- }
- else
- {
- //Disconnecting
- SerialPort.Close();
- AtPark = false;
- }
- }
- }
-
- private void TestConnectionActive()
- {
- var firmwareVersionNumber = SerialPort.CommandTerminated(":GVN#", "#");
- if (string.IsNullOrEmpty(firmwareVersionNumber))
- {
- throw new InvalidOperationException("Failed to communicate with telescope.");
- }
- }
-
- public bool Slewing
- {
- get
- {
- if (!Connected) return false;
-
-
- if (movingAxis())
- return true;
-
- var result = SerialPort.CommandTerminated(":D#", "#");
- return result != string.Empty;
- }
- }
-
- public DateTime utcDate
- {
- get
- {
- string telescopeDate = SerialPort.CommandTerminated(":GC#", "#");
- string telescopeTime = SerialPort.CommandTerminated(":GL#", "#");
-
- int month = telescopeDate.Substring(0, 2).ToInteger();
- int day = telescopeDate.Substring(3, 2).ToInteger();
- int year = telescopeDate.Substring(6, 2).ToInteger();
-
- if (year < 2000) //todo fix this hack that will create a Y2K100 bug
- {
- year = year + 2000;
- }
-
- int hour = telescopeTime.Substring(0, 2).ToInteger();
- int minute = telescopeTime.Substring(3, 2).ToInteger();
- int second = telescopeTime.Substring(6, 2).ToInteger();
-
- var utcCorrection = GetUtcCorrection();
-
- //Todo is this telescope local time, or real utc?
- var newDate = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc) + utcCorrection;
-
- return newDate;
- }
- set
- {
- var utcCorrection = GetUtcCorrection();
- var localDateTime = value - utcCorrection;
-
- //Todo is this telescope local time, or real utc?
- var timeResult = SerialPort.CommandChar($":SL{localDateTime:HH:mm:ss}#");
- if (timeResult != '1')
- {
- throw new InvalidOperationException("Failed to set local time");
- }
-
- SerialPort.Lock();
- try
- {
- var dateResult = SerialPort.CommandChar($":SC{localDateTime:MM/dd/yy}#");
- if (dateResult != '1')
- {
- throw new InvalidOperationException("Failed to set local date");
- }
-
- //throwing away these two strings which represent
- SerialPort.ReadTerminated("#"); //Updating Planetary Data#
- SerialPort.ReadTerminated("#"); // #
- }
- finally
- {
- SerialPort.Unlock();
- }
- }
-
- }
-
- private TimeSpan GetUtcCorrection()
- {
- string utcOffSet = SerialPort.CommandTerminated(":GG#", "#");
- double utcOffsetHours = double.Parse(utcOffSet);
- TimeSpan utcCorrection = TimeSpan.FromHours(utcOffsetHours);
- return utcCorrection;
- }
-
- public double SiteLatitude
- {
- get
- {
- var latitude = SerialPort.CommandTerminated( ":Gt#", "#");
-
- return DmsToDouble(latitude);
- }
- set
- {
- if (value > 90)
- throw new InvalidValueException("Latitude cannot be greater than 90 degrees.");
-
- if (value < -90)
- throw new InvalidValueException("Latitude cannot be less than -90 degrees.");
-
- int d = Convert.ToInt32(Math.Floor(value));
- int m = Convert.ToInt32(60 * (value - d));
-
- var result = SerialPort.CommandChar($":Sts{d:00}*{m:00}#");
- if (result != '1')
- throw new InvalidOperationException("Failed to set site latitude.");
- }
- }
-
- private double DmsToDouble(string dms)
- {
- if (IsNumeric(dms[0]))
- {
- double l = int.Parse(dms.Substring(0, 3));
- l = l + double.Parse(dms.Substring(4, 2)) / 60;
- if (dms.Length == 9)
- l = l + double.Parse(dms.Substring(7, 2)) / 60 / 60;
-
- return l;
- }
-
- double lat = int.Parse(dms.Substring(1, 2));
- lat = lat + double.Parse(dms.Substring(4, 2)) / 60;
- if (dms.Length == 9)
- lat = lat + double.Parse(dms.Substring(7, 2)) / 60 / 60;
-
- if (dms[0] == '-')
- lat = -lat;
-
- return lat;
- }
-
- private bool IsNumeric(char c)
- {
- char[] nums = new[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
- return nums.Contains(c);
- }
-
- public double SiteLongitude
- {
- get
- {
- var longitude = SerialPort.CommandTerminated(":Gg#", "#");
- double l = DmsToDouble(longitude);
-
- if (l > 180)
- l = l - 360;
-
- return l;
- }
- set
- {
- if (value > 180)
- throw new InvalidValueException("Longitude cannot be greater than 180 degrees.");
-
- if (value < -180)
- throw new InvalidValueException("Longitude cannot be lower than -180 degrees.");
-
- int d = Convert.ToInt32(Math.Floor(value));
- int m = Convert.ToInt32(60 * (value - d));
-
- var result = SerialPort.CommandChar($":Sg{d:000}*{m:00}#");
- if (result != '1')
- throw new InvalidOperationException("Failed to set site longitude.");
- }
-
- }
-
- public AlignmentModes AlignmentMode
- {
- get
- {
- const char ack = (char)6;
- //var alignmentString = SerialPort.CommandTerminated(":GW#", "#");
- var alignmentString = SerialPort.CommandChar(ack.ToString());
- //:GW# Get Scope Alignment Status
- //Returns: #
- // where:
- //mount: A - AzEl mounted, P - Equatorially mounted, G - german mounted equatorial
- //tracking: T - tracking, N - not tracking
- //alignment: 0 - needs alignment, 1 - one star aligned, 2 - two star aligned, 3 - three star aligned.
-
- switch (alignmentString)
- {
- case 'A': return AlignmentModes.algAltAz;
- case 'P': return AlignmentModes.algPolar;
- case 'G': return AlignmentModes.algGermanPolar;
- default:
- throw new InvalidValueException($"unknown alignment returned from telescope: {alignmentString}");
- }
- }
- set
- {
- switch (value)
- {
- case AlignmentModes.algAltAz:
- SerialPort.Command(":AA#");
- //:AA# Sets telescope the AltAz alignment mode
- //Returns: nothing
- break;
- case AlignmentModes.algPolar:
- case AlignmentModes.algGermanPolar:
- SerialPort.Command(":AP#");
- //:AP# Sets telescope to Polar alignment mode
- //Returns: nothing
- break;
- default:
- throw new ArgumentOutOfRangeException(nameof(value), value, null);
- }
-
- //:AL# Sets telescope to Land alignment mode
- //Returns: nothing
- }
- }
-
- public bool AtPark { get; private set; }
-
- public double Azimuth
- {
- get
- {
- var result = SerialPort.CommandTerminated(":GZ#", "#");
- //:GZ# Get telescope azimuth
- //Returns: DDD*MM#T or DDD*MM’SS#
- //The current telescope Azimuth depending on the selected precision.
-
- double az = DmsToDouble(result);
-
- return az;
- }
- }
-
- public double RightAscension {
- get
- {
- var result = SerialPort.CommandTerminated(":GR#", "#");
- //:GR# Get Telescope RA
- //Returns: HH: MM.T# or HH:MM:SS#
- //Depending which precision is set for the telescope
-
- double ra = HmsToDouble(result);
-
- return ra;
- }
- }
-
- private double HmsToDouble(string hms)
- {
- return Util.HMSToHours(hms);
- }
-
- public double Declination
- {
- get
- {
- var result = SerialPort.CommandTerminated(":GD#", "#");
- //:GD# Get Telescope Declination.
- //Returns: sDD* MM# or sDD*MM’SS#
- //Depending upon the current precision setting for the telescope.
-
- double az = DmsToDouble(result);
-
- return az;
- }
- }
-
- private double _targetRightAscension = INVALID_PARAMETER;
- public double TargetRightAscension {
- get
- {
- if (_targetRightAscension == INVALID_PARAMETER)
- throw new ASCOM.InvalidOperationException("Target not set");
-
- //var result = SerialPort.CommandTerminated(":Gr#", "#");
- ////:Gr# Get current/target object RA
- ////Returns: HH: MM.T# or HH:MM:SS
- ////Depending upon which precision is set for the telescope
-
- //double targetRa = HmsToDouble(result);
- //return targetRa;
- return _targetRightAscension;
- }
- set
- {
- if (value < 0)
- throw new InvalidValueException("Right ascension value cannot be below 0");
-
- if (value >= 24)
- throw new InvalidValueException("Right ascension value cannot be greater than 23:59:59");
-
-
- //todo implement the low precision version
-
- var hms = Util.HoursToHMS(value, ":", ":", ":", 2);
- var response = SerialPort.CommandChar($":Sr{hms}#");
- //:SrHH:MM.T#
- //:SrHH:MM:SS#
- //Set target object RA to HH:MM.T or HH: MM: SS depending on the current precision setting.
- // Returns:
- //0 – Invalid
- //1 - Valid
-
- if (response == '0')
- throw new InvalidOperationException("Failed to set TargetRightAscension.");
-
- _targetRightAscension = value;
- }
- }
-
- private double _targetDeclination = INVALID_PARAMETER;
- public double TargetDeclination {
- get
- {
- if (_targetDeclination == INVALID_PARAMETER)
- throw new ASCOM.InvalidOperationException("Target not set");
-
- //var result = SerialPort.CommandTerminated(":Gd#", "#");
- ////:Gd# Get Currently Selected Object/Target Declination
- ////Returns: sDD* MM# or sDD*MM’SS#
- ////Depending upon the current precision setting for the telescope.
-
- //double targetDec = DmsToDouble(result);
-
- //return targetDec;
- return _targetDeclination;
- }
- set
- {
- //todo implement low precision version of this.
- if (value > 90)
- throw new ASCOM.InvalidValueException("Declination cannot be greater than 90.");
-
- if (value < -90)
- throw new ASCOM.InvalidValueException("Declination cannot be less than -90.");
-
-
- var dms = Util.DegreesToDMS(value, "*", ":", ":", 2);
- var s = value < 0 ? '-' : '+';
-
- var result = SerialPort.CommandChar($":Sd{s}{dms}#");
- //:SdsDD*MM#
- //Set target object declination to sDD*MM or sDD*MM:SS depending on the current precision setting
- //Returns:
- //1 - Dec Accepted
- //0 – Dec invalid
-
- if (result == '0')
- {
- throw new ASCOM.InvalidOperationException("Target declination invalid");
- }
-
- _targetDeclination = value;
- }
- }
-
- private DriveRates _trackingRate = DriveRates.driveSidereal;
- public DriveRates TrackingRate
- {
- get
- {
- //var result = SerialPort.CommandTerminated(":GT#", "#");
-
- //double rate = double.Parse(result);
-
-
- //if (rate == 60.1)
- // return DriveRates.driveLunar;
- //else if (rate == 60.1)
- // return DriveRates.driveSidereal;
-
- //return DriveRates.driveKing;
- return _trackingRate;
- }
- set
- {
- switch (value)
- {
- case DriveRates.driveSidereal:
- SerialPort.Command(":TQ#");
- //:TQ# Selects sidereal tracking rate
- //Returns: Nothing
- break;
- case DriveRates.driveLunar:
- SerialPort.Command(":TL#");
- //:TL# Set Lunar Tracking Rage
- //Returns: Nothing
- break;
- //case DriveRates.driveSolar:
- // SerialPort.Command(":TS#");
- // //:TS# Select Solar tracking rate. [LS Only]
- // //Returns: Nothing
- // break;
- case DriveRates.driveKing:
- //:TM# Select custom tracking rate [ no-op in Autostar II]
- //Returns: Nothing
- break;
- default:
- throw new ArgumentOutOfRangeException(nameof(value), value, null);
- }
-
- _trackingRate = value;
- }
- }
-
- public int FocuserMaxIncrement { get; set; } = 7000;
-
- public int FocuserMaxStep { get; set; } = 7000;
-
- public double Altitude {
- get
- {
- var result = SerialPort.CommandTerminated(":GA#", "#");
- //:GA# Get Telescope Altitude
- //Returns: sDD* MM# or sDD*MM’SS#
- //The current scope altitude. The returned format depending on the current precision setting.
- return DmsToDouble(result);
- }
- }
-
- public void AbortSlew()
- {
- SerialPort.Command("#:Q#");
- }
-
- public void PulseGuide(GuideDirections direction, int duration)
- {
- string d = string.Empty;
- switch (direction)
- {
- case GuideDirections.guideEast:
- d = "e";
- break;
- case GuideDirections.guideNorth:
- d = "n";
- break;
- case GuideDirections.guideSouth:
- d = "s";
- break;
- case GuideDirections.guideWest:
- d = "w";
- break;
- }
-
- if (UserNewerPulseGuiding)
- {
- _serialPort.Command($":Mg{d}{duration:0000}#");
- Thread.Sleep(duration); //todo figure out if this is really needed
- }
- else
- {
- SerialPort.Lock();
- try
- {
- _serialPort.Command(":RG#"); //Make sure we are at guide rate
- _serialPort.Command($":M{d}#");
- Thread.Sleep(duration);
- _serialPort.Command($":Q{d}#");
-
- //classic only !!!, this is needed since once in a while one is not enough
- Thread.Sleep(200);
- _serialPort.Command($":Q{d}#");
- }
- finally
- {
- SerialPort.Unlock();
- }
- }
- }
-
- public void Park()
- {
- if (AtPark)
- return;
-
- AtPark = true;
- _serialPort.Command(":hP#");
- }
-
- public void SlewToCoordinates(double rightAscension, double declination)
- {
- SlewToCoordinatesAsync(rightAscension, declination);
-
- while (Slewing) //wait for slew to complete
- {
- Util.WaitForMilliseconds(200); //be responsive to AbortSlew();
- }
- }
-
- public void SlewToCoordinatesAsync(double rightAscension, double declination)
- {
- SerialPort.Lock();
- try
- {
- TargetRightAscension = rightAscension;
- TargetDeclination = declination;
-
- DoSlewAsync(true);
- }
- finally
- {
- SerialPort.Unlock();
- }
- }
-
- public void SlewToAltAz(double azimuth, double altitude)
- {
- SlewToAltAzAsync(azimuth, altitude);
-
- while (Slewing) //wait for slew to complete
- {
- Util.WaitForMilliseconds(200); //be responsive to AbortSlew();
- }
- }
-
- private double TargetAltitude
- {
- set
- {
- if (value > 90)
- throw new ASCOM.InvalidValueException("Altitude cannot be greater than 90.");
-
- if (value < 0)
- throw new ASCOM.InvalidValueException("Altitide cannot be less than 0.");
-
-
- var dms = Util.DegreesToDMS(value, "*", "'", ".", 2);
- var s = value < 0 ? '-' : '+';
-
- var result = SerialPort.CommandChar($":Sa{s}{dms}#");
- //:SasDD*MM#
- //Set target object altitude to sDD*MM# or sDD*MM’SS# [LX 16”, Autostar, Autostar II]
- //Returns:
- //1 Object within slew range
- //0 Object out of slew range
-
- if (result == '0')
- throw new ASCOM.InvalidOperationException("Target altitude out of slew range");
- }
- }
-
- private double TargetAzimuth
- {
- set
- {
- if (value >= 360)
- throw new ASCOM.InvalidValueException("Azimuth cannot be 360 or higher.");
-
- if (value < 0)
- throw new ASCOM.InvalidValueException("Azimuth cannot be less than 0.");
-
- var dms = Util.DegreesToDM(value, "*", ":", 2);
-
- var result = SerialPort.CommandChar($":Sd{dms}#");
- //:SzDDD*MM#
- //Sets the target Object Azimuth[LX 16” and Autostar II only]
- //Returns:
- //0 – Invalid
- //1 - Valid
-
- if (result == '0')
- throw new ASCOM.InvalidOperationException("Target Azimuth out of slew range");
-
- }
- }
-
- public void SlewToAltAzAsync(double azimuth, double altitude)
- {
- SerialPort.Lock();
- try
- {
- TargetAltitude = altitude;
- TargetAzimuth = azimuth;
-
- DoSlewAsync(false);
- }
- finally
- {
- SerialPort.Unlock();
- }
- }
-
- public void SyncToTarget()
- {
- var result = SerialPort.CommandTerminated(":CM#", "#");
- //:CM# Synchronizes the telescope's position with the currently selected database object's coordinates.
- //Returns:
- //LX200's - a "#" terminated string with the name of the object that was synced.
- // Autostars & Autostar II - At static string: " M31 EX GAL MAG 3.5 SZ178.0'#"
-
- if (result == string.Empty)
- throw new ASCOM.InvalidOperationException("Unable to perform sync");
- }
-
- public void SlewToTarget()
- {
- SlewToTargetAsync();
-
- while (Slewing)
- {
- Util.WaitForMilliseconds(200);
- }
- }
-
- public void SlewToTargetAsync()
- {
- if (TargetDeclination == INVALID_PARAMETER || TargetRightAscension == INVALID_PARAMETER )
- throw new ASCOM.InvalidOperationException("No target selected to slew to.");
-
- DoSlewAsync(true);
- }
-
- private bool movingAxis()
- {
- return _movingPrimary || _movingSecondary;
- }
-
- private bool _movingPrimary;
- private bool _movingSecondary;
-
- public void MoveAxis(TelescopeAxes axis, double rate)
- {
- SerialPort.Lock();
- try
- {
- var absrate = Math.Abs(rate);
-
- switch (absrate)
- {
- case 0:
- //do nothing, it's ok this time as we're halting the slew.
- break;
- case 1:
- SerialPort.Command(":RG#");
- //:RG# Set Slew rate to Guiding Rate (slowest)
- //Returns: Nothing
- break;
- case 2:
- SerialPort.Command(":RC#");
- //:RC# Set Slew rate to Centering rate (2nd slowest)
- //Returns: Nothing
- break;
- case 3:
- SerialPort.Command(":RM#");
- //:RM# Set Slew rate to Find Rate (2nd Fastest)
- //Returns: Nothing
- break;
- case 4:
- SerialPort.Command(":RS#");
- //:RS# Set Slew rate to max (fastest)
- //Returns: Nothing
- break;
- default:
- throw new ASCOM.InvalidValueException($"Rate {rate} not supported");
-
- }
-
- switch (axis)
- {
- case TelescopeAxes.axisPrimary:
- if (rate == 0)
- {
- _movingPrimary = false;
- SerialPort.Command(":Qe#");
- //:Qe# Halt eastward Slews
- //Returns: Nothing
- SerialPort.Command(":Qw#");
- //:Qw# Halt westward Slews
- //Returns: Nothing
- }
- else if (rate > 0)
- {
- SerialPort.Command(":Me#");
- //:Me# Move Telescope East at current slew rate
- //Returns: Nothing
- _movingPrimary = true;
- }
- else
- {
- SerialPort.Command(":Mw#");
- //:Mw# Move Telescope West at current slew rate
- //Returns: Nothing
- _movingPrimary = true;
- }
-
- break;
- case TelescopeAxes.axisSecondary:
- if (rate == 0)
- {
- _movingSecondary = false;
- SerialPort.Command(":Qn#");
- //:Qn# Halt northward Slews
- //Returns: Nothing
- SerialPort.Command(":Qs#");
- //:Qs# Halt southward Slews
- //Returns: Nothing
- }
- else if (rate > 0)
- {
- SerialPort.Command(":Mn#");
- //:Mn# Move Telescope North at current slew rate
- //Returns: Nothing
- _movingSecondary = true;
- }
- else
- {
- SerialPort.Command(":Ms#");
- //:Ms# Move Telescope South at current slew rate
- //Returns: Nothing
- _movingSecondary = true;
- }
-
- break;
- default:
- throw new ASCOM.MethodNotImplementedException("Can not move this axis.");
- }
- }
- finally
- {
- SerialPort.Unlock();
- }
- }
-
- public void FocuserHalt()
- {
- SerialPort.Command(":FQ#");
- //:FQ# Halt Focuser Motion
- //Returns: Nothing
- }
-
- public void FocuserMove(int newPosition)
- {
- //todo implement backlash compensation
- //todo implement direction reverse
- //todo implement dynamic braking
-
- if (newPosition < -FocuserMaxIncrement || newPosition > FocuserMaxIncrement)
- {
- throw new ASCOM.InvalidValueException($"position out of range {-FocuserMaxIncrement} < {newPosition} < {FocuserMaxIncrement}");
- }
-
- if (newPosition == 0)
- return;
-
- if (newPosition > 0)
- {
- //desired move direction is out
- MoveFocuser(true, Math.Abs(newPosition));
- }
- else
- {
- //desired move direction is in
- MoveFocuser(false, Math.Abs(newPosition));
- }
- }
-
- public string CommandString(string command, bool raw)
- {
- return SerialPort.CommandTerminated(command, "#");
- }
-
- public void CommandBlind(string command, bool raw)
- {
- SerialPort.Command(command);
- }
-
- private void MoveFocuser(bool directionOut, int steps)
- {
- SerialPort.Command(directionOut ? ":F+#" : ":F-#");
- //:F+# Start Focuser moving inward (toward objective)
- //Returns: None
-
- //:F-# Start Focuser moving outward (away from objective)
- //Returns: None
-
- Util.WaitForMilliseconds(steps);
-
- FocuserHalt();
- }
-
- private void SetFocuserSpeedFastest()
- {
- SerialPort.Command(":FF#");
- //:FF# Set Focus speed to fastest setting
- //Returns: Nothing
- }
-
- private void SetFocuserSpeedSlowest()
- {
- SerialPort.Command(":FS#");
- //:FS# Set Focus speed to slowest setting
- //Returns: Nothing
- }
-
- private void SetFocuserSpeed( int speed)
- {
- if (speed < 1)
- throw new ArgumentOutOfRangeException("speed is too low");
-
- if (speed > 4)
- throw new ArgumentOutOfRangeException("speed is too high");
-
- SerialPort.Command($":F{speed}#");
- //:F# Autostar, Autostar II – set focuser speed to where is an ASCII digit 1..4
- //Returns: Nothing
- //All others – Not Supported
- }
-
- //todo remove the polar parameter and split method into two.
- private void DoSlewAsync( bool polar)
- {
- SerialPort.Lock();
- try
- {
- switch (polar)
- {
- case true:
- var response = SerialPort.CommandChar(":MS#");
- //:MS# Slew to Target Object
- //Returns:
- //0 Slew is Possible
- //1# Object Below Horizon w/string message
- //2# Object Below Higher w/string message
-
- switch (response)
- {
- case '0':
- //We're slewing everything should be working just fine.
- break;
- case '1':
- //Below Horizon
- string belowHorizonMessage = SerialPort.ReadTerminated("#");
- throw new ASCOM.InvalidOperationException(belowHorizonMessage);
- case '2':
- //Below Horizon
- string belowMinimumElevationMessage = SerialPort.ReadTerminated("#");
- throw new ASCOM.InvalidOperationException(belowMinimumElevationMessage);
- default:
- throw new ASCOM.DriverException("This error should not happen");
-
- }
-
- break;
- case false:
- var maResponse = SerialPort.CommandChar(":MA#");
- //:MA# Autostar, LX 16”, Autostar II – Slew to target Alt and Az
- //Returns:
- //0 - No fault
- //1 – Fault
- // LX200 – Not supported
-
- if (maResponse == '1')
- {
- throw new ASCOM.InvalidOperationException("fault");
- }
-
- break;
- }
- }
- finally
- {
- SerialPort.Unlock();
- }
- }
-
- public bool UserNewerPulseGuiding { get; set; } = true; //todo make this a device setting
- }
-}
diff --git a/TargetToBeat.txt b/TargetToBeat.txt
deleted file mode 100644
index 8255bd9..0000000
--- a/TargetToBeat.txt
+++ /dev/null
@@ -1,249 +0,0 @@
-
-ConformanceCheck ASCOM Device Conformance Checker Version 6.4.63.0, Build time: 18/12/2018 08:58:34
-ConformanceCheck Running on: ASCOM Platform 6.4 SP1 6.4.1.2695
-
-ConformanceCheck Driver ProgID: MeadeEx.Telescope
-
-Error handling
-Error number for "Not Implemented" is: 80040400
-Error number for "Invalid Value 1" is: 80040401
-Error number for "Invalid Value 2" is: 80040405
-Error number for "Value Not Set 1" is: 80040402
-Error number for "Value Not Set 2" is: 80040403
-Error messages will not be interpreted to infer state.
-
-21:04:42.255 Driver Access Checks OK
-21:04:42.997 AccessChecks OK Successfully created driver using late binding
-21:04:50.059 AccessChecks OK Successfully connected using late binding
-21:04:50.063 AccessChecks INFO The driver is a COM object
-21:04:57.769 AccessChecks INFO Device exposes interface ITelescopeV2
-21:04:58.546 AccessChecks INFO Device does not expose interface ITelescopeV3
-21:04:59.881 AccessChecks OK Successfully created driver using driver access toolkit
-21:05:06.873 AccessChecks OK Successfully connected using driver access toolkit
-
-Conform is using ASCOM.DriverAccess.Telescope to get a Telescope object
-21:05:08.261 ConformanceCheck OK Driver instance created successfully
-21:05:15.293 ConformanceCheck OK Connected OK
-
-Common Driver Methods
-21:05:15.333 InterfaceVersion OK 2
-21:05:15.362 Connected OK True
-21:05:15.448 Description OK Meade Autostar 497: ETX Autostar|A|43Ea|Jun 02 2006@10:09:40
-21:05:15.480 DriverInfo OK ASCOM Meade Telescope/Focuser driver for classic and Autostar I 5.0.4
- ASCOM Iniative
- http://ascom-standards.org/
- Last Modified 10/06/2013 19:06:54
-21:05:15.509 DriverVersion OK 5.0
-21:05:15.539 Name OK Autostar 497
-21:05:15.568 CommandString INFO Conform cannot test the CommandString method
-21:05:15.572 CommandBlind INFO Conform cannot test the CommandBlind method
-21:05:15.582 CommandBool INFO Conform cannot test the CommandBool method
-21:05:15.588 Action INFO Conform cannot test the Action method
-21:05:15.595 SupportedActions OK Driver returned an empty action list
-
-Can Properties
-21:05:15.663 CanFindHome OK False
-21:05:15.671 CanPark OK True
-21:05:15.679 CanPulseGuide OK True
-21:05:15.687 CanSetDeclinationRate OK False
-21:05:15.695 CanSetGuideRates OK False
-21:05:15.703 CanSetPark OK False
-21:05:15.711 CanSetPierSide OK False
-21:05:15.719 CanSetRightAscensionRate OK False
-21:05:15.727 CanSetTracking OK False
-21:05:15.735 CanSlew OK True
-21:05:15.743 CanSlewltAz OK True
-21:05:15.752 CanSlewAltAzAsync OK True
-21:05:15.761 CanSlewAsync OK True
-21:05:15.769 CanSync OK True
-21:05:15.777 CanSyncAltAz OK False
-21:05:15.785 CanUnPark OK False
-
-Pre-run Checks
-21:05:15.834 Mount Safety INFO Scope is not parked, continuing testing
-21:05:15.887 TimeCheck INFO PC Time Zone: GMT Summer Time, offset -1 hours.
-21:05:15.894 TimeCheck INFO PC UTCDate: 30-Apr-2019 20:05:15.894
-21:05:16.013 TimeCheck INFO Mount UTCDate: 30-Apr-2019 20:04:15.000
-
-Properties
-21:05:16.063 AlignmentMode OK algPolar
-21:05:16.117 Altitude OK 90.00
-21:05:16.149 ApertureArea ERROR Unexpected DriverAccessCOMException, : Property ApertureAreaThe supplied value is out of range for this property.
-21:05:16.182 ApertureDiameter ERROR Unexpected DriverAccessCOMException, : Property ApertureDiameterThe supplied value is out of range for this property.
-21:05:16.214 AtHome OK False
-21:05:16.245 AtPark OK False
-21:05:16.310 Azimuth OK 0.57
-21:05:16.369 Declination OK 89:59:59.00
-21:05:16.402 DeclinationRate Read OK 0.00
-21:05:16.434 DeclinationRate Write OK CanSetDeclinationRate is False and a PropertyNotImplementedException exception was generated as expected
-21:05:16.469 DoesRefraction Read OK True
-21:05:16.501 DoesRefraction Write ERROR Unexpected DriverAccessCOMException, : Property DoesRefractionThe supplied value is out of range for this property.
-21:05:16.534 EquatorialSystem OK equLocalTopocentric
-21:05:16.568 FocalLength ERROR Unexpected DriverAccessCOMException, : Property FocalLengthThe supplied value is out of range for this property.
-21:05:16.602 GuideRateDeclination Read OK 0.00
-21:05:16.613 GuideRateDeclination Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
-21:05:16.646 GuideRateRightAscension Read OK 0.00
-21:05:16.661 GuideRateRightAscension Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
-21:05:16.694 IsPulseGuiding OK False
-21:05:16.748 RightAscension OK 22:28:48.00
-21:05:16.781 RightAscensionRate Read OK 0.00
-21:05:16.814 RightAscensionRate Write OK CanSetRightAscensionRate is False and a PropertyNotImplementedException exception was generated as expected
-21:05:16.848 SiteElevation Read OK 0
-21:05:16.884 SiteElevation Write ERROR Unexpected DriverAccessCOMException, : Property SiteElevation The supplied value is out of range for this property.
-21:05:16.896 SiteElevation Write ERROR Unexpected DriverAccessCOMException, : Property SiteElevation The supplied value is out of range for this property.
-21:05:16.908 SiteElevation Write OK Legal value 0m written successfully
-21:05:16.965 SiteLatitude Read OK 53:50:00.00
-21:05:16.999 SiteLatitude Write OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.012 SiteLatitude Write OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.025 SiteLatitude Write OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.096 SiteLongitude Read OK -01:46:00.00
-21:05:17.130 SiteLongitude Write OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.144 SiteLongitude Write OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.156 SiteLongitude Write OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.192 Slewing OK False
-21:05:17.226 SlewSettleTime Read OK 0
-21:05:17.262 SlewSettleTime Write ERROR Unexpected DriverAccessCOMException, : Property SlewSettleTime The supplied value is out of range for this property.
-21:05:17.277 SlewSettleTime Write OK Legal value 0 seconds written successfully
-21:05:17.313 SideOfPier Read OK Optional member threw a PropertyNotImplementedException exception.
-21:05:17.356 SiderealTime OK 10:31:06.00
-21:05:17.368 SiderealTime OK Scope and ASCOM sidereal times agree to better than 5 minutes, Scope: 10:31:06.00, ASCOM: 10:32:07.97
-21:05:17.405 TargetDeclination Read ERROR Unexpected DriverAccessCOMException, : The target value is not set.
-21:05:17.440 TargetDeclination Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
-21:05:17.454 TargetRightAscension Read ERROR Unexpected DriverAccessCOMException, : The target value is not set.
-21:05:17.489 TargetRightAscension Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
-21:05:17.502 Tracking Read OK True
-21:05:17.537 Tracking Write OK CanSetTracking is False and a PropertyNotImplementedException exception was generated as expected
-21:05:17.575 TrackingRates ERROR Unexpected System.Reflection.TargetInvocationException exception, : Exception has been thrown by the target of an invocation.
-21:05:17.590 TrackingRates ERROR Unexpected System.Reflection.TargetInvocationException exception, : Exception has been thrown by the target of an invocation.
-21:05:17.603 TrackingRates OK Dispose member not present
-21:05:17.638 TrackingRates OK Successfully obtained a TrackingRates object after the previous TrackingRates object was disposed
-21:05:17.651 TrackingRate Read OK driveSidereal
-21:05:17.665 TrackingRate Write ERROR Unexpected System.Reflection.TargetInvocationException exception, : Exception has been thrown by the target of an invocation.
-21:05:17.760 UTCDate Read OK 30-Apr-2019 20:04:16.000
-21:05:17.774 UTCDate Write OK Optional member threw a PropertyNotImplementedException exception.
-
-Methods
-21:05:17.858 CanMoveAxis:Primary OK CanMoveAxis:Primary False
-21:05:17.894 CanMoveAxis:Secondary OK CanMoveAxis:Secondary False
-21:05:17.931 CanMoveAxis:Tertiary OK CanMoveAxis:Tertiary False
-21:05:17.967 Park/Unpark INFO Tests skipped
-21:05:18.981 AbortSlew OK AbortSlew OK when not slewing
-21:05:19.040 AxisRate:Primary Enum ERROR .NET - Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
- --- End of inner exception stack trace ---
- at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
- at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
- at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
- at Conform.TelescopeTester.TelescopeAxisRateTest(String p_Name, TelescopeAxes p_Axis) in J:\Conform\Conform\Devices\TelescopeTester.vb:line 3022
-21:05:19.055 AxisRate:Primary OK Empty axis rate returned
-21:05:19.069 AxisRate:Primary OK AxisRates.Dispose() member not present for axis axisPrimary
-21:05:19.085 AxisRate:Secondary Enum ERROR .NET - Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
- --- End of inner exception stack trace ---
- at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
- at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
- at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
- at Conform.TelescopeTester.TelescopeAxisRateTest(String p_Name, TelescopeAxes p_Axis) in J:\Conform\Conform\Devices\TelescopeTester.vb:line 3022
-21:05:19.100 AxisRate:Secondary OK Empty axis rate returned
-21:05:19.117 AxisRate:Secondary OK AxisRates.Dispose() member not present for axis axisSecondary
-21:05:19.132 AxisRate:Tertiary Enum ERROR .NET - Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
- --- End of inner exception stack trace ---
- at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
- at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
- at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
- at Conform.TelescopeTester.TelescopeAxisRateTest(String p_Name, TelescopeAxes p_Axis) in J:\Conform\Conform\Devices\TelescopeTester.vb:line 3022
-21:05:19.149 AxisRate:Tertiary OK Empty axis rate returned
-21:05:19.178 AxisRate:Tertiary OK AxisRates.Dispose() member not present for axis axisTertiary
-21:05:19.195 FindHome OK CanFindHome is False and a MethodNotImplementedException exception was generated as expected
-21:05:19.234 MoveAxis Primary OK CanMoveAxis Primary is False and a MethodNotImplementedException exception was generated as expected
-21:05:19.273 MoveAxis Secondary OK CanMoveAxis Secondary is False and a MethodNotImplementedException exception was generated as expected
-21:05:19.314 MoveAxis Tertiary OK CanMoveAxis Tertiary is False and a MethodNotImplementedException exception was generated as expected
-21:05:21.349 PulseGuide OK Synchronous pulse guide found OK
-21:06:13.942 SlewToCoordinates INFO Slewed within 15.0 arc seconds of expected RA: 09:31:10.00, actual RA: 09:31:09.00
-21:06:13.956 SlewToCoordinates OK Slewed OK. DEC: 01:00:00.00
-21:06:13.971 SlewToCoordinates OK The TargetRightAscension property 09:31:10.00 matches the expected RA OK.
-21:06:13.987 SlewToCoordinates OK The TargetDeclination property 01:00:00.00 matches the expected Declination OK.
-21:06:14.028 SlewToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:06:14.102 SlewToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:06:14.164 SlewToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:06:14.262 SlewToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:06:48.075 SlewToCoordinatesAsync INFO Slewed within 45.0 arc seconds of expected RA: 08:32:03.00, actual RA: 08:32:00.00
-21:06:48.090 SlewToCoordinatesAsync OK Slewed OK. DEC: 02:00:00.00
-21:06:48.106 SlewToCoordinatesAsync OK The TargetRightAscension property 08:32:03.00 matches the expected RA OK.
-21:06:48.122 SlewToCoordinatesAsync OK The TargetDeclination property 02:00:00.00 matches the expected Declination OK.
-21:06:48.164 SlewToCoordinatesAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:06:48.239 SlewToCoordinatesAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:06:48.302 SlewToCoordinatesAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:06:48.436 SlewToCoordinatesAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:07:22.044 SyncToCoordinates INFO Slewed to start position within 15.0 arc seconds of expected RA: 07:32:37.00, actual RA: 07:32:36.00
-21:07:22.061 SyncToCoordinates OK Slewed to start position OK. DEC: 26:55:00.00
-21:07:22.782 SyncToCoordinates INFO Synced to sync position within 15.0 arc seconds of expected RA: 07:28:37.00, actual RA: 07:28:36.00
-21:07:22.796 SyncToCoordinates OK Synced to sync position OK. DEC: 25:55:00.00
-21:07:22.812 SyncToCoordinates OK The TargetRightAscension property 07:28:37.00 matches the expected RA OK.
-21:07:22.828 SyncToCoordinates OK The TargetDeclination property 25:55:00.00 matches the expected Declination OK.
-21:07:53.961 SyncToCoordinates INFO Slewed back to start position within 15.0 arc seconds of expected RA: 07:32:37.00, actual RA: 07:32:36.00
-21:07:53.976 SyncToCoordinates OK Slewed back to start position OK. DEC: 26:55:00.00
-21:07:54.692 SyncToCoordinates INFO Synced to reversed sync position within 30.0 arc seconds of expected RA: 07:36:37.00, actual RA: 07:36:35.00
-21:07:54.708 SyncToCoordinates OK Synced to reversed sync position OK. DEC: 27:55:00.00
-21:08:25.954 SyncToCoordinates INFO Slewed back to start position within 15.0 arc seconds of expected RA: 07:32:37.00, actual RA: 07:32:36.00
-21:08:25.969 SyncToCoordinates OK Slewed back to start position OK. DEC: 26:55:00.00
-21:08:26.009 SyncToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, syncing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:08:26.087 SyncToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, syncing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:08:26.150 SyncToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, syncing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:08:26.229 SyncToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, syncing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:08:26.292 TargetRightAscension Write ERROR Unexpected DriverAccessCOMException, : Property TargetRightAscension The supplied value is out of range for this property.
-21:08:26.311 TargetRightAscension Write ERROR Unexpected DriverAccessCOMException, : Property TargetRightAscension The supplied value is out of range for this property.
-21:08:26.395 TargetRightAscension Write OK Legal value 06:34:15.00 HH:MM:SS written successfully
-21:08:26.435 TargetDeclination Write ERROR Unexpected DriverAccessCOMException, : Property TargetDeclination The supplied value is out of range for this property.
-21:08:26.454 TargetDeclination Write ERROR Unexpected DriverAccessCOMException, : Property TargetDeclination The supplied value is out of range for this property.
-21:08:26.506 TargetDeclination Write OK Legal value 01:00:00.00 DD:MM:SS written successfully
-21:08:57.865 SlewToTarget INFO Slewed within 45.0 arc seconds of expected RA: 07:34:15.00, actual RA: 07:34:12.00
-21:08:57.880 SlewToTarget OK Slewed OK. DEC: 03:00:00.00
-21:08:57.897 SlewToTarget OK The TargetRightAscension property 07:34:15.00 matches the expected RA OK.
-21:08:57.915 SlewToTarget OK The TargetDeclination property 03:00:00.00 matches the expected Declination OK.
-21:08:57.959 SlewToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:08:58.003 SlewToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:08:58.064 SlewToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:08:58.114 SlewToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:09:29.948 SlewToTargetAsync INFO Slewed within 45.0 arc seconds of expected RA: 06:34:47.00, actual RA: 06:34:44.00
-21:09:29.964 SlewToTargetAsync OK Slewed OK. DEC: 04:00:00.00
-21:09:29.979 SlewToTargetAsync OK The TargetRightAscension property 06:34:47.00 matches the expected RA OK.
-21:09:29.996 SlewToTargetAsync OK The TargetDeclination property 04:00:00.00 matches the expected Declination OK.
-21:09:30.038 SlewToTargetAsync (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:09:30.085 SlewToTargetAsync (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:09:30.150 SlewToTargetAsync (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:09:30.196 SlewToTargetAsync (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:09:30.257 DestinationSideOfPier Test skipped as AligmentMode is not German Polar
-21:09:30.278 SlewToAltAz ERROR Unexpected DriverAccessCOMException, CanSlewAltAz is True: Wrong tracking state
-21:09:30.322 SlewToAltAz (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
-21:09:30.343 SlewToAltAz (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
-21:09:30.407 SlewToAltAz (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
-21:09:30.426 SlewToAltAz (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
-21:09:30.492 SlewToAltAzAsync ERROR Unexpected DriverAccessCOMException, CanSlewAltAzAsync is True: Wrong tracking state
-21:09:30.534 SlewToAltAzAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
-21:09:30.552 SlewToAltAzAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
-21:09:30.617 SlewToAltAzAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
-21:09:30.637 SlewToAltAzAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
-21:10:05.974 SyncToTarget OK Slewed to start position OK. RA: 07:35:20.00
-21:10:05.993 SyncToTarget OK Slewed to start position OK. DEC: 26:55:00.00
-21:10:06.721 SyncToTarget OK Synced to sync position OK. RA: 07:31:20.00
-21:10:06.736 SyncToTarget OK Synced to sync position OK. DEC: 25:55:00.00
-21:10:37.626 SyncToTarget OK Slewed back to start position OK. RA: 07:35:20.00
-21:10:37.641 SyncToTarget OK Slewed back to start position OK. DEC: 26:55:00.00
-21:10:38.363 SyncToTarget OK Synced to reversed sync position OK. RA: 07:39:20.00
-21:10:38.381 SyncToTarget OK Synced to reversed sync position OK. DEC: 27:55:00.00
-21:11:09.639 SyncToTarget OK Slewed back to start position OK. RA: 07:35:20.00
-21:11:09.657 SyncToTarget OK Slewed back to start position OK. DEC: 26:55:00.00
-21:11:09.697 SyncToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:11:09.741 SyncToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:11:09.803 SyncToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
-21:11:09.847 SyncToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
-21:11:10.010 SyncToAltAz OK CanSyncAltAz is False and a MethodNotImplementedException exception was generated as expected
-
-SideOfPier Model Tests
-21:11:10.080 SideOfPier Model Tests INFO Tests skipped because this driver does Not support SideOfPier Read
-
-Post-run Checks
-21:11:10.180 Mount Safety INFO Tracking can't be turned off for this mount, please switch off manually.
-
-Conformance test complete
-
-Your driver had 53 errors, 0 warnings and 0 issues
\ No newline at end of file
diff --git a/TestConsole/Program.cs b/TelescopeTestConsole/Program.cs
similarity index 71%
rename from TestConsole/Program.cs
rename to TelescopeTestConsole/Program.cs
index 6c8fa71..72b790c 100644
--- a/TestConsole/Program.cs
+++ b/TelescopeTestConsole/Program.cs
@@ -22,17 +22,19 @@ namespace ASCOM
// Uncomment the code that's required
#if UseChooser
// choose the device
- string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.MeadeAutostar497.Telescope");
+ string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.Meade.net.Telescope");
if (string.IsNullOrEmpty(id))
return;
// create this device
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope(id);
#else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly.
- ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.MeadeAutostar497.Telescope");
+ ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.Meade.net.Telescope");
#endif
// now run some tests, adding code to your driver so that the tests will pass.
// these first tests are common to all drivers.
+
+
Console.WriteLine("name " + device.Name);
Console.WriteLine("description " + device.Description);
Console.WriteLine("DriverInfo " + device.DriverInfo);
@@ -41,29 +43,11 @@ namespace ASCOM
// TODO add more code to test the driver.
device.Connected = true;
- //Console.WriteLine(device.Slewing);
+ //Console.WriteLine($"Altitute {device.Altitude}");
- //device.UTCDate = DateTime.UtcNow;
- //Console.WriteLine(device.UTCDate.ToLocalTime());
+ //Console.WriteLine($"Dec {device.Declination}");
-
- //Console.WriteLine(device.AlignmentMode);
-
-
-
- //double l = device.SiteLatitude;
- //device.SiteLatitude = l;
-
- //double l = device.SiteLongitude;
- //device.SiteLongitude = l;
- //Console.WriteLine(device.SiteLongitude);
-
- //Console.WriteLine(device.RightAscension);
-
- //device.SlewToAltAz(0,0);
-
-
- Console.WriteLine(device.TrackingRate);
+ device.SlewToAltAz(30, 45);
device.Connected = false;
Console.WriteLine("Press Enter to finish");
diff --git a/TestConsole/Properties/AssemblyInfo.cs b/TelescopeTestConsole/Properties/AssemblyInfo.cs
similarity index 93%
rename from TestConsole/Properties/AssemblyInfo.cs
rename to TelescopeTestConsole/Properties/AssemblyInfo.cs
index 86599a1..2b89b32 100644
--- a/TestConsole/Properties/AssemblyInfo.cs
+++ b/TelescopeTestConsole/Properties/AssemblyInfo.cs
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("q Test Application")]
+[assembly: AssemblyTitle("Meade.net Test Application")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ASCOM Initiative")]
-[assembly: AssemblyProduct("q")]
+[assembly: AssemblyProduct("Meade.net")]
[assembly: AssemblyCopyright("Copyright © ASCOM Initiative 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
diff --git a/TestConsole/TestConsole.csproj b/TelescopeTestConsole/TelescopeTestConsole.csproj
similarity index 92%
rename from TestConsole/TestConsole.csproj
rename to TelescopeTestConsole/TelescopeTestConsole.csproj
index 34ad58e..deb5415 100644
--- a/TestConsole/TestConsole.csproj
+++ b/TelescopeTestConsole/TelescopeTestConsole.csproj
@@ -8,15 +8,15 @@
{D5207217-61C7-4E94-8097-91DBACE57D2A}
Exe
Properties
- TestConsole
- TestConsole
- v4.6
+ ASCOM.Meade.net
+ ASCOM.Meade.net.Test
+ v4.7.1
512