diff --git a/AstroMath.UnitTests/AstroMathsUnitTests.cs b/AstroMath.UnitTests/AstroMathsUnitTests.cs index c6c0082..489c873 100644 --- a/AstroMath.UnitTests/AstroMathsUnitTests.cs +++ b/AstroMath.UnitTests/AstroMathsUnitTests.cs @@ -113,11 +113,13 @@ namespace AstroMath.UnitTests { var latitude = 52.0; - EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates(); - equatorialCoordinates.RightAscension = 5.862222222222222;//5 51' 44" - equatorialCoordinates.Declination = 23.21944444444444;//23 13' 10" + var equatorialCoordinates = new EquatorialCoordinates + { + RightAscension = 5.862222222222222, //5 51' 44" + Declination = 23.21944444444444 //23 13' 10" + }; - var hourAngle = 5.682222; + const double hourAngle = 5.682222; var altAz = _astroMath.ConvertEqToHoz(hourAngle, latitude, equatorialCoordinates); @@ -131,9 +133,11 @@ namespace AstroMath.UnitTests DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc); var longitude = -1.7833333333333332; var latitude = 52.0; - EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates(); - equatorialCoordinates.RightAscension = 4.15361111111111; - equatorialCoordinates.Declination = 30.0019444444444; + EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates + { + RightAscension = 4.15361111111111, + Declination = 30.0019444444444 + }; var hourAngle = _astroMath.RightAscensionToHourAngle(dateTime, longitude, equatorialCoordinates.RightAscension); var altaz = _astroMath.ConvertEqToHoz(hourAngle, latitude, equatorialCoordinates); diff --git a/Meade.net.Focuser.UnitTests/FocuserUnitTests.cs b/Meade.net.Focuser.UnitTests/FocuserUnitTests.cs index 9dfd50b..1c9d18c 100644 --- a/Meade.net.Focuser.UnitTests/FocuserUnitTests.cs +++ b/Meade.net.Focuser.UnitTests/FocuserUnitTests.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using ASCOM; using ASCOM.DeviceInterface; using ASCOM.Meade.net; @@ -6,7 +7,6 @@ using ASCOM.Meade.net.Wrapper; using ASCOM.Utilities.Interfaces; using Moq; using NUnit.Framework; -using NotImplementedException = System.NotImplementedException; namespace Meade.net.Focuser.UnitTests { @@ -23,11 +23,13 @@ namespace Meade.net.Focuser.UnitTests [SetUp] public void Setup() { - _profileProperties = new ProfileProperties(); - _profileProperties.TraceLogger = false; - _profileProperties.ComPort = "TestCom1"; - _profileProperties.GuideRateArcSecondsPerSecond = 1.23; - _profileProperties.Precision = "Unchanged"; + _profileProperties = new ProfileProperties + { + TraceLogger = false, + ComPort = "TestCom1", + GuideRateArcSecondsPerSecond = 1.23, + Precision = "Unchanged" + }; _utilMock = new Mock(); @@ -84,7 +86,11 @@ namespace Meade.net.Focuser.UnitTests { var actionName = "Action"; - var exception = Assert.Throws(() => { var actualResult = _focuser.Action(actionName, string.Empty); }); + Assert.Throws(() => + { + var actualResult = _focuser.Action(actionName, string.Empty); + Assert.Fail($"{actualResult} should not have a value"); + }); } [Test] @@ -234,7 +240,7 @@ namespace Meade.net.Focuser.UnitTests [Test] public void DriverVersion_Get() { - Version version = System.Reflection.Assembly.GetAssembly(typeof(ASCOM.Meade.net.Focuser)).GetName().Version; + Version version = Assembly.GetAssembly(typeof(ASCOM.Meade.net.Focuser)).GetName().Version; string exptectedDriverInfo = $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; @@ -246,8 +252,6 @@ namespace Meade.net.Focuser.UnitTests [Test] public void DriverInfo_Get() { - Version version = System.Reflection.Assembly.GetAssembly(typeof(ASCOM.Meade.net.Focuser)).GetName().Version; - string exptectedDriverInfo = $"{_focuser.Description} .net driver. Version: {_focuser.DriverVersion}"; var driverInfo = _focuser.DriverInfo; @@ -277,7 +281,11 @@ namespace Meade.net.Focuser.UnitTests [Test] public void Absolute_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _focuser.Absolute; }); + var exception = Assert.Throws(() => + { + var result = _focuser.Absolute; + Assert.Fail($"{result} should not have a value"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to focuser when trying to execute: Absolute Get")); } @@ -413,14 +421,22 @@ namespace Meade.net.Focuser.UnitTests [Test] public void Position_WhenCalled_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _focuser.Position; }); + var exception = Assert.Throws(() => + { + var result = _focuser.Position; + Assert.Fail($"{result} should not have a value"); + }); Assert.That(exception.Message, Is.EqualTo("Property read Position is not implemented in this driver.")); } [Test] public void StepSize_WhenCalled_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _focuser.StepSize; }); + var exception = Assert.Throws(() => + { + var result = _focuser.StepSize; + Assert.Fail($"{result} should not have a value"); + }); Assert.That(exception.Message, Is.EqualTo("Property read StepSize is not implemented in this driver.")); } @@ -448,7 +464,11 @@ namespace Meade.net.Focuser.UnitTests [Test] public void Temperature_WhenCalled_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _focuser.Temperature; }); + var exception = Assert.Throws(() => + { + var result = _focuser.Temperature; + Assert.Fail($"{result} should not have a value"); + }); Assert.That(exception.Message, Is.EqualTo("Property read Temperature is not implemented in this driver.")); } } diff --git a/Meade.net.Focuser.UnitTests/Properties/AssemblyInfo.cs b/Meade.net.Focuser.UnitTests/Properties/AssemblyInfo.cs index 61a9edd..0ed52fa 100644 --- a/Meade.net.Focuser.UnitTests/Properties/AssemblyInfo.cs +++ b/Meade.net.Focuser.UnitTests/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 diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index 3fb595c..0d6264b 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using ASCOM; using ASCOM.Astrometry.AstroUtils; using ASCOM.DeviceInterface; @@ -28,11 +29,13 @@ namespace Meade.net.Telescope.UnitTests [SetUp] public void Setup() { - _profileProperties = new ProfileProperties(); - _profileProperties.TraceLogger = false; - _profileProperties.ComPort = "TestCom1"; - _profileProperties.GuideRateArcSecondsPerSecond = 1.23; - _profileProperties.Precision = "Unchanged"; + _profileProperties = new ProfileProperties + { + TraceLogger = false, + ComPort = "TestCom1", + GuideRateArcSecondsPerSecond = 1.23, + Precision = "Unchanged" + }; _utilMock = new Mock(); _utilExtraMock = new Mock(); @@ -43,8 +46,8 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Setup(x => x.ReadProfile()).Returns(() =>_profileProperties); _sharedResourcesWrapperMock.Setup(x => x.Lock(It.IsAny())).Callback(action => { action(); }); - _sharedResourcesWrapperMock.Setup(x => x.Lock(It.IsAny>())).Returns>( (func) => func()); - _sharedResourcesWrapperMock.Setup(x => x.Lock(It.IsAny>())).Returns>((func) => func()); + _sharedResourcesWrapperMock.Setup(x => x.Lock(It.IsAny>())).Returns>( func => func()); + _sharedResourcesWrapperMock.Setup(x => x.Lock(It.IsAny>())).Returns>(func => func()); _connectionInfo = new ConnectionInfo {Connections = 1, SameDevice = 1}; @@ -103,7 +106,10 @@ namespace Meade.net.Telescope.UnitTests [Test] public void Action_WhenNotConnected_ThrowsNotConnectedException() { - var exception = Assert.Throws(() => { var actualResult = _telescope.Action(string.Empty, string.Empty); }); + var exception = Assert.Throws(() => + { + _telescope.Action(string.Empty, string.Empty); + }); Assert.That(exception.Message,Is.EqualTo("Not connected to telescope when trying to execute: Action")); } @@ -238,7 +244,7 @@ namespace Meade.net.Telescope.UnitTests { ConnectTelescope(); - string parameters = $"unknown"; + string parameters = "unknown"; var exception = Assert.Throws(() => { _telescope.Action("site", parameters); }); Assert.That(exception.Message, Is.EqualTo($"Site parameters {parameters} not known")); @@ -343,12 +349,18 @@ namespace Meade.net.Telescope.UnitTests _telescope.Connected = expectedConnected; Assert.That(_telescope.Connected, Is.EqualTo(expectedConnected)); - } + if (expectedConnected) + { + _sharedResourcesWrapperMock.Verify(x => x.SendString(":GZ#"), Times.Once); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind($":Rg{_profileProperties.GuideRateArcSecondsPerSecond:00.0}#"), Times.Never); + } + } + [Test] - public void Connected_Set_WhenConnecting_Then_ConnectsToSerialDevice() + public void Connected_Set_WhenConnectingLX200GPS_Then_ConnectsToSerialDevice() { - var productName = "LX2001"; + var productName = TelescopeList.LX200GPS; var firmware = string.Empty; _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(productName); @@ -361,6 +373,21 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Verify(x => x.SendBlind($":Rg{_profileProperties.GuideRateArcSecondsPerSecond:00.0}#"),Times.Once); } + [Test] + public void Connected_Set_WhenConnectingToLX200EMC_Then_ConnectsToSerialDevice() + { + var productName = TelescopeList.LX200CLASSIC; + var firmware = string.Empty; + + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(productName); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(firmware); + _telescope.Connected = true; + + _sharedResourcesWrapperMock.Verify(x => x.Connect("Serial", It.IsAny()), Times.Once); + _sharedResourcesWrapperMock.Verify(x => x.SendString(":GZ#"), Times.Never); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind($":Rg{_profileProperties.GuideRateArcSecondsPerSecond:00.0}#"), Times.Never); + } + [Test] public void Connected_Set_SettingTrueWhenTrue_ThenDoesNothing() @@ -408,6 +435,7 @@ namespace Meade.net.Telescope.UnitTests [TestCase("Autostar", "43Eg", true)] [TestCase("Autostar II", "", false)] [TestCase("LX2001", "", true)] + [TestCase(":GVP", "", false)] //LX200 Classic public void IsNewPulseGuidingSupported_ThenIsSupported_ThenReturnsTrue(string productName, string firmware, bool isSupported) { _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(productName); @@ -509,7 +537,7 @@ namespace Meade.net.Telescope.UnitTests [Test] public void DriverVersion_Get() { - Version version = System.Reflection.Assembly.GetAssembly(typeof(ASCOM.Meade.net.Telescope)).GetName().Version; + Version version = Assembly.GetAssembly(typeof(ASCOM.Meade.net.Telescope)).GetName().Version; string exptectedDriverInfo = $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; @@ -521,8 +549,6 @@ namespace Meade.net.Telescope.UnitTests [Test] public void DriverInfo_Get() { - Version version = System.Reflection.Assembly.GetAssembly(typeof(ASCOM.Meade.net.Telescope)).GetName().Version; - string exptectedDriverInfo = $"{_telescope.Description} .net driver. Version: {_telescope.DriverVersion}"; var driverInfo = _telescope.DriverInfo; @@ -552,7 +578,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void AlignmentMode_Get_WhenNotConnected_ThrowsException() { - var exception = Assert.Throws(() => { var actualResult = _telescope.AlignmentMode; }); + var exception = Assert.Throws(() => + { + var actualResult = _telescope.AlignmentMode; + Assert.Fail($"{actualResult} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: AlignmentMode Get")); } @@ -577,7 +607,11 @@ namespace Meade.net.Telescope.UnitTests { ConnectTelescope(); - Assert.Throws(() => { var actualResult = _telescope.AlignmentMode; }); + Assert.Throws(() => + { + var actualResult = _telescope.AlignmentMode; + Assert.Fail($"{actualResult} should not have returned"); + }); } [Test] @@ -617,7 +651,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void ApertureArea_Get_ThrowsNotImplementedException() { - var excpetion = Assert.Throws(() => { var result = _telescope.ApertureArea; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.ApertureArea; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("ApertureArea")); Assert.That(excpetion.AccessorSet, Is.False); @@ -626,7 +664,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void ApertureDiameter_Get_ThrowsNotImplementedException() { - var excpetion = Assert.Throws(() => { var result = _telescope.ApertureDiameter; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.ApertureDiameter; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("ApertureDiameter")); Assert.That(excpetion.AccessorSet, Is.False); @@ -714,7 +756,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void CanSetGuideRates_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.CanSetGuideRates; }); + var exception = Assert.Throws(() => + { + var result = _telescope.CanSetGuideRates; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: CanSetGuideRates Get")); } @@ -883,7 +929,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void Declination_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var actualResult = _telescope.Declination; }); + var exception = Assert.Throws(() => + { + var actualResult = _telescope.Declination; + Assert.Fail($"{actualResult} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: Declination Get")); } @@ -921,7 +971,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void DestinationSideOfPier_ThenThrowsException() { - var excpetion = Assert.Throws(() => { var result = _telescope.DestinationSideOfPier(0,0); }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.DestinationSideOfPier(0,0); + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Method, Is.EqualTo("DestinationSideOfPier")); } @@ -929,7 +983,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void DoesRefraction_Get_ThenThrowsException() { - var excpetion = Assert.Throws(() => { var result = _telescope.DoesRefraction; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.DoesRefraction; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("DoesRefraction")); Assert.That(excpetion.AccessorSet, Is.False); @@ -963,7 +1021,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void FocalLength_Get_ThenThrowsException() { - var excpetion = Assert.Throws(() => { var result = _telescope.FocalLength; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.FocalLength; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("FocalLength")); Assert.That(excpetion.AccessorSet, Is.False); @@ -1144,7 +1206,7 @@ namespace Meade.net.Telescope.UnitTests var exception = Assert.Throws(() => { _telescope.MoveAxis(TelescopeAxes.axisTertiary, testRate); }); - Assert.That(exception.Message, Is.EqualTo($"Can not move this axis.")); + Assert.That(exception.Message, Is.EqualTo("Can not move this axis.")); } [Test] @@ -1300,7 +1362,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void RightAscension_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.RightAscension; }); + var exception = Assert.Throws(() => + { + var result = _telescope.RightAscension; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: RightAscension Get")); } @@ -1351,7 +1417,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void SideOfPier_Get_ThenThrowsException() { - var excpetion = Assert.Throws(() => { var result = _telescope.SideOfPier; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.SideOfPier; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("SideOfPier")); Assert.That(excpetion.AccessorSet, Is.False); @@ -1369,7 +1439,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void SiteElevation_Get_ThenThrowsException() { - var excpetion = Assert.Throws(() => { var result = _telescope.SiteElevation; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.SiteElevation; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("SiteElevation")); Assert.That(excpetion.AccessorSet, Is.False); @@ -1387,7 +1461,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void SlewSettleTime_Get_ThenThrowsException() { - var excpetion = Assert.Throws(() => { var result = _telescope.SlewSettleTime; }); + var excpetion = Assert.Throws(() => + { + var result = _telescope.SlewSettleTime; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(excpetion.Property, Is.EqualTo("SlewSettleTime")); Assert.That(excpetion.AccessorSet, Is.False); @@ -1413,7 +1491,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void SiteLatitude_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.SiteLatitude; }); + var exception = Assert.Throws(() => + { + var result = _telescope.SiteLatitude; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: SiteLatitude Get")); } @@ -1488,7 +1570,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void SiteLongitude_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.SiteLongitude; }); + var exception = Assert.Throws(() => + { + var result = _telescope.SiteLongitude; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: SiteLongitude Get")); } @@ -1659,7 +1745,11 @@ namespace Meade.net.Telescope.UnitTests { ConnectTelescope(); - var exception = Assert.Throws(() => { var result = _telescope.TargetDeclination; }); + var exception = Assert.Throws(() => + { + var result = _telescope.TargetDeclination; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Target not set")); } @@ -1733,7 +1823,11 @@ namespace Meade.net.Telescope.UnitTests { ConnectTelescope(); - var exception = Assert.Throws(() => { var result = _telescope.TargetRightAscension; }); + var exception = Assert.Throws(() => + { + var result = _telescope.TargetRightAscension; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Target not set")); } @@ -1830,7 +1924,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void UTCDate_Get_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.UTCDate; }); + var exception = Assert.Throws(() => + { + var result = _telescope.UTCDate; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: UTCDate Get")); } @@ -2115,8 +2213,7 @@ namespace Meade.net.Telescope.UnitTests slewCounter++; if (slewCounter <= iterations) return "|"; - else - return ""; + return ""; }); _telescope.SlewToTarget(); @@ -2184,8 +2281,7 @@ namespace Meade.net.Telescope.UnitTests slewCounter++; if (slewCounter <= iterations) return "|"; - else - return ""; + return ""; }); _telescope.SlewToCoordinates(rightAscension, declination); @@ -2255,7 +2351,7 @@ namespace Meade.net.Telescope.UnitTests _astroMathsMock .Setup(x => x.ConvertHozToEq(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny())).Returns(new EquatorialCoordinates(){ Declination = declination, RightAscension = rightAscension }); + It.IsAny())).Returns(new EquatorialCoordinates { Declination = declination, RightAscension = rightAscension }); _sharedResourcesWrapperMock.Setup(x => x.SendChar(":MS#")).Returns("0"); @@ -2289,7 +2385,7 @@ namespace Meade.net.Telescope.UnitTests _astroMathsMock .Setup(x => x.ConvertHozToEq(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny())).Returns(new EquatorialCoordinates() { Declination = declination, RightAscension = rightAscension }); + It.IsAny())).Returns(new EquatorialCoordinates { Declination = declination, RightAscension = rightAscension }); _sharedResourcesWrapperMock.Setup(x => x.SendChar(":MS#")).Returns("0"); @@ -2300,8 +2396,7 @@ namespace Meade.net.Telescope.UnitTests slewCounter++; if (slewCounter <= iterations) return "|"; - else - return ""; + return ""; }); _telescope.SlewToAltAz( azimuth, altitude); @@ -2315,7 +2410,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void Azimuth_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.Azimuth; }); + var exception = Assert.Throws(() => + { + var result = _telescope.Azimuth; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: Azimuth Get")); } @@ -2356,7 +2455,11 @@ namespace Meade.net.Telescope.UnitTests [Test] public void Altitude_WhenNotConnected_ThenThrowsException() { - var exception = Assert.Throws(() => { var result = _telescope.Altitude; }); + var exception = Assert.Throws(() => + { + var result = _telescope.Altitude; + Assert.Fail($"{result} should not have returned"); + }); Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: Altitude Get")); } @@ -2416,5 +2519,4 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Verify( x => x.SendString(":D#"), Times.Once); } } -} -; \ No newline at end of file +} \ No newline at end of file diff --git a/Meade.net.Telescope/AstroMaths/AstroMaths.cs b/Meade.net.Telescope/AstroMaths/AstroMaths.cs index 17e168b..9ae12d9 100644 --- a/Meade.net.Telescope/AstroMaths/AstroMaths.cs +++ b/Meade.net.Telescope/AstroMaths/AstroMaths.cs @@ -9,7 +9,7 @@ namespace ASCOM.Meade.net.AstroMaths //returns the decimal hour angle for given right ascension on a given datetime for a given logitude. public double RightAscensionToHourAngle(DateTime utcDateTime, double longitude, double rightAscension) { - var ut = DateTimeToDecimalHours( utcDateTime); + //var ut = DateTimeToDecimalHours( utcDateTime); var gst = UTtoGst( utcDateTime); var lst = GsTtoLst( gst, longitude); var raHours = rightAscension; @@ -82,10 +82,11 @@ namespace ASCOM.Meade.net.AstroMaths var upperA = Math.Atan2(y, x); var upperB = RadiansToDegrees(upperA); - var horizonCoordinates = new HorizonCoordinates(); - horizonCoordinates.Altitude = RadiansToDegrees(Math.Asin(sinA)); + var horizonCoordinates = new HorizonCoordinates + { + Altitude = RadiansToDegrees(Math.Asin(sinA)), Azimuth = upperB + }; - horizonCoordinates.Azimuth = upperB; if (upperB < 0) { @@ -106,7 +107,7 @@ namespace ASCOM.Meade.net.AstroMaths public double RadiansToDegrees(double radians) { double degrees = (180 / Math.PI) * radians; - return (degrees); + return degrees; } //todo convert to extension method diff --git a/Meade.net.Telescope/Meade.net.Telescope.csproj b/Meade.net.Telescope/Meade.net.Telescope.csproj index 37a57ba..4d1c796 100644 --- a/Meade.net.Telescope/Meade.net.Telescope.csproj +++ b/Meade.net.Telescope/Meade.net.Telescope.csproj @@ -152,7 +152,6 @@ Settings.Designer.cs - diff --git a/Meade.net.Telescope/Properties/Resources.Designer.cs b/Meade.net.Telescope/Properties/Resources.Designer.cs index 7df2b0c..4038f60 100644 --- a/Meade.net.Telescope/Properties/Resources.Designer.cs +++ b/Meade.net.Telescope/Properties/Resources.Designer.cs @@ -8,10 +8,16 @@ // //------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + namespace ASCOM.Meade.net.Properties { - using System; - - /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,27 +25,27 @@ namespace ASCOM.Meade.net.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [DebuggerNonUserCode()] + [CompilerGenerated()] internal class Resources { - private static global::System.Resources.ResourceManager resourceMan; + private static ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly); + if (ReferenceEquals(resourceMan, null)) { + ResourceManager temp = new ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -50,8 +56,8 @@ namespace ASCOM.Meade.net.Properties { /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture { get { return resourceCulture; } @@ -63,20 +69,47 @@ namespace ASCOM.Meade.net.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ASCOM { + internal static Bitmap ASCOM { get { object obj = ResourceManager.GetObject("ASCOM", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DefaultIcon { + internal static Icon DefaultIcon { get { object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture); - return ((System.Drawing.Icon)(obj)); + return ((Icon)(obj)); + } + } + + /// + /// Looks up a localized string similar to Site out of range. + /// + internal static string Telescope_GetSiteName_Site_out_of_range { + get { + return ResourceManager.GetString("Telescope_GetSiteName_Site_out_of_range", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Site cannot be higher than 4. + /// + internal static string Telescope_SelectSite_Site_cannot_be_higher_than_4 { + get { + return ResourceManager.GetString("Telescope_SelectSite_Site_cannot_be_higher_than_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Site cannot be lower than 1. + /// + internal static string Telescope_SelectSite_Site_cannot_be_lower_than_1 { + get { + return ResourceManager.GetString("Telescope_SelectSite_Site_cannot_be_lower_than_1", resourceCulture); } } } diff --git a/Meade.net.Telescope/Properties/Resources.resx b/Meade.net.Telescope/Properties/Resources.resx index e522d9e..7c00377 100644 --- a/Meade.net.Telescope/Properties/Resources.resx +++ b/Meade.net.Telescope/Properties/Resources.resx @@ -124,4 +124,13 @@ ..\ASCOM.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Site cannot be lower than 1 + + + Site cannot be higher than 4 + + + Site out of range + \ No newline at end of file diff --git a/Meade.net.Telescope/Properties/Settings.Designer.cs b/Meade.net.Telescope/Properties/Settings.Designer.cs index 67ea42d..81d4ba1 100644 --- a/Meade.net.Telescope/Properties/Settings.Designer.cs +++ b/Meade.net.Telescope/Properties/Settings.Designer.cs @@ -8,14 +8,18 @@ // //------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.Configuration; +using System.Runtime.CompilerServices; + namespace ASCOM.Meade.net.Properties { - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + [CompilerGenerated()] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] + internal sealed partial class Settings : ApplicationSettingsBase { - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + private static Settings defaultInstance = ((Settings)(Synchronized(new Settings()))); public static Settings Default { get { diff --git a/Meade.net.Telescope/Rates.cs b/Meade.net.Telescope/Rates.cs index b3f6f22..432c85a 100644 --- a/Meade.net.Telescope/Rates.cs +++ b/Meade.net.Telescope/Rates.cs @@ -1,7 +1,7 @@ -using System.Runtime.InteropServices; -using ASCOM.DeviceInterface; -using System.Collections; +using System.Collections; +using System.Runtime.InteropServices; using System.Threading; +using ASCOM.DeviceInterface; namespace ASCOM.Meade.net { @@ -19,17 +19,14 @@ namespace ASCOM.Meade.net [ComVisible(true)] public class Rate : IRate { - private double _maximum = 0; - private double _minimum = 0; - // // Default constructor - Internal prevents public creation // of instances. These are values for AxisRates. // internal Rate(double minimum, double maximum) { - _maximum = maximum; - _minimum = minimum; + Maximum = maximum; + Minimum = minimum; } #region Implementation of IRate @@ -39,17 +36,9 @@ namespace ASCOM.Meade.net // TODO Add any required object cleanup here } - public double Maximum - { - get => _maximum; - set => _maximum = value; - } + public double Maximum { get; set; } - public double Minimum - { - get => _minimum; - set => _minimum = value; - } + public double Minimum { get; set; } #endregion } @@ -96,12 +85,12 @@ 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]; - _rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) }; + _rates = new[] { 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]; - _rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) }; + _rates = new[] { 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 @@ -152,7 +141,7 @@ namespace ASCOM.Meade.net private readonly DriveRates[] _trackingRates; // this is used to make the index thread safe - private readonly ThreadLocal _pos = new ThreadLocal(() => { return -1; }); + private readonly ThreadLocal _pos = new ThreadLocal(() => -1); private static readonly object LockObj = new object(); // @@ -176,8 +165,12 @@ namespace ASCOM.Meade.net public IEnumerator GetEnumerator() { - _pos.Value = -1; - return this as IEnumerator; + lock (LockObj) + { + _pos.Value = -1; + } + + return this; } public void Dispose() @@ -220,7 +213,10 @@ namespace ASCOM.Meade.net public void Reset() { - _pos.Value = -1; + lock (LockObj) + { + _pos.Value = -1; + } } #endregion } diff --git a/Meade.net.Telescope/ReadMe.htm b/Meade.net.Telescope/ReadMe.htm deleted file mode 100644 index df43505..0000000 --- a/Meade.net.Telescope/ReadMe.htm +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Untitled Document - - - - - - - - - - - -
-

ASCOM Telescope Driver (C#)

-
-



-

-

You have just created the skeleton of an ASCOM -Telescope driver in C#. It produces an in-process -(assembly) based driver.

-
-

Prior to developing your first driver, please -familiarize yourself with the developer -information we've provided at the ASCOM Initiative web site -(internet required). -

-

You must do the following in order to complete -your implementation:

-
    -
  1. Switch to the Debug configuration - and build the template now. It should build without errors. -

    -
  2. Add a test project to the - solution. There are templates that can be used to add either a - console or a Windows Forms application:

    -
-
    -
  • Select the ASCOM - Test Forms App (CS) or ASCOM - Test Console App (CS) template.

    -
  • Set a name for the test - application and click on OK.

    -
  • In the Wizard: set the same device - type and model name as for the driver and select Create to build the - test project.

    -
  • Set the Test Application to Run at - Startup.

    -
  • Click on Debug and the test - application should run. You should be able to select your - application in the chooser. Selecting Properties should show the - default setup dialog for your driver.

    -
  • Trying to continue will generate - errors because the additional properties have not been implemented.

    -
-
    -
  1. Go through the Driver.cs file and - replace the System.NotImplemented exceptions with code to implement - your driver's functionality. See the ASCOM ITelescopeV3 - spec. If a property or method is not implemented in your driver the - System.NotImplemented exception must be replaced by an - ASCOM.PropertyNotImplemented or ASCOM.MethodNotImplemented - exception.

    -
  2. Customize the Setup Dialog (SetupDialogForm) to provide the - settings and other controls for your driver. You can bind settings - directly to controls on your dialog form, there's no need to manage - settings manually. A custom Settings class takes care of managing - your settings behind the scenes. -

    -
-

Notes:

-
    -
  • Successfully building the driver, - as well as using regasm - on the assembly, registers it for both COM and ASCOM (the Chooser). - See the code in the ASCOM Registration region of Driver.vb. -

    -
  • Doing a Clean for the project, as - well doing a regasm - -u on the assembly, unregisters it for both COM and ASCOM - (the Chooser). -

    -
  • Place a breakpoint in your driver class constructor, then - start debugging (go, F5). Your breakpoint will be hit when the test - application creates an instance of your driver (after selecting it - in the Chooser). You can now single step, examine variables, etc. - Please review the test application and make changes and additions to - activate various parts of your driver during debugging.

    -
  • The project's Debug configuration is already configured (The - test application creates an instance of your driver (after selecting - it in the Chooser). You can now single step, examine variables, etc. - Please review the test application and feel free to make changes and - additions to activate various parts of your driver during debugging. -

    -
-
- - - - - - - -
- - - - - -
-

ASCOM Initiative

-
-
-



-

-
-

The ASCOM Initiative consists of a group of astronomy software - developers and instrument vendors whose goals are to promote the - driver/client model and scripting automation. -

-

See the ASCOM - web site for more information. Please participate in the - ASCOM-Talk - Yahoo Group. -

-
-
-



-

-

-

- - \ No newline at end of file diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index cf94f12..94bf158 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -1,15 +1,18 @@ #define Telescope using System; -using System.Runtime.InteropServices; -using ASCOM.Astrometry.AstroUtils; -using ASCOM.Utilities; -using ASCOM.DeviceInterface; using System.Collections; using System.Globalization; using System.Reflection; +using System.Runtime.InteropServices; +using ASCOM.Astrometry; +using ASCOM.Astrometry.AstroUtils; +using ASCOM.Astrometry.NOVAS; +using ASCOM.DeviceInterface; using ASCOM.Meade.net.AstroMaths; +using ASCOM.Meade.net.Properties; using ASCOM.Meade.net.Wrapper; +using ASCOM.Utilities; using ASCOM.Utilities.Interfaces; namespace ASCOM.Meade.net @@ -98,9 +101,7 @@ namespace ASCOM.Meade.net } private double _guideRate; - - private const double SIDRATE = 0.9972695677; //synodic/solar seconds per sidereal second - + private void Initialise() { //todo move the TraceLogger out to a factory class. @@ -152,9 +153,7 @@ namespace ASCOM.Meade.net get { LogMessage("SupportedActions Get", "Returning empty arraylist"); - var supportedActions = new ArrayList(); - supportedActions.Add("handbox"); - supportedActions.Add("site"); + var supportedActions = new ArrayList {"handbox", "site"}; return supportedActions; } } @@ -388,7 +387,7 @@ namespace ASCOM.Meade.net if (connectionInfo.SameDevice == 1) { - LogMessage("Connected Set", $"Making first connection telescope adjustments"); + LogMessage("Connected Set", "Making first connection telescope adjustments"); //These settings are applied only when the first device connects to the telescope. SetLongFormat(true); @@ -430,14 +429,14 @@ namespace ASCOM.Meade.net { case "high": TelescopePointingPrecision(true); - LogMessage(propertyName, $"High precision slewing selected"); + LogMessage(propertyName, "High precision slewing selected"); break; case "low": TelescopePointingPrecision(false); - LogMessage(propertyName, $"Low precision slewing selected"); + LogMessage(propertyName, "Low precision slewing selected"); break; default: - LogMessage(propertyName, $"Precision slewing unchanged"); + LogMessage(propertyName, "Precision slewing unchanged"); break; } } @@ -457,6 +456,15 @@ namespace ASCOM.Meade.net return false; } + private bool IsLongFormatSupported() + { + if (_sharedResourcesWrapper.ProductName == TelescopeList.LX200CLASSIC) + { + return false; + } + return true; + } + private bool IsGuideRateSettingSupported() { if (_sharedResourcesWrapper.ProductName == TelescopeList.LX200GPS) @@ -470,11 +478,18 @@ namespace ASCOM.Meade.net { var currentVersion = _sharedResourcesWrapper.FirmwareVersion; var comparison = String.Compare(currentVersion, minVersion, StringComparison.Ordinal); - return (comparison >= 0); + return comparison >= 0; } + private bool IsLongFormat { get; set; } + public void SetLongFormat(bool setLongFormat) { + IsLongFormat = false; + + if (!IsLongFormatSupported()) + return; + _sharedResourcesWrapper.Lock(() => { var result = _sharedResourcesWrapper.SendString(":GZ#"); @@ -482,9 +497,9 @@ namespace ASCOM.Meade.net //Returns: DDD*MM# or DDD*MM’SS# //The current telescope Azimuth depending on the selected precision. - bool isLongFormat = result.Length > 6; + IsLongFormat = result.Length > 6; - if (isLongFormat != setLongFormat) + if (IsLongFormat != setLongFormat) { _utilities.WaitForMilliseconds(500); _sharedResourcesWrapper.SendBlind(":U#"); @@ -498,7 +513,7 @@ namespace ASCOM.Meade.net private bool TogglePrecision() { - LogMessage("TogglePrecision", $"Toggling slewing precision"); + LogMessage("TogglePrecision", "Toggling slewing precision"); var result = _sharedResourcesWrapper.SendChar(":P#"); //:P# Toggles High Precsion Pointing. When High precision pointing is enabled scope will first allow the operator to center a nearby bright star before moving to the actual target. //Returns: @@ -540,9 +555,9 @@ namespace ASCOM.Meade.net CheckConnected("SelectSite"); if (site < 1) - throw new ArgumentOutOfRangeException("site",site,"Site cannot be lower than 1"); - else if (site > 4) - throw new ArgumentOutOfRangeException("site", site, "Site cannot be higher than 4"); + throw new ArgumentOutOfRangeException(nameof(site),site,Resources.Telescope_SelectSite_Site_cannot_be_lower_than_1); + if (site > 4) + throw new ArgumentOutOfRangeException(nameof(site), site, Resources.Telescope_SelectSite_Site_cannot_be_higher_than_4); _sharedResourcesWrapper.SendBlind($":W{site}#"); //:W# @@ -555,9 +570,9 @@ namespace ASCOM.Meade.net CheckConnected("SetSiteName"); if (site < 1) - throw new ArgumentOutOfRangeException("site", site, "Site cannot be lower than 1"); - else if (site > 4) - throw new ArgumentOutOfRangeException("site", site, "Site cannot be higher than 4"); + throw new ArgumentOutOfRangeException(nameof(site), site, Resources.Telescope_SelectSite_Site_cannot_be_lower_than_1); + if (site > 4) + throw new ArgumentOutOfRangeException(nameof(site), site, Resources.Telescope_SelectSite_Site_cannot_be_higher_than_4); string command = String.Empty; switch (site) @@ -609,9 +624,9 @@ namespace ASCOM.Meade.net CheckConnected("GetSiteName"); if (site < 1) - throw new ArgumentOutOfRangeException("site", site, "Site cannot be lower than 1"); - else if (site > 4) - throw new ArgumentOutOfRangeException("site", site, "Site cannot be higher than 4"); + throw new ArgumentOutOfRangeException(nameof(site), site, Resources.Telescope_SelectSite_Site_cannot_be_lower_than_1); + if (site > 4) + throw new ArgumentOutOfRangeException(nameof(site), site, Resources.Telescope_SelectSite_Site_cannot_be_higher_than_4); switch (site) { @@ -637,7 +652,7 @@ namespace ASCOM.Meade.net //A ‘#’ terminated string with the name of the requested site. } - throw new ArgumentOutOfRangeException("site", site, "Site out of range"); + throw new ArgumentOutOfRangeException(nameof(site), site, Resources.Telescope_GetSiteName_Site_out_of_range); } public string Description @@ -834,7 +849,7 @@ namespace ASCOM.Meade.net UtcDateTime = UTCDate, SiteLongitude = SiteLongitude, SiteLatitude = SiteLatitude, - EquatorialCoordinates = new EquatorialCoordinates() + EquatorialCoordinates = new EquatorialCoordinates { RightAscension = RightAscension, Declination = Declination @@ -869,12 +884,12 @@ namespace ASCOM.Meade.net { get { - LogMessage("AtHome", "Get - " + false.ToString()); + LogMessage("AtHome", "Get - " + false); return false; } } - private bool _atPark = false; + private bool _atPark; public bool AtPark { @@ -888,7 +903,7 @@ namespace ASCOM.Meade.net public IAxisRates AxisRates(TelescopeAxes axis) { - LogMessage("AxisRates", "Get - " + axis.ToString()); + LogMessage("AxisRates", "Get - " + axis); return new AxisRates(axis); } @@ -918,14 +933,14 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanFindHome", "Get - " + false.ToString()); + LogMessage("CanFindHome", "Get - " + false); return false; } } public bool CanMoveAxis(TelescopeAxes axis) { - LogMessage("CanMoveAxis", "Get - " + axis.ToString()); + LogMessage("CanMoveAxis", "Get - " + axis); switch (axis) { case TelescopeAxes.axisPrimary: return true; //RA or AZ @@ -939,7 +954,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanPark", "Get - " + true.ToString()); + LogMessage("CanPark", "Get - " + true); return true; } } @@ -948,7 +963,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanPulseGuide", "Get - " + true.ToString()); + LogMessage("CanPulseGuide", "Get - " + true); return true; } } @@ -957,7 +972,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetDeclinationRate", "Get - " + false.ToString()); + LogMessage("CanSetDeclinationRate", "Get - " + false); return false; } } @@ -970,7 +985,7 @@ namespace ASCOM.Meade.net var canSetGuideRate = IsGuideRateSettingSupported(); - LogMessage("CanSetGuideRates", "Get - " + canSetGuideRate.ToString()); + LogMessage("CanSetGuideRates", "Get - " + canSetGuideRate); return canSetGuideRate; } } @@ -979,7 +994,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetPark", "Get - " + false.ToString()); + LogMessage("CanSetPark", "Get - " + false); return false; } } @@ -988,7 +1003,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetPierSide", "Get - " + false.ToString()); + LogMessage("CanSetPierSide", "Get - " + false); return false; } } @@ -997,7 +1012,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetRightAscensionRate", "Get - " + false.ToString()); + LogMessage("CanSetRightAscensionRate", "Get - " + false); return false; } } @@ -1006,7 +1021,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetTracking", "Get - " + true.ToString()); + LogMessage("CanSetTracking", "Get - " + true); return true; } } @@ -1015,7 +1030,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSlew", "Get - " + true.ToString()); + LogMessage("CanSlew", "Get - " + true); return true; } } @@ -1024,7 +1039,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSlewAltAz", "Get - " + true.ToString()); + LogMessage("CanSlewAltAz", "Get - " + true); return true; } } @@ -1033,7 +1048,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSlewAltAzAsync", "Get - " + true.ToString()); + LogMessage("CanSlewAltAzAsync", "Get - " + true); return true; } } @@ -1042,7 +1057,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSlewAsync", "Get - " + true.ToString()); + LogMessage("CanSlewAsync", "Get - " + true); return true; } } @@ -1051,7 +1066,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSync", "Get - " + true.ToString()); + LogMessage("CanSync", "Get - " + true); return true; } } @@ -1060,7 +1075,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSyncAltAz", "Get - " + false.ToString()); + LogMessage("CanSyncAltAz", "Get - " + false); return false; } } @@ -1069,7 +1084,7 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanUnpark", "Get - " + false.ToString()); + LogMessage("CanUnpark", "Get - " + false); return false; } } @@ -1100,6 +1115,7 @@ namespace ASCOM.Meade.net LogMessage("DeclinationRate", "Get - " + declination.ToString(CultureInfo.InvariantCulture)); return declination; } + // ReSharper disable once ValueParameterNotUsed set { LogMessage("DeclinationRate Set", "Not implemented"); @@ -1120,6 +1136,7 @@ namespace ASCOM.Meade.net LogMessage("DoesRefraction Get", "Not implemented"); throw new PropertyNotImplementedException("DoesRefraction", false); } + // ReSharper disable once ValueParameterNotUsed set { LogMessage("DoesRefraction Set", "Not implemented"); @@ -1132,7 +1149,7 @@ namespace ASCOM.Meade.net get { EquatorialCoordinateType equatorialSystem = EquatorialCoordinateType.equTopocentric; - LogMessage("DeclinationRate", "Get - " + equatorialSystem.ToString()); + LogMessage("DeclinationRate", "Get - " + equatorialSystem); return equatorialSystem; } } @@ -1162,10 +1179,10 @@ namespace ASCOM.Meade.net if (!value.InRange(0, 15.0417)) { - throw new InvalidValueException(propertyName, value.ToString(), "0 to 15.0417”/sec"); + throw new InvalidValueException(propertyName, value.ToString(CultureInfo.CurrentCulture), $"{0.ToString(CultureInfo.CurrentCulture)} to {15.0417.ToString(CultureInfo.CurrentCulture)}”/sec"); } - LogMessage($"{propertyName} Set", $"Setting new guiderate {value.ToString()} arc seconds/second ({value.ToString()} degrees/second)"); + LogMessage($"{propertyName} Set", $"Setting new guiderate {value.ToString(CultureInfo.CurrentCulture)} arc seconds/second ({value.ToString(CultureInfo.CurrentCulture)} degrees/second)"); _sharedResourcesWrapper.SendBlind($":Rg{value:00.0}#"); //:RgSS.S# //Set guide rate to +/ -SS.S to arc seconds per second.This rate is added to or subtracted from the current tracking @@ -1371,7 +1388,7 @@ namespace ASCOM.Meade.net if (_userNewerPulseGuiding && duration < 10000) { - LogMessage("PulseGuide", $"Using new pulse guiding technique"); + LogMessage("PulseGuide", "Using new pulse guiding technique"); _sharedResourcesWrapper.SendBlind($":Mg{d}{duration:0000}#"); //:MgnDDDD# //:MgsDDDD# @@ -1385,7 +1402,7 @@ namespace ASCOM.Meade.net } else { - LogMessage("PulseGuide", $"Using old pulse guiding technique"); + LogMessage("PulseGuide", "Using old pulse guiding technique"); _sharedResourcesWrapper.Lock(() => { _sharedResourcesWrapper.SendBlind(":RG#"); //Make sure we are at guide rate @@ -1439,6 +1456,7 @@ namespace ASCOM.Meade.net LogMessage("RightAscensionRate", "Get - " + rightAscensionRate.ToString(CultureInfo.InvariantCulture)); return rightAscensionRate; } + // ReSharper disable once ValueParameterNotUsed set { LogMessage("RightAscensionRate Set", "Not implemented"); @@ -1459,6 +1477,7 @@ namespace ASCOM.Meade.net LogMessage("SideOfPier Get", "Not implemented"); throw new PropertyNotImplementedException("SideOfPier", false); } + // ReSharper disable once ValueParameterNotUsed set { LogMessage("SideOfPier Set", "Not implemented"); @@ -1472,13 +1491,13 @@ namespace ASCOM.Meade.net { // Now using NOVAS 3.1 double siderealTime = 0.0; - using (var novas = new Astrometry.NOVAS.NOVAS31()) + using (var novas = new NOVAS31()) { var jd = _utilities.DateUTCToJulian(DateTime.UtcNow); novas.SiderealTime(jd, 0, novas.DeltaT(jd), - Astrometry.GstType.GreenwichApparentSiderealTime, - Astrometry.Method.EquinoxBased, - Astrometry.Accuracy.Reduced, ref siderealTime); + GstType.GreenwichApparentSiderealTime, + Method.EquinoxBased, + Accuracy.Reduced, ref siderealTime); } // Allow for the longitude @@ -1499,6 +1518,7 @@ namespace ASCOM.Meade.net LogMessage("SiteElevation Get", "Not implemented"); throw new PropertyNotImplementedException("SiteElevation", false); } + // ReSharper disable once ValueParameterNotUsed set { LogMessage("SiteElevation Set", "Not implemented"); @@ -1613,6 +1633,7 @@ namespace ASCOM.Meade.net LogMessage("SlewSettleTime Get", "Not implemented"); throw new PropertyNotImplementedException("SlewSettleTime", false); } + // ReSharper disable once ValueParameterNotUsed set { LogMessage("SlewSettleTime Set", "Not implemented"); @@ -1633,63 +1654,63 @@ namespace ASCOM.Meade.net } } - private double TargetAltitude - { - set - { - if (value > 90) - throw new InvalidValueException("Altitude cannot be greater than 90."); + //private double TargetAltitude + //{ + // set + // { + // if (value > 90) + // throw new InvalidValueException("Altitude cannot be greater than 90."); - if (value < 0) - throw new InvalidValueException("Altitide cannot be less than 0."); + // if (value < 0) + // throw new InvalidValueException("Altitide cannot be less than 0."); - CheckConnected("TargetAltitude Set"); + // CheckConnected("TargetAltitude Set"); - //todo this serial string does not work. Calculate the EQ version instead. + // //todo this serial string does not work. Calculate the EQ version instead. - var dms = _utilities.DegreesToDMS(value, "*", "'", "",0); - var s = value < 0 ? string.Empty : "+"; + // var dms = _utilities.DegreesToDMS(value, "*", "'", "",0); + // var s = value < 0 ? string.Empty : "+"; - var result = _sharedResourcesWrapper.SendChar($":Sa{s}{dms}#"); - //:SasDD*MM# - //Set target object altitude to sDD*MM# or sDD*MM’SS# [LX 16”, Autostar, Autostar II] - //Returns: - //1 Object within slew range - //0 Object out of slew range + // var result = _sharedResourcesWrapper.SendChar($":Sa{s}{dms}#"); + // //:SasDD*MM# + // //Set target object altitude to sDD*MM# or sDD*MM’SS# [LX 16”, Autostar, Autostar II] + // //Returns: + // //1 Object within slew range + // //0 Object out of slew range - if (result == "0") - throw new InvalidOperationException("Target altitude out of slew range"); - } - } + // if (result == "0") + // throw new InvalidOperationException("Target altitude out of slew range"); + // } + //} - private double TargetAzimuth - { - set - { - if (value >= 360) - throw new InvalidValueException("Azimuth cannot be 360 or higher."); + //private double TargetAzimuth + //{ + // set + // { + // if (value >= 360) + // throw new InvalidValueException("Azimuth cannot be 360 or higher."); - if (value < 0) - throw new InvalidValueException("Azimuth cannot be less than 0."); + // if (value < 0) + // throw new InvalidValueException("Azimuth cannot be less than 0."); - CheckConnected("TargetAzimuth Set"); + // CheckConnected("TargetAzimuth Set"); - //todo this serial string does not work. Calculate the EQ version instead. + // //todo this serial string does not work. Calculate the EQ version instead. - var dms = _utilitiesExtra.DegreesToDM(value, "*" ); + // var dms = _utilitiesExtra.DegreesToDM(value, "*" ); - var result = _sharedResourcesWrapper.SendChar($":Sz{dms}#"); - //:SzDDD*MM# - //Sets the target Object Azimuth[LX 16” and Autostar II only] - //Returns: - //0 – Invalid - //1 - Valid + // var result = _sharedResourcesWrapper.SendChar($":Sz{dms}#"); + // //:SzDDD*MM# + // //Sets the target Object Azimuth[LX 16” and Autostar II only] + // //Returns: + // //0 – Invalid + // //1 - Valid - if (result == "0") - throw new InvalidOperationException("Target Azimuth out of slew range"); + // if (result == "0") + // throw new InvalidOperationException("Target Azimuth out of slew range"); - } - } + // } + //} public void SlewToAltAzAsync(double azimuth, double altitude) { @@ -1708,10 +1729,8 @@ namespace ASCOM.Meade.net throw new InvalidValueException("Azimuth cannot be less than 0."); LogMessage("SlewToAltAzAsync", $"Az={azimuth} Alt={altitude}"); - - HorizonCoordinates altAz = new HorizonCoordinates(); - altAz.Azimuth = azimuth; - altAz.Altitude = altitude; + + HorizonCoordinates altAz = new HorizonCoordinates {Azimuth = azimuth, Altitude = altitude}; var utcDateTime = UTCDate; var latitude = SiteLatitude; @@ -2026,7 +2045,7 @@ namespace ASCOM.Meade.net } set { - LogMessage($"Tracking Set", $"{value}"); + LogMessage("Tracking Set", $"{value}"); _tracking = value; } } @@ -2095,7 +2114,7 @@ namespace ASCOM.Meade.net LogMessage("TrackingRates", "Get - "); foreach (DriveRates driveRate in trackingRates) { - LogMessage("TrackingRates", "Get - " + driveRate.ToString()); + LogMessage("TrackingRates", "Get - " + driveRate); } return trackingRates; } @@ -2128,18 +2147,20 @@ namespace ASCOM.Meade.net LogMessage("UTCDate", "Get started"); - TelescopeDateDetails telescopeDateDetails = _sharedResourcesWrapper.Lock(() => + var telescopeDateDetails = _sharedResourcesWrapper.Lock(() => { - TelescopeDateDetails tdd = new TelescopeDateDetails(); - tdd.TelescopeDate = _sharedResourcesWrapper.SendString(":GC#"); - //:GC# Get current date. - //Returns: MM/DD/YY# - //The current local calendar date for the telescope. - tdd.TelescopeTime = _sharedResourcesWrapper.SendString(":GL#"); - //:GL# Get Local Time in 24 hour format - //Returns: HH:MM:SS# - //The Local Time in 24 - hour Format - tdd.UtcCorrection = GetUtcCorrection(); + var tdd = new TelescopeDateDetails + { + TelescopeDate = _sharedResourcesWrapper.SendString(":GC#"), + //:GC# Get current date. + //Returns: MM/DD/YY# + //The current local calendar date for the telescope. + TelescopeTime = _sharedResourcesWrapper.SendString(":GL#"), + //:GL# Get Local Time in 24 hour format + //Returns: HH:MM:SS# + //The Local Time in 24 - hour Format + UtcCorrection = GetUtcCorrection() + }; return tdd; }); @@ -2327,7 +2348,7 @@ namespace ASCOM.Meade.net LogMessage("ReadProfile", $"Precision: {_precision}"); } - internal void WriteProfile() + private void WriteProfile() { var profileProperties = new ProfileProperties { @@ -2345,7 +2366,7 @@ namespace ASCOM.Meade.net /// /// /// - internal void LogMessage(string identifier, string message, params object[] args) + private void LogMessage(string identifier, string message, params object[] args) { var msg = string.Format(message, args); _tl.LogMessage(identifier, msg); diff --git a/Meade.net.focuser/Focuser.cs b/Meade.net.focuser/Focuser.cs index 81cccf4..e61be5d 100644 --- a/Meade.net.focuser/Focuser.cs +++ b/Meade.net.focuser/Focuser.cs @@ -1,13 +1,13 @@ #define Focuser using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using ASCOM.Utilities; -using ASCOM.DeviceInterface; using System.Collections; +using System.Diagnostics; using System.Reflection; +using System.Runtime.InteropServices; +using ASCOM.DeviceInterface; using ASCOM.Meade.net.Wrapper; +using ASCOM.Utilities; using ASCOM.Utilities.Interfaces; namespace ASCOM.Meade.net @@ -54,7 +54,7 @@ namespace ASCOM.Meade.net /// /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify) /// - private static TraceLogger Tl; + private static TraceLogger _tl; private readonly ISharedResourcesWrapper _sharedResourcesWrapper; @@ -83,7 +83,7 @@ namespace ASCOM.Meade.net private void Initialise() { //todo move the TraceLogger out to a factory class. - Tl = new TraceLogger("", "Meade.Generic.focusser"); + _tl = new TraceLogger("", "Meade.Generic.focusser"); ReadProfile(); // Read device configuration from the ASCOM Profile store @@ -108,17 +108,17 @@ namespace ASCOM.Meade.net /// 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(); } } @@ -163,9 +163,9 @@ namespace ASCOM.Meade.net 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 @@ -177,7 +177,7 @@ namespace ASCOM.Meade.net } set { - Tl.LogMessage("Connected", "Set {0}", value); + _tl.LogMessage("Connected", "Set {0}", value); if (value == IsConnected) return; @@ -216,7 +216,7 @@ namespace ASCOM.Meade.net // TODO customise this device description get { - Tl.LogMessage("Description Get", DriverDescription); + _tl.LogMessage("Description Get", DriverDescription); return DriverDescription; } } @@ -259,7 +259,7 @@ namespace ASCOM.Meade.net { //string name = "Short driver name - please customise"; string name = DriverDescription; - Tl.LogMessage("Name Get", name); + _tl.LogMessage("Name Get", name); return name; } } @@ -274,14 +274,14 @@ namespace ASCOM.Meade.net { CheckConnected("Absolute 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"); @@ -302,7 +302,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 } } @@ -311,12 +311,12 @@ namespace ASCOM.Meade.net { get { - Tl.LogMessage("Link Get", Connected.ToString()); + _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()); + _tl.LogMessage("Link Set", value.ToString()); Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility } } @@ -326,7 +326,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 } } @@ -336,14 +336,14 @@ namespace ASCOM.Meade.net { get { - Tl.LogMessage("MaxStep Get", _maxStep.ToString()); + _tl.LogMessage("MaxStep Get", _maxStep.ToString()); return _maxStep; } } public void Move(int position) { - Tl.LogMessage("Move", position.ToString()); + _tl.LogMessage("Move", position.ToString()); CheckConnected("Move"); //todo implement backlash compensation @@ -405,7 +405,7 @@ namespace ASCOM.Meade.net { get { - Tl.LogMessage("StepSize Get", "Not implemented"); + _tl.LogMessage("StepSize Get", "Not implemented"); throw new PropertyNotImplementedException("StepSize", false); } } @@ -414,13 +414,13 @@ namespace ASCOM.Meade.net { get { - Tl.LogMessage("TempComp Get", false.ToString()); + _tl.LogMessage("TempComp Get", false.ToString()); return false; } // ReSharper disable once ValueParameterNotUsed set { - Tl.LogMessage("TempComp Set", "Not implemented"); + _tl.LogMessage("TempComp Set", "Not implemented"); throw new PropertyNotImplementedException("TempComp", false); } } @@ -429,7 +429,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 } } @@ -438,7 +438,7 @@ namespace ASCOM.Meade.net { get { - Tl.LogMessage("Temperature Get", "Not implemented"); + _tl.LogMessage("Temperature Get", "Not implemented"); throw new PropertyNotImplementedException("Temperature", false); } } @@ -546,10 +546,10 @@ namespace ASCOM.Meade.net private void ReadProfile() { var profileProperties = _sharedResourcesWrapper.ReadProfile(); - Tl.Enabled = profileProperties.TraceLogger; + _tl.Enabled = profileProperties.TraceLogger; _comPort = profileProperties.ComPort; - LogMessage("ReadProfile", $"Trace logger enabled: {Tl.Enabled}"); + LogMessage("ReadProfile", $"Trace logger enabled: {_tl.Enabled}"); LogMessage("ReadProfile", $"Com Port: {_comPort}"); } @@ -562,7 +562,7 @@ namespace ASCOM.Meade.net private 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 } diff --git a/Meade.net.focuser/Meade.net.focuser.csproj b/Meade.net.focuser/Meade.net.focuser.csproj index cbde904..55eeca3 100644 --- a/Meade.net.focuser/Meade.net.focuser.csproj +++ b/Meade.net.focuser/Meade.net.focuser.csproj @@ -156,7 +156,6 @@ Settings.Designer.cs
- diff --git a/Meade.net.focuser/Properties/Resources.Designer.cs b/Meade.net.focuser/Properties/Resources.Designer.cs index 7df2b0c..80e9977 100644 --- a/Meade.net.focuser/Properties/Resources.Designer.cs +++ b/Meade.net.focuser/Properties/Resources.Designer.cs @@ -8,10 +8,16 @@ // //------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + namespace ASCOM.Meade.net.Properties { - using System; - - /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,27 +25,27 @@ namespace ASCOM.Meade.net.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [DebuggerNonUserCode()] + [CompilerGenerated()] internal class Resources { - private static global::System.Resources.ResourceManager resourceMan; + private static ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly); + if (ReferenceEquals(resourceMan, null)) { + ResourceManager temp = new ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -50,8 +56,8 @@ namespace ASCOM.Meade.net.Properties { /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture { get { return resourceCulture; } @@ -63,20 +69,20 @@ namespace ASCOM.Meade.net.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ASCOM { + internal static Bitmap ASCOM { get { object obj = ResourceManager.GetObject("ASCOM", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DefaultIcon { + internal static Icon DefaultIcon { get { object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture); - return ((System.Drawing.Icon)(obj)); + return ((Icon)(obj)); } } } diff --git a/Meade.net.focuser/Properties/Settings.Designer.cs b/Meade.net.focuser/Properties/Settings.Designer.cs index 67ea42d..81d4ba1 100644 --- a/Meade.net.focuser/Properties/Settings.Designer.cs +++ b/Meade.net.focuser/Properties/Settings.Designer.cs @@ -8,14 +8,18 @@ // //------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.Configuration; +using System.Runtime.CompilerServices; + namespace ASCOM.Meade.net.Properties { - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + [CompilerGenerated()] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] + internal sealed partial class Settings : ApplicationSettingsBase { - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + private static Settings defaultInstance = ((Settings)(Synchronized(new Settings()))); public static Settings Default { get { diff --git a/Meade.net.focuser/ReadMe.htm b/Meade.net.focuser/ReadMe.htm deleted file mode 100644 index d0e812e..0000000 --- a/Meade.net.focuser/ReadMe.htm +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Untitled Document - - - - - - - - - - - -
-

ASCOM Focuser Driver (C#)

-
-



-

-

You have just created the skeleton of an ASCOM -Focuser driver in C#. It produces an in-process -(assembly) based driver.

-
-

Prior to developing your first driver, please -familiarize yourself with the developer -information we've provided at the ASCOM Initiative web site -(internet required). -

-

You must do the following in order to complete -your implementation:

-
    -
  1. Switch to the Debug configuration - and build the template now. It should build without errors. -

    -
  2. Add a test project to the - solution. There are templates that can be used to add either a - console or a Windows Forms application:

    -
-
    -
  • Select the ASCOM - Test Forms App (CS) or ASCOM - Test Console App (CS) template.

    -
  • Set a name for the test - application and click on OK.

    -
  • In the Wizard: set the same device - type and model name as for the driver and select Create to build the - test project.

    -
  • Set the Test Application to Run at - Startup.

    -
  • Click on Debug and the test - application should run. You should be able to select your - application in the chooser. Selecting Properties should show the - default setup dialog for your driver.

    -
  • Trying to continue will generate - errors because the additional properties have not been implemented.

    -
-
    -
  1. Go through the Driver.cs file and - replace the System.NotImplemented exceptions with code to implement - your driver's functionality. See the ASCOM IFocuserV3 - spec. If a property or method is not implemented in your driver the - System.NotImplemented exception must be replaced by an - ASCOM.PropertyNotImplemented or ASCOM.MethodNotImplemented - exception.

    -
  2. Customize the Setup Dialog (SetupDialogForm) to provide the - settings and other controls for your driver. You can bind settings - directly to controls on your dialog form, there's no need to manage - settings manually. A custom Settings class takes care of managing - your settings behind the scenes. -

    -
-

Notes:

-
    -
  • Successfully building the driver, - as well as using regasm - on the assembly, registers it for both COM and ASCOM (the Chooser). - See the code in the ASCOM Registration region of Driver.vb. -

    -
  • Doing a Clean for the project, as - well doing a regasm - -u on the assembly, unregisters it for both COM and ASCOM - (the Chooser). -

    -
  • Place a breakpoint in your driver class constructor, then - start debugging (go, F5). Your breakpoint will be hit when the test - application creates an instance of your driver (after selecting it - in the Chooser). You can now single step, examine variables, etc. - Please review the test application and make changes and additions to - activate various parts of your driver during debugging.

    -
  • The project's Debug configuration is already configured (The - test application creates an instance of your driver (after selecting - it in the Chooser). You can now single step, examine variables, etc. - Please review the test application and feel free to make changes and - additions to activate various parts of your driver during debugging. -

    -
-
- - - - - - - -
- - - - - -
-

ASCOM Initiative

-
-
-



-

-
-

The ASCOM Initiative consists of a group of astronomy software - developers and instrument vendors whose goals are to promote the - driver/client model and scripting automation. -

-

See the ASCOM - web site for more information. Please participate in the - ASCOM-Talk - Yahoo Group. -

-
-
-



-

-

-

- - \ No newline at end of file diff --git a/Meade.net/AssemblyInfo.cs b/Meade.net/AssemblyInfo.cs index 04b5aaf..d5f66f7 100644 --- a/Meade.net/AssemblyInfo.cs +++ b/Meade.net/AssemblyInfo.cs @@ -1,29 +1,32 @@ using System; using System.Reflection; -using System.Runtime.InteropServices; -using System.Resources; namespace ASCOM.Meade.net { public class AssemblyInfo { // The assembly information values. - public string Title = "", Description = "", Company = "", - Product = "", Copyright = "", Trademark = "", - AssemblyVersion = "", FileVersion = "", Guid = "", - NeutralLanguage = ""; - public bool IsComVisible = false; + //public readonly string Title = string.Empty; + //public readonly string Description = string.Empty; + //public readonly string Company = string.Empty; + public readonly string Product = string.Empty; + //public readonly string Copyright = string.Empty; + //public readonly string Trademark = string.Empty; + public readonly string AssemblyVersion; + //public readonly string FileVersion = string.Empty; + //public readonly string Guid = string.Empty; + //public readonly string NeutralLanguage = string.Empty; + //public readonly bool IsComVisible; // Return a particular assembly attribute value. - public static T GetAssemblyAttribute(Assembly assembly) + private T GetAssemblyAttribute(Assembly assembly) where T : Attribute { // Get attributes of this type. - object[] attributes = - assembly.GetCustomAttributes(typeof(T), true); + object[] attributes = assembly.GetCustomAttributes(typeof(T), true); // If we didn't get anything, return null. - if ((attributes == null) || (attributes.Length == 0)) + if (attributes.Length == 0) return null; // Convert the first attribute value into @@ -37,54 +40,52 @@ namespace ASCOM.Meade.net { } - public AssemblyInfo(Assembly assembly) + private AssemblyInfo(Assembly assembly) { // Get values from the assembly. - AssemblyTitleAttribute titleAttr = - GetAssemblyAttribute(assembly); - if (titleAttr != null) Title = titleAttr.Title; + //var titleAttr = GetAssemblyAttribute(assembly); + //if (titleAttr != null) + // Title = titleAttr.Title; - AssemblyDescriptionAttribute assemblyAttr = - GetAssemblyAttribute(assembly); - if (assemblyAttr != null) Description = - assemblyAttr.Description; + //var assemblyAttr = GetAssemblyAttribute(assembly); + //if (assemblyAttr != null) + // Description = assemblyAttr.Description; - AssemblyCompanyAttribute companyAttr = - GetAssemblyAttribute(assembly); - if (companyAttr != null) Company = companyAttr.Company; + //var companyAttr =GetAssemblyAttribute(assembly); + //if (companyAttr != null) + // Company = companyAttr.Company; - AssemblyProductAttribute productAttr = - GetAssemblyAttribute(assembly); - if (productAttr != null) Product = productAttr.Product; + var productAttr = GetAssemblyAttribute(assembly); + if (productAttr != null) + Product = productAttr.Product; - AssemblyCopyrightAttribute copyrightAttr = - GetAssemblyAttribute(assembly); - if (copyrightAttr != null) Copyright = copyrightAttr.Copyright; + //var copyrightAttr = GetAssemblyAttribute(assembly); + //if (copyrightAttr != null) + // Copyright = copyrightAttr.Copyright; - AssemblyTrademarkAttribute trademarkAttr = - GetAssemblyAttribute(assembly); - if (trademarkAttr != null) Trademark = trademarkAttr.Trademark; + //var trademarkAttr = GetAssemblyAttribute(assembly); + //if (trademarkAttr != null) + // Trademark = trademarkAttr.Trademark; var version = assembly.GetName().Version; AssemblyVersion = $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; - AssemblyFileVersionAttribute fileVersionAttr = - GetAssemblyAttribute(assembly); - if (fileVersionAttr != null) FileVersion = - fileVersionAttr.Version; + //var fileVersionAttr = GetAssemblyAttribute(assembly); + //if (fileVersionAttr != null) FileVersion = + // fileVersionAttr.Version; - GuidAttribute guidAttr = GetAssemblyAttribute(assembly); - if (guidAttr != null) Guid = guidAttr.Value; + //var guidAttr = GetAssemblyAttribute(assembly); + //if (guidAttr != null) + // Guid = guidAttr.Value; - NeutralResourcesLanguageAttribute languageAttr = - GetAssemblyAttribute(assembly); - if (languageAttr != null) NeutralLanguage = - languageAttr.CultureName; + //var languageAttr = GetAssemblyAttribute(assembly); + //if (languageAttr != null) + // NeutralLanguage = languageAttr.CultureName; - ComVisibleAttribute comAttr = - GetAssemblyAttribute(assembly); - if (comAttr != null) IsComVisible = comAttr.Value; + //var comAttr = GetAssemblyAttribute(assembly); + //if (comAttr != null) + // IsComVisible = comAttr.Value; } } } diff --git a/Meade.net/ClassFactory.cs b/Meade.net/ClassFactory.cs index bbb5771..1b69663 100644 --- a/Meade.net/ClassFactory.cs +++ b/Meade.net/ClassFactory.cs @@ -1,6 +1,8 @@ using System; -using System.Runtime.InteropServices; using System.Collections; +using System.Runtime.InteropServices; +// ReSharper disable UnusedMember.Local +// ReSharper disable UnusedMember.Global namespace ASCOM.Meade.net { @@ -33,8 +35,8 @@ namespace ASCOM.Meade.net #region Access to ole32.dll functions for class factories // Define two common GUID objects for public usage. - private static readonly Guid _iidIUnknown = new Guid("{00000000-0000-0000-C000-000000000046}"); - private static readonly Guid _iidIDispatch = 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 @@ -113,16 +115,16 @@ namespace ASCOM.Meade.net private Guid _mClassId; private readonly ArrayList _mInterfaceTypes; private uint _mCookie; - private readonly string _mProgid; + //private readonly string _mProgid; public ClassFactory(Type type) { if (type == null) - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(type)); _mClassType = type; //PWGS Get the ProgID from the MetaData - _mProgid = Marshal.GenerateProgIdForType(type); + //_mProgid = Marshal.GenerateProgIdForType(type); _mClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)] ClassContext = (uint)Clsctx.ClsctxLocalServer; // Default Flags = (uint)Regcls.RegclsMultipleuse | // Default @@ -135,7 +137,8 @@ namespace ASCOM.Meade.net #endregion #region Common ClassFactory Methods - public uint ClassContext { get; } + + private uint ClassContext { get; } public Guid ClassId { @@ -143,7 +146,7 @@ namespace ASCOM.Meade.net set => _mClassId = value; } - public uint Flags { get; } + private uint Flags { get; } public bool RegisterClassObject() { @@ -156,25 +159,22 @@ namespace ASCOM.Meade.net Flags, out _mCookie ); - return (i == 0); + return i == 0; } - public bool RevokeClassObject() + public void RevokeClassObject() { - int i = CoRevokeClassObject(_mCookie); - return (i == 0); + CoRevokeClassObject(_mCookie); } - public static bool ResumeClassObjects() + public static void ResumeClassObjects() { - int i = CoResumeClassObjects(); - return (i == 0); + CoResumeClassObjects(); } - public static bool SuspendClassObjects() + public static void SuspendClassObjects() { - int i = CoSuspendClassObjects(); - return (i == 0); + CoSuspendClassObjects(); } #endregion @@ -201,12 +201,11 @@ namespace ASCOM.Meade.net // // Handle requests for IDispatch or IUnknown on the class // - if (riid == _iidIDispatch) + if (riid == IidIDispatch) { ppvObject = Marshal.GetIDispatchForObject(Activator.CreateInstance(_mClassType)); - return; } - else if (riid == _iidIUnknown) + else if (riid == IidIUnknown) { ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(_mClassType)); } diff --git a/Meade.net/GarbageCollection.cs b/Meade.net/GarbageCollection.cs index a68096f..ecc601d 100644 --- a/Meade.net/GarbageCollection.cs +++ b/Meade.net/GarbageCollection.cs @@ -30,7 +30,7 @@ namespace ASCOM.Meade.net _mEventThreadEnded.Set(); } - protected bool ContinueThread() + private bool ContinueThread() { lock (this) { diff --git a/Meade.net/LocalServer.cs b/Meade.net/LocalServer.cs index 4fb6769..0c70f53 100644 --- a/Meade.net/LocalServer.cs +++ b/Meade.net/LocalServer.cs @@ -12,84 +12,38 @@ // Modified by Chris Rowland and Peter Simpson to allow use with multiple devices of the same type March 2011 // // + using System; -using System.IO; -using System.Windows.Forms; using System.Collections; -using System.Runtime.InteropServices; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.Principal; +using System.Threading; +using System.Windows.Forms; +using ASCOM.Meade.net.Properties; using ASCOM.Utilities; using Microsoft.Win32; -using System.Threading; -using System.Security.Principal; -using System.Diagnostics; namespace ASCOM.Meade.net { public static class Server { - private const string DRIVER_NAME = "Meade Generic"; + private const string DriverName = "Meade Generic"; #region Access to kernel32.dll, user32.dll, and ole32.dll functions - [Flags] - enum Clsctx : uint - { - 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 - { - /// Initializes the thread for multi-threaded object concurrency. - CoinitMultithreaded = 0x0, - /// Initializes the thread for apartment-threaded object concurrency. - CoinitApartmentthreaded = 0x2, - /// Disables DDE for Ole1 support. - CoinitDisableOle1Dde = 0x4, - /// Trades memory for speed. - CoinitSpeedOverMemory = 0x8 - } + //// CoInitializeEx() can be used to set the apartment model + //// of individual threads. + //[DllImport("ole32.dll")] + //static extern int CoInitializeEx(IntPtr pvReserved, uint dwCoInit); - [Flags] - enum Regcls : uint - { - RegclsSingleuse = 0, - RegclsMultipleuse = 1, - RegclsMultiSeparate = 2, - RegclsSuspended = 4, - RegclsSurrogate = 8 - } - - - // CoInitializeEx() can be used to set the apartment model - // of individual threads. - [DllImport("ole32.dll")] - static extern int CoInitializeEx(IntPtr pvReserved, uint dwCoInit); - - // CoUninitialize() is used to uninitialize a COM thread. - [DllImport("ole32.dll")] - static extern void CoUninitialize(); + //// CoUninitialize() is used to uninitialize a COM thread. + //[DllImport("ole32.dll")] + //static extern void CoUninitialize(); // PostThreadMessage() allows us to post a Windows Message to // a specific thread (identified by its thread id). @@ -109,8 +63,8 @@ namespace ASCOM.Meade.net #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 _sMainForm = null; // Reference to our main form - private static ArrayList _sComObjectAssys; // Dynamically loaded assemblies containing served COM objects + private static FrmMain _sMainForm; // 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 @@ -118,15 +72,15 @@ namespace ASCOM.Meade.net #endregion // This property returns the main thread's id. - public static uint MainThreadId { get; private set; } // Stores the main thread's thread id. + private static uint MainThreadId { get; 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) + private static bool StartedByCom { get; set; } // True if server started by COM (-embedding) #region Server Lock, Object Counting, and AutoQuit on COM startup // Returns the total number of objects alive currently. - public static int ObjectsCount + private static int ObjectsCount { get { @@ -138,21 +92,21 @@ namespace ASCOM.Meade.net } // This method performs a thread-safe incrementation of the objects count. - public static int CountObject() + public static void CountObject() { // Increment the global count of objects. - return Interlocked.Increment(ref _objsInUse); + Interlocked.Increment(ref _objsInUse); } // This method performs a thread-safe decrementation the objects count. - public static int UncountObject() + public static void UncountObject() { // Decrement the global count of objects. - return Interlocked.Decrement(ref _objsInUse); + Interlocked.Decrement(ref _objsInUse); } // Returns the current server lock count. - public static int ServerLockCount + private static int ServerLockCount { get { @@ -165,18 +119,18 @@ namespace ASCOM.Meade.net // This method performs a thread-safe incrementation the // server lock count. - public static int CountLock() + public static void CountLock() { // Increment the global lock count of this server. - return Interlocked.Increment(ref _serverLocks); + Interlocked.Increment(ref _serverLocks); } // This method performs a thread-safe decrementation the // server lock count. - public static int UncountLock() + public static void UncountLock() { // Decrement the global lock count of this server. - return Interlocked.Decrement(ref _serverLocks); + Interlocked.Decrement(ref _serverLocks); } // AttemptToTerminateServer() will check to see if the objects count and the server @@ -215,7 +169,7 @@ namespace ASCOM.Meade.net // private static bool LoadComObjectAssemblies() { - _sComObjectAssys = new ArrayList(); + //_sComObjectAssys = new ArrayList(); _sComObjectTypes = new ArrayList(); // put everything into one folder, the same as the server. @@ -246,7 +200,7 @@ namespace ASCOM.Meade.net { //MessageBox.Show("Adding Type: " + type.Name + " " + type.FullName); _sComObjectTypes.Add(type); //PWGS - much simpler - _sComObjectAssys.Add(so); + //_sComObjectAssys.Add(so); } } } @@ -254,15 +208,13 @@ namespace ASCOM.Meade.net { // Probably an attempt to load a Win32 DLL (i.e. not a .net assembly) // Just swallow the exception and continue to the next item. - continue; } catch (Exception e) { - MessageBox.Show($"Failed to load served COM class assembly {fi.Name} - {e.Message}", - DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Stop); + MessageBox.Show(string.Format(Resources.Server_LoadComObjectAssemblies_Failed_to_load_served_COM_class_assembly__0_____1_, fi.Name, e.Message), + DriverName, MessageBoxButtons.OK, MessageBoxIcon.Stop); return false; } - } return true; } @@ -287,21 +239,22 @@ namespace ASCOM.Meade.net // private static void ElevateSelf(string arg) { - ProcessStartInfo si = new ProcessStartInfo(); - si.Arguments = arg; - si.WorkingDirectory = Environment.CurrentDirectory; - si.FileName = Application.ExecutablePath; - si.Verb = "runas"; - try { Process.Start(si); } - catch (System.ComponentModel.Win32Exception) + var si = new ProcessStartInfo { - MessageBox.Show($"The {DRIVER_NAME} was not {(arg == "/register" ? "registered" : "unregistered")} because you did not allow it.", DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Warning); + Arguments = arg, + WorkingDirectory = Environment.CurrentDirectory, + FileName = Application.ExecutablePath, + Verb = "runas" + }; + try { Process.Start(si); } + catch (Win32Exception) + { + MessageBox.Show(string.Format(Resources.Server_ElevateSelf_The__0__was_not__1__because_you_did_not_allow_it_, DriverName, (arg == "/register" ? "registered" : "unregistered")), DriverName, MessageBoxButtons.OK, MessageBoxIcon.Warning); } catch (Exception ex) { - MessageBox.Show(ex.ToString(), DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Stop); + MessageBox.Show(ex.ToString(), DriverName, MessageBoxButtons.OK, MessageBoxIcon.Stop); } - return; } // @@ -349,21 +302,18 @@ namespace ASCOM.Meade.net // // HKCR\APPID\exename.ext // - using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("APPID\\{0}", - Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)))) + using (RegistryKey key = Registry.ClassesRoot.CreateSubKey( + $"APPID\\{Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)}")) { key.SetValue("AppID", _sAppId); } } catch (Exception ex) { - MessageBox.Show($"Error while registering the server:\n{ex}", - DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Stop); + MessageBox.Show(string.Format(Resources.Server_RegisterObjects_, ex), + DriverName, MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } - finally - { - } // // For each of the driver assemblies @@ -381,7 +331,7 @@ namespace ASCOM.Meade.net //PWGS Generate device type from the Class name string deviceType = type.Name; - using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("CLSID\\{0}", clsid))) + using (RegistryKey key = Registry.ClassesRoot.CreateSubKey($"CLSID\\{clsid}")) { key.SetValue(null, progid); // Could be assyTitle/Desc??, but .NET components show ProgId here key.SetValue("AppId", _sAppId); @@ -413,7 +363,7 @@ namespace ASCOM.Meade.net // // ASCOM // - assy = type.Assembly; + //assy = type.Assembly; // Pull the display name from the ServedClassName attribute. attr = Attribute.GetCustomAttribute(type, typeof(ServedClassNameAttribute)); //PWGS Changed to search type for attribute rather than assembly @@ -426,13 +376,11 @@ namespace ASCOM.Meade.net } catch (Exception ex) { - MessageBox.Show("Error while registering the server:\n" + ex.ToString(), - DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Stop); + MessageBox.Show(string.Format(Resources.Server_RegisterObjects_, ex), + DriverName, MessageBoxButtons.OK, MessageBoxIcon.Stop); bFail = true; } - finally - { - } + if (bFail) break; } } @@ -454,9 +402,9 @@ namespace ASCOM.Meade.net // // Local server's DCOM/AppID information // - Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", _sAppId), false); - Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", - Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)), false); + Registry.ClassesRoot.DeleteSubKey($"APPID\\{_sAppId}", false); + Registry.ClassesRoot.DeleteSubKey( + $"APPID\\{Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)}", false); // // For each of the driver assemblies @@ -472,17 +420,17 @@ namespace ASCOM.Meade.net // // HKCR\progid // - Registry.ClassesRoot.DeleteSubKey(String.Format("{0}\\CLSID", progid), false); + Registry.ClassesRoot.DeleteSubKey($"{progid}\\CLSID", false); Registry.ClassesRoot.DeleteSubKey(progid, false); // // HKCR\CLSID\clsid // - Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Implemented Categories\\{{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}}", clsid), false); - Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Implemented Categories", clsid), false); - Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\ProgId", clsid), false); - Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\LocalServer32", clsid), false); - Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Programmable", clsid), false); - Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}", clsid), false); + Registry.ClassesRoot.DeleteSubKey($"CLSID\\{clsid}\\Implemented Categories\\{{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}}", false); + Registry.ClassesRoot.DeleteSubKey($"CLSID\\{clsid}\\Implemented Categories", false); + Registry.ClassesRoot.DeleteSubKey($"CLSID\\{clsid}\\ProgId", false); + Registry.ClassesRoot.DeleteSubKey($"CLSID\\{clsid}\\LocalServer32", false); + Registry.ClassesRoot.DeleteSubKey($"CLSID\\{clsid}\\Programmable", false); + Registry.ClassesRoot.DeleteSubKey($"CLSID\\{clsid}", false); try { // @@ -494,7 +442,10 @@ namespace ASCOM.Meade.net p.Unregister(progid); } } - catch (Exception) { } + catch (Exception) + { + // ignored + } } } #endregion @@ -505,7 +456,7 @@ namespace ASCOM.Meade.net // that we serve. This requires the class facgtory name to be // equal to the served class name + "ClassFactory". // - private static bool RegisterClassFactories() + private static void RegisterClassFactories() { _sClassFactories = new ArrayList(); foreach (Type type in _sComObjectTypes) @@ -514,13 +465,12 @@ namespace ASCOM.Meade.net _sClassFactories.Add(factory); if (!factory.RegisterClassObject()) { - MessageBox.Show("Failed to register class factory for " + type.Name, - DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Stop); - return false; + MessageBox.Show(string.Format(Resources.Server_RegisterClassFactories_Failed_to_register_class_factory_for__0_, type.Name), + DriverName, MessageBoxButtons.OK, MessageBoxIcon.Stop); + return; } } ClassFactory.ResumeClassObjects(); // Served objects now go live - return true; } private static void RevokeClassFactories() @@ -570,8 +520,9 @@ namespace ASCOM.Meade.net break; default: - MessageBox.Show("Unknown argument: " + args[0] + "\nValid are : -register, -unregister and -embedding", - DRIVER_NAME, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + MessageBox.Show( + string.Format(Resources.Server_ProcessArguments_, args[0]), + DriverName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); break; } } @@ -610,9 +561,11 @@ namespace ASCOM.Meade.net 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"; + var garbageCollector = new GarbageCollection(1000); + var gcThread = new Thread(garbageCollector.GcWatch) + { + Name = "Garbage Collection Thread" + }; gcThread.Start(); // diff --git a/Meade.net/Localization/LocalisationHelper.cs b/Meade.net/Localization/LocalisationHelper.cs deleted file mode 100644 index d193826..0000000 --- a/Meade.net/Localization/LocalisationHelper.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Globalization; -using System.Threading; -using System.Resources; -using System.Reflection; - -namespace ASCOM.Meade.net.Localization -{ - internal class LocalisationHelper - { - private const string LocalizationNamespace = "LocalisationTest.Localization.Resources.Localization"; - private readonly ResourceManager _resourceManager; - - public LocalisationHelper() - { - _resourceManager = new ResourceManager(LocalizationNamespace, Assembly.GetExecutingAssembly()); - - SetLocalisation(CultureInfo.CurrentCulture.Name); - } - - internal void SetLocalisation(string name) - { - var cultureInfo = new CultureInfo(name); - - //CultureInfo.DefaultThreadCurrentCulture = cultureInfo; - //CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; - - Thread.CurrentThread.CurrentCulture = cultureInfo; - Thread.CurrentThread.CurrentUICulture = cultureInfo; - } - - internal string GetString(string key) - { - return _resourceManager.GetString(key); - } - } -} diff --git a/Meade.net/Meade.net.csproj b/Meade.net/Meade.net.csproj index e5b1b9c..8156cd2 100644 --- a/Meade.net/Meade.net.csproj +++ b/Meade.net/Meade.net.csproj @@ -132,7 +132,6 @@ frmMain.cs - @@ -168,7 +167,6 @@ - diff --git a/Meade.net/Properties/AssemblyInfo.cs b/Meade.net/Properties/AssemblyInfo.cs index a2c5fb1..c906d0b 100644 --- a/Meade.net/Properties/AssemblyInfo.cs +++ b/Meade.net/Properties/AssemblyInfo.cs @@ -23,4 +23,4 @@ using System.Runtime.InteropServices; [assembly: AssemblyVersion("0.0.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")] -[assembly: ComVisibleAttribute(false)] +[assembly: ComVisible(false)] diff --git a/Meade.net/Properties/Resources.Designer.cs b/Meade.net/Properties/Resources.Designer.cs index 67c41c7..1f4ff11 100644 --- a/Meade.net/Properties/Resources.Designer.cs +++ b/Meade.net/Properties/Resources.Designer.cs @@ -69,5 +69,71 @@ namespace ASCOM.Meade.net.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized string similar to The {0} was not {1} because you did not allow it.. + /// + internal static string Server_ElevateSelf_The__0__was_not__1__because_you_did_not_allow_it_ { + get { + return ResourceManager.GetString("Server_ElevateSelf_The__0__was_not__1__because_you_did_not_allow_it_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to load served COM class assembly {0} - {1}. + /// + internal static string Server_LoadComObjectAssemblies_Failed_to_load_served_COM_class_assembly__0_____1_ { + get { + return ResourceManager.GetString("Server_LoadComObjectAssemblies_Failed_to_load_served_COM_class_assembly__0_____1_" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown argument: {0} + ///Valid are : -register, -unregister and -embedding. + /// + internal static string Server_ProcessArguments_ { + get { + return ResourceManager.GetString("Server_ProcessArguments_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to register class factory for {0}. + /// + internal static string Server_RegisterClassFactories_Failed_to_register_class_factory_for__0_ { + get { + return ResourceManager.GetString("Server_RegisterClassFactories_Failed_to_register_class_factory_for__0_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error while registering the server: + ///{0}. + /// + internal static string Server_RegisterObjects_ { + get { + return ResourceManager.GetString("Server_RegisterObjects_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} Settings ({1}). + /// + internal static string SetupDialogForm_SetupDialogForm__0__Settings___1__ { + get { + return ResourceManager.GetString("SetupDialogForm_SetupDialogForm__0__Settings___1__", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0:00.0}% of sidereal rate). + /// + internal static string SetupDialogForm_TextBox1_TextChanged___0_00_0___of_sidereal_rate_ { + get { + return ResourceManager.GetString("SetupDialogForm_TextBox1_TextChanged___0_00_0___of_sidereal_rate_", resourceCulture); + } + } } } diff --git a/Meade.net/Properties/Resources.resx b/Meade.net/Properties/Resources.resx index f4cef88..67a3869 100644 --- a/Meade.net/Properties/Resources.resx +++ b/Meade.net/Properties/Resources.resx @@ -121,4 +121,27 @@ ..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Unknown argument: {0} +Valid are : -register, -unregister and -embedding + + + Failed to register class factory for {0} + + + Error while registering the server: +{0} + + + The {0} was not {1} because you did not allow it. + + + Failed to load served COM class assembly {0} - {1} + + + ({0:00.0}% of sidereal rate) + + + {0} Settings ({1}) + \ No newline at end of file diff --git a/Meade.net/ReadMe.htm b/Meade.net/ReadMe.htm deleted file mode 100644 index 0a8dc80..0000000 --- a/Meade.net/ReadMe.htm +++ /dev/null @@ -1,666 +0,0 @@ - - - - - Untitled Document - - - - - - - - - - - - -
-

- ASCOM LocalServer (singleton) Host -

-
-

-
-
- -

-

- You have just created a local server (singleton) host for one or - more ASCOM driver classes. -

-
-

- This project implements an ASCOM host server for one or more - driver classes in a single-instance executable. It can be used to - serve multiple instances of a single driver class (hub), provide - driver services for multiple devices (e.g., Telescope and Focuser) to - multiple applications and allow multiple devices of the same type to - be connected. In the latter scenario, the multiple driver classes - will often share one or more resources such as the serial connection - and a microcontroller in the combined device. From the client's - perspective, using the drivers served by the local server is exactly - the same as if the drivers are loaded into the client's process space - (in-proc servers). -

-

- - NOTE: - - - Unless you are prepared to handle all of the timing issues that arise - when multiple clients are accessing the properties and methods of - your driver(s), stop now. Just because the local server serializes - the calls to your driver(s)' properties and methods does not mean - that there will be no timing or concurrency issues.
-  
For - example, suppose the hub serves instances of a Telescope driver. One - client sets the TargetRightAscension property, then another sets - TargetRightAscension to a different value, then the first client sets - TargetDeclination, then the first client calls SlewToTarget() - followed by the second client calling SlewToTarget(). Besides the - first client's slew command sending the scope to the wrong (and - possibly dangerous) coordinates, there is the problem of the second - client trying to slew a slewing scope. Local server drivers are - tricky to get right. There is no such thing as "ignorance is - bliss" here. - -
-

-

- - This implementation has changed - from what was defined for Platform 5.5 as follows: - -

-

- - The drivers are now installed in - the same folder as the local server executable. This makes deployment - cleaner because the whole driver can exist in a single folder - independently of other drivers. - -

-

- - The ProgId and friendly name as - displayed by the Chooser are defined using attributes. This allows - driver dlls to be identified clearly and so avoids confusion with - other dlls that may be required such as interop dlls. - -

-

- - Some changes have been made that - will facilitate generating multiple drivers of the same type. - -

-

- - I've put some additional advice and - comments in the notes below in italics. - -

-

- You're probably anxious to get going, but you really should read - through the Theory of Operation and - Detailed - Use and Deployment - below. -

-

You must do the following in order to complete your local server:

-
    -
  1. -

    - In the local server's project - properties, Application tab, change BOTH the AssemblyName and the - default assembly name to ASCOM.xxx (e.g., ASCOM.SuperScope). - This - may be done by default now. - -

    -
  2. -
  3. -

    - Add one or more driver skeleton - projects using the in-proc templates. You may use either the C# or - VB templates. Project name is not important (not used in ProgID) - choose something like TelescopeDriver. You will be changing the - substituted project name in these projects below. If you ensure that - the LocalServer and all the driver projects have the same NameSpace - e.g. ASCOM.SuperScope the renaming in section 6a will not be - required. -

    -
  4. -
  5. -

    - Develop and debug these driver - projects as normal in-process assemblies. This will be much simpler - because the driver and test code can be debugged in the same - process. -

    -
  6. -
  7. -

    - Build the LocalServer. -

    -
  8. -
  9. -

    - Set a reference to the local - server project in each of the driver skeleton - projects. -

    -
  10. -
  11. -

    In each skeleton driver project:

    -
      -
    1. -

      - Do a Find In Files for the - project name of the skeleton driver (e.g., TelescopeDriver) and - change it to match the project name of your local server (e.g. - SuperScope). You don't have to do this in the ReadMe.html file. - Everywhere else, however, is IMPORTANT. This sets the correct - namespace, progID, etc. If you're a bit more brave, you can use - Replace in Files. - This may not be needed if the correct - namespace and naming conventions have been followed when the - drivers and local server were generated. - -

      -
    2. -
    3. -

      - In project properties, - Application tab, change the assembly name to - ASCOM.localserverprojectname.drivertype, - (e.g., ASCOM.SuperScope.Telescope). -

      -
    4. -
    5. -

      - In project properties, - Application tab, click Assembly Information... -

      -
        -
      • -

        - Assure that Make assembly COM - visible is on (it should already be on). -

        -
      • -
      • -

        - Edit the Product Name to be the - "friendly name" of your driver as will be shown in the - Chooser. - Not used now, use the ServedClassName attribute - instead. - -

        -
      • -
      -
    6. -
    7. -

      - In project properties, Build tab, - turn off Register for COM Interop. -

      -
    8. -
    9. -

      - Modify the driver class declaration to inherit from - ReferenceCountedObjectBase. Examples:
      C#: -

      -
      -              public class Telescope :
      -              ReferenceCountedObjectBase,
      -              ITelescope
      -            
      -

      - VB: -

      -
      -              Public Class Telescope
      -              '==================================
      -              Inherits ReferenceCountedObjectBase
      -              Implements ITelescope
      -              '==================================
      -            
      -
    10. -
    11. -

      - In driver.cs/driver.vb, remove - the entire ASCOM Registration region -

      -
    12. -
    13. -

      - In driver.cs/driver.vb, remove - the private strings for driver ID and driver description. - They - may be needed internally, and if so should be set from the - associated attributes, ServedClassName for the description and - ProgId for the driver Id. - -

      -
    14. -
    15. -

      - Modify the class attributes by - adding the ServedClassName and ProgID attributes. The - ServedClassName attribute must be the friendly name shown as the - device name in the Chooser and the ProgId the progid of the driver - e.g. ASCOM.SuperScope.Telescope. The class header should look like - this: -

      -

      C#:

      -
      -              
      -                [Guid("0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B")]  // set by the template
      -                [ProgId("ASCOM.SuperScope.Telescope")]
      -                [ServedClassName ("Super Scope Telescope")]
      -                [ClassInterface(ClassInterfaceType.None)]
      -                public class Telescope : ReferenceCountedObjectBase , ITelescope
      -              
      -            
      -
    16. -
    -
  12. -
-

-
-

-
    -
      -

      VB:

      -
      -          
      -            <Guid(“0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B”)>
      -            <ProgId(“ASCOM.SuperScope.Telescope”)>
      -            <ServedClassName(“Super Scope Telescope”)>
      -            Public Class Telescope
      -            '==================================
      -            Inherits ReferenceCountedObjectBase
      -            Implements ITelescope
      -            '==================================
      -          
      -        
      -
    -
-

- Add the following line to the driver - constructor, this sets the driver ID using the ProgId Attribute: -

-
    -
      -

      C#

      -
      -          
      -            s_csDriverID = Marshal.GenerateProgIdForType(this.GetType());
      -          
      -        
      -

      VB:

      -
      -          
      -            s_csDriverID = Marshal.GenerateProgIdForType(Me.GetType())
      -          
      -        
      -
    -
  1. -

    - Unless you're writing a - single-driver hub, you will have two or more driver types (e.g. - Telescope and Focuser) and thus two or more driver assembly projects - added. Presumably, these drivers need to share some resources (e.g. - a single COM port via Helper.Serial). - Put shared resources into - the SharedResources class provided - . There are some examples that - should give a clue, modify and delete these as required. -

    -
  2. -
  3. -

    - A shared serial port is already - provided (see SharedResources.cs) as SharedResources.SharedSerial - and it is an ASCOM Helper Serial object. You may wish to define - additional shared resources in static member variables with public - static accessor properties as is already done for SharedSerial. - Unfortunately, if you are a Visual Basic programmer, you will have - to make these additions in C#. -

    -
  4. -
  5. -

    - If you are writing a hub and don't - need the serial port, in SharedResources.cs you can remove the - public static SharedSerial property, the m_SharedSerial member in - the private data region, and the line in main that initializes it. - If you don't need any other shared resources for your hub, then you - can remove the SharedResources.cs file completely. -

    -
  6. -
  7. -

    - If you modified the LocalServer, - build it again now. This will refresh the stuff that's visible to - the drivers. -

    -
  8. -
  9. -

    - Build the driver skeletons to - verify that you got all of the namespace and other variable changes. -

    -
  10. -
  11. -

    - The local server dynamically loads the driver assemblies from - the same folder as the local server executable.
    -
    During - development, you'll need to add a post-build task to each of your - driver assembly projects which puts a copy of the driver assembly - into the local server executable folder. Here is an example: -

    -
        copy "$(TargetPath)" "$(SolutionDir)\SuperScope\$(OutDir)\$(TargetFileName)"
    -

    - This assumes that the server project is called “SuperScope”, - and handles using the debug or release build.
    - Note the quotes for - possible path elements with spaces in them. - An alternative is to - set the build path to the required destination instead of the - default path. - -

    -
  12. -
  13. -

    - - Make sure the drivers are - registered through the local server by running it with the /register - parameter, see below for details. - -

    -
  14. -
  15. -

    - IMPORTANT: - With a local server based driver (or hub) it is possible for - multiple clients to control the device(s). It is up to you to - safeguard against abuse. - The sort of thing that's needed is to - have a counter of the number of connections to a device, the - connection is only fully broken when the number of connections is - zero. You may also need code to prevent several drivers from talking - to the hardware at the same time, the lock pattern is useful for - that. - -

    -
  16. -
  17. -

    - You may want to add controls and/or status information to the - main form frmMain of the local server. Please resist the temptation - to turn the local server's main form into a graphical device control - panel. Instead, make a separate application that uses the served - driver(s). A driver is not a program! -

    -
  18. -
-

Notes

-
    -
  • -

    - The local server handles all of - the registration and unregistration for each of its served driver - classes, including the ASCOM Chooser info and the DCOM/AppID info - needed for activation from TheSky. By running the server from a - command line and giving /register or /unregister as the command line - option, it will register or unregister all served classes - (respectively). - Never use REGASM - on the local server executable! - - This can be done in the - Visual Studio IDE by setting the server project to run as startup - and setting the command line argument to /register in Debug – - Start Options. - -

    -
  • -
  • -

    - When you make the installer for - your local server based driver/hub, do not let it register the - executable for COM. Instead, have it activate the installed local - server with the /register option. -

    -
  • -
  • -

    - The ASCOM registration uses the ServedClassName attribute as - the friendly name that will show in the chooser and the ProgId - attribute as the driver Id. -

    -
  • -
  • -

    - The best deployment way is to install all the files in a - folder that's a sub folder of the main driver, so the SuperScope - driver files will be in the folder ...\ASCOM\Telescope\SuperScope. - This can be done in the Inno script by changing the DefaultDirName - like this:
    - DefaultDirName="{cf}\ASCOM\Telescope\SuperScope"
    then - the files can all be installed with DestDir: {app}; -

    -
  • -
-

- Theory of Operation -

-

- The local server is an executable which can provide multiple - instances of multiple drivers to multiple clients. This capability is - needed for two applications: -

-
    -
  • -

    - A hub, which allows multiple - clients to share a single device -

    -
  • -
  • -

    - A device which provides multiple services, such as a - telescope which has a focuser built-in where both the telescope and - focuser are controlled by the same serial connection and different - client programs need to control to the focuser and telescope. -

    -
  • -
-

- By simply dropping suitably developed driver assemblies into the - same folder as the local server executable, the local server will - find them and register them for COM and ASCOM and serve any number of - instances of the drivers' interfaces to any number of client - programs. It does this by locating and loading the driver assemblies, - analysing them to detect their classes and interfaces, and - implementing a class factory that can create instances of them for - clients. -

-

- A driver is an assembly which contains a class that implements - one of the ASCOM standard driver interfaces and inherits the - ReferenceCountedObjectBase class of the local server. Apart from - that, driver assemblies are identical to those that are used - in-process (DLL-type). The instructions above detail the steps needed - to convert an in-process driver into one that can be served by the - local server. -

-

- The name of the local server is important, so we provide it as a - template from which you can create a local server for your - produce. To make this clear, let's assume that your company AlphaTech - produces a telescope system which contains a microcontroller that is - able to control not only the telescope mount, but also a focuser and - a camera rotator. The mount, focuser, and rotator are all controlled - via commands sent through a common serial line connecting the - computer to the microcontroller, so you need a local server. In - ASCOM, then, you probably want your system to appear as - AlphaTech.Telescope, AlphaTech.Focuser, and AlphaTech.Rotator. Then - you would name the local server AlphaTech. Be sure to give this due - consideration before creating the template, the project name is the - name of your local server. - Is this still correct? I get the - impression that ASCOM.AlphaTech.Server would be OK. - -

-

- The fact that driver classes inherit from the local server's - ReferenceCountedObjectBase class allows the local server to maintain - a reference count on the driver class. If a client creates an - instance of a served driver, the local server automatically starts up - and provides an instance of the class to the client. Once started the - local server can provide additional instances of any of its served - driver classes. If the reference count of all served classes drops to - zero as a result of clients releasing their instances, the local - server will automatically exit. -

-

- Registration services provided include not only the basic COM - class registration, but also DCOM/AppID info needed to use the served - classes from outbound connections from Software Bisque's TheSky. It - also registers the served classes for the ASCOM Chooser. The - "friendly" name of each served driver that appears in the - chooser comes from the driver's ServedClassName attribute. This also - used to identify a driver so that non driver dlls, such as Interop - dlls can be ignored. The COM ProgID for each served driver is - specified in the ProgId attribute - ASCOM.localservername.drivertype, - for example, ASCOM.AlphaTech.Telescope, where AlphaTech is the local - server name and Telescope is the type of the driver. Unregistering - removes all of this information from the system. Specifying the - ProgId as an attribute allows multiple driver assemblies to be - generated using the same source and namespace. This is used to - provide multiple instances of the same driver, each with a different - ProgId and so able to be registered separately. -

-

- Driver DLLs are identified for registering/unregistering because - they contain a type with the ServedClassName attribute. Only these - will be registered for Com and ASCOM. This has changed; in Platform - 5 there was no attribute and the local server attempted to register - all dlls. The new behaviour allows support dlls such as interop dlls - to be included without them being registered incorrectly. There was - also an interim version where the ServedClassName attribute was on - the assembly, not the class. - All these previous versions, and the - new drivers will operate together with Platform 6, the changes are - local to the individual drivers. - -

-

- Detailed Use and Deployment -

-

- Once you have built your local server and the served driver class - assemblies, here's how to use it. To register the served classes, - activate the local server from a shell command line with the option - /register (or /regserver, for VB6 compatibility): -

-
-      C:\xxx> localserver.exe /register
-    
-

- To unregister the local server and its drivers, activate the local - server from a shell command line with the option /unregister (or - /unregserver for VB6 compatibility): -

-
-      C:\xxx> localserver.exe /unregister
-    
-

- When the operating system starts the local server in response to a - client creating one of it's served driver classes, the command option - /embedding is included. The local server's code detects this and sets - a variable that you can use. -

-

- When deploying a hub or set of drivers - with the local server, you'll have to arrange for the local server - and the driver assemblies to be placed together in a folder in the - ASCOM driver folder. Any support files, such as Interop DLLs can be - put in the same fiolder. That's all you need to do, the local server - will find them in the same folder as it is located in. -

-
- - - - - - - -
- - - - - -
-

ASCOM Initiative

-
- -
-

-
-
- -

-
-

- The ASCOM Initiative consists of a group of astronomy software - developers and instrument vendors whose goals are to promote the - driver/client model and scripting automation. -

-

- See the - ASCOM - web site - for more information. Please participate in the - - ASCOM-Talk - Yahoo Group - . -

-
-
-

-
-
- -

-

-
-
- -

- - \ No newline at end of file diff --git a/Meade.net/SetupDialogForm.cs b/Meade.net/SetupDialogForm.cs index 6815a09..4067b83 100644 --- a/Meade.net/SetupDialogForm.cs +++ b/Meade.net/SetupDialogForm.cs @@ -1,7 +1,11 @@ using System; using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.IO.Ports; using System.Runtime.InteropServices; using System.Windows.Forms; +using ASCOM.Meade.net.Properties; namespace ASCOM.Meade.net { @@ -14,7 +18,13 @@ namespace ASCOM.Meade.net var assemblyInfo = new AssemblyInfo(); - Text = $"{assemblyInfo.Product} Settings ({assemblyInfo.AssemblyVersion})"; + Text = string.Format(Resources.SetupDialogForm_SetupDialogForm__0__Settings___1__, assemblyInfo.Product, assemblyInfo.AssemblyVersion); + } + + public sealed override string Text + { + get => base.Text; + set => base.Text = value; } private void cmdCancel_Click(object sender, EventArgs e) // Cancel button event handler @@ -26,7 +36,7 @@ namespace ASCOM.Meade.net { try { - System.Diagnostics.Process.Start("http://ascom-standards.org/"); + Process.Start("http://ascom-standards.org/"); } catch (Win32Exception noBrowser) { @@ -44,7 +54,7 @@ namespace ASCOM.Meade.net 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 + comboBoxComPort.Items.AddRange(SerialPort .GetPortNames()); // use System.IO because it's static // select the current port if possible if (comboBoxComPort.Items.Contains(profileProperties.ComPort)) @@ -52,7 +62,7 @@ namespace ASCOM.Meade.net comboBoxComPort.SelectedItem = profileProperties.ComPort; } - txtGuideRate.Text = profileProperties.GuideRateArcSecondsPerSecond.ToString(); + txtGuideRate.Text = profileProperties.GuideRateArcSecondsPerSecond.ToString(CultureInfo.CurrentCulture); try { cboPrecision.SelectedItem = profileProperties.Precision; @@ -86,15 +96,14 @@ namespace ASCOM.Meade.net 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); + var percentOfSideReal = newGuideRate / siderealArcSecondsPerSecond * 100; - lblPercentOfSiderealRate.Text = $"({percentOfSideReal:00.0}% of sidereal rate)"; + lblPercentOfSiderealRate.Text = string.Format(Resources.SetupDialogForm_TextBox1_TextChanged___0_00_0___of_sidereal_rate_, percentOfSideReal); _guideRateValid = true; } catch (Exception) @@ -103,17 +112,17 @@ namespace ASCOM.Meade.net _guideRateValid = false; } - UpdateOKButton(); + UpdateOkButton(); } - private void UpdateOKButton() + private void UpdateOkButton() { cmdOK.Enabled = _guideRateValid && (comboBoxComPort.SelectedItem != null); } private void ComboBoxComPort_SelectedValueChanged(object sender, EventArgs e) { - UpdateOKButton(); + UpdateOkButton(); } public void SetReadOnlyMode() diff --git a/Meade.net/SetupDialogForm.designer.cs b/Meade.net/SetupDialogForm.designer.cs index af1859b..10e1f06 100644 --- a/Meade.net/SetupDialogForm.designer.cs +++ b/Meade.net/SetupDialogForm.designer.cs @@ -1,3 +1,6 @@ +using System.ComponentModel; +using System.Windows.Forms; + namespace ASCOM.Meade.net { partial class SetupDialogForm @@ -5,7 +8,7 @@ namespace ASCOM.Meade.net /// /// Required designer variable. /// - private System.ComponentModel.IContainer components = null; + private IContainer components = null; /// /// Clean up any resources being used. @@ -162,18 +165,18 @@ namespace ASCOM.Meade.net #endregion - private System.Windows.Forms.Button cmdOK; - private System.Windows.Forms.Button cmdCancel; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.PictureBox picASCOM; - 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; + private Button cmdOK; + private Button cmdCancel; + private Label label1; + private PictureBox picASCOM; + private Label label2; + private CheckBox chkTrace; + private ComboBox comboBoxComPort; + private Label label3; + private TextBox txtGuideRate; + private Label label4; + private Label lblPercentOfSiderealRate; + private Label label5; + private ComboBox cboPrecision; } } \ No newline at end of file diff --git a/Meade.net/SetupDialogForm.resx b/Meade.net/SetupDialogForm.resx index 69e65d4..84d89dc 100644 --- a/Meade.net/SetupDialogForm.resx +++ b/Meade.net/SetupDialogForm.resx @@ -1,4 +1,4 @@ - +