Compare commits

...

73 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
ColinD 0475217d62 Trying to read the BUILD_NUMBER from the environment. 2019-07-14 22:56:32 +01:00
ColinD e89f01ed51 Another try 2019-07-14 22:40:45 +01:00
ColinD 2846e9f719 Anotther try. 2019-07-14 22:32:38 +01:00
ColinD a7904d7485 Another attempt at the version number rename. 2019-07-14 22:28:32 +01:00
ColinD 12c11b4987 Removed unneeded comments 2019-07-14 22:19:55 +01:00
ColinD 07569b146e Trying the nant variable inside the string. 2019-07-14 22:19:05 +01:00
ColinD 112fdf0bb9 Experiment on build.build to see if I can rename the msi file 2019-07-14 22:14:43 +01:00
ColinD 73e8e8ffe8 More unit testing 2019-07-14 22:05:25 +01:00
ColinD 34a145765b More unit testing
Fixed issue when setting site latitude to negative value.
2019-07-14 21:47:02 +01:00
ColinD e3f82ff232 More unit tests 2019-07-14 17:51:34 +01:00
ColinD 5f5d819f3b More unit tests added 2019-07-14 17:12:56 +01:00
ColinD 69434454ca More unit test coverage 2019-07-13 23:26:19 +01:00
38 changed files with 3189 additions and 686 deletions
+6 -7
View File
@@ -1,5 +1,4 @@
using System;
using ASCOM.Meade.net;
using ASCOM.Meade.net.AstroMaths;
using NUnit.Framework;
@@ -53,16 +52,16 @@ namespace AstroMath.UnitTests
public void UTtoGST_book()
{
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));
}
[Test]
public void UTtoGST()
public void UTtoGst()
{
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));
}
@@ -72,16 +71,16 @@ namespace AstroMath.UnitTests
{
double gst = 4.668119;
var longitude = -64;
var lst = _astroMath.GSTtoLST(gst, longitude);
var lst = _astroMath.GsTtoLst(gst, longitude);
Assert.That(lst, Is.EqualTo(0.4014523333333333));
}
[Test]
public void GSTtoLST()
public void GsTtoLst()
{
double gst = 14.257589512545053;
var longitude = -1.7833333333333332;
var lst = _astroMath.GSTtoLST(gst, longitude);
var lst = _astroMath.GsTtoLst(gst, longitude);
Assert.That(lst, Is.EqualTo(14.138700623656163));
}
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 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
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.0.0.0")]
+3 -6
View File
@@ -9,13 +9,10 @@
#define UseChooser
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ASCOM.DriverAccess;
namespace ASCOM
namespace ASCOM.MeadeGeneric
{
class Program
{
@@ -24,11 +21,11 @@ namespace ASCOM
// Uncomment the code that's required
#if UseChooser
// choose the device
string id = ASCOM.DriverAccess.Focuser.Choose("ASCOM.MeadeGeneric.Focuser");
string id = Focuser.Choose("ASCOM.MeadeGeneric.Focuser");
if (string.IsNullOrEmpty(id))
return;
// create this device
ASCOM.DriverAccess.Focuser device = new ASCOM.DriverAccess.Focuser(id);
Focuser device = new Focuser(id);
#else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly.
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.MeadeGeneric.Telescope");
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 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
// by using the '*' as shown below:
[assembly: AssemblyVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyVersion("0.0.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.
-->
<?define InstallName = "ASCOM Meade.net" ?>
<?define InstallName = "ASCOM Meade Generic" ?>
<?define Manufacturer = "cjdawson.com" ?>
<?define UpgradeCode = "{57597bb6-f207-4998-97f4-8a041950d062}" ?>
<?define INSTALLFOLDER = "$(var.InstallName)" ?>
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 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
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("0.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 double SiteLatitude { 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)
{
var ut = DateTimeToDecimalHours( utcDateTime);
var gst = UTtoGST( utcDateTime);
var lst = GSTtoLST( gst, longitude);
var gst = UTtoGst( utcDateTime);
var lst = GsTtoLst( gst, longitude);
var raHours = rightAscension;
var h1 = lst - raHours;
var h = h1;
@@ -24,8 +24,8 @@ namespace ASCOM.Meade.net.AstroMaths
public double HourAngleToRightAscension(DateTime utcDateTime, double longitude, double hourAngle )
{
var gst = UTtoGST(utcDateTime);
var lst = GSTtoLST( gst, longitude);
var gst = UTtoGst(utcDateTime);
var lst = GsTtoLst( gst, longitude);
var raHours = hourAngle;
var h1 = lst - raHours;
var h = h1;
@@ -129,7 +129,7 @@ namespace ASCOM.Meade.net.AstroMaths
}
//todo convert to extension method
public double UTtoGST(DateTime utcDateTime)
public double UTtoGst(DateTime utcDateTime)
{
Util util = new Util();
@@ -171,7 +171,7 @@ namespace ASCOM.Meade.net.AstroMaths
return t1;
}
public double GSTtoLST(double gst, double longitude)
public double GsTtoLst(double gst, double longitude)
{
var l = longitude/ 15;
@@ -11,7 +11,7 @@ namespace ASCOM.Meade.net.AstroMaths
double DegreesToRadians(double degrees);
double RadiansToDegrees(double radians);
double DateTimeToDecimalHours( DateTime utcDateTime);
double UTtoGST(DateTime utcDateTime);
double GSTtoLST(double gst, double longitude);
double UTtoGst(DateTime utcDateTime);
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\HorizonCoordinates.cs" />
<Compile Include="AstroMaths\IAstroMaths.cs" />
<Compile Include="DoubleExtensions.cs" />
<Compile Include="StringExtensions.cs" />
<Compile Include="Telescope.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
@@ -35,5 +34,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
//
// TODO - Set your driver's version here
[assembly: AssemblyVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.0.0.0")]
+32 -48
View File
@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices;
using ASCOM.DeviceInterface;
using System.Collections;
using System.Threading;
@@ -21,10 +17,10 @@ namespace ASCOM.Meade.net
[Guid("288838d1-bbf9-4ce0-9ee1-86ecf38b45c9")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Rate : ASCOM.DeviceInterface.IRate
public class Rate : IRate
{
private double maximum = 0;
private double minimum = 0;
private double _maximum = 0;
private double _minimum = 0;
//
// Default constructor - Internal prevents public creation
@@ -32,8 +28,8 @@ namespace ASCOM.Meade.net
//
internal Rate(double minimum, double maximum)
{
this.maximum = maximum;
this.minimum = minimum;
_maximum = maximum;
_minimum = minimum;
}
#region Implementation of IRate
@@ -45,14 +41,14 @@ namespace ASCOM.Meade.net
public double Maximum
{
get { return this.maximum; }
set { this.maximum = value; }
get => _maximum;
set => _maximum = value;
}
public double Minimum
{
get { return this.minimum; }
set { this.minimum = value; }
get => _minimum;
set => _minimum = value;
}
#endregion
@@ -74,8 +70,8 @@ namespace ASCOM.Meade.net
[ComVisible(true)]
public class AxisRates : IAxisRates, IEnumerable
{
private TelescopeAxes axis;
private readonly Rate[] rates;
private TelescopeAxes _axis;
private readonly Rate[] _rates;
//
// Constructor - Internal prevents public creation
@@ -83,7 +79,7 @@ namespace ASCOM.Meade.net
//
internal AxisRates(TelescopeAxes axis)
{
this.axis = axis;
_axis = axis;
//
// This collection must hold zero or more Rate objects describing the
// 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
// 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[] { 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;
case TelescopeAxes.axisSecondary:
// TODO Initialize this array with any Secondary axis rates that your driver may provide
//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;
case TelescopeAxes.axisTertiary:
// TODO Initialize this array with any Tertiary axis rates that your driver may provide
this.rates = new Rate[0];
_rates = new Rate[0];
break;
}
}
#region IAxisRates Members
public int Count
{
get { return this.rates.Length; }
}
public int Count => _rates.Length;
public void Dispose()
{
@@ -128,13 +121,10 @@ namespace ASCOM.Meade.net
public IEnumerator GetEnumerator()
{
return rates.GetEnumerator();
return _rates.GetEnumerator();
}
public IRate this[int index]
{
get { return this.rates[index - 1]; } // 1-based
}
public IRate this[int index] => _rates[index - 1];
#endregion
}
@@ -159,11 +149,11 @@ namespace ASCOM.Meade.net
[ComVisible(true)]
public class TrackingRates : ITrackingRates, IEnumerable, IEnumerator
{
private readonly DriveRates[] trackingRates;
private readonly DriveRates[] _trackingRates;
// this is used to make the index thread safe
private readonly ThreadLocal<int> pos = new ThreadLocal<int>(() => { return -1; });
private static readonly object lockObj = new object();
private readonly ThreadLocal<int> _pos = new ThreadLocal<int>(() => { return -1; });
private static readonly object LockObj = new object();
//
// Default constructor - Internal prevents public creation
@@ -176,20 +166,17 @@ namespace ASCOM.Meade.net
// the tracking rates supported by your telescope. The one value
// (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
}
#region ITrackingRates Members
public int Count
{
get { return this.trackingRates.Length; }
}
public int Count => _trackingRates.Length;
public IEnumerator GetEnumerator()
{
pos.Value = -1;
_pos.Value = -1;
return this as IEnumerator;
}
@@ -198,10 +185,7 @@ namespace ASCOM.Meade.net
// TODO Add any required object cleanup here
}
public DriveRates this[int index]
{
get { return this.trackingRates[index - 1]; } // 1-based
}
public DriveRates this[int index] => _trackingRates[index - 1];
#endregion
@@ -211,22 +195,22 @@ namespace ASCOM.Meade.net
{
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();
}
return trackingRates[pos.Value];
return _trackingRates[_pos.Value];
}
}
}
public bool MoveNext()
{
lock (lockObj)
lock (LockObj)
{
if (++pos.Value >= trackingRates.Length)
if (++_pos.Value >= _trackingRates.Length)
{
return false;
}
@@ -236,7 +220,7 @@ namespace ASCOM.Meade.net
public void Reset()
{
pos.Value = -1;
_pos.Value = -1;
}
#endregion
}
+23
View File
@@ -6,5 +6,28 @@ namespace ASCOM.Meade.net
{
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.
/// </summary>
//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
/// <summary>
/// Driver description that displays in the ASCOM Chooser.
/// </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>
/// Private variable to hold an ASCOM Utilities object
@@ -55,7 +55,7 @@ namespace ASCOM.Meade.net
/// <summary>
/// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify)
/// </summary>
internal static TraceLogger tl;
internal static TraceLogger Tl;
private readonly ISharedResourcesWrapper _sharedResourcesWrapper;
@@ -74,14 +74,15 @@ namespace ASCOM.Meade.net
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
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>
public void SetupDialog()
{
tl.LogMessage("SetupDialog", "Opening setup dialog");
Tl.LogMessage("SetupDialog", "Opening setup dialog");
_sharedResourcesWrapper.SetupDialog();
ReadProfile();
tl.LogMessage("SetupDialog", "complete");
Tl.LogMessage("SetupDialog", "complete");
}
public ArrayList SupportedActions
{
get
{
tl.LogMessage("SupportedActions Get", "Returning empty arraylist");
Tl.LogMessage("SupportedActions Get", "Returning empty arraylist");
return new ArrayList();
}
}
@@ -117,7 +118,7 @@ namespace ASCOM.Meade.net
public string Action(string actionName, string actionParameters)
{
LogMessage("", "Action {0}, parameters {1} not implemented", actionName, actionParameters);
throw new ASCOM.ActionNotImplementedException("Action " + actionName + " is not implemented by this driver");
throw new ActionNotImplementedException("Action " + actionName + " is not implemented by this driver");
}
public void CommandBlind(string command, bool raw)
@@ -137,7 +138,7 @@ namespace ASCOM.Meade.net
//string ret = CommandString(command, raw);
// TODO decode the return string and return true or false
// or
throw new ASCOM.MethodNotImplementedException("CommandBool");
throw new MethodNotImplementedException("CommandBool");
// 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
return _sharedResourcesWrapper.SendString(command);
throw new ASCOM.MethodNotImplementedException("CommandString");
throw new MethodNotImplementedException("CommandString");
}
public void Dispose()
{
// Clean up the tracelogger and util objects
tl.Enabled = false;
tl.Dispose();
tl = null;
Tl.Enabled = false;
Tl.Dispose();
Tl = null;
}
public bool Connected
@@ -169,7 +170,7 @@ namespace ASCOM.Meade.net
}
set
{
tl.LogMessage("Connected", "Set {0}", value);
Tl.LogMessage("Connected", "Set {0}", value);
if (value == IsConnected)
return;
@@ -177,6 +178,7 @@ namespace ASCOM.Meade.net
{
try
{
ReadProfile();
_sharedResourcesWrapper.Connect("Serial");
try
{
@@ -193,12 +195,12 @@ namespace ASCOM.Meade.net
}
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
{
LogMessage("Connected Set", "Disconnecting from port {0}", comPort);
LogMessage("Connected Set", "Disconnecting from port {0}", _comPort);
_sharedResourcesWrapper.Disconnect("Serial");
IsConnected = false;
}
@@ -241,8 +243,8 @@ namespace ASCOM.Meade.net
// TODO customise this device description
get
{
tl.LogMessage("Description Get", driverDescription);
return driverDescription;
Tl.LogMessage("Description Get", DriverDescription);
return DriverDescription;
}
}
@@ -250,10 +252,10 @@ namespace ASCOM.Meade.net
{
get
{
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
Version version = Assembly.GetExecutingAssembly().GetName().Version;
// TODO customise this driver description
string driverInfo = "Information about the driver itself. Version: " + String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
tl.LogMessage("DriverInfo Get", driverInfo);
Tl.LogMessage("DriverInfo Get", driverInfo);
return driverInfo;
}
}
@@ -262,9 +264,9 @@ namespace ASCOM.Meade.net
{
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);
tl.LogMessage("DriverVersion Get", driverVersion);
Tl.LogMessage("DriverVersion Get", driverVersion);
return driverVersion;
}
}
@@ -284,8 +286,8 @@ namespace ASCOM.Meade.net
get
{
//string name = "Short driver name - please customise";
string name = driverDescription;
tl.LogMessage("Name Get", name);
string name = DriverDescription;
Tl.LogMessage("Name Get", name);
return name;
}
}
@@ -298,14 +300,14 @@ namespace ASCOM.Meade.net
{
get
{
tl.LogMessage("Absolute Get", false.ToString());
Tl.LogMessage("Absolute Get", false.ToString());
return false; // This is a relative focuser
}
}
public void Halt()
{
tl.LogMessage("Halt", "Halting");
Tl.LogMessage("Halt", "Halting");
CheckConnected("Halt");
@@ -325,7 +327,7 @@ namespace ASCOM.Meade.net
{
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
}
}
@@ -334,13 +336,13 @@ namespace ASCOM.Meade.net
{
get
{
tl.LogMessage("Link Get", this.Connected.ToString());
return this.Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility
Tl.LogMessage("Link Get", Connected.ToString());
return Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility
}
set
{
tl.LogMessage("Link Set", value.ToString());
this.Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility
Tl.LogMessage("Link Set", value.ToString());
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
{
tl.LogMessage("MaxIncrement Get", _maxIncrement.ToString());
Tl.LogMessage("MaxIncrement Get", _maxIncrement.ToString());
return _maxIncrement; // Maximum change in one move
}
}
@@ -359,37 +361,37 @@ namespace ASCOM.Meade.net
{
get
{
tl.LogMessage("MaxStep Get", _maxStep.ToString());
Tl.LogMessage("MaxStep Get", _maxStep.ToString());
return _maxStep;
}
}
public void Move(int Position)
public void Move(int position)
{
tl.LogMessage("Move", Position.ToString());
Tl.LogMessage("Move", position.ToString());
CheckConnected("Move");
//todo implement backlash compensation
//todo implement direction reverse
//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;
if (Position > 0)
if (position > 0)
{
//desired move direction is out
MoveFocuser(true, Math.Abs(Position));
MoveFocuser(true, Math.Abs(position));
}
else
{
//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
{
get
{
throw new ASCOM.PropertyNotImplementedException("Position", false);
//return focuserPosition; // Return the focuser position
}
}
public int Position => throw new PropertyNotImplementedException("Position", false);
public double StepSize
{
get
{
tl.LogMessage("StepSize Get", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("StepSize", false);
Tl.LogMessage("StepSize Get", "Not implemented");
throw new PropertyNotImplementedException("StepSize", false);
}
}
@@ -452,13 +447,13 @@ namespace ASCOM.Meade.net
{
get
{
tl.LogMessage("TempComp Get", false.ToString());
Tl.LogMessage("TempComp Get", false.ToString());
return false;
}
set
{
tl.LogMessage("TempComp Set", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("TempComp", false);
Tl.LogMessage("TempComp Set", "Not implemented");
throw new PropertyNotImplementedException("TempComp", false);
}
}
@@ -466,7 +461,7 @@ namespace ASCOM.Meade.net
{
get
{
tl.LogMessage("TempCompAvailable Get", false.ToString());
Tl.LogMessage("TempCompAvailable Get", false.ToString());
return false; // Temperature compensation is not available in this driver
}
}
@@ -475,8 +470,8 @@ namespace ASCOM.Meade.net
{
get
{
tl.LogMessage("Temperature Get", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("Temperature", false);
Tl.LogMessage("Temperature Get", "Not implemented");
throw new PropertyNotImplementedException("Temperature", false);
}
}
@@ -496,18 +491,18 @@ namespace ASCOM.Meade.net
/// This is harmless if the driver is already registered/unregistered.
/// </summary>
/// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param>
private static void RegUnregASCOM(bool bRegister)
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)
{
P.Register(driverID, driverDescription);
p.Register(DriverId, DriverDescription);
}
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.
/// </remarks>
[ComRegisterFunction]
public static void RegisterASCOM(Type t)
public static void RegisterAscom(Type t)
{
RegUnregASCOM(true);
RegUnregAscom(true);
}
/// <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.
/// </remarks>
[ComUnregisterFunction]
public static void UnregisterASCOM(Type t)
public static void UnregisterAscom(Type t)
{
RegUnregASCOM(false);
RegUnregAscom(false);
}
#endregion
@@ -573,7 +568,7 @@ namespace ASCOM.Meade.net
{
if (!IsConnected)
{
throw new ASCOM.NotConnectedException(message);
throw new NotConnectedException(message);
}
}
@@ -583,8 +578,11 @@ namespace ASCOM.Meade.net
internal void ReadProfile()
{
var profileProperties = _sharedResourcesWrapper.ReadProfile();
tl.Enabled = profileProperties.TraceLogger;
comPort = profileProperties.ComPort;
Tl.Enabled = profileProperties.TraceLogger;
_comPort = profileProperties.ComPort;
LogMessage("ReadProfile", $"Trace logger enabled: {Tl.Enabled}");
LogMessage("ReadProfile", $"Com Port: {_comPort}");
}
/// <summary>
@@ -596,7 +594,7 @@ namespace ASCOM.Meade.net
internal static void LogMessage(string identifier, string message, params object[] args)
{
var msg = string.Format(message, args);
tl.LogMessage(identifier, msg);
Tl.LogMessage(identifier, msg);
}
#endregion
}
+2 -3
View File
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
@@ -35,5 +34,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
//
// TODO - Set your driver's version here
[assembly: AssemblyVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyVersion("0.0.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
// Define two common GUID objects for public usage.
public static Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
public static Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
private static readonly Guid _iidIUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
private static readonly Guid _iidIDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
[Flags]
enum CLSCTX : uint
enum Clsctx : uint
{
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
ClsctxInprocServer = 0x1,
ClsctxInprocHandler = 0x2,
ClsctxLocalServer = 0x4,
ClsctxInprocServer16 = 0x8,
ClsctxRemoteServer = 0x10,
ClsctxInprocHandler16 = 0x20,
ClsctxReserved1 = 0x40,
ClsctxReserved2 = 0x80,
ClsctxReserved3 = 0x100,
ClsctxReserved4 = 0x200,
ClsctxNoCodeDownload = 0x400,
ClsctxReserved5 = 0x800,
ClsctxNoCustomMarshal = 0x1000,
ClsctxEnableCodeDownload = 0x2000,
ClsctxNoFailureLog = 0x4000,
ClsctxDisableAaa = 0x8000,
ClsctxEnableAaa = 0x10000,
ClsctxFromDefaultContext = 0x20000,
ClsctxInproc = ClsctxInprocServer | ClsctxInprocHandler,
ClsctxServer = ClsctxInprocServer | ClsctxLocalServer | ClsctxRemoteServer,
ClsctxAll = ClsctxServer | ClsctxInprocHandler
}
[Flags]
enum REGCLS : uint
enum Regcls : uint
{
REGCLS_SINGLEUSE = 0,
REGCLS_MULTIPLEUSE = 1,
REGCLS_MULTI_SEPARATE = 2,
REGCLS_SUSPENDED = 4,
REGCLS_SURROGATE = 8
RegclsSingleuse = 0,
RegclsMultipleuse = 1,
RegclsMultiSeparate = 2,
RegclsSuspended = 4,
RegclsSurrogate = 8
}
//
// CoRegisterClassObject() is used to register a Class Factory
@@ -109,70 +109,59 @@ namespace ASCOM.Meade.net
#region Constructor and Private ClassFactory Data
protected Type m_ClassType;
protected Guid m_ClassId;
protected ArrayList m_InterfaceTypes;
protected uint m_ClassContext;
protected uint m_Flags;
protected UInt32 m_locked = 0;
protected uint m_Cookie;
protected string m_progid;
private readonly Type _mClassType;
private Guid _mClassId;
private readonly ArrayList _mInterfaceTypes;
private uint _mCookie;
private readonly string _mProgid;
public ClassFactory(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
m_ClassType = type;
_mClassType = type;
//PWGS Get the ProgID from the MetaData
m_progid = Marshal.GenerateProgIdForType(type);
m_ClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)]
m_ClassContext = (uint)CLSCTX.CLSCTX_LOCAL_SERVER; // Default
m_Flags = (uint)REGCLS.REGCLS_MULTIPLEUSE | // Default
(uint)REGCLS.REGCLS_SUSPENDED;
m_InterfaceTypes = new ArrayList();
_mProgid = Marshal.GenerateProgIdForType(type);
_mClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)]
ClassContext = (uint)Clsctx.ClsctxLocalServer; // Default
Flags = (uint)Regcls.RegclsMultipleuse | // Default
(uint)Regcls.RegclsSuspended;
_mInterfaceTypes = new ArrayList();
foreach (Type T in type.GetInterfaces()) // Save all of the implemented interfaces
m_InterfaceTypes.Add(T);
_mInterfaceTypes.Add(T);
}
#endregion
#region Common ClassFactory Methods
public uint ClassContext
{
get { return m_ClassContext; }
set { m_ClassContext = value; }
}
public uint ClassContext { get; }
public Guid ClassId
{
get { return m_ClassId; }
set { m_ClassId = value; }
get => _mClassId;
set => _mClassId = value;
}
public uint Flags
{
get { return m_Flags; }
set { m_Flags = value; }
}
public uint Flags { get; }
public bool RegisterClassObject()
{
// Register the class factory
int i = CoRegisterClassObject
(
ref m_ClassId,
ref _mClassId,
this,
m_ClassContext,
m_Flags,
out m_Cookie
ClassContext,
Flags,
out _mCookie
);
return (i == 0);
}
public bool RevokeClassObject()
{
int i = CoRevokeClassObject(m_Cookie);
int i = CoRevokeClassObject(_mCookie);
return (i == 0);
}
@@ -201,25 +190,25 @@ namespace ASCOM.Meade.net
//
// Handle specific requests for implemented interfaces
//
foreach (Type iType in m_InterfaceTypes)
foreach (Type iType in _mInterfaceTypes)
{
if (riid == Marshal.GenerateGuidForType(iType))
{
ppvObject = Marshal.GetComInterfaceForObject(Activator.CreateInstance(m_ClassType), iType);
ppvObject = Marshal.GetComInterfaceForObject(Activator.CreateInstance(_mClassType), iType);
return;
}
}
//
// 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;
}
else if (riid == IID_IUnknown)
else if (riid == _iidIUnknown)
{
ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(m_ClassType));
ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(_mClassType));
}
else
{
+13 -15
View File
@@ -8,35 +8,33 @@ namespace ASCOM.Meade.net
/// </summary>
class GarbageCollection
{
protected bool m_bContinueThread;
protected bool m_GCWatchStopped;
protected int m_iInterval;
protected ManualResetEvent m_EventThreadEnded;
private bool _mbContinueThread;
private readonly int _miInterval;
private readonly ManualResetEvent _mEventThreadEnded;
public GarbageCollection(int iInterval)
{
m_bContinueThread = true;
m_GCWatchStopped = false;
m_iInterval = iInterval;
m_EventThreadEnded = new ManualResetEvent(false);
_mbContinueThread = true;
_miInterval = iInterval;
_mEventThreadEnded = new ManualResetEvent(false);
}
public void GCWatch()
public void GcWatch()
{
// Pause for a moment to provide a delay to make threads more apparent.
while (ContinueThread())
{
GC.Collect();
Thread.Sleep(m_iInterval);
Thread.Sleep(_miInterval);
}
m_EventThreadEnded.Set();
_mEventThreadEnded.Set();
}
protected bool ContinueThread()
{
lock (this)
{
return m_bContinueThread;
return _mbContinueThread;
}
}
@@ -44,14 +42,14 @@ namespace ASCOM.Meade.net
{
lock (this)
{
m_bContinueThread = false;
_mbContinueThread = false;
}
}
public void WaitForThreadToStop()
{
m_EventThreadEnded.WaitOne();
m_EventThreadEnded.Reset();
_mEventThreadEnded.WaitOne();
_mEventThreadEnded.Reset();
}
}
}
+87 -90
View File
@@ -15,17 +15,14 @@
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;
using System.Collections;
using System.Runtime.InteropServices;
using System.Reflection;
using ASCOM.Utilities;
using Microsoft.Win32;
using System.Text;
using System.Threading;
using System.Security.Principal;
using System.Diagnostics;
using ASCOM;
namespace ASCOM.Meade.net
{
@@ -34,52 +31,52 @@ namespace ASCOM.Meade.net
#region Access to kernel32.dll, user32.dll, and ole32.dll functions
[Flags]
enum CLSCTX : uint
enum Clsctx : uint
{
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
ClsctxInprocServer = 0x1,
ClsctxInprocHandler = 0x2,
ClsctxLocalServer = 0x4,
ClsctxInprocServer16 = 0x8,
ClsctxRemoteServer = 0x10,
ClsctxInprocHandler16 = 0x20,
ClsctxReserved1 = 0x40,
ClsctxReserved2 = 0x80,
ClsctxReserved3 = 0x100,
ClsctxReserved4 = 0x200,
ClsctxNoCodeDownload = 0x400,
ClsctxReserved5 = 0x800,
ClsctxNoCustomMarshal = 0x1000,
ClsctxEnableCodeDownload = 0x2000,
ClsctxNoFailureLog = 0x4000,
ClsctxDisableAaa = 0x8000,
ClsctxEnableAaa = 0x10000,
ClsctxFromDefaultContext = 0x20000,
ClsctxInproc = ClsctxInprocServer | ClsctxInprocHandler,
ClsctxServer = ClsctxInprocServer | ClsctxLocalServer | ClsctxRemoteServer,
ClsctxAll = ClsctxServer | ClsctxInprocHandler
}
[Flags]
enum COINIT : uint
enum Coinit : uint
{
/// Initializes the thread for multi-threaded object concurrency.
COINIT_MULTITHREADED = 0x0,
CoinitMultithreaded = 0x0,
/// Initializes the thread for apartment-threaded object concurrency.
COINIT_APARTMENTTHREADED = 0x2,
CoinitApartmentthreaded = 0x2,
/// Disables DDE for Ole1 support.
COINIT_DISABLE_OLE1DDE = 0x4,
CoinitDisableOle1Dde = 0x4,
/// Trades memory for speed.
COINIT_SPEED_OVER_MEMORY = 0x8
CoinitSpeedOverMemory = 0x8
}
[Flags]
enum REGCLS : uint
enum Regcls : uint
{
REGCLS_SINGLEUSE = 0,
REGCLS_MULTIPLEUSE = 1,
REGCLS_MULTI_SEPARATE = 2,
REGCLS_SUSPENDED = 4,
REGCLS_SURROGATE = 8
RegclsSingleuse = 0,
RegclsMultipleuse = 1,
RegclsMultiSeparate = 2,
RegclsSuspended = 4,
RegclsSurrogate = 8
}
@@ -97,7 +94,7 @@ namespace ASCOM.Meade.net
// We will need this API to post a WM_QUIT message to the main
// thread in order to terminate this application.
[DllImport("user32.dll")]
static extern bool PostThreadMessage(uint idThread, uint Msg, UIntPtr wParam,
static extern bool PostThreadMessage(uint idThread, uint msg, UIntPtr wParam,
IntPtr lParam);
// GetCurrentThreadId() allows us to obtain the thread id of the
@@ -108,21 +105,21 @@ namespace ASCOM.Meade.net
#endregion
#region Private Data
private static int objsInUse; // Keeps a count on the total number of objects alive.
private static int serverLocks; // Keeps a lock count on this application.
private static frmMain s_MainForm = null; // Reference to our main form
private static ArrayList s_ComObjectAssys; // Dynamically loaded assemblies containing served COM objects
private static ArrayList s_ComObjectTypes; // Served COM object types
private static ArrayList s_ClassFactories; // Served COM object class factories
private static string s_appId = "{4e68ec46-5ffc-49e7-b298-38a548df0bfd}"; // Our AppId
private static readonly Object lockObject = new object();
private static int _objsInUse; // Keeps a count on the total number of objects alive.
private static int _serverLocks; // Keeps a lock count on this application.
private static FrmMain _sMainForm = null; // Reference to our main form
private static ArrayList _sComObjectAssys; // Dynamically loaded assemblies containing served COM objects
private static ArrayList _sComObjectTypes; // Served COM object types
private static ArrayList _sClassFactories; // Served COM object class factories
private static string _sAppId = "{4e68ec46-5ffc-49e7-b298-38a548df0bfd}"; // Our AppId
private static readonly Object LockObject = new object();
#endregion
// This property returns the main thread's id.
public static uint MainThreadId { get; private set; } // Stores the main thread's thread id.
// Used to tell if started by COM or manually
public static bool StartedByCOM { get; private set; } // True if server started by COM (-embedding)
public static bool StartedByCom { get; private set; } // True if server started by COM (-embedding)
#region Server Lock, Object Counting, and AutoQuit on COM startup
@@ -131,9 +128,9 @@ namespace ASCOM.Meade.net
{
get
{
lock (lockObject)
lock (LockObject)
{
return objsInUse;
return _objsInUse;
}
}
}
@@ -142,14 +139,14 @@ namespace ASCOM.Meade.net
public static int CountObject()
{
// 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.
public static int UncountObject()
{
// Decrement the global count of objects.
return Interlocked.Decrement(ref objsInUse);
return Interlocked.Decrement(ref _objsInUse);
}
// Returns the current server lock count.
@@ -157,9 +154,9 @@ namespace ASCOM.Meade.net
{
get
{
lock (lockObject)
lock (LockObject)
{
return serverLocks;
return _serverLocks;
}
}
}
@@ -169,7 +166,7 @@ namespace ASCOM.Meade.net
public static int CountLock()
{
// 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
@@ -177,7 +174,7 @@ namespace ASCOM.Meade.net
public static int UncountLock()
{
// 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
@@ -189,11 +186,11 @@ namespace ASCOM.Meade.net
//
public static void ExitIf()
{
lock (lockObject)
lock (LockObject)
{
if ((ObjectsCount <= 0) && (ServerLockCount <= 0))
{
if (StartedByCOM)
if (StartedByCom)
{
UIntPtr wParam = new UIntPtr(0);
IntPtr lParam = new IntPtr(0);
@@ -216,8 +213,8 @@ namespace ASCOM.Meade.net
//
private static bool LoadComObjectAssemblies()
{
s_ComObjectAssys = new ArrayList();
s_ComObjectTypes = new ArrayList();
_sComObjectAssys = new ArrayList();
_sComObjectTypes = new ArrayList();
// put everything into one folder, the same as the server.
string assyPath = Assembly.GetEntryAssembly().Location;
@@ -246,8 +243,8 @@ namespace ASCOM.Meade.net
if (attrbutes.Length > 0)
{
//MessageBox.Show("Adding Type: " + type.Name + " " + type.FullName);
s_ComObjectTypes.Add(type); //PWGS - much simpler
s_ComObjectAssys.Add(so);
_sComObjectTypes.Add(type); //PWGS - much simpler
_sComObjectAssys.Add(so);
}
}
}
@@ -342,10 +339,10 @@ namespace ASCOM.Meade.net
//
// 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("AppID", s_appId);
key.SetValue("AppID", _sAppId);
key.SetValue("AuthenticationLevel", 1, RegistryValueKind.DWord);
}
//
@@ -354,7 +351,7 @@ namespace ASCOM.Meade.net
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("APPID\\{0}",
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1))))
{
key.SetValue("AppID", s_appId);
key.SetValue("AppID", _sAppId);
}
}
catch (Exception ex)
@@ -370,7 +367,7 @@ namespace ASCOM.Meade.net
//
// For each of the driver assemblies
//
foreach (Type type in s_ComObjectTypes)
foreach (Type type in _sComObjectTypes)
{
bool bFail = false;
try
@@ -386,7 +383,7 @@ namespace ASCOM.Meade.net
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("CLSID\\{0}", clsid)))
{
key.SetValue(null, progid); // Could be assyTitle/Desc??, but .NET components show ProgId here
key.SetValue("AppId", s_appId);
key.SetValue("AppId", _sAppId);
using (RegistryKey key2 = key.CreateSubKey("Implemented Categories"))
{
key2.CreateSubKey("{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}");
@@ -420,10 +417,10 @@ namespace ASCOM.Meade.net
// Pull the display name from the ServedClassName attribute.
attr = Attribute.GetCustomAttribute(type, typeof(ServedClassNameAttribute)); //PWGS Changed to search type for attribute rather than assembly
string chooserName = ((ServedClassNameAttribute)attr).DisplayName ?? "MultiServer";
using (var P = new ASCOM.Utilities.Profile())
using (var p = new Profile())
{
P.DeviceType = deviceType;
P.Register(progid, chooserName);
p.DeviceType = deviceType;
p.Register(progid, chooserName);
}
}
catch (Exception ex)
@@ -456,14 +453,14 @@ namespace ASCOM.Meade.net
//
// 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}",
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)), false);
//
// 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 progid = Marshal.GenerateProgIdForType(type);
@@ -490,10 +487,10 @@ namespace ASCOM.Meade.net
//
// ASCOM
//
using (var P = new ASCOM.Utilities.Profile())
using (var p = new Profile())
{
P.DeviceType = deviceType;
P.Unregister(progid);
p.DeviceType = deviceType;
p.Unregister(progid);
}
}
catch (Exception) { }
@@ -509,11 +506,11 @@ namespace ASCOM.Meade.net
//
private static bool RegisterClassFactories()
{
s_ClassFactories = new ArrayList();
foreach (Type type in s_ComObjectTypes)
_sClassFactories = new ArrayList();
foreach (Type type in _sComObjectTypes)
{
ClassFactory factory = new ClassFactory(type); // Use default context & flags
s_ClassFactories.Add(factory);
_sClassFactories.Add(factory);
if (!factory.RegisterClassObject())
{
MessageBox.Show("Failed to register class factory for " + type.Name,
@@ -528,7 +525,7 @@ namespace ASCOM.Meade.net
private static void RevokeClassFactories()
{
ClassFactory.SuspendClassObjects(); // Prevent race conditions
foreach (ClassFactory factory in s_ClassFactories)
foreach (ClassFactory factory in _sClassFactories)
factory.RevokeClassObject();
}
#endregion
@@ -552,7 +549,7 @@ namespace ASCOM.Meade.net
switch (args[0].ToLower())
{
case "-embedding":
StartedByCOM = true; // Indicate COM started us
StartedByCom = true; // Indicate COM started us
break;
case "-register":
@@ -578,7 +575,7 @@ namespace ASCOM.Meade.net
}
}
else
StartedByCOM = false;
StartedByCom = false;
return bRet;
}
@@ -598,24 +595,24 @@ namespace ASCOM.Meade.net
if (!ProcessArguments(args)) return; // Register/Unregister
// Initialize critical member variables.
objsInUse = 0;
serverLocks = 0;
_objsInUse = 0;
_serverLocks = 0;
MainThreadId = GetCurrentThreadId();
Thread.CurrentThread.Name = "Main Thread";
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
s_MainForm = new frmMain();
if (StartedByCOM) s_MainForm.WindowState = FormWindowState.Minimized;
_sMainForm = new FrmMain();
if (StartedByCom) _sMainForm.WindowState = FormWindowState.Minimized;
// Register the class factories of the served objects
RegisterClassFactories();
// Start up the garbage collection thread.
GarbageCollection GarbageCollector = new GarbageCollection(1000);
Thread GCThread = new Thread(new ThreadStart(GarbageCollector.GCWatch));
GCThread.Name = "Garbage Collection Thread";
GCThread.Start();
GarbageCollection garbageCollector = new GarbageCollection(1000);
Thread gcThread = new Thread(new ThreadStart(garbageCollector.GcWatch));
gcThread.Name = "Garbage Collection Thread";
gcThread.Start();
//
// Start the message loop. This serializes incoming calls to our
@@ -623,7 +620,7 @@ namespace ASCOM.Meade.net
//
try
{
Application.Run(s_MainForm);
Application.Run(_sMainForm);
}
finally
{
@@ -633,8 +630,8 @@ namespace ASCOM.Meade.net
RevokeClassFactories();
// Now stop the Garbage Collector thread.
GarbageCollector.StopThread();
GarbageCollector.WaitForThreadToStop();
garbageCollector.StopThread();
garbageCollector.WaitForThreadToStop();
}
}
#endregion
+1 -1
View File
@@ -8,7 +8,7 @@ namespace ASCOM.Meade.net.Localization
internal class LocalisationHelper
{
private const string LocalizationNamespace = "LocalisationTest.Localization.Resources.Localization";
ResourceManager _resourceManager;
private readonly ResourceManager _resourceManager;
public LocalisationHelper()
{
+1
View File
@@ -133,6 +133,7 @@
<Compile Include="LocalServer.cs" />
<Compile Include="ProfileProperties.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TelescopeList.cs" />
<Compile Include="Wrapper\SharedResourcesWrapper.cs" />
<EmbeddedResource Include="frmMain.resx">
<SubType>Designer</SubType>
+2
View File
@@ -5,5 +5,7 @@ namespace ASCOM.Meade.net
// properies that are part of the profile
public string ComPort { 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.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
@@ -21,7 +20,7 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: ComVisibleAttribute(false)]
-1
View File
@@ -1,4 +1,3 @@
using System;
using System.Runtime.InteropServices;
namespace ASCOM.Meade.net
+54 -12
View File
@@ -1,16 +1,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using ASCOM.Utilities;
using ASCOM.Meade.net;
namespace ASCOM.Meade.net
{
[ComVisible(false)] // Form not registered for COM!
[ComVisible(false)] // Form not registered for COM!
public partial class SetupDialogForm : Form
{
public SetupDialogForm()
@@ -29,36 +24,49 @@ namespace ASCOM.Meade.net
{
System.Diagnostics.Process.Start("http://ascom-standards.org/");
}
catch (System.ComponentModel.Win32Exception noBrowser)
catch (Win32Exception noBrowser)
{
if (noBrowser.ErrorCode == -2147467259)
MessageBox.Show(noBrowser.Message);
}
catch (System.Exception other)
catch (Exception other)
{
MessageBox.Show(other.Message);
}
}
}
public void SetProfile(ProfileProperties profileProperties)
{
chkTrace.Checked = profileProperties.TraceLogger;
// set the list of com ports to those that are currently available
comboBoxComPort.Items.Clear();
comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); // use System.IO because it's static
comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort
.GetPortNames()); // use System.IO because it's static
// select the current port if possible
if (comboBoxComPort.Items.Contains(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()
{
var profileProperties = new ProfileProperties
{
TraceLogger = chkTrace.Checked,
ComPort = comboBoxComPort.SelectedItem.ToString()
ComPort = comboBoxComPort.SelectedItem.ToString(),
GuideRateArcSecondsPerSecond = double.Parse(txtGuideRate.Text.Trim()),
Precision = cboPrecision.SelectedItem.ToString()
};
return profileProperties;
@@ -68,5 +76,39 @@ namespace ASCOM.Meade.net
{
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.chkTrace = new System.Windows.Forms.CheckBox();
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();
this.SuspendLayout();
//
@@ -85,11 +91,55 @@ namespace ASCOM.Meade.net
this.comboBoxComPort.FormattingEnabled = true;
resources.ApplyResources(this.comboBoxComPort, "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
//
resources.ApplyResources(this, "$this");
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.chkTrace);
this.Controls.Add(this.label2);
@@ -118,5 +168,11 @@ namespace ASCOM.Meade.net
private System.Windows.Forms.Label label2;
private System.Windows.Forms.CheckBox chkTrace;
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>
<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">
<value>281, 112</value>
<value>281, 225</value>
</data>
<data name="cmdOK.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 24</value>
@@ -145,13 +145,13 @@
<value>$this</value>
</data>
<data name="&gt;&gt;cmdOK.ZOrder" xml:space="preserve">
<value>6</value>
<value>12</value>
</data>
<data name="cmdCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="cmdCancel.Location" type="System.Drawing.Point, System.Drawing">
<value>281, 142</value>
<value>281, 255</value>
</data>
<data name="cmdCancel.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 25</value>
@@ -172,7 +172,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;cmdCancel.ZOrder" xml:space="preserve">
<value>5</value>
<value>11</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 9</value>
@@ -196,7 +196,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>4</value>
<value>10</value>
</data>
<data name="picASCOM.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
@@ -223,7 +223,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;picASCOM.ZOrder" xml:space="preserve">
<value>3</value>
<value>9</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -250,13 +250,13 @@
<value>$this</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>2</value>
<value>8</value>
</data>
<data name="chkTrace.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="chkTrace.Location" type="System.Drawing.Point, System.Drawing">
<value>77, 118</value>
<value>77, 136</value>
</data>
<data name="chkTrace.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 17</value>
@@ -277,7 +277,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;chkTrace.ZOrder" xml:space="preserve">
<value>1</value>
<value>7</value>
</data>
<data name="comboBoxComPort.Location" type="System.Drawing.Point, System.Drawing">
<value>77, 87</value>
@@ -298,6 +298,168 @@
<value>$this</value>
</data>
<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>
</data>
<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>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>350, 175</value>
<value>350, 288</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
+67 -55
View File
@@ -15,8 +15,6 @@
//
using System;
using System.Collections.Generic;
using System.Text;
using ASCOM;
using ASCOM.Utilities;
namespace ASCOM.Meade.net
@@ -32,10 +30,10 @@ namespace ASCOM.Meade.net
public static class SharedResources
{
// object used for locking to prevent multiple drivers accessing common code at the same time
private static readonly object lockObject = new object();
private static readonly object LockObject = new object();
// Shared serial port. This will allow multiple drivers to use one single serial port.
private static ASCOM.Utilities.Serial s_sharedSerial; // Shared serial port
private static Serial _sSharedSerial; // Shared serial port
//
// Public access to shared resources
@@ -60,7 +58,7 @@ namespace ASCOM.Meade.net
/// <summary>
/// Shared serial port
/// </summary>
public static ASCOM.Utilities.Serial SharedSerial => s_sharedSerial ?? (s_sharedSerial = new ASCOM.Utilities.Serial());
public static Serial SharedSerial => _sSharedSerial ?? (_sSharedSerial = new Serial());
/// <summary>
/// number of connections to the shared serial port
@@ -69,7 +67,7 @@ namespace ASCOM.Meade.net
public static void SendBlind(string message)
{
lock (lockObject)
lock (LockObject)
{
SharedSerial.ClearBuffers();
SharedSerial.Transmit(message);
@@ -92,7 +90,7 @@ namespace ASCOM.Meade.net
/// <returns></returns>
public static string SendString(string message)
{
lock (lockObject)
lock (LockObject)
{
SharedSerial.ClearBuffers();
SharedSerial.Transmit(message);
@@ -102,7 +100,7 @@ namespace ASCOM.Meade.net
public static string SendChar(string message)
{
lock (lockObject)
lock (LockObject)
{
SharedSerial.ClearBuffers();
SharedSerial.Transmit(message);
@@ -112,12 +110,20 @@ namespace ASCOM.Meade.net
public static string ReadTerminated()
{
lock (lockObject)
lock (LockObject)
{
return SharedSerial.ReceiveTerminated("#");
}
}
public static string ReadCharacters(int throwAwayCharacters)
{
lock (LockObject)
{
return SharedSerial.ReceiveCounted(throwAwayCharacters);
}
}
/// <summary>
/// Example of handling connecting to and disconnection from the
/// shared serial port.
@@ -130,7 +136,7 @@ namespace ASCOM.Meade.net
{
set
{
lock (lockObject)
lock (LockObject)
{
if (value)
{
@@ -148,47 +154,53 @@ namespace ASCOM.Meade.net
}
}
}
get { return SharedSerial.Connected; }
get => SharedSerial.Connected;
}
#endregion
#region Profile
internal static string driverID = "ASCOM.MeadeGeneric.Telescope";
private const string DriverId = "ASCOM.MeadeGeneric.Telescope";
// Constants used for Profile persistence
internal static string comPortProfileName = "COM Port";
internal static string traceStateProfileName = "Trace Level";
private const string ComPortProfileName = "COM Port";
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)
{
lock (lockObject)
lock (LockObject)
{
using (Profile driverProfile = new Profile())
{
driverProfile.DeviceType = "Telescope";
driverProfile.WriteValue(driverID, traceStateProfileName, profileProperties.TraceLogger.ToString());
driverProfile.WriteValue(driverID, comPortProfileName, profileProperties.ComPort);
driverProfile.WriteValue(DriverId, TraceStateProfileName, profileProperties.TraceLogger.ToString());
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";
internal static string traceStateDefault = "false";
private const string ComPortDefault = "COM1";
private const string TraceStateDefault = "false";
private const string GuideRateProfileNameDefault = "10.077939"; //67% of sidereal rate
private const string PrecisionDefault = "Unchanged";
public static ProfileProperties ReadProfile()
{
lock (lockObject)
lock (LockObject)
{
ProfileProperties profileProperties = new ProfileProperties();
using (Profile driverProfile = new Profile())
{
driverProfile.DeviceType = "Telescope";
profileProperties.ComPort =
driverProfile.GetValue(driverID, comPortProfileName, string.Empty, comPortDefault);
profileProperties.TraceLogger = Convert.ToBoolean(driverProfile.GetValue(driverID,
traceStateProfileName, string.Empty, traceStateDefault));
profileProperties.ComPort = driverProfile.GetValue(DriverId, ComPortProfileName, string.Empty, ComPortDefault);
profileProperties.TraceLogger = Convert.ToBoolean(driverProfile.GetValue(DriverId, TraceStateProfileName, string.Empty, TraceStateDefault));
profileProperties.GuideRateArcSecondsPerSecond = double.Parse(driverProfile.GetValue(DriverId, GuideRateProfileName, string.Empty, GuideRateProfileNameDefault));
profileProperties.Precision = driverProfile.GetValue(DriverId, PrecisionProfileName, string.Empty, PrecisionDefault);
}
return profileProperties;
@@ -211,14 +223,14 @@ namespace ASCOM.Meade.net
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)
{
profileProperties = F.GetProfile();
profileProperties = f.GetProfile();
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,
/// USB ID or IP Address, the Value is the DeviceHardware class
/// </summary>
private static Dictionary<string, DeviceHardware> connectedDevices = new Dictionary<string, DeviceHardware>();
private static readonly Dictionary<string, DeviceHardware> _connectedDevices = new Dictionary<string, DeviceHardware>();
/// <summary>
/// This is called in the driver Connect(true) property,
@@ -255,26 +267,26 @@ namespace ASCOM.Meade.net
/// <param name="deviceId"></param>
public static void Connect(string deviceId)
{
lock (lockObject)
lock (LockObject)
{
if (!connectedDevices.ContainsKey(deviceId))
connectedDevices.Add(deviceId, new DeviceHardware());
connectedDevices[deviceId].count++; // increment the value
if (!_connectedDevices.ContainsKey(deviceId))
_connectedDevices.Add(deviceId, new DeviceHardware());
_connectedDevices[deviceId].Count++; // increment the value
if (deviceId == "Serial")
{
if (connectedDevices[deviceId].count == 1)
if (_connectedDevices[deviceId].Count == 1)
{
var profileProperties = ReadProfile();
SharedResources.SharedSerial.PortName = profileProperties.ComPort;
SharedResources.SharedSerial.DTREnable = false;
SharedResources.SharedSerial.RTSEnable = false;
SharedResources.SharedSerial.DataBits = 8;
SharedResources.SharedSerial.StopBits = SerialStopBits.One;
SharedResources.SharedSerial.Parity = SerialParity.None;
SharedResources.SharedSerial.Speed = SerialSpeed.ps9600;
SharedResources.SharedSerial.Handshake = SerialHandshake.None;
SharedResources.SharedSerial.Connected = true;
SharedSerial.PortName = profileProperties.ComPort;
SharedSerial.DTREnable = false;
SharedSerial.RTSEnable = false;
SharedSerial.DataBits = 8;
SharedSerial.StopBits = SerialStopBits.One;
SharedSerial.Parity = SerialParity.None;
SharedSerial.Speed = SerialSpeed.ps9600;
SharedSerial.Handshake = SerialHandshake.None;
SharedSerial.Connected = true;
ProductName = SendString(":GVP#");
FirmwareVersion = SendString(":GVN#");
@@ -285,17 +297,17 @@ namespace ASCOM.Meade.net
public static void Disconnect(string deviceId)
{
lock (lockObject)
lock (LockObject)
{
if (connectedDevices.ContainsKey(deviceId))
if (_connectedDevices.ContainsKey(deviceId))
{
connectedDevices[deviceId].count--;
if (connectedDevices[deviceId].count <= 0)
_connectedDevices[deviceId].Count--;
if (_connectedDevices[deviceId].Count <= 0)
{
connectedDevices.Remove(deviceId);
_connectedDevices.Remove(deviceId);
if (deviceId == "Serial")
{
SharedResources.SharedSerial.Connected = false;
SharedSerial.Connected = false;
}
}
}
@@ -304,8 +316,8 @@ namespace ASCOM.Meade.net
public static bool IsConnected(string deviceId)
{
if (connectedDevices.ContainsKey(deviceId))
return (connectedDevices[deviceId].count > 0);
if (_connectedDevices.ContainsKey(deviceId))
return (_connectedDevices[deviceId].Count > 0);
else
return false;
}
@@ -314,7 +326,7 @@ namespace ASCOM.Meade.net
public static void Lock(Action action)
{
lock (lockObject)
lock (LockObject)
{
action();
}
@@ -322,7 +334,7 @@ namespace ASCOM.Meade.net
public static T Lock<T>(Func<T> func)
{
lock (lockObject)
lock (LockObject)
{
return func();
}
@@ -336,7 +348,7 @@ namespace ASCOM.Meade.net
{
private int _count;
internal int count
internal int Count
{
set => _count = value;
get => _count;
@@ -344,7 +356,7 @@ namespace ASCOM.Meade.net
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.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASCOM.Meade.net.Wrapper
{
public interface ISharedResourcesWrapper
{
string AUTOSTAR497 { get; }
string AUTOSTAR497_31EE { get; }
string AUTOSTAR497_43EG { get;}
void Connect(string deviceId);
void Disconnect(string deviceId);
@@ -31,19 +23,12 @@ namespace ASCOM.Meade.net.Wrapper
ProfileProperties ReadProfile();
void SetupDialog();
void WriteProfile(ProfileProperties profileProperties);
string ReadCharacters(int throwAwayCharacters);
}
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)
{
SharedResources.Connect( deviceId);
@@ -88,6 +73,11 @@ namespace ASCOM.Meade.net.Wrapper
return SharedResources.ReadTerminated();
}
public string ReadCharacters(int throwAwayCharacters)
{
return SharedResources.ReadCharacters(throwAwayCharacters);
}
public ProfileProperties ReadProfile()
{
return SharedResources.ReadProfile();
@@ -97,5 +87,10 @@ namespace ASCOM.Meade.net.Wrapper
{
SharedResources.SetupDialog();
}
public void WriteProfile(ProfileProperties profileProperties)
{
SharedResources.WriteProfile(profileProperties);
}
}
}
+2 -2
View File
@@ -2,7 +2,7 @@ using System;
namespace ASCOM.Meade.net
{
partial class frmMain
partial class FrmMain
{
/// <summary>
/// Required designer variable.
@@ -48,7 +48,7 @@ namespace ASCOM.Meade.net
this.ClientSize = new System.Drawing.Size(233, 52);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "frmMain";
this.Name = "FrmMain";
this.Text = "Meade.net Driver Server";
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;
namespace ASCOM.Meade.net
{
public partial class frmMain : Form
public partial class FrmMain : Form
{
delegate void SetTextCallback(string text);
public frmMain()
public FrmMain()
{
InitializeComponent();
}
+3 -6
View File
@@ -9,11 +9,8 @@
#define UseChooser
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASCOM
namespace ASCOM.Meade.net
{
class Program
{
@@ -22,11 +19,11 @@ namespace ASCOM
// Uncomment the code that's required
#if UseChooser
// choose the device
string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.MeadeGeneric.Telescope");
string id = DriverAccess.Telescope.Choose("ASCOM.MeadeGeneric.Telescope");
if (string.IsNullOrEmpty(id))
return;
// create this device
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope(id);
DriverAccess.Telescope device = new DriverAccess.Telescope(id);
#else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly.
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.Meade.net.Telescope");
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 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
// by using the '*' as shown below:
[assembly: AssemblyVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("0.0.0.0")]
@@ -16,7 +16,7 @@
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
+6
View File
@@ -32,5 +32,11 @@
<include name="**/*" />
</fileset>
</copy>
<foreach item="File" in="${build.output.directory}" property="fileName">
<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')}" />
</if>
</foreach>
</target>
</project>