Compare commits

..

61 Commits

Author SHA1 Message Date
ColinD 633babd967 Merged in develop (pull request #12)
Develop
2019-08-18 22:12:57 +00:00
ColinD 81a3a29743 Made the Precision combobox a bit wider. 2019-08-18 23:05:51 +01:00
ColinD e1a0d6449d Added ability to read an unterminated buffer when changing slewing precision 2019-08-18 22:57:24 +01:00
ColinD f6556716a5 Modified the precision toggle to only use the first letter of the response rather than try to detect the entire string 2019-08-18 22:43:38 +01:00
ColinD f10936a9e8 Changes the installer name to ASCOM Meade Generic 2019-08-18 22:30:05 +01:00
ColinD 98feb74870 Changed how the precision item is saved. Removed the case-sensitivity. 2019-08-18 22:26:58 +01:00
ColinD 7542e86aeb Added missing log message for the new precision parameter. 2019-08-18 21:39:07 +01:00
ColinD 68928a2289 Added a config setting to be able to choose whether the telescope uses high or low precision. Set to Unchanged for the telescope settings to not be altered. 2019-08-18 21:30:22 +01:00
ColinD b3dc507aff Merge branch 'master' into develop 2019-07-26 11:49:13 +01:00
ColinD c5e9f67f84 Merged in develop (pull request #11)
Next release
2019-07-26 10:47:59 +00:00
ColinD 4568f49f5f Fixed broken unit test 2019-07-26 11:42:59 +01:00
ColinD fa613ecc92 Fixed issue where the driver version number is being reported incorrectly. 2019-07-26 11:38:26 +01:00
ColinD a9e2ec9528 Fixed issue when connecting, that the first attempt to set the guide rate was not in the right scale. 2019-07-25 00:15:34 +01:00
ColinD 027cb24d3f Added validation to the setup dialog. 2019-07-23 23:42:14 +01:00
ColinD 93c63cc014 Fixed defect where the guide rate wasn't being saved properly 2019-07-23 21:00:30 +01:00
ColinD 355320a4ba trying to make sure that the output of the log message contains the full double. 2019-07-23 19:11:27 +01:00
ColinD 87c8457bf0 All guide rate set commands now write the value to the telescope and to the internal variable, as well as saving to the profile. Set's also include a log message as well. 2019-07-23 14:12:33 +01:00
ColinD cc05808542 Added extra logging when reading the profile into the driver. Added readprofile just before the connection is made to make sure that the latest values are used. 2019-07-23 10:41:19 +01:00
ColinD e9d41a2412 Moved the code that reports the driver version to the end of the initialisation. 2019-07-23 10:32:18 +01:00
ColinD 1452f3cf07 Re-designed the Site action so that you can now select a site, get a site name, or get a site name. 2019-07-22 16:45:01 +01:00
ColinD 64e2b9c6f9 Set's the guide rate after connection if setting guide rate is supported. 2019-07-22 15:27:52 +01:00
ColinD 37437b7c7c Readded support for guide rate get and set. This will use a default value of 0.67 sidereal rate. But can be overridden by a user. 2019-07-22 15:06:03 +01:00
ColinD 692e39771c Added the driver version to the trace log. 2019-07-22 00:18:40 +01:00
ColinD e582761f53 Taken out the ability to get or set the guide rates, as there doesn't appear to be a method to read the guide rates in the meade command set. 2019-07-21 18:43:13 +01:00
ColinD c4eb74b274 Added support for can get guide rates for the LX200GPS 2019-07-21 17:49:28 +01:00
ColinD 6b9eff2b86 Implemented the select site custom action. 2019-07-20 23:56:52 +01:00
ColinD 5d3688bde7 Added log messages so that it's known which pulse guiding commands have been used. 2019-07-20 22:24:25 +01:00
ColinD 6d8702a011 Corrected trace log name to Meade.Generic.<telescope/focusser> 2019-07-20 21:11:58 +01:00
ColinD c2ebe329c5 Added support for the LX200GPS to use the newer pulse guiding commands.
Added support for setting the guide rate on the LX200GPS (untested)
2019-07-20 16:53:09 +01:00
ColinD ce74e980fa Returned the build.build file to the last known fully working version. 2019-07-19 22:41:01 +01:00
ColinD 1c3eb9f3d7 Fixed a typo 2019-07-19 22:25:17 +01:00
ColinD b6e12d687b Reading the guide rate from any axis will now return a hard coded value for the default guide rate. 2019-07-19 22:21:58 +01:00
ColinD e15537e6c3 Added support for being able to have ASCOM see a value for guide rate. 2019-07-19 22:15:41 +01:00
ColinD d9e551707f Removed the echo as it doesn't work in teamcity. 2019-07-19 20:43:40 +01:00
ColinD 5f55d9f28f Added MSIFilename to the nant output 2019-07-19 20:25:32 +01:00
ColinD c9ec7f3fca Merge branch 'master' into develop 2019-07-19 17:04:01 +01:00
ColinD df3887c385 Merged in develop (pull request #10)
Version 0.7.1
2019-07-19 16:02:10 +00:00
ColinD 53150f9400 Reset all version info's to 0.0.0.0 as TeamCity deals with version numbering now. 2019-07-19 16:51:13 +01:00
ColinD ac887ccdff Code inspections 2019-07-19 14:42:25 +01:00
ColinD 0e98f0e370 Code inspections 2019-07-19 14:33:41 +01:00
ColinD 9cf63c4912 Code inspections 2019-07-19 14:23:27 +01:00
ColinD d6f72c8222 Code inspections 2019-07-19 13:22:15 +01:00
ColinD c1cae2b0c4 Removed redundant using statements 2019-07-19 13:13:15 +01:00
ColinD 2ce8c4e123 Removed redundant qualifiers 2019-07-19 13:12:22 +01:00
ColinD dfef48ff0c code tidy up 2019-07-19 13:06:56 +01:00
ColinD 4b65c946d2 Unit testing 2019-07-19 12:49:56 +01:00
ColinD 3579189465 SlewToAltAz unit tests 2019-07-18 13:45:26 +01:00
ColinD 8b31c8d7a9 SlewToAltAzAsync unit tests 2019-07-18 13:12:26 +01:00
ColinD 04845cea7a Unit tests for SlewToCoordinates 2019-07-18 12:54:18 +01:00
ColinD aeaaf9df95 More unit testing 2019-07-18 12:31:09 +01:00
ColinD 1d5dcb529e Unit tests for slew to target async 2019-07-17 23:20:26 +01:00
ColinD fdeee5b822 Unit tests for slewing 2019-07-17 22:58:53 +01:00
ColinD a53f99810d More unit testing 2019-07-17 15:35:32 +01:00
ColinD 325e9908a7 Unit testing for UTCDate 2019-07-17 14:42:28 +01:00
ColinD 83865a3911 Unit testing for TrackingRate 2019-07-17 11:30:49 +01:00
ColinD b3b1d95cda Unit tests for Tracking property 2019-07-16 23:33:53 +01:00
ColinD bfb8f257a1 Unit tests for TargetRightAscension 2019-07-16 23:22:41 +01:00
ColinD 3109d1dcef Merged in feature/DecompeSharedResources (pull request #9)
Feature/DecompeSharedResources
2019-07-16 21:59:51 +00:00
ColinD 0ac7b8b7bd Unit tests for TargetDeclination 2019-07-16 22:03:56 +01:00
ColinD ee60613a95 More unit testing 2019-07-15 00:16:08 +01:00
ColinD a6308f1a64 Added a missing . to the name file name. Working :) 2019-07-14 23:00:15 +01:00
38 changed files with 2448 additions and 773 deletions
+6 -7
View File
@@ -1,5 +1,4 @@
using System; using System;
using ASCOM.Meade.net;
using ASCOM.Meade.net.AstroMaths; using ASCOM.Meade.net.AstroMaths;
using NUnit.Framework; using NUnit.Framework;
@@ -53,16 +52,16 @@ namespace AstroMath.UnitTests
public void UTtoGST_book() public void UTtoGST_book()
{ {
DateTime dateTime = new DateTime(1980, 04, 22, 14, 36, 51, 670, DateTimeKind.Utc); DateTime dateTime = new DateTime(1980, 04, 22, 14, 36, 51, 670, DateTimeKind.Utc);
double gst = _astroMath.UTtoGST(dateTime); double gst = _astroMath.UTtoGst(dateTime);
Assert.That(gst, Is.EqualTo(4.667932706211154)); Assert.That(gst, Is.EqualTo(4.667932706211154));
} }
[Test] [Test]
public void UTtoGST() public void UTtoGst()
{ {
DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc); DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc);
double gst = _astroMath.UTtoGST(dateTime); double gst = _astroMath.UTtoGst(dateTime);
Assert.That(gst, Is.EqualTo(14.191879687876451)); Assert.That(gst, Is.EqualTo(14.191879687876451));
} }
@@ -72,16 +71,16 @@ namespace AstroMath.UnitTests
{ {
double gst = 4.668119; double gst = 4.668119;
var longitude = -64; var longitude = -64;
var lst = _astroMath.GSTtoLST(gst, longitude); var lst = _astroMath.GsTtoLst(gst, longitude);
Assert.That(lst, Is.EqualTo(0.4014523333333333)); Assert.That(lst, Is.EqualTo(0.4014523333333333));
} }
[Test] [Test]
public void GSTtoLST() public void GsTtoLst()
{ {
double gst = 14.257589512545053; double gst = 14.257589512545053;
var longitude = -1.7833333333333332; var longitude = -1.7833333333333332;
var lst = _astroMath.GSTtoLST(gst, longitude); var lst = _astroMath.GsTtoLst(gst, longitude);
Assert.That(lst, Is.EqualTo(14.138700623656163)); Assert.That(lst, Is.EqualTo(14.138700623656163));
} }
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -32,5 +31,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.7.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
+3 -6
View File
@@ -9,13 +9,10 @@
#define UseChooser #define UseChooser
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; using System.Threading;
using ASCOM.DriverAccess; using ASCOM.DriverAccess;
namespace ASCOM namespace ASCOM.MeadeGeneric
{ {
class Program class Program
{ {
@@ -24,11 +21,11 @@ namespace ASCOM
// Uncomment the code that's required // Uncomment the code that's required
#if UseChooser #if UseChooser
// choose the device // choose the device
string id = ASCOM.DriverAccess.Focuser.Choose("ASCOM.MeadeGeneric.Focuser"); string id = Focuser.Choose("ASCOM.MeadeGeneric.Focuser");
if (string.IsNullOrEmpty(id)) if (string.IsNullOrEmpty(id))
return; return;
// create this device // create this device
ASCOM.DriverAccess.Focuser device = new ASCOM.DriverAccess.Focuser(id); Focuser device = new Focuser(id);
#else #else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly. // 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.MeadeGeneric.Telescope"); ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.MeadeGeneric.Telescope");
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -32,5 +31,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("0.7.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
+1 -1
View File
@@ -11,7 +11,7 @@
UpgradeCode must be unique to this product and should not be changed for the product lifetime. UpgradeCode must be unique to this product and should not be changed for the product lifetime.
--> -->
<?define InstallName = "ASCOM Meade.net" ?> <?define InstallName = "ASCOM Meade Generic" ?>
<?define Manufacturer = "cjdawson.com" ?> <?define Manufacturer = "cjdawson.com" ?>
<?define UpgradeCode = "{57597bb6-f207-4998-97f4-8a041950d062}" ?> <?define UpgradeCode = "{57597bb6-f207-4998-97f4-8a041950d062}" ?>
<?define INSTALLFOLDER = "$(var.InstallName)" ?> <?define INSTALLFOLDER = "$(var.InstallName)" ?>
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -32,5 +31,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
File diff suppressed because it is too large Load Diff
@@ -7,6 +7,6 @@ namespace ASCOM.Meade.net.AstroMaths
public DateTime UtcDateTime { get; set; } public DateTime UtcDateTime { get; set; }
public double SiteLatitude { get; set; } public double SiteLatitude { get; set; }
public double SiteLongitude { get; set; } public double SiteLongitude { get; set; }
public EquatorialCoordinates equatorialCoordinates { get; set; } public EquatorialCoordinates EquatorialCoordinates { get; set; }
} }
} }
+6 -6
View File
@@ -10,8 +10,8 @@ namespace ASCOM.Meade.net.AstroMaths
public double RightAscensionToHourAngle(DateTime utcDateTime, double longitude, double rightAscension) public double RightAscensionToHourAngle(DateTime utcDateTime, double longitude, double rightAscension)
{ {
var ut = DateTimeToDecimalHours( utcDateTime); var ut = DateTimeToDecimalHours( utcDateTime);
var gst = UTtoGST( utcDateTime); var gst = UTtoGst( utcDateTime);
var lst = GSTtoLST( gst, longitude); var lst = GsTtoLst( gst, longitude);
var raHours = rightAscension; var raHours = rightAscension;
var h1 = lst - raHours; var h1 = lst - raHours;
var h = h1; var h = h1;
@@ -24,8 +24,8 @@ namespace ASCOM.Meade.net.AstroMaths
public double HourAngleToRightAscension(DateTime utcDateTime, double longitude, double hourAngle ) public double HourAngleToRightAscension(DateTime utcDateTime, double longitude, double hourAngle )
{ {
var gst = UTtoGST(utcDateTime); var gst = UTtoGst(utcDateTime);
var lst = GSTtoLST( gst, longitude); var lst = GsTtoLst( gst, longitude);
var raHours = hourAngle; var raHours = hourAngle;
var h1 = lst - raHours; var h1 = lst - raHours;
var h = h1; var h = h1;
@@ -129,7 +129,7 @@ namespace ASCOM.Meade.net.AstroMaths
} }
//todo convert to extension method //todo convert to extension method
public double UTtoGST(DateTime utcDateTime) public double UTtoGst(DateTime utcDateTime)
{ {
Util util = new Util(); Util util = new Util();
@@ -171,7 +171,7 @@ namespace ASCOM.Meade.net.AstroMaths
return t1; return t1;
} }
public double GSTtoLST(double gst, double longitude) public double GsTtoLst(double gst, double longitude)
{ {
var l = longitude/ 15; var l = longitude/ 15;
@@ -11,7 +11,7 @@ namespace ASCOM.Meade.net.AstroMaths
double DegreesToRadians(double degrees); double DegreesToRadians(double degrees);
double RadiansToDegrees(double radians); double RadiansToDegrees(double radians);
double DateTimeToDecimalHours( DateTime utcDateTime); double DateTimeToDecimalHours( DateTime utcDateTime);
double UTtoGST(DateTime utcDateTime); double UTtoGst(DateTime utcDateTime);
double GSTtoLST(double gst, double longitude); double GsTtoLst(double gst, double longitude);
} }
} }
+14
View File
@@ -0,0 +1,14 @@
namespace ASCOM.Meade.net
{
public static class DoubleExtensions
{
public static bool InRange(this double value, double low, double high)
{
if (value < low)
return false;
if (value > high)
return false;
return true;
}
}
}
@@ -118,6 +118,7 @@
<Compile Include="AstroMaths\EquatorialCoordinates.cs" /> <Compile Include="AstroMaths\EquatorialCoordinates.cs" />
<Compile Include="AstroMaths\HorizonCoordinates.cs" /> <Compile Include="AstroMaths\HorizonCoordinates.cs" />
<Compile Include="AstroMaths\IAstroMaths.cs" /> <Compile Include="AstroMaths\IAstroMaths.cs" />
<Compile Include="DoubleExtensions.cs" />
<Compile Include="StringExtensions.cs" /> <Compile Include="StringExtensions.cs" />
<Compile Include="Telescope.cs" /> <Compile Include="Telescope.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -35,5 +34,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below: // by using the '*' as shown below:
// //
// TODO - Set your driver's version here // TODO - Set your driver's version here
[assembly: AssemblyVersion("0.7.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
+32 -48
View File
@@ -1,8 +1,4 @@
using System; using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using ASCOM.DeviceInterface; using ASCOM.DeviceInterface;
using System.Collections; using System.Collections;
using System.Threading; using System.Threading;
@@ -21,10 +17,10 @@ namespace ASCOM.Meade.net
[Guid("288838d1-bbf9-4ce0-9ee1-86ecf38b45c9")] [Guid("288838d1-bbf9-4ce0-9ee1-86ecf38b45c9")]
[ClassInterface(ClassInterfaceType.None)] [ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)] [ComVisible(true)]
public class Rate : ASCOM.DeviceInterface.IRate public class Rate : IRate
{ {
private double maximum = 0; private double _maximum = 0;
private double minimum = 0; private double _minimum = 0;
// //
// Default constructor - Internal prevents public creation // Default constructor - Internal prevents public creation
@@ -32,8 +28,8 @@ namespace ASCOM.Meade.net
// //
internal Rate(double minimum, double maximum) internal Rate(double minimum, double maximum)
{ {
this.maximum = maximum; _maximum = maximum;
this.minimum = minimum; _minimum = minimum;
} }
#region Implementation of IRate #region Implementation of IRate
@@ -45,14 +41,14 @@ namespace ASCOM.Meade.net
public double Maximum public double Maximum
{ {
get { return this.maximum; } get => _maximum;
set { this.maximum = value; } set => _maximum = value;
} }
public double Minimum public double Minimum
{ {
get { return this.minimum; } get => _minimum;
set { this.minimum = value; } set => _minimum = value;
} }
#endregion #endregion
@@ -74,8 +70,8 @@ namespace ASCOM.Meade.net
[ComVisible(true)] [ComVisible(true)]
public class AxisRates : IAxisRates, IEnumerable public class AxisRates : IAxisRates, IEnumerable
{ {
private TelescopeAxes axis; private TelescopeAxes _axis;
private readonly Rate[] rates; private readonly Rate[] _rates;
// //
// Constructor - Internal prevents public creation // Constructor - Internal prevents public creation
@@ -83,7 +79,7 @@ namespace ASCOM.Meade.net
// //
internal AxisRates(TelescopeAxes axis) internal AxisRates(TelescopeAxes axis)
{ {
this.axis = axis; _axis = axis;
// //
// This collection must hold zero or more Rate objects describing the // This collection must hold zero or more Rate objects describing the
// rates of motion ranges for the Telescope.MoveAxis() method // rates of motion ranges for the Telescope.MoveAxis() method
@@ -100,26 +96,23 @@ namespace ASCOM.Meade.net
// TODO Initialize this array with any Primary axis rates that your driver may provide // TODO Initialize this array with any Primary axis rates that your driver may provide
// Example: m_Rates = new Rate[] { new Rate(10.5, 30.2), new Rate(54.0, 43.6) } // Example: m_Rates = new Rate[] { new Rate(10.5, 30.2), new Rate(54.0, 43.6) }
//this.rates = new Rate[0]; //this.rates = new Rate[0];
this.rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) }; _rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) };
break; break;
case TelescopeAxes.axisSecondary: case TelescopeAxes.axisSecondary:
// TODO Initialize this array with any Secondary axis rates that your driver may provide // TODO Initialize this array with any Secondary axis rates that your driver may provide
//this.rates = new Rate[0]; //this.rates = new Rate[0];
this.rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) }; _rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) };
break; break;
case TelescopeAxes.axisTertiary: case TelescopeAxes.axisTertiary:
// TODO Initialize this array with any Tertiary axis rates that your driver may provide // TODO Initialize this array with any Tertiary axis rates that your driver may provide
this.rates = new Rate[0]; _rates = new Rate[0];
break; break;
} }
} }
#region IAxisRates Members #region IAxisRates Members
public int Count public int Count => _rates.Length;
{
get { return this.rates.Length; }
}
public void Dispose() public void Dispose()
{ {
@@ -128,13 +121,10 @@ namespace ASCOM.Meade.net
public IEnumerator GetEnumerator() public IEnumerator GetEnumerator()
{ {
return rates.GetEnumerator(); return _rates.GetEnumerator();
} }
public IRate this[int index] public IRate this[int index] => _rates[index - 1];
{
get { return this.rates[index - 1]; } // 1-based
}
#endregion #endregion
} }
@@ -159,11 +149,11 @@ namespace ASCOM.Meade.net
[ComVisible(true)] [ComVisible(true)]
public class TrackingRates : ITrackingRates, IEnumerable, IEnumerator public class TrackingRates : ITrackingRates, IEnumerable, IEnumerator
{ {
private readonly DriveRates[] trackingRates; private readonly DriveRates[] _trackingRates;
// this is used to make the index thread safe // this is used to make the index thread safe
private readonly ThreadLocal<int> pos = new ThreadLocal<int>(() => { return -1; }); private readonly ThreadLocal<int> _pos = new ThreadLocal<int>(() => { return -1; });
private static readonly object lockObj = new object(); private static readonly object LockObj = new object();
// //
// Default constructor - Internal prevents public creation // Default constructor - Internal prevents public creation
@@ -176,20 +166,17 @@ namespace ASCOM.Meade.net
// the tracking rates supported by your telescope. The one value // the tracking rates supported by your telescope. The one value
// (tracking rate) that MUST be supported is driveSidereal! // (tracking rate) that MUST be supported is driveSidereal!
// //
this.trackingRates = new[] { DriveRates.driveSidereal, DriveRates.driveLunar }; _trackingRates = new[] { DriveRates.driveSidereal, DriveRates.driveLunar };
// TODO Initialize this array with any additional tracking rates that your driver may provide // TODO Initialize this array with any additional tracking rates that your driver may provide
} }
#region ITrackingRates Members #region ITrackingRates Members
public int Count public int Count => _trackingRates.Length;
{
get { return this.trackingRates.Length; }
}
public IEnumerator GetEnumerator() public IEnumerator GetEnumerator()
{ {
pos.Value = -1; _pos.Value = -1;
return this as IEnumerator; return this as IEnumerator;
} }
@@ -198,10 +185,7 @@ namespace ASCOM.Meade.net
// TODO Add any required object cleanup here // TODO Add any required object cleanup here
} }
public DriveRates this[int index] public DriveRates this[int index] => _trackingRates[index - 1];
{
get { return this.trackingRates[index - 1]; } // 1-based
}
#endregion #endregion
@@ -211,22 +195,22 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
lock (lockObj) lock (LockObj)
{ {
if (pos.Value < 0 || pos.Value >= trackingRates.Length) if (_pos.Value < 0 || _pos.Value >= _trackingRates.Length)
{ {
throw new System.InvalidOperationException(); throw new System.InvalidOperationException();
} }
return trackingRates[pos.Value]; return _trackingRates[_pos.Value];
} }
} }
} }
public bool MoveNext() public bool MoveNext()
{ {
lock (lockObj) lock (LockObj)
{ {
if (++pos.Value >= trackingRates.Length) if (++_pos.Value >= _trackingRates.Length)
{ {
return false; return false;
} }
@@ -236,7 +220,7 @@ namespace ASCOM.Meade.net
public void Reset() public void Reset()
{ {
pos.Value = -1; _pos.Value = -1;
} }
#endregion #endregion
} }
+23
View File
@@ -6,5 +6,28 @@ namespace ASCOM.Meade.net
{ {
return int.Parse(str); return int.Parse(str);
} }
public static double ToDouble(this string str)
{
return double.Parse(str);
}
public static int Position(this string str, char find, int instance)
{
var currentInstance = 0;
for (var i = 0; i < str.Length; i++)
{
if (str[i] == find)
{
currentInstance++;
if (currentInstance == instance)
{
return i;
}
}
}
return -1;
}
} }
} }
File diff suppressed because it is too large Load Diff
+71 -73
View File
@@ -38,14 +38,14 @@ namespace ASCOM.Meade.net
/// The DeviceID is used by ASCOM applications to load the driver at runtime. /// The DeviceID is used by ASCOM applications to load the driver at runtime.
/// </summary> /// </summary>
//internal static string driverID = "ASCOM.Meade.net.Focuser"; //internal static string driverID = "ASCOM.Meade.net.Focuser";
internal static string driverID = Marshal.GenerateProgIdForType(MethodBase.GetCurrentMethod().DeclaringType); private static readonly string DriverId = Marshal.GenerateProgIdForType(MethodBase.GetCurrentMethod().DeclaringType);
// TODO Change the descriptive string for your driver then remove this line // TODO Change the descriptive string for your driver then remove this line
/// <summary> /// <summary>
/// Driver description that displays in the ASCOM Chooser. /// Driver description that displays in the ASCOM Chooser.
/// </summary> /// </summary>
private static string driverDescription = "Meade Generic"; private static readonly string DriverDescription = "Meade Generic";
internal static string comPort; // Variables to hold the currrent device configuration private static string _comPort; // Variables to hold the currrent device configuration
/// <summary> /// <summary>
/// Private variable to hold an ASCOM Utilities object /// Private variable to hold an ASCOM Utilities object
@@ -55,7 +55,7 @@ namespace ASCOM.Meade.net
/// <summary> /// <summary>
/// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify) /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify)
/// </summary> /// </summary>
internal static TraceLogger tl; internal static TraceLogger Tl;
private readonly ISharedResourcesWrapper _sharedResourcesWrapper; private readonly ISharedResourcesWrapper _sharedResourcesWrapper;
@@ -74,14 +74,15 @@ namespace ASCOM.Meade.net
private void Initialise() private void Initialise()
{ {
tl = new TraceLogger("", "Meade.net.focusser"); //todo move the TraceLogger out to a factory class.
Tl = new TraceLogger("", "Meade.Generic.focusser");
tl.LogMessage("Focuser", "Starting initialisation");
ReadProfile(); // Read device configuration from the ASCOM Profile store ReadProfile(); // Read device configuration from the ASCOM Profile store
IsConnected = false; // Initialise connected to false IsConnected = false; // Initialise connected to false
tl.LogMessage("Focuser", "Completed initialisation"); LogMessage("Focuser", "Completed initialisation");
LogMessage("Focuser", $"Driver version: {DriverVersion}");
} }
@@ -99,17 +100,17 @@ namespace ASCOM.Meade.net
/// </summary> /// </summary>
public void SetupDialog() public void SetupDialog()
{ {
tl.LogMessage("SetupDialog", "Opening setup dialog"); Tl.LogMessage("SetupDialog", "Opening setup dialog");
_sharedResourcesWrapper.SetupDialog(); _sharedResourcesWrapper.SetupDialog();
ReadProfile(); ReadProfile();
tl.LogMessage("SetupDialog", "complete"); Tl.LogMessage("SetupDialog", "complete");
} }
public ArrayList SupportedActions public ArrayList SupportedActions
{ {
get get
{ {
tl.LogMessage("SupportedActions Get", "Returning empty arraylist"); Tl.LogMessage("SupportedActions Get", "Returning empty arraylist");
return new ArrayList(); return new ArrayList();
} }
} }
@@ -117,7 +118,7 @@ namespace ASCOM.Meade.net
public string Action(string actionName, string actionParameters) public string Action(string actionName, string actionParameters)
{ {
LogMessage("", "Action {0}, parameters {1} not implemented", actionName, actionParameters); LogMessage("", "Action {0}, parameters {1} not implemented", actionName, actionParameters);
throw new ASCOM.ActionNotImplementedException("Action " + actionName + " is not implemented by this driver"); throw new ActionNotImplementedException("Action " + actionName + " is not implemented by this driver");
} }
public void CommandBlind(string command, bool raw) public void CommandBlind(string command, bool raw)
@@ -137,7 +138,7 @@ namespace ASCOM.Meade.net
//string ret = CommandString(command, raw); //string ret = CommandString(command, raw);
// TODO decode the return string and return true or false // TODO decode the return string and return true or false
// or // or
throw new ASCOM.MethodNotImplementedException("CommandBool"); throw new MethodNotImplementedException("CommandBool");
// DO NOT have both these sections! One or the other // DO NOT have both these sections! One or the other
} }
@@ -149,15 +150,15 @@ namespace ASCOM.Meade.net
// you need something to ensure that only one command is in progress at a time // you need something to ensure that only one command is in progress at a time
return _sharedResourcesWrapper.SendString(command); return _sharedResourcesWrapper.SendString(command);
throw new ASCOM.MethodNotImplementedException("CommandString"); throw new MethodNotImplementedException("CommandString");
} }
public void Dispose() public void Dispose()
{ {
// Clean up the tracelogger and util objects // Clean up the tracelogger and util objects
tl.Enabled = false; Tl.Enabled = false;
tl.Dispose(); Tl.Dispose();
tl = null; Tl = null;
} }
public bool Connected public bool Connected
@@ -169,7 +170,7 @@ namespace ASCOM.Meade.net
} }
set set
{ {
tl.LogMessage("Connected", "Set {0}", value); Tl.LogMessage("Connected", "Set {0}", value);
if (value == IsConnected) if (value == IsConnected)
return; return;
@@ -177,6 +178,7 @@ namespace ASCOM.Meade.net
{ {
try try
{ {
ReadProfile();
_sharedResourcesWrapper.Connect("Serial"); _sharedResourcesWrapper.Connect("Serial");
try try
{ {
@@ -193,12 +195,12 @@ namespace ASCOM.Meade.net
} }
catch (Exception ex) catch (Exception ex)
{ {
LogMessage("Connected Set", "Error connecting to port {0} - {1}", comPort, ex.Message); LogMessage("Connected Set", "Error connecting to port {0} - {1}", _comPort, ex.Message);
} }
} }
else else
{ {
LogMessage("Connected Set", "Disconnecting from port {0}", comPort); LogMessage("Connected Set", "Disconnecting from port {0}", _comPort);
_sharedResourcesWrapper.Disconnect("Serial"); _sharedResourcesWrapper.Disconnect("Serial");
IsConnected = false; IsConnected = false;
} }
@@ -241,8 +243,8 @@ namespace ASCOM.Meade.net
// TODO customise this device description // TODO customise this device description
get get
{ {
tl.LogMessage("Description Get", driverDescription); Tl.LogMessage("Description Get", DriverDescription);
return driverDescription; return DriverDescription;
} }
} }
@@ -250,10 +252,10 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; Version version = Assembly.GetExecutingAssembly().GetName().Version;
// TODO customise this driver description // TODO customise this driver description
string driverInfo = "Information about the driver itself. Version: " + String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor); string driverInfo = "Information about the driver itself. Version: " + String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
tl.LogMessage("DriverInfo Get", driverInfo); Tl.LogMessage("DriverInfo Get", driverInfo);
return driverInfo; return driverInfo;
} }
} }
@@ -262,9 +264,9 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; Version version = Assembly.GetExecutingAssembly().GetName().Version;
string driverVersion = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor); string driverVersion = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
tl.LogMessage("DriverVersion Get", driverVersion); Tl.LogMessage("DriverVersion Get", driverVersion);
return driverVersion; return driverVersion;
} }
} }
@@ -284,8 +286,8 @@ namespace ASCOM.Meade.net
get get
{ {
//string name = "Short driver name - please customise"; //string name = "Short driver name - please customise";
string name = driverDescription; string name = DriverDescription;
tl.LogMessage("Name Get", name); Tl.LogMessage("Name Get", name);
return name; return name;
} }
} }
@@ -298,14 +300,14 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("Absolute Get", false.ToString()); Tl.LogMessage("Absolute Get", false.ToString());
return false; // This is a relative focuser return false; // This is a relative focuser
} }
} }
public void Halt() public void Halt()
{ {
tl.LogMessage("Halt", "Halting"); Tl.LogMessage("Halt", "Halting");
CheckConnected("Halt"); CheckConnected("Halt");
@@ -325,7 +327,7 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("IsMoving Get", false.ToString()); Tl.LogMessage("IsMoving Get", false.ToString());
return false; // This focuser always moves instantaneously so no need for IsMoving ever to be True return false; // This focuser always moves instantaneously so no need for IsMoving ever to be True
} }
} }
@@ -334,13 +336,13 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("Link Get", this.Connected.ToString()); Tl.LogMessage("Link Get", Connected.ToString());
return this.Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility return Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility
} }
set set
{ {
tl.LogMessage("Link Set", value.ToString()); Tl.LogMessage("Link Set", value.ToString());
this.Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility
} }
} }
@@ -349,7 +351,7 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("MaxIncrement Get", _maxIncrement.ToString()); Tl.LogMessage("MaxIncrement Get", _maxIncrement.ToString());
return _maxIncrement; // Maximum change in one move return _maxIncrement; // Maximum change in one move
} }
} }
@@ -359,37 +361,37 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("MaxStep Get", _maxStep.ToString()); Tl.LogMessage("MaxStep Get", _maxStep.ToString());
return _maxStep; return _maxStep;
} }
} }
public void Move(int Position) public void Move(int position)
{ {
tl.LogMessage("Move", Position.ToString()); Tl.LogMessage("Move", position.ToString());
CheckConnected("Move"); CheckConnected("Move");
//todo implement backlash compensation //todo implement backlash compensation
//todo implement direction reverse //todo implement direction reverse
//todo implement dynamic braking //todo implement dynamic braking
if (Position < -MaxIncrement || Position > MaxIncrement) if (position < -MaxIncrement || position > MaxIncrement)
{ {
throw new ASCOM.InvalidValueException($"position out of range {-MaxIncrement} < {Position} < {MaxIncrement}"); throw new InvalidValueException($"position out of range {-MaxIncrement} < {position} < {MaxIncrement}");
} }
if (Position == 0) if (position == 0)
return; return;
if (Position > 0) if (position > 0)
{ {
//desired move direction is out //desired move direction is out
MoveFocuser(true, Math.Abs(Position)); MoveFocuser(true, Math.Abs(position));
} }
else else
{ {
//desired move direction is in //desired move direction is in
MoveFocuser(false, Math.Abs(Position)); MoveFocuser(false, Math.Abs(position));
} }
} }
@@ -430,21 +432,14 @@ namespace ASCOM.Meade.net
}); });
} }
public int Position public int Position => throw new PropertyNotImplementedException("Position", false);
{
get
{
throw new ASCOM.PropertyNotImplementedException("Position", false);
//return focuserPosition; // Return the focuser position
}
}
public double StepSize public double StepSize
{ {
get get
{ {
tl.LogMessage("StepSize Get", "Not implemented"); Tl.LogMessage("StepSize Get", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("StepSize", false); throw new PropertyNotImplementedException("StepSize", false);
} }
} }
@@ -452,13 +447,13 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("TempComp Get", false.ToString()); Tl.LogMessage("TempComp Get", false.ToString());
return false; return false;
} }
set set
{ {
tl.LogMessage("TempComp Set", "Not implemented"); Tl.LogMessage("TempComp Set", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("TempComp", false); throw new PropertyNotImplementedException("TempComp", false);
} }
} }
@@ -466,7 +461,7 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("TempCompAvailable Get", false.ToString()); Tl.LogMessage("TempCompAvailable Get", false.ToString());
return false; // Temperature compensation is not available in this driver return false; // Temperature compensation is not available in this driver
} }
} }
@@ -475,8 +470,8 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
tl.LogMessage("Temperature Get", "Not implemented"); Tl.LogMessage("Temperature Get", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("Temperature", false); throw new PropertyNotImplementedException("Temperature", false);
} }
} }
@@ -496,18 +491,18 @@ namespace ASCOM.Meade.net
/// This is harmless if the driver is already registered/unregistered. /// This is harmless if the driver is already registered/unregistered.
/// </summary> /// </summary>
/// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param> /// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param>
private static void RegUnregASCOM(bool bRegister) private static void RegUnregAscom(bool bRegister)
{ {
using (var P = new ASCOM.Utilities.Profile()) using (var p = new Profile())
{ {
P.DeviceType = "Focuser"; p.DeviceType = "Focuser";
if (bRegister) if (bRegister)
{ {
P.Register(driverID, driverDescription); p.Register(DriverId, DriverDescription);
} }
else else
{ {
P.Unregister(driverID); p.Unregister(DriverId);
} }
} }
} }
@@ -530,9 +525,9 @@ namespace ASCOM.Meade.net
/// This technique should mean that it is never necessary to manually register a driver with ASCOM. /// This technique should mean that it is never necessary to manually register a driver with ASCOM.
/// </remarks> /// </remarks>
[ComRegisterFunction] [ComRegisterFunction]
public static void RegisterASCOM(Type t) public static void RegisterAscom(Type t)
{ {
RegUnregASCOM(true); RegUnregAscom(true);
} }
/// <summary> /// <summary>
@@ -553,9 +548,9 @@ namespace ASCOM.Meade.net
/// This technique should mean that it is never necessary to manually unregister a driver from ASCOM. /// This technique should mean that it is never necessary to manually unregister a driver from ASCOM.
/// </remarks> /// </remarks>
[ComUnregisterFunction] [ComUnregisterFunction]
public static void UnregisterASCOM(Type t) public static void UnregisterAscom(Type t)
{ {
RegUnregASCOM(false); RegUnregAscom(false);
} }
#endregion #endregion
@@ -573,7 +568,7 @@ namespace ASCOM.Meade.net
{ {
if (!IsConnected) if (!IsConnected)
{ {
throw new ASCOM.NotConnectedException(message); throw new NotConnectedException(message);
} }
} }
@@ -583,8 +578,11 @@ namespace ASCOM.Meade.net
internal void ReadProfile() internal void ReadProfile()
{ {
var profileProperties = _sharedResourcesWrapper.ReadProfile(); var profileProperties = _sharedResourcesWrapper.ReadProfile();
tl.Enabled = profileProperties.TraceLogger; Tl.Enabled = profileProperties.TraceLogger;
comPort = profileProperties.ComPort; _comPort = profileProperties.ComPort;
LogMessage("ReadProfile", $"Trace logger enabled: {Tl.Enabled}");
LogMessage("ReadProfile", $"Com Port: {_comPort}");
} }
/// <summary> /// <summary>
@@ -596,7 +594,7 @@ namespace ASCOM.Meade.net
internal static void LogMessage(string identifier, string message, params object[] args) internal static void LogMessage(string identifier, string message, params object[] args)
{ {
var msg = string.Format(message, args); var msg = string.Format(message, args);
tl.LogMessage(identifier, msg); Tl.LogMessage(identifier, msg);
} }
#endregion #endregion
} }
+2 -3
View File
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -35,5 +34,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below: // by using the '*' as shown below:
// //
// TODO - Set your driver's version here // TODO - Set your driver's version here
[assembly: AssemblyVersion("0.7.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
+58 -69
View File
@@ -33,43 +33,43 @@ namespace ASCOM.Meade.net
#region Access to ole32.dll functions for class factories #region Access to ole32.dll functions for class factories
// Define two common GUID objects for public usage. // Define two common GUID objects for public usage.
public static Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}"); private static readonly Guid _iidIUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
public static Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}"); private static readonly Guid _iidIDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
[Flags] [Flags]
enum CLSCTX : uint enum Clsctx : uint
{ {
CLSCTX_INPROC_SERVER = 0x1, ClsctxInprocServer = 0x1,
CLSCTX_INPROC_HANDLER = 0x2, ClsctxInprocHandler = 0x2,
CLSCTX_LOCAL_SERVER = 0x4, ClsctxLocalServer = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8, ClsctxInprocServer16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10, ClsctxRemoteServer = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20, ClsctxInprocHandler16 = 0x20,
CLSCTX_RESERVED1 = 0x40, ClsctxReserved1 = 0x40,
CLSCTX_RESERVED2 = 0x80, ClsctxReserved2 = 0x80,
CLSCTX_RESERVED3 = 0x100, ClsctxReserved3 = 0x100,
CLSCTX_RESERVED4 = 0x200, ClsctxReserved4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400, ClsctxNoCodeDownload = 0x400,
CLSCTX_RESERVED5 = 0x800, ClsctxReserved5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000, ClsctxNoCustomMarshal = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000, ClsctxEnableCodeDownload = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000, ClsctxNoFailureLog = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000, ClsctxDisableAaa = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000, ClsctxEnableAaa = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000, ClsctxFromDefaultContext = 0x20000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, ClsctxInproc = ClsctxInprocServer | ClsctxInprocHandler,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, ClsctxServer = ClsctxInprocServer | ClsctxLocalServer | ClsctxRemoteServer,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER ClsctxAll = ClsctxServer | ClsctxInprocHandler
} }
[Flags] [Flags]
enum REGCLS : uint enum Regcls : uint
{ {
REGCLS_SINGLEUSE = 0, RegclsSingleuse = 0,
REGCLS_MULTIPLEUSE = 1, RegclsMultipleuse = 1,
REGCLS_MULTI_SEPARATE = 2, RegclsMultiSeparate = 2,
REGCLS_SUSPENDED = 4, RegclsSuspended = 4,
REGCLS_SURROGATE = 8 RegclsSurrogate = 8
} }
// //
// CoRegisterClassObject() is used to register a Class Factory // CoRegisterClassObject() is used to register a Class Factory
@@ -109,70 +109,59 @@ namespace ASCOM.Meade.net
#region Constructor and Private ClassFactory Data #region Constructor and Private ClassFactory Data
protected Type m_ClassType; private readonly Type _mClassType;
protected Guid m_ClassId; private Guid _mClassId;
protected ArrayList m_InterfaceTypes; private readonly ArrayList _mInterfaceTypes;
protected uint m_ClassContext; private uint _mCookie;
protected uint m_Flags; private readonly string _mProgid;
protected UInt32 m_locked = 0;
protected uint m_Cookie;
protected string m_progid;
public ClassFactory(Type type) public ClassFactory(Type type)
{ {
if (type == null) if (type == null)
throw new ArgumentNullException("type"); throw new ArgumentNullException("type");
m_ClassType = type; _mClassType = type;
//PWGS Get the ProgID from the MetaData //PWGS Get the ProgID from the MetaData
m_progid = Marshal.GenerateProgIdForType(type); _mProgid = Marshal.GenerateProgIdForType(type);
m_ClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)] _mClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)]
m_ClassContext = (uint)CLSCTX.CLSCTX_LOCAL_SERVER; // Default ClassContext = (uint)Clsctx.ClsctxLocalServer; // Default
m_Flags = (uint)REGCLS.REGCLS_MULTIPLEUSE | // Default Flags = (uint)Regcls.RegclsMultipleuse | // Default
(uint)REGCLS.REGCLS_SUSPENDED; (uint)Regcls.RegclsSuspended;
m_InterfaceTypes = new ArrayList(); _mInterfaceTypes = new ArrayList();
foreach (Type T in type.GetInterfaces()) // Save all of the implemented interfaces foreach (Type T in type.GetInterfaces()) // Save all of the implemented interfaces
m_InterfaceTypes.Add(T); _mInterfaceTypes.Add(T);
} }
#endregion #endregion
#region Common ClassFactory Methods #region Common ClassFactory Methods
public uint ClassContext public uint ClassContext { get; }
{
get { return m_ClassContext; }
set { m_ClassContext = value; }
}
public Guid ClassId public Guid ClassId
{ {
get { return m_ClassId; } get => _mClassId;
set { m_ClassId = value; } set => _mClassId = value;
} }
public uint Flags public uint Flags { get; }
{
get { return m_Flags; }
set { m_Flags = value; }
}
public bool RegisterClassObject() public bool RegisterClassObject()
{ {
// Register the class factory // Register the class factory
int i = CoRegisterClassObject int i = CoRegisterClassObject
( (
ref m_ClassId, ref _mClassId,
this, this,
m_ClassContext, ClassContext,
m_Flags, Flags,
out m_Cookie out _mCookie
); );
return (i == 0); return (i == 0);
} }
public bool RevokeClassObject() public bool RevokeClassObject()
{ {
int i = CoRevokeClassObject(m_Cookie); int i = CoRevokeClassObject(_mCookie);
return (i == 0); return (i == 0);
} }
@@ -201,25 +190,25 @@ namespace ASCOM.Meade.net
// //
// Handle specific requests for implemented interfaces // Handle specific requests for implemented interfaces
// //
foreach (Type iType in m_InterfaceTypes) foreach (Type iType in _mInterfaceTypes)
{ {
if (riid == Marshal.GenerateGuidForType(iType)) if (riid == Marshal.GenerateGuidForType(iType))
{ {
ppvObject = Marshal.GetComInterfaceForObject(Activator.CreateInstance(m_ClassType), iType); ppvObject = Marshal.GetComInterfaceForObject(Activator.CreateInstance(_mClassType), iType);
return; return;
} }
} }
// //
// Handle requests for IDispatch or IUnknown on the class // Handle requests for IDispatch or IUnknown on the class
// //
if (riid == IID_IDispatch) if (riid == _iidIDispatch)
{ {
ppvObject = Marshal.GetIDispatchForObject(Activator.CreateInstance(m_ClassType)); ppvObject = Marshal.GetIDispatchForObject(Activator.CreateInstance(_mClassType));
return; return;
} }
else if (riid == IID_IUnknown) else if (riid == _iidIUnknown)
{ {
ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(m_ClassType)); ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(_mClassType));
} }
else else
{ {
+13 -15
View File
@@ -8,35 +8,33 @@ namespace ASCOM.Meade.net
/// </summary> /// </summary>
class GarbageCollection class GarbageCollection
{ {
protected bool m_bContinueThread; private bool _mbContinueThread;
protected bool m_GCWatchStopped; private readonly int _miInterval;
protected int m_iInterval; private readonly ManualResetEvent _mEventThreadEnded;
protected ManualResetEvent m_EventThreadEnded;
public GarbageCollection(int iInterval) public GarbageCollection(int iInterval)
{ {
m_bContinueThread = true; _mbContinueThread = true;
m_GCWatchStopped = false; _miInterval = iInterval;
m_iInterval = iInterval; _mEventThreadEnded = new ManualResetEvent(false);
m_EventThreadEnded = new ManualResetEvent(false);
} }
public void GCWatch() public void GcWatch()
{ {
// Pause for a moment to provide a delay to make threads more apparent. // Pause for a moment to provide a delay to make threads more apparent.
while (ContinueThread()) while (ContinueThread())
{ {
GC.Collect(); GC.Collect();
Thread.Sleep(m_iInterval); Thread.Sleep(_miInterval);
} }
m_EventThreadEnded.Set(); _mEventThreadEnded.Set();
} }
protected bool ContinueThread() protected bool ContinueThread()
{ {
lock (this) lock (this)
{ {
return m_bContinueThread; return _mbContinueThread;
} }
} }
@@ -44,14 +42,14 @@ namespace ASCOM.Meade.net
{ {
lock (this) lock (this)
{ {
m_bContinueThread = false; _mbContinueThread = false;
} }
} }
public void WaitForThreadToStop() public void WaitForThreadToStop()
{ {
m_EventThreadEnded.WaitOne(); _mEventThreadEnded.WaitOne();
m_EventThreadEnded.Reset(); _mEventThreadEnded.Reset();
} }
} }
} }
+87 -90
View File
@@ -15,17 +15,14 @@
using System; using System;
using System.IO; using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using System.Drawing;
using System.Collections; using System.Collections;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Reflection; using System.Reflection;
using ASCOM.Utilities; using ASCOM.Utilities;
using Microsoft.Win32; using Microsoft.Win32;
using System.Text;
using System.Threading; using System.Threading;
using System.Security.Principal; using System.Security.Principal;
using System.Diagnostics; using System.Diagnostics;
using ASCOM;
namespace ASCOM.Meade.net namespace ASCOM.Meade.net
{ {
@@ -34,52 +31,52 @@ namespace ASCOM.Meade.net
#region Access to kernel32.dll, user32.dll, and ole32.dll functions #region Access to kernel32.dll, user32.dll, and ole32.dll functions
[Flags] [Flags]
enum CLSCTX : uint enum Clsctx : uint
{ {
CLSCTX_INPROC_SERVER = 0x1, ClsctxInprocServer = 0x1,
CLSCTX_INPROC_HANDLER = 0x2, ClsctxInprocHandler = 0x2,
CLSCTX_LOCAL_SERVER = 0x4, ClsctxLocalServer = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8, ClsctxInprocServer16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10, ClsctxRemoteServer = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20, ClsctxInprocHandler16 = 0x20,
CLSCTX_RESERVED1 = 0x40, ClsctxReserved1 = 0x40,
CLSCTX_RESERVED2 = 0x80, ClsctxReserved2 = 0x80,
CLSCTX_RESERVED3 = 0x100, ClsctxReserved3 = 0x100,
CLSCTX_RESERVED4 = 0x200, ClsctxReserved4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400, ClsctxNoCodeDownload = 0x400,
CLSCTX_RESERVED5 = 0x800, ClsctxReserved5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000, ClsctxNoCustomMarshal = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000, ClsctxEnableCodeDownload = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000, ClsctxNoFailureLog = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000, ClsctxDisableAaa = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000, ClsctxEnableAaa = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000, ClsctxFromDefaultContext = 0x20000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, ClsctxInproc = ClsctxInprocServer | ClsctxInprocHandler,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, ClsctxServer = ClsctxInprocServer | ClsctxLocalServer | ClsctxRemoteServer,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER ClsctxAll = ClsctxServer | ClsctxInprocHandler
} }
[Flags] [Flags]
enum COINIT : uint enum Coinit : uint
{ {
/// Initializes the thread for multi-threaded object concurrency. /// Initializes the thread for multi-threaded object concurrency.
COINIT_MULTITHREADED = 0x0, CoinitMultithreaded = 0x0,
/// Initializes the thread for apartment-threaded object concurrency. /// Initializes the thread for apartment-threaded object concurrency.
COINIT_APARTMENTTHREADED = 0x2, CoinitApartmentthreaded = 0x2,
/// Disables DDE for Ole1 support. /// Disables DDE for Ole1 support.
COINIT_DISABLE_OLE1DDE = 0x4, CoinitDisableOle1Dde = 0x4,
/// Trades memory for speed. /// Trades memory for speed.
COINIT_SPEED_OVER_MEMORY = 0x8 CoinitSpeedOverMemory = 0x8
} }
[Flags] [Flags]
enum REGCLS : uint enum Regcls : uint
{ {
REGCLS_SINGLEUSE = 0, RegclsSingleuse = 0,
REGCLS_MULTIPLEUSE = 1, RegclsMultipleuse = 1,
REGCLS_MULTI_SEPARATE = 2, RegclsMultiSeparate = 2,
REGCLS_SUSPENDED = 4, RegclsSuspended = 4,
REGCLS_SURROGATE = 8 RegclsSurrogate = 8
} }
@@ -97,7 +94,7 @@ namespace ASCOM.Meade.net
// We will need this API to post a WM_QUIT message to the main // We will need this API to post a WM_QUIT message to the main
// thread in order to terminate this application. // thread in order to terminate this application.
[DllImport("user32.dll")] [DllImport("user32.dll")]
static extern bool PostThreadMessage(uint idThread, uint Msg, UIntPtr wParam, static extern bool PostThreadMessage(uint idThread, uint msg, UIntPtr wParam,
IntPtr lParam); IntPtr lParam);
// GetCurrentThreadId() allows us to obtain the thread id of the // GetCurrentThreadId() allows us to obtain the thread id of the
@@ -108,21 +105,21 @@ namespace ASCOM.Meade.net
#endregion #endregion
#region Private Data #region Private Data
private static int objsInUse; // Keeps a count on the total number of objects alive. 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 int _serverLocks; // Keeps a lock count on this application.
private static frmMain s_MainForm = null; // Reference to our main form private static FrmMain _sMainForm = null; // Reference to our main form
private static ArrayList s_ComObjectAssys; // Dynamically loaded assemblies containing served COM objects private static ArrayList _sComObjectAssys; // Dynamically loaded assemblies containing served COM objects
private static ArrayList s_ComObjectTypes; // Served COM object types private static ArrayList _sComObjectTypes; // Served COM object types
private static ArrayList s_ClassFactories; // Served COM object class factories private static ArrayList _sClassFactories; // Served COM object class factories
private static string s_appId = "{4e68ec46-5ffc-49e7-b298-38a548df0bfd}"; // Our AppId private static string _sAppId = "{4e68ec46-5ffc-49e7-b298-38a548df0bfd}"; // Our AppId
private static readonly Object lockObject = new object(); private static readonly Object LockObject = new object();
#endregion #endregion
// This property returns the main thread's id. // This property returns the main thread's id.
public static uint MainThreadId { get; private set; } // Stores the main thread's thread id. public static uint MainThreadId { get; private set; } // Stores the main thread's thread id.
// Used to tell if started by COM or manually // Used to tell if started by COM or manually
public static bool StartedByCOM { get; private set; } // True if server started by COM (-embedding) public static bool StartedByCom { get; private set; } // True if server started by COM (-embedding)
#region Server Lock, Object Counting, and AutoQuit on COM startup #region Server Lock, Object Counting, and AutoQuit on COM startup
@@ -131,9 +128,9 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
lock (lockObject) lock (LockObject)
{ {
return objsInUse; return _objsInUse;
} }
} }
} }
@@ -142,14 +139,14 @@ namespace ASCOM.Meade.net
public static int CountObject() public static int CountObject()
{ {
// Increment the global count of objects. // Increment the global count of objects.
return Interlocked.Increment(ref objsInUse); return Interlocked.Increment(ref _objsInUse);
} }
// This method performs a thread-safe decrementation the objects count. // This method performs a thread-safe decrementation the objects count.
public static int UncountObject() public static int UncountObject()
{ {
// Decrement the global count of objects. // Decrement the global count of objects.
return Interlocked.Decrement(ref objsInUse); return Interlocked.Decrement(ref _objsInUse);
} }
// Returns the current server lock count. // Returns the current server lock count.
@@ -157,9 +154,9 @@ namespace ASCOM.Meade.net
{ {
get get
{ {
lock (lockObject) lock (LockObject)
{ {
return serverLocks; return _serverLocks;
} }
} }
} }
@@ -169,7 +166,7 @@ namespace ASCOM.Meade.net
public static int CountLock() public static int CountLock()
{ {
// Increment the global lock count of this server. // Increment the global lock count of this server.
return Interlocked.Increment(ref serverLocks); return Interlocked.Increment(ref _serverLocks);
} }
// This method performs a thread-safe decrementation the // This method performs a thread-safe decrementation the
@@ -177,7 +174,7 @@ namespace ASCOM.Meade.net
public static int UncountLock() public static int UncountLock()
{ {
// Decrement the global lock count of this server. // Decrement the global lock count of this server.
return Interlocked.Decrement(ref serverLocks); return Interlocked.Decrement(ref _serverLocks);
} }
// AttemptToTerminateServer() will check to see if the objects count and the server // AttemptToTerminateServer() will check to see if the objects count and the server
@@ -189,11 +186,11 @@ namespace ASCOM.Meade.net
// //
public static void ExitIf() public static void ExitIf()
{ {
lock (lockObject) lock (LockObject)
{ {
if ((ObjectsCount <= 0) && (ServerLockCount <= 0)) if ((ObjectsCount <= 0) && (ServerLockCount <= 0))
{ {
if (StartedByCOM) if (StartedByCom)
{ {
UIntPtr wParam = new UIntPtr(0); UIntPtr wParam = new UIntPtr(0);
IntPtr lParam = new IntPtr(0); IntPtr lParam = new IntPtr(0);
@@ -216,8 +213,8 @@ namespace ASCOM.Meade.net
// //
private static bool LoadComObjectAssemblies() private static bool LoadComObjectAssemblies()
{ {
s_ComObjectAssys = new ArrayList(); _sComObjectAssys = new ArrayList();
s_ComObjectTypes = new ArrayList(); _sComObjectTypes = new ArrayList();
// put everything into one folder, the same as the server. // put everything into one folder, the same as the server.
string assyPath = Assembly.GetEntryAssembly().Location; string assyPath = Assembly.GetEntryAssembly().Location;
@@ -246,8 +243,8 @@ namespace ASCOM.Meade.net
if (attrbutes.Length > 0) if (attrbutes.Length > 0)
{ {
//MessageBox.Show("Adding Type: " + type.Name + " " + type.FullName); //MessageBox.Show("Adding Type: " + type.Name + " " + type.FullName);
s_ComObjectTypes.Add(type); //PWGS - much simpler _sComObjectTypes.Add(type); //PWGS - much simpler
s_ComObjectAssys.Add(so); _sComObjectAssys.Add(so);
} }
} }
} }
@@ -342,10 +339,10 @@ namespace ASCOM.Meade.net
// //
// HKCR\APPID\appid // HKCR\APPID\appid
// //
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey("APPID\\" + s_appId)) using (RegistryKey key = Registry.ClassesRoot.CreateSubKey("APPID\\" + _sAppId))
{ {
key.SetValue(null, assyDescription); key.SetValue(null, assyDescription);
key.SetValue("AppID", s_appId); key.SetValue("AppID", _sAppId);
key.SetValue("AuthenticationLevel", 1, RegistryValueKind.DWord); key.SetValue("AuthenticationLevel", 1, RegistryValueKind.DWord);
} }
// //
@@ -354,7 +351,7 @@ namespace ASCOM.Meade.net
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("APPID\\{0}", using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("APPID\\{0}",
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)))) Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1))))
{ {
key.SetValue("AppID", s_appId); key.SetValue("AppID", _sAppId);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -370,7 +367,7 @@ namespace ASCOM.Meade.net
// //
// For each of the driver assemblies // For each of the driver assemblies
// //
foreach (Type type in s_ComObjectTypes) foreach (Type type in _sComObjectTypes)
{ {
bool bFail = false; bool bFail = false;
try try
@@ -386,7 +383,7 @@ namespace ASCOM.Meade.net
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("CLSID\\{0}", clsid))) 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(null, progid); // Could be assyTitle/Desc??, but .NET components show ProgId here
key.SetValue("AppId", s_appId); key.SetValue("AppId", _sAppId);
using (RegistryKey key2 = key.CreateSubKey("Implemented Categories")) using (RegistryKey key2 = key.CreateSubKey("Implemented Categories"))
{ {
key2.CreateSubKey("{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}"); key2.CreateSubKey("{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}");
@@ -420,10 +417,10 @@ namespace ASCOM.Meade.net
// Pull the display name from the ServedClassName attribute. // Pull the display name from the ServedClassName attribute.
attr = Attribute.GetCustomAttribute(type, typeof(ServedClassNameAttribute)); //PWGS Changed to search type for attribute rather than assembly attr = Attribute.GetCustomAttribute(type, typeof(ServedClassNameAttribute)); //PWGS Changed to search type for attribute rather than assembly
string chooserName = ((ServedClassNameAttribute)attr).DisplayName ?? "MultiServer"; string chooserName = ((ServedClassNameAttribute)attr).DisplayName ?? "MultiServer";
using (var P = new ASCOM.Utilities.Profile()) using (var p = new Profile())
{ {
P.DeviceType = deviceType; p.DeviceType = deviceType;
P.Register(progid, chooserName); p.Register(progid, chooserName);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -456,14 +453,14 @@ namespace ASCOM.Meade.net
// //
// Local server's DCOM/AppID information // Local server's DCOM/AppID information
// //
Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", s_appId), false); Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", _sAppId), false);
Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}",
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)), false); Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)), false);
// //
// For each of the driver assemblies // For each of the driver assemblies
// //
foreach (Type type in s_ComObjectTypes) foreach (Type type in _sComObjectTypes)
{ {
string clsid = Marshal.GenerateGuidForType(type).ToString("B"); string clsid = Marshal.GenerateGuidForType(type).ToString("B");
string progid = Marshal.GenerateProgIdForType(type); string progid = Marshal.GenerateProgIdForType(type);
@@ -490,10 +487,10 @@ namespace ASCOM.Meade.net
// //
// ASCOM // ASCOM
// //
using (var P = new ASCOM.Utilities.Profile()) using (var p = new Profile())
{ {
P.DeviceType = deviceType; p.DeviceType = deviceType;
P.Unregister(progid); p.Unregister(progid);
} }
} }
catch (Exception) { } catch (Exception) { }
@@ -509,11 +506,11 @@ namespace ASCOM.Meade.net
// //
private static bool RegisterClassFactories() private static bool RegisterClassFactories()
{ {
s_ClassFactories = new ArrayList(); _sClassFactories = new ArrayList();
foreach (Type type in s_ComObjectTypes) foreach (Type type in _sComObjectTypes)
{ {
ClassFactory factory = new ClassFactory(type); // Use default context & flags ClassFactory factory = new ClassFactory(type); // Use default context & flags
s_ClassFactories.Add(factory); _sClassFactories.Add(factory);
if (!factory.RegisterClassObject()) if (!factory.RegisterClassObject())
{ {
MessageBox.Show("Failed to register class factory for " + type.Name, MessageBox.Show("Failed to register class factory for " + type.Name,
@@ -528,7 +525,7 @@ namespace ASCOM.Meade.net
private static void RevokeClassFactories() private static void RevokeClassFactories()
{ {
ClassFactory.SuspendClassObjects(); // Prevent race conditions ClassFactory.SuspendClassObjects(); // Prevent race conditions
foreach (ClassFactory factory in s_ClassFactories) foreach (ClassFactory factory in _sClassFactories)
factory.RevokeClassObject(); factory.RevokeClassObject();
} }
#endregion #endregion
@@ -552,7 +549,7 @@ namespace ASCOM.Meade.net
switch (args[0].ToLower()) switch (args[0].ToLower())
{ {
case "-embedding": case "-embedding":
StartedByCOM = true; // Indicate COM started us StartedByCom = true; // Indicate COM started us
break; break;
case "-register": case "-register":
@@ -578,7 +575,7 @@ namespace ASCOM.Meade.net
} }
} }
else else
StartedByCOM = false; StartedByCom = false;
return bRet; return bRet;
} }
@@ -598,24 +595,24 @@ namespace ASCOM.Meade.net
if (!ProcessArguments(args)) return; // Register/Unregister if (!ProcessArguments(args)) return; // Register/Unregister
// Initialize critical member variables. // Initialize critical member variables.
objsInUse = 0; _objsInUse = 0;
serverLocks = 0; _serverLocks = 0;
MainThreadId = GetCurrentThreadId(); MainThreadId = GetCurrentThreadId();
Thread.CurrentThread.Name = "Main Thread"; Thread.CurrentThread.Name = "Main Thread";
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
s_MainForm = new frmMain(); _sMainForm = new FrmMain();
if (StartedByCOM) s_MainForm.WindowState = FormWindowState.Minimized; if (StartedByCom) _sMainForm.WindowState = FormWindowState.Minimized;
// Register the class factories of the served objects // Register the class factories of the served objects
RegisterClassFactories(); RegisterClassFactories();
// Start up the garbage collection thread. // Start up the garbage collection thread.
GarbageCollection GarbageCollector = new GarbageCollection(1000); GarbageCollection garbageCollector = new GarbageCollection(1000);
Thread GCThread = new Thread(new ThreadStart(GarbageCollector.GCWatch)); Thread gcThread = new Thread(new ThreadStart(garbageCollector.GcWatch));
GCThread.Name = "Garbage Collection Thread"; gcThread.Name = "Garbage Collection Thread";
GCThread.Start(); gcThread.Start();
// //
// Start the message loop. This serializes incoming calls to our // Start the message loop. This serializes incoming calls to our
@@ -623,7 +620,7 @@ namespace ASCOM.Meade.net
// //
try try
{ {
Application.Run(s_MainForm); Application.Run(_sMainForm);
} }
finally finally
{ {
@@ -633,8 +630,8 @@ namespace ASCOM.Meade.net
RevokeClassFactories(); RevokeClassFactories();
// Now stop the Garbage Collector thread. // Now stop the Garbage Collector thread.
GarbageCollector.StopThread(); garbageCollector.StopThread();
GarbageCollector.WaitForThreadToStop(); garbageCollector.WaitForThreadToStop();
} }
} }
#endregion #endregion
+1 -1
View File
@@ -8,7 +8,7 @@ namespace ASCOM.Meade.net.Localization
internal class LocalisationHelper internal class LocalisationHelper
{ {
private const string LocalizationNamespace = "LocalisationTest.Localization.Resources.Localization"; private const string LocalizationNamespace = "LocalisationTest.Localization.Resources.Localization";
ResourceManager _resourceManager; private readonly ResourceManager _resourceManager;
public LocalisationHelper() public LocalisationHelper()
{ {
+1
View File
@@ -133,6 +133,7 @@
<Compile Include="LocalServer.cs" /> <Compile Include="LocalServer.cs" />
<Compile Include="ProfileProperties.cs" /> <Compile Include="ProfileProperties.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TelescopeList.cs" />
<Compile Include="Wrapper\SharedResourcesWrapper.cs" /> <Compile Include="Wrapper\SharedResourcesWrapper.cs" />
<EmbeddedResource Include="frmMain.resx"> <EmbeddedResource Include="frmMain.resx">
<SubType>Designer</SubType> <SubType>Designer</SubType>
+2
View File
@@ -5,5 +5,7 @@ namespace ASCOM.Meade.net
// properies that are part of the profile // properies that are part of the profile
public string ComPort { get; set; } public string ComPort { get; set; }
public bool TraceLogger { get; set; } public bool TraceLogger { get; set; }
public double GuideRateArcSecondsPerSecond { get; set; }
public string Precision { get; set; }
} }
} }
+2 -3
View File
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -21,7 +20,7 @@ using System.Runtime.InteropServices;
// Build Number // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("0.7.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: ComVisibleAttribute(false)] [assembly: ComVisibleAttribute(false)]
-1
View File
@@ -1,4 +1,3 @@
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace ASCOM.Meade.net namespace ASCOM.Meade.net
+51 -9
View File
@@ -1,12 +1,7 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
using ASCOM.Utilities;
using ASCOM.Meade.net;
namespace ASCOM.Meade.net namespace ASCOM.Meade.net
{ {
@@ -29,12 +24,12 @@ namespace ASCOM.Meade.net
{ {
System.Diagnostics.Process.Start("http://ascom-standards.org/"); System.Diagnostics.Process.Start("http://ascom-standards.org/");
} }
catch (System.ComponentModel.Win32Exception noBrowser) catch (Win32Exception noBrowser)
{ {
if (noBrowser.ErrorCode == -2147467259) if (noBrowser.ErrorCode == -2147467259)
MessageBox.Show(noBrowser.Message); MessageBox.Show(noBrowser.Message);
} }
catch (System.Exception other) catch (Exception other)
{ {
MessageBox.Show(other.Message); MessageBox.Show(other.Message);
} }
@@ -45,12 +40,23 @@ namespace ASCOM.Meade.net
chkTrace.Checked = profileProperties.TraceLogger; chkTrace.Checked = profileProperties.TraceLogger;
// set the list of com ports to those that are currently available // set the list of com ports to those that are currently available
comboBoxComPort.Items.Clear(); comboBoxComPort.Items.Clear();
comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); // use System.IO because it's static comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort
.GetPortNames()); // use System.IO because it's static
// select the current port if possible // select the current port if possible
if (comboBoxComPort.Items.Contains(profileProperties.ComPort)) if (comboBoxComPort.Items.Contains(profileProperties.ComPort))
{ {
comboBoxComPort.SelectedItem = profileProperties.ComPort; comboBoxComPort.SelectedItem = profileProperties.ComPort;
} }
txtGuideRate.Text = profileProperties.GuideRateArcSecondsPerSecond.ToString();
try
{
cboPrecision.SelectedItem = profileProperties.Precision;
}
catch (Exception e)
{
cboPrecision.SelectedItem = "Unchanged";
}
} }
public ProfileProperties GetProfile() public ProfileProperties GetProfile()
@@ -58,7 +64,9 @@ namespace ASCOM.Meade.net
var profileProperties = new ProfileProperties var profileProperties = new ProfileProperties
{ {
TraceLogger = chkTrace.Checked, TraceLogger = chkTrace.Checked,
ComPort = comboBoxComPort.SelectedItem.ToString() ComPort = comboBoxComPort.SelectedItem.ToString(),
GuideRateArcSecondsPerSecond = double.Parse(txtGuideRate.Text.Trim()),
Precision = cboPrecision.SelectedItem.ToString()
}; };
return profileProperties; return profileProperties;
@@ -68,5 +76,39 @@ namespace ASCOM.Meade.net
{ {
Activate(); Activate();
} }
private bool _guideRateValid = true;
private void TextBox1_TextChanged(object sender, EventArgs e)
{
//const double SIDRATE = 0.9972695677; //synodic/solar seconds per sidereal second
try
{
double newGuideRate = double.Parse(txtGuideRate.Text.Trim());
const double siderealArcSecondsPerSecond = 15.041;
var percentOfSideReal = (newGuideRate / siderealArcSecondsPerSecond * 100);
lblPercentOfSiderealRate.Text = $"({percentOfSideReal:00.0}% of sidereal rate)";
_guideRateValid = true;
}
catch (Exception exception)
{
//Surpressing this exception as if the value is not valid then it's not useful.
_guideRateValid = false;
}
UpdateOKButton();
}
private void UpdateOKButton()
{
cmdOK.Enabled = _guideRateValid && (comboBoxComPort.SelectedItem != null);
}
private void ComboBoxComPort_SelectedValueChanged(object sender, EventArgs e)
{
UpdateOKButton();
}
} }
} }
+56
View File
@@ -36,6 +36,12 @@ namespace ASCOM.Meade.net
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.chkTrace = new System.Windows.Forms.CheckBox(); this.chkTrace = new System.Windows.Forms.CheckBox();
this.comboBoxComPort = new System.Windows.Forms.ComboBox(); this.comboBoxComPort = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.txtGuideRate = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.lblPercentOfSiderealRate = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.cboPrecision = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.picASCOM)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.picASCOM)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
@@ -85,11 +91,55 @@ namespace ASCOM.Meade.net
this.comboBoxComPort.FormattingEnabled = true; this.comboBoxComPort.FormattingEnabled = true;
resources.ApplyResources(this.comboBoxComPort, "comboBoxComPort"); resources.ApplyResources(this.comboBoxComPort, "comboBoxComPort");
this.comboBoxComPort.Name = "comboBoxComPort"; this.comboBoxComPort.Name = "comboBoxComPort";
this.comboBoxComPort.SelectedValueChanged += new System.EventHandler(this.ComboBoxComPort_SelectedValueChanged);
//
// label3
//
resources.ApplyResources(this.label3, "label3");
this.label3.Name = "label3";
//
// txtGuideRate
//
resources.ApplyResources(this.txtGuideRate, "txtGuideRate");
this.txtGuideRate.Name = "txtGuideRate";
this.txtGuideRate.TextChanged += new System.EventHandler(this.TextBox1_TextChanged);
//
// label4
//
resources.ApplyResources(this.label4, "label4");
this.label4.Name = "label4";
//
// lblPercentOfSiderealRate
//
resources.ApplyResources(this.lblPercentOfSiderealRate, "lblPercentOfSiderealRate");
this.lblPercentOfSiderealRate.Name = "lblPercentOfSiderealRate";
//
// label5
//
resources.ApplyResources(this.label5, "label5");
this.label5.Name = "label5";
//
// cboPrecision
//
this.cboPrecision.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboPrecision.FormattingEnabled = true;
this.cboPrecision.Items.AddRange(new object[] {
resources.GetString("cboPrecision.Items"),
resources.GetString("cboPrecision.Items1"),
resources.GetString("cboPrecision.Items2")});
resources.ApplyResources(this.cboPrecision, "cboPrecision");
this.cboPrecision.Name = "cboPrecision";
// //
// SetupDialogForm // SetupDialogForm
// //
resources.ApplyResources(this, "$this"); resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.cboPrecision);
this.Controls.Add(this.label5);
this.Controls.Add(this.lblPercentOfSiderealRate);
this.Controls.Add(this.label4);
this.Controls.Add(this.txtGuideRate);
this.Controls.Add(this.label3);
this.Controls.Add(this.comboBoxComPort); this.Controls.Add(this.comboBoxComPort);
this.Controls.Add(this.chkTrace); this.Controls.Add(this.chkTrace);
this.Controls.Add(this.label2); this.Controls.Add(this.label2);
@@ -118,5 +168,11 @@ namespace ASCOM.Meade.net
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label2;
private System.Windows.Forms.CheckBox chkTrace; private System.Windows.Forms.CheckBox chkTrace;
private System.Windows.Forms.ComboBox comboBoxComPort; private System.Windows.Forms.ComboBox comboBoxComPort;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox txtGuideRate;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label lblPercentOfSiderealRate;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.ComboBox cboPrecision;
} }
} }
+172 -10
View File
@@ -123,7 +123,7 @@
</data> </data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="cmdOK.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmdOK.Location" type="System.Drawing.Point, System.Drawing">
<value>281, 112</value> <value>281, 225</value>
</data> </data>
<data name="cmdOK.Size" type="System.Drawing.Size, System.Drawing"> <data name="cmdOK.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 24</value> <value>59, 24</value>
@@ -145,13 +145,13 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;cmdOK.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmdOK.ZOrder" xml:space="preserve">
<value>6</value> <value>12</value>
</data> </data>
<data name="cmdCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms"> <data name="cmdCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value> <value>Bottom, Right</value>
</data> </data>
<data name="cmdCancel.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmdCancel.Location" type="System.Drawing.Point, System.Drawing">
<value>281, 142</value> <value>281, 255</value>
</data> </data>
<data name="cmdCancel.Size" type="System.Drawing.Size, System.Drawing"> <data name="cmdCancel.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 25</value> <value>59, 25</value>
@@ -172,7 +172,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;cmdCancel.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmdCancel.ZOrder" xml:space="preserve">
<value>5</value> <value>11</value>
</data> </data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing"> <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 9</value> <value>12, 9</value>
@@ -196,7 +196,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve"> <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>4</value> <value>10</value>
</data> </data>
<data name="picASCOM.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms"> <data name="picASCOM.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value> <value>Top, Right</value>
@@ -223,7 +223,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;picASCOM.ZOrder" xml:space="preserve"> <data name="&gt;&gt;picASCOM.ZOrder" xml:space="preserve">
<value>3</value> <value>9</value>
</data> </data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib"> <data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
@@ -250,13 +250,13 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve"> <data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>2</value> <value>8</value>
</data> </data>
<data name="chkTrace.AutoSize" type="System.Boolean, mscorlib"> <data name="chkTrace.AutoSize" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
</data> </data>
<data name="chkTrace.Location" type="System.Drawing.Point, System.Drawing"> <data name="chkTrace.Location" type="System.Drawing.Point, System.Drawing">
<value>77, 118</value> <value>77, 136</value>
</data> </data>
<data name="chkTrace.Size" type="System.Drawing.Size, System.Drawing"> <data name="chkTrace.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 17</value> <value>69, 17</value>
@@ -277,7 +277,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;chkTrace.ZOrder" xml:space="preserve"> <data name="&gt;&gt;chkTrace.ZOrder" xml:space="preserve">
<value>1</value> <value>7</value>
</data> </data>
<data name="comboBoxComPort.Location" type="System.Drawing.Point, System.Drawing"> <data name="comboBoxComPort.Location" type="System.Drawing.Point, System.Drawing">
<value>77, 87</value> <value>77, 87</value>
@@ -298,6 +298,168 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;comboBoxComPort.ZOrder" xml:space="preserve"> <data name="&gt;&gt;comboBoxComPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>10, 162</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>61, 13</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Guide Rate</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="txtGuideRate.Location" type="System.Drawing.Point, System.Drawing">
<value>77, 159</value>
</data>
<data name="txtGuideRate.Size" type="System.Drawing.Size, System.Drawing">
<value>46, 20</value>
</data>
<data name="txtGuideRate.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="txtGuideRate.Text" xml:space="preserve">
<value>10.0</value>
</data>
<data name="&gt;&gt;txtGuideRate.Name" xml:space="preserve">
<value>txtGuideRate</value>
</data>
<data name="&gt;&gt;txtGuideRate.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;txtGuideRate.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;txtGuideRate.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>129, 162</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>122, 13</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>Arc seconds per second</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="lblPercentOfSiderealRate.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblPercentOfSiderealRate.Location" type="System.Drawing.Point, System.Drawing">
<value>129, 175</value>
</data>
<data name="lblPercentOfSiderealRate.Size" type="System.Drawing.Size, System.Drawing">
<value>105, 13</value>
</data>
<data name="lblPercentOfSiderealRate.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="lblPercentOfSiderealRate.Text" xml:space="preserve">
<value>(67% of sidereal rate)</value>
</data>
<data name="&gt;&gt;lblPercentOfSiderealRate.Name" xml:space="preserve">
<value>lblPercentOfSiderealRate</value>
</data>
<data name="&gt;&gt;lblPercentOfSiderealRate.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;lblPercentOfSiderealRate.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;lblPercentOfSiderealRate.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 194</value>
</data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 13</value>
</data>
<data name="label5.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>Precision</value>
</data>
<data name="&gt;&gt;label5.Name" xml:space="preserve">
<value>label5</value>
</data>
<data name="&gt;&gt;label5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="cboPrecision.Items" xml:space="preserve">
<value>Unchanged</value>
</data>
<data name="cboPrecision.Items1" xml:space="preserve">
<value>Low</value>
</data>
<data name="cboPrecision.Items2" xml:space="preserve">
<value>High</value>
</data>
<data name="cboPrecision.Location" type="System.Drawing.Point, System.Drawing">
<value>77, 191</value>
</data>
<data name="cboPrecision.Size" type="System.Drawing.Size, System.Drawing">
<value>90, 21</value>
</data>
<data name="cboPrecision.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
</data>
<data name="&gt;&gt;cboPrecision.Name" xml:space="preserve">
<value>cboPrecision</value>
</data>
<data name="&gt;&gt;cboPrecision.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;cboPrecision.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;cboPrecision.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@@ -307,7 +469,7 @@
<value>6, 13</value> <value>6, 13</value>
</data> </data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing"> <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>350, 175</value> <value>350, 288</value>
</data> </data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms"> <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value> <value>CenterScreen</value>
+67 -55
View File
@@ -15,8 +15,6 @@
// //
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
using ASCOM;
using ASCOM.Utilities; using ASCOM.Utilities;
namespace ASCOM.Meade.net namespace ASCOM.Meade.net
@@ -32,10 +30,10 @@ namespace ASCOM.Meade.net
public static class SharedResources public static class SharedResources
{ {
// object used for locking to prevent multiple drivers accessing common code at the same time // object used for locking to prevent multiple drivers accessing common code at the same time
private static readonly object lockObject = new object(); private static readonly object LockObject = new object();
// Shared serial port. This will allow multiple drivers to use one single serial port. // Shared serial port. This will allow multiple drivers to use one single serial port.
private static ASCOM.Utilities.Serial s_sharedSerial; // Shared serial port private static Serial _sSharedSerial; // Shared serial port
// //
// Public access to shared resources // Public access to shared resources
@@ -60,7 +58,7 @@ namespace ASCOM.Meade.net
/// <summary> /// <summary>
/// Shared serial port /// Shared serial port
/// </summary> /// </summary>
public static ASCOM.Utilities.Serial SharedSerial => s_sharedSerial ?? (s_sharedSerial = new ASCOM.Utilities.Serial()); public static Serial SharedSerial => _sSharedSerial ?? (_sSharedSerial = new Serial());
/// <summary> /// <summary>
/// number of connections to the shared serial port /// number of connections to the shared serial port
@@ -69,7 +67,7 @@ namespace ASCOM.Meade.net
public static void SendBlind(string message) public static void SendBlind(string message)
{ {
lock (lockObject) lock (LockObject)
{ {
SharedSerial.ClearBuffers(); SharedSerial.ClearBuffers();
SharedSerial.Transmit(message); SharedSerial.Transmit(message);
@@ -92,7 +90,7 @@ namespace ASCOM.Meade.net
/// <returns></returns> /// <returns></returns>
public static string SendString(string message) public static string SendString(string message)
{ {
lock (lockObject) lock (LockObject)
{ {
SharedSerial.ClearBuffers(); SharedSerial.ClearBuffers();
SharedSerial.Transmit(message); SharedSerial.Transmit(message);
@@ -102,7 +100,7 @@ namespace ASCOM.Meade.net
public static string SendChar(string message) public static string SendChar(string message)
{ {
lock (lockObject) lock (LockObject)
{ {
SharedSerial.ClearBuffers(); SharedSerial.ClearBuffers();
SharedSerial.Transmit(message); SharedSerial.Transmit(message);
@@ -112,12 +110,20 @@ namespace ASCOM.Meade.net
public static string ReadTerminated() public static string ReadTerminated()
{ {
lock (lockObject) lock (LockObject)
{ {
return SharedSerial.ReceiveTerminated("#"); return SharedSerial.ReceiveTerminated("#");
} }
} }
public static string ReadCharacters(int throwAwayCharacters)
{
lock (LockObject)
{
return SharedSerial.ReceiveCounted(throwAwayCharacters);
}
}
/// <summary> /// <summary>
/// Example of handling connecting to and disconnection from the /// Example of handling connecting to and disconnection from the
/// shared serial port. /// shared serial port.
@@ -130,7 +136,7 @@ namespace ASCOM.Meade.net
{ {
set set
{ {
lock (lockObject) lock (LockObject)
{ {
if (value) if (value)
{ {
@@ -148,47 +154,53 @@ namespace ASCOM.Meade.net
} }
} }
} }
get { return SharedSerial.Connected; } get => SharedSerial.Connected;
} }
#endregion #endregion
#region Profile #region Profile
internal static string driverID = "ASCOM.MeadeGeneric.Telescope"; private const string DriverId = "ASCOM.MeadeGeneric.Telescope";
// Constants used for Profile persistence // Constants used for Profile persistence
internal static string comPortProfileName = "COM Port"; private const string ComPortProfileName = "COM Port";
internal static string traceStateProfileName = "Trace Level"; private const string TraceStateProfileName = "Trace Level";
private const string GuideRateProfileName = "Guide Rate Arc Seconds Per Second";
private const string PrecisionProfileName = "Precision";
public static void WriteProfile(ProfileProperties profileProperties) public static void WriteProfile(ProfileProperties profileProperties)
{ {
lock (lockObject) lock (LockObject)
{ {
using (Profile driverProfile = new Profile()) using (Profile driverProfile = new Profile())
{ {
driverProfile.DeviceType = "Telescope"; driverProfile.DeviceType = "Telescope";
driverProfile.WriteValue(driverID, traceStateProfileName, profileProperties.TraceLogger.ToString()); driverProfile.WriteValue(DriverId, TraceStateProfileName, profileProperties.TraceLogger.ToString());
driverProfile.WriteValue(driverID, comPortProfileName, profileProperties.ComPort); driverProfile.WriteValue(DriverId, ComPortProfileName, profileProperties.ComPort);
driverProfile.WriteValue(DriverId, GuideRateProfileName, profileProperties.GuideRateArcSecondsPerSecond.ToString());
driverProfile.WriteValue(DriverId, PrecisionProfileName, profileProperties.Precision);
} }
} }
} }
private static readonly string comPortDefault = "COM1"; private const string ComPortDefault = "COM1";
internal static string traceStateDefault = "false"; private const string TraceStateDefault = "false";
private const string GuideRateProfileNameDefault = "10.077939"; //67% of sidereal rate
private const string PrecisionDefault = "Unchanged";
public static ProfileProperties ReadProfile() public static ProfileProperties ReadProfile()
{ {
lock (lockObject) lock (LockObject)
{ {
ProfileProperties profileProperties = new ProfileProperties(); ProfileProperties profileProperties = new ProfileProperties();
using (Profile driverProfile = new Profile()) using (Profile driverProfile = new Profile())
{ {
driverProfile.DeviceType = "Telescope"; driverProfile.DeviceType = "Telescope";
profileProperties.ComPort = profileProperties.ComPort = driverProfile.GetValue(DriverId, ComPortProfileName, string.Empty, ComPortDefault);
driverProfile.GetValue(driverID, comPortProfileName, string.Empty, comPortDefault); profileProperties.TraceLogger = Convert.ToBoolean(driverProfile.GetValue(DriverId, TraceStateProfileName, string.Empty, TraceStateDefault));
profileProperties.TraceLogger = Convert.ToBoolean(driverProfile.GetValue(driverID, profileProperties.GuideRateArcSecondsPerSecond = double.Parse(driverProfile.GetValue(DriverId, GuideRateProfileName, string.Empty, GuideRateProfileNameDefault));
traceStateProfileName, string.Empty, traceStateDefault)); profileProperties.Precision = driverProfile.GetValue(DriverId, PrecisionProfileName, string.Empty, PrecisionDefault);
} }
return profileProperties; return profileProperties;
@@ -211,14 +223,14 @@ namespace ASCOM.Meade.net
var profileProperties = ReadProfile(); var profileProperties = ReadProfile();
using (SetupDialogForm F = new SetupDialogForm()) using (SetupDialogForm f = new SetupDialogForm())
{ {
F.SetProfile(profileProperties); f.SetProfile(profileProperties);
var result = F.ShowDialog(); var result = f.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK) if (result == System.Windows.Forms.DialogResult.OK)
{ {
profileProperties = F.GetProfile(); profileProperties = f.GetProfile();
WriteProfile(profileProperties); // Persist device configuration values to the ASCOM Profile store WriteProfile(profileProperties); // Persist device configuration values to the ASCOM Profile store
} }
@@ -246,7 +258,7 @@ namespace ASCOM.Meade.net
/// The Key is the connection number that identifies the device, it could be the COM port name, /// 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 /// USB ID or IP Address, the Value is the DeviceHardware class
/// </summary> /// </summary>
private static Dictionary<string, DeviceHardware> connectedDevices = new Dictionary<string, DeviceHardware>(); private static readonly Dictionary<string, DeviceHardware> _connectedDevices = new Dictionary<string, DeviceHardware>();
/// <summary> /// <summary>
/// This is called in the driver Connect(true) property, /// This is called in the driver Connect(true) property,
@@ -255,26 +267,26 @@ namespace ASCOM.Meade.net
/// <param name="deviceId"></param> /// <param name="deviceId"></param>
public static void Connect(string deviceId) public static void Connect(string deviceId)
{ {
lock (lockObject) lock (LockObject)
{ {
if (!connectedDevices.ContainsKey(deviceId)) if (!_connectedDevices.ContainsKey(deviceId))
connectedDevices.Add(deviceId, new DeviceHardware()); _connectedDevices.Add(deviceId, new DeviceHardware());
connectedDevices[deviceId].count++; // increment the value _connectedDevices[deviceId].Count++; // increment the value
if (deviceId == "Serial") if (deviceId == "Serial")
{ {
if (connectedDevices[deviceId].count == 1) if (_connectedDevices[deviceId].Count == 1)
{ {
var profileProperties = ReadProfile(); var profileProperties = ReadProfile();
SharedResources.SharedSerial.PortName = profileProperties.ComPort; SharedSerial.PortName = profileProperties.ComPort;
SharedResources.SharedSerial.DTREnable = false; SharedSerial.DTREnable = false;
SharedResources.SharedSerial.RTSEnable = false; SharedSerial.RTSEnable = false;
SharedResources.SharedSerial.DataBits = 8; SharedSerial.DataBits = 8;
SharedResources.SharedSerial.StopBits = SerialStopBits.One; SharedSerial.StopBits = SerialStopBits.One;
SharedResources.SharedSerial.Parity = SerialParity.None; SharedSerial.Parity = SerialParity.None;
SharedResources.SharedSerial.Speed = SerialSpeed.ps9600; SharedSerial.Speed = SerialSpeed.ps9600;
SharedResources.SharedSerial.Handshake = SerialHandshake.None; SharedSerial.Handshake = SerialHandshake.None;
SharedResources.SharedSerial.Connected = true; SharedSerial.Connected = true;
ProductName = SendString(":GVP#"); ProductName = SendString(":GVP#");
FirmwareVersion = SendString(":GVN#"); FirmwareVersion = SendString(":GVN#");
@@ -285,17 +297,17 @@ namespace ASCOM.Meade.net
public static void Disconnect(string deviceId) public static void Disconnect(string deviceId)
{ {
lock (lockObject) lock (LockObject)
{ {
if (connectedDevices.ContainsKey(deviceId)) if (_connectedDevices.ContainsKey(deviceId))
{ {
connectedDevices[deviceId].count--; _connectedDevices[deviceId].Count--;
if (connectedDevices[deviceId].count <= 0) if (_connectedDevices[deviceId].Count <= 0)
{ {
connectedDevices.Remove(deviceId); _connectedDevices.Remove(deviceId);
if (deviceId == "Serial") if (deviceId == "Serial")
{ {
SharedResources.SharedSerial.Connected = false; SharedSerial.Connected = false;
} }
} }
} }
@@ -304,8 +316,8 @@ namespace ASCOM.Meade.net
public static bool IsConnected(string deviceId) public static bool IsConnected(string deviceId)
{ {
if (connectedDevices.ContainsKey(deviceId)) if (_connectedDevices.ContainsKey(deviceId))
return (connectedDevices[deviceId].count > 0); return (_connectedDevices[deviceId].Count > 0);
else else
return false; return false;
} }
@@ -314,7 +326,7 @@ namespace ASCOM.Meade.net
public static void Lock(Action action) public static void Lock(Action action)
{ {
lock (lockObject) lock (LockObject)
{ {
action(); action();
} }
@@ -322,7 +334,7 @@ namespace ASCOM.Meade.net
public static T Lock<T>(Func<T> func) public static T Lock<T>(Func<T> func)
{ {
lock (lockObject) lock (LockObject)
{ {
return func(); return func();
} }
@@ -336,7 +348,7 @@ namespace ASCOM.Meade.net
{ {
private int _count; private int _count;
internal int count internal int Count
{ {
set => _count = value; set => _count = value;
get => _count; get => _count;
@@ -344,7 +356,7 @@ namespace ASCOM.Meade.net
internal DeviceHardware() internal DeviceHardware()
{ {
count = 0; Count = 0;
} }
} }
+30
View File
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
namespace ASCOM.Meade.net
{
public static class TelescopeList
{
#region Autostar 497/Audiostar
public readonly static string Autostar497 = "Autostar";
//Autostar/Audiostar firmware revisions
public readonly static string Autostar497_30Ee = "30Ee";
public readonly static string Autostar497_31Ee = "31Ee";
public readonly static string Autostar497_43Eg = "43Eg";
#endregion
#region LX200GPS
public readonly static string LX200GPS = "LX2001";
public readonly static string LX200GPS_42G = "4.2G";
#endregion
}
}
+12 -17
View File
@@ -1,17 +1,9 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASCOM.Meade.net.Wrapper namespace ASCOM.Meade.net.Wrapper
{ {
public interface ISharedResourcesWrapper public interface ISharedResourcesWrapper
{ {
string AUTOSTAR497 { get; }
string AUTOSTAR497_31EE { get; }
string AUTOSTAR497_43EG { get;}
void Connect(string deviceId); void Connect(string deviceId);
void Disconnect(string deviceId); void Disconnect(string deviceId);
@@ -31,19 +23,12 @@ namespace ASCOM.Meade.net.Wrapper
ProfileProperties ReadProfile(); ProfileProperties ReadProfile();
void SetupDialog(); void SetupDialog();
void WriteProfile(ProfileProperties profileProperties);
string ReadCharacters(int throwAwayCharacters);
} }
public class SharedResourcesWrapper : ISharedResourcesWrapper public class SharedResourcesWrapper : ISharedResourcesWrapper
{ {
#region AutostarProducts
public string AUTOSTAR497 => "Autostar";
public string AUTOSTAR497_31EE => "31Ee";
public string AUTOSTAR497_43EG => "43Eg";
#endregion
public void Connect(string deviceId) public void Connect(string deviceId)
{ {
SharedResources.Connect( deviceId); SharedResources.Connect( deviceId);
@@ -88,6 +73,11 @@ namespace ASCOM.Meade.net.Wrapper
return SharedResources.ReadTerminated(); return SharedResources.ReadTerminated();
} }
public string ReadCharacters(int throwAwayCharacters)
{
return SharedResources.ReadCharacters(throwAwayCharacters);
}
public ProfileProperties ReadProfile() public ProfileProperties ReadProfile()
{ {
return SharedResources.ReadProfile(); return SharedResources.ReadProfile();
@@ -97,5 +87,10 @@ namespace ASCOM.Meade.net.Wrapper
{ {
SharedResources.SetupDialog(); SharedResources.SetupDialog();
} }
public void WriteProfile(ProfileProperties profileProperties)
{
SharedResources.WriteProfile(profileProperties);
}
} }
} }
+2 -2
View File
@@ -2,7 +2,7 @@ using System;
namespace ASCOM.Meade.net namespace ASCOM.Meade.net
{ {
partial class frmMain partial class FrmMain
{ {
/// <summary> /// <summary>
/// Required designer variable. /// Required designer variable.
@@ -48,7 +48,7 @@ namespace ASCOM.Meade.net
this.ClientSize = new System.Drawing.Size(233, 52); this.ClientSize = new System.Drawing.Size(233, 52);
this.Controls.Add(this.label1); this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "frmMain"; this.Name = "FrmMain";
this.Text = "Meade.net Driver Server"; this.Text = "Meade.net Driver Server";
this.ResumeLayout(false); this.ResumeLayout(false);
+2 -7
View File
@@ -1,17 +1,12 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
namespace ASCOM.Meade.net namespace ASCOM.Meade.net
{ {
public partial class frmMain : Form public partial class FrmMain : Form
{ {
delegate void SetTextCallback(string text); delegate void SetTextCallback(string text);
public frmMain() public FrmMain()
{ {
InitializeComponent(); InitializeComponent();
} }
+3 -6
View File
@@ -9,11 +9,8 @@
#define UseChooser #define UseChooser
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASCOM namespace ASCOM.Meade.net
{ {
class Program class Program
{ {
@@ -22,11 +19,11 @@ namespace ASCOM
// Uncomment the code that's required // Uncomment the code that's required
#if UseChooser #if UseChooser
// choose the device // choose the device
string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.MeadeGeneric.Telescope"); string id = DriverAccess.Telescope.Choose("ASCOM.MeadeGeneric.Telescope");
if (string.IsNullOrEmpty(id)) if (string.IsNullOrEmpty(id))
return; return;
// create this device // create this device
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope(id); DriverAccess.Telescope device = new DriverAccess.Telescope(id);
#else #else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly. // 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.Meade.net.Telescope"); ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.Meade.net.Telescope");
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -32,5 +31,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("0.7.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
@@ -16,7 +16,7 @@
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
+1 -1
View File
@@ -35,7 +35,7 @@
<foreach item="File" in="${build.output.directory}" property="fileName"> <foreach item="File" in="${build.output.directory}" property="fileName">
<if test="${string::to-lower(path::get-extension(fileName)) == '.msi'}"> <if test="${string::to-lower(path::get-extension(fileName)) == '.msi'}">
<move file="${fileName}" tofile="${path::combine(path::get-directory-name(fileName), path::get-file-name-without-extension(fileName) + environment::get-variable('BUILD_NUMBER') + '.msi')}" /> <move file="${fileName}" tofile="${path::combine(path::get-directory-name(fileName), path::get-file-name-without-extension(fileName) + '.' + environment::get-variable('BUILD_NUMBER') + '.msi')}" />
</if> </if>
</foreach> </foreach>
</target> </target>