From 21e7bcd530bc46d623e12cb9dea2a6314d188e5e Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 10 Mar 2021 19:25:27 +0000 Subject: [PATCH 1/8] Added support for the GW Command. Removed the implementation of Tracking Set as this does not do anything in the code. Set Can Set Tracking to false. Get tracking always returns true is the GW command is not supported. --- .../TelescopeUnitTests.cs | 23 +-- Meade.net.Telescope/Alignment.cs | 10 ++ Meade.net.Telescope/AlignmentStatus.cs | 11 ++ .../Meade.net.Telescope.csproj | 2 + Meade.net.Telescope/Telescope.cs | 131 ++++++++++++------ 5 files changed, 123 insertions(+), 54 deletions(-) create mode 100644 Meade.net.Telescope/Alignment.cs create mode 100644 Meade.net.Telescope/AlignmentStatus.cs diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index 16b330d..be47538 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -621,15 +621,18 @@ namespace Meade.net.Telescope.UnitTests } - [TestCase("A", AlignmentModes.algAltAz)] - [TestCase("P", AlignmentModes.algPolar)] - [TestCase("G", AlignmentModes.algGermanPolar)] - public void AlignmentMode_Get_WhenScopeInAltAz_ReturnsAltAz(string telescopeMode, AlignmentModes alignmentMode) + [TestCase("A", AlignmentModes.algAltAz, TelescopeList.Autostar497, TelescopeList.Autostar497_31Ee)] + [TestCase("P", AlignmentModes.algPolar, TelescopeList.Autostar497, TelescopeList.Autostar497_31Ee)] + [TestCase("A", AlignmentModes.algAltAz, TelescopeList.Autostar497, TelescopeList.Autostar497_43Eg)] + [TestCase("P", AlignmentModes.algPolar, TelescopeList.Autostar497, TelescopeList.Autostar497_43Eg)] + [TestCase("G", AlignmentModes.algGermanPolar, TelescopeList.Autostar497, TelescopeList.Autostar497_43Eg)] + public void AlignmentMode_Get_WhenScopeInAltAz_ReturnsAltAz(string telescopeMode, AlignmentModes alignmentMode, string productName, string firmware) { const char ack = (char)6; _sharedResourcesWrapperMock.Setup(x => x.SendChar(ack.ToString())).Returns(telescopeMode); + _sharedResourcesWrapperMock.Setup(x => x.SendString(":GW#")).Returns($"{telescopeMode}N0"); - ConnectTelescope(); + ConnectTelescope(productName, firmware); var actualResult = _telescope.AlignmentMode; @@ -897,11 +900,11 @@ namespace Meade.net.Telescope.UnitTests } [Test] - public void CanSetTracking_Get_ReturnsTrue() + public void CanSetTracking_Get_ReturnsFalse() { var result = _telescope.CanSetTracking; - Assert.That(result, Is.True); + Assert.That(result, Is.False); } [Test] @@ -2121,11 +2124,9 @@ namespace Meade.net.Telescope.UnitTests [TestCase(true)] [TestCase(false)] - public void Tracking_SetAndGet_WhenValueSet_ThenCanGetNewValue(bool tracking) + public void Tracking_Set_ThenThrowsNotImplementedException(bool tracking) { - _telescope.Tracking = tracking; - - Assert.That(_telescope.Tracking, Is.EqualTo( tracking)); + Assert.Throws( () => { _telescope.Tracking = tracking; } ); } [Test] diff --git a/Meade.net.Telescope/Alignment.cs b/Meade.net.Telescope/Alignment.cs new file mode 100644 index 0000000..7450c67 --- /dev/null +++ b/Meade.net.Telescope/Alignment.cs @@ -0,0 +1,10 @@ +namespace ASCOM.Meade.net +{ + public enum Alignment + { + NeedsAlignment, + OneStarAligned, + TwoStarAligned, + ThreeStarAligned + } +} \ No newline at end of file diff --git a/Meade.net.Telescope/AlignmentStatus.cs b/Meade.net.Telescope/AlignmentStatus.cs new file mode 100644 index 0000000..a602f5a --- /dev/null +++ b/Meade.net.Telescope/AlignmentStatus.cs @@ -0,0 +1,11 @@ +using ASCOM.DeviceInterface; + +namespace ASCOM.Meade.net +{ + public class AlignmentStatus + { + public AlignmentModes AlignmentMode { get; set; } + public bool Tracking { get; set; } + public Alignment Status { get; set; } + } +} \ No newline at end of file diff --git a/Meade.net.Telescope/Meade.net.Telescope.csproj b/Meade.net.Telescope/Meade.net.Telescope.csproj index cfae8a4..9b8c187 100644 --- a/Meade.net.Telescope/Meade.net.Telescope.csproj +++ b/Meade.net.Telescope/Meade.net.Telescope.csproj @@ -118,6 +118,8 @@ + + diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index ada8098..1008e89 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -510,7 +510,7 @@ namespace ASCOM.Meade.net private bool FirmwareIsGreaterThan(string minVersion) { var currentVersion = SharedResourcesWrapper.FirmwareVersion; - var comparison = String.Compare(currentVersion, minVersion, StringComparison.Ordinal); + var comparison = string.Compare(currentVersion, minVersion, StringComparison.Ordinal); return comparison >= 0; } @@ -830,47 +830,41 @@ namespace ASCOM.Meade.net CheckConnected("AlignmentMode Get"); - const char ack = (char) 6; - - var alignmentString = SharedResourcesWrapper.SendChar(ack.ToString()); - //ACK <0x06> Query of alignment mounting mode. - //Returns: - //A If scope in AltAz Mode - //D If scope is currently in the Downloader[Autostar II & Autostar] - //L If scope in Land Mode - //P If scope in Polar Mode - - //todo implement GW Command - Supported in Autostar 43Eg and above - //if FirmwareIsGreaterThan(TelescopeList.Autostar497_43EG) - //{ - //var alignmentString = SerialPort.CommandTerminated(":GW#", "#"); - //:GW# Get Scope Alignment Status - //Returns: # - // where: - //mount: A - AzEl mounted, P - Equatorially mounted, G - german mounted equatorial - //tracking: T - tracking, N - not tracking - //alignment: 0 - needs alignment, 1 - one star aligned, 2 - two star aligned, 3 - three star aligned. - //} - - AlignmentModes alignmentMode; - switch (alignmentString) + if (FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) { - case "A": - alignmentMode = AlignmentModes.algAltAz; - break; - case "P": - alignmentMode = AlignmentModes.algPolar; - break; - case "G": - alignmentMode = AlignmentModes.algGermanPolar; - break; - default: - throw new InvalidValueException( - $"unknown alignment returned from telescope: {alignmentString}"); + var alignmentStatus = GetScopeAlignmentStatus(); + return alignmentStatus.AlignmentMode; } + else + { + const char ack = (char)6; + //ACK <0x06> Query of alignment mounting mode. + //Returns: + //A If scope in AltAz Mode + //D If scope is currently in the Downloader[Autostar II & Autostar] + //L If scope in Land Mode + //P If scope in Polar Mode + var alignmentString = SharedResourcesWrapper.SendChar(ack.ToString()); + AlignmentModes alignmentMode; + switch (alignmentString) + { + case "A": + alignmentMode = AlignmentModes.algAltAz; + break; + case "P": + alignmentMode = AlignmentModes.algPolar; + break; + //case "G": + // alignmentMode = AlignmentModes.algGermanPolar; + // break; + default: + throw new InvalidValueException( + $"unknown alignment returned from telescope: {alignmentString}"); + } - LogMessage("AlignmentMode Get", $"alignmode = {alignmentMode}"); - return alignmentMode; + LogMessage("AlignmentMode Get", $"alignmode = {alignmentMode}"); + return alignmentMode; + } } set { @@ -901,6 +895,50 @@ namespace ASCOM.Meade.net //Returns: nothing } } + + private AlignmentStatus GetScopeAlignmentStatus() + { + var alignmentString = SharedResourcesWrapper.SendString(":GW#"); + //:GW# Get Scope Alignment Status + //Returns: # + // where: + //mount: A - AzEl mounted, P - Equatorially mounted, G - german mounted equatorial + //tracking: T - tracking, N - not tracking + //alignment: 0 - needs alignment, 1 - one star aligned, 2 - two star aligned, 3 - three star aligned. + + var alignmentStatus = new AlignmentStatus(); + switch (alignmentString[0]) + { + case 'A': + alignmentStatus.AlignmentMode = AlignmentModes.algAltAz; + break; + case 'P': + alignmentStatus.AlignmentMode = AlignmentModes.algPolar; + break; + case 'G': + alignmentStatus.AlignmentMode = AlignmentModes.algGermanPolar; + break; + } + alignmentStatus.Tracking = alignmentString[0] == 'T'; + switch (alignmentString[1]) + { + case '0': + alignmentStatus.Status = Alignment.NeedsAlignment; + break; + case '1': + alignmentStatus.Status = Alignment.OneStarAligned; + break; + case '2': + alignmentStatus.Status = Alignment.TwoStarAligned; + break; + case '3': + alignmentStatus.Status = Alignment.ThreeStarAligned; + break; + } + + + return alignmentStatus; + } public double Altitude { @@ -1111,8 +1149,8 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetTracking", "Get - " + true); - return true; + LogMessage("CanSetTracking", "Get - " + false); + return false; } } @@ -2236,12 +2274,19 @@ namespace ASCOM.Meade.net get { LogMessage("Tracking", $"Get - {_tracking}"); + if (FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) + { + var alignmentStatus = GetScopeAlignmentStatus(); + _tracking = alignmentStatus.Tracking; + } + return _tracking; } set { - LogMessage("Tracking Set", $"{value}"); - _tracking = value; + throw new ASCOM.NotImplementedException("Tracking Set"); + //LogMessage("Tracking Set", $"{value}"); + //_tracking = value; } } From a2abbbb3d086a15372aa98fabe6f40997a1ffcd6 Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Wed, 21 Apr 2021 17:24:40 +0100 Subject: [PATCH 2/8] Working on a possible side of pier implementation --- Meade.net.Telescope/Telescope.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index 1008e89..02bf7d0 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -1660,7 +1660,16 @@ namespace ASCOM.Meade.net get { LogMessage("SideOfPier Get", "Not implemented"); - throw new PropertyNotImplementedException("SideOfPier", false); + if (!FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) + throw new PropertyNotImplementedException("SideOfPier", false); + else + { + var alignmentStatus = GetScopeAlignmentStatus(); + if (alignmentStatus.AlignmentMode != AlignmentModes.algPolar) + throw new PropertyNotImplementedException("SideOfPier", false); + + //return + } } // ReSharper disable once ValueParameterNotUsed set From a3408a86c37425a9cbd56517b24fcb0267a72d7e Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Sun, 27 Jun 2021 18:57:17 +1000 Subject: [PATCH 3/8] Update unit tests to support GW command SideOfPier also supports German EQ --- .../TelescopeUnitTests.cs | 14 ++- Meade.net.Telescope/Alignment.cs | 4 +- Meade.net.Telescope/Telescope.cs | 91 ++++++++++--------- Meade.net/SharedResources.cs | 15 +-- Meade.net/Wrapper/SharedResourcesWrapper.cs | 6 ++ 5 files changed, 72 insertions(+), 58 deletions(-) diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index a917901..a5343bd 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -121,8 +121,9 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Object, _astroMathsMock.Object, _clockMock.Object, _novasMock.Object); } - private void ConnectTelescope(string productName = TelescopeList.Autostar497, string firmwareVersion = TelescopeList.Autostar497_31Ee) + private void ConnectTelescope(string productName = TelescopeList.Autostar497, string firmwareVersion = TelescopeList.Autostar497_31Ee, string alignmentStatus = "GT0") { + _sharedResourcesWrapperMock.Setup(x => x.SendChars("GW", false, 3)).Returns(alignmentStatus); _sharedResourcesWrapperMock.Setup(x => x.SendString("Gt", false)).Returns( () => _testProperties.SiteLatitudeString); _utilMock.Setup(x => x.DMSToDegrees(_testProperties.SiteLatitudeString)).Returns( () => _testProperties.SiteLatitudeValue); @@ -778,9 +779,8 @@ namespace Meade.net.Telescope.UnitTests { const char ack = (char)6; _sharedResourcesWrapperMock.Setup(x => x.SendChar(ack.ToString(), false)).Returns(telescopeMode); - _sharedResourcesWrapperMock.Setup(x => x.SendString("GW", false)).Returns($"{telescopeMode}N0"); - ConnectTelescope(productName, firmware); + ConnectTelescope(productName, firmware, $"{telescopeMode}N0"); var actualResult = _telescope.AlignmentMode; @@ -1942,7 +1942,7 @@ namespace Meade.net.Telescope.UnitTests _astroUtilsMock.Setup(x => x.ConditionHA(It.IsAny())).Returns(pHA => pHA < -12 ? pHA + 12 : pHA > 12 ? pHA - 12 : pHA); _astroUtilsMock.Setup(x => x.ConditionRA(It.IsAny())).Returns(pRA => pRA < 0 ? pRA + 24 : pRA >= 24 ? pRA - 24 : pRA); - ConnectTelescope(); + ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_43Eg); Assert.That(_connectionInfo.SameDevice, Is.EqualTo(1)); _telescope.SlewToCoordinates(ra, dec); @@ -2056,7 +2056,8 @@ namespace Meade.net.Telescope.UnitTests // Setup DestinationSideOfPier _astroUtilsMock.Setup(x => x.ConditionHA(It.IsAny())).Returns(pHA => pHA < -12 ? pHA + 12 : pHA > 12 ? pHA - 12 : pHA); - ConnectTelescope(); + // Use firmware that supports GW + ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_43Eg); // when _telescope.SlewToCoordinatesAsync(ra, dec); @@ -3203,7 +3204,6 @@ namespace Meade.net.Telescope.UnitTests _telescope.SlewToTarget(); _utilMock.Verify(x => x.WaitForMilliseconds(It.IsAny()), Times.Exactly(iterations)); - _astroUtilsMock.Verify(x => x.ConditionHA(It.IsAny()), Times.Once); } [Test] @@ -3298,7 +3298,6 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Verify(x => x.SendChar("MS", false), Times.Once); _utilMock.Verify(x => x.WaitForMilliseconds(It.IsAny()), Times.Exactly(iterations)); - _astroUtilsMock.Verify(x => x.ConditionHA(It.IsAny()), Times.Once); } [Test] @@ -3419,7 +3418,6 @@ namespace Meade.net.Telescope.UnitTests Assert.That(_telescope.TargetDeclination, Is.EqualTo(_testProperties.declination)); _sharedResourcesWrapperMock.Verify(x => x.SendChar("MS", false), Times.Once); _utilMock.Verify(x => x.WaitForMilliseconds(It.IsAny()), Times.Exactly(iterations)); - _astroUtilsMock.Verify(x => x.ConditionHA(It.IsAny()), Times.Once); } [Test] diff --git a/Meade.net.Telescope/Alignment.cs b/Meade.net.Telescope/Alignment.cs index 7450c67..78ef928 100644 --- a/Meade.net.Telescope/Alignment.cs +++ b/Meade.net.Telescope/Alignment.cs @@ -5,6 +5,8 @@ namespace ASCOM.Meade.net NeedsAlignment, OneStarAligned, TwoStarAligned, - ThreeStarAligned + ThreeStarAligned, + AlignedOnHome, + ScopeWasParked, } } \ No newline at end of file diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index e10c5ea..402375e 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -360,9 +360,6 @@ namespace ASCOM.Meade.net var result = SharedResourcesWrapper.SendBool(command, raw); LogMessage("CommandBool", "Completed: {0}", result); return result; - // or - //throw new MethodNotImplementedException("CommandBool"); - // DO NOT have both these sections! One or the other } public string CommandString(string command, bool raw) @@ -372,10 +369,19 @@ namespace ASCOM.Meade.net // it's a good idea to put all the low level communication with the device here, // then all communication calls this function // you need something to ensure that only one command is in progress at a time - var result = SharedResourcesWrapper.SendString(command, raw); - LogMessage("CommandBool", "Completed: {0}", result); + string result; + // :GW# is not terminated with a # for some reason, see reported comment + // https://bitbucket.org/cjdskunkworks/meadeautostar497/issues/24/get-set-tracking#comment-60586901 + if (command == (raw ? ":GW#" : "GW")) + { + result = SharedResourcesWrapper.SendChars(command, raw, count: 3); + } + else + { + result = SharedResourcesWrapper.SendString(command, raw); + } + LogMessage("CommandString", "Completed: {0}", result); return result; - //throw new ASCOM.MethodNotImplementedException("CommandString"); } public void Dispose() @@ -416,7 +422,6 @@ namespace ASCOM.Meade.net $"Connected to port {ComPort}. Product: {SharedResourcesWrapper.ProductName} Version:{SharedResourcesWrapper.FirmwareVersion}"); _userNewerPulseGuiding = IsNewPulseGuidingSupported(); - _tracking = true; LogMessage("Connected Set", $"New Pulse Guiding Supported: {_userNewerPulseGuiding}"); IsConnected = true; @@ -620,17 +625,13 @@ namespace ASCOM.Meade.net return false; } - // true iff the mount will perform a meridian flip when required - // TODO: Needs checking what mounts actually support this - private bool IsMeridianFlipOnSlewSupported() - { - if (SharedResourcesWrapper.ProductName == TelescopeList.LX200CLASSIC) - { - return false; - } + private bool IsGWCommandSupported() => FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg); - return true; - } + // true iff the mount will perform a meridian flip when required + // According to "A User's Guide to the Meade LXD55 and LXD75 Telescopes" Autostar supports meridian flip so + // we assume that for any telescope that supports the GW command and is not in Alt-Az mode then + // meridian flip on slew is supported + private bool IsMeridianFlipOnSlewSupported() => IsGWCommandSupported() && AlignmentMode != AlignmentModes.algAltAz; private bool FirmwareIsGreaterThan(string minVersion) { @@ -957,7 +958,7 @@ namespace ASCOM.Meade.net CheckConnected("AlignmentMode Get"); - if (FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) + if (IsGWCommandSupported()) { var alignmentStatus = GetScopeAlignmentStatus(); return alignmentStatus.AlignmentMode; @@ -998,7 +999,7 @@ namespace ASCOM.Meade.net CheckConnected("AlignmentMode Set"); //todo tidy this up into a better solution that means can :GW#, :AL#, :AA#, & :AP# and checked for Autostar properly - if (!FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) + if (!IsGWCommandSupported()) throw new PropertyNotImplementedException("AlignmentMode", true); switch (value) @@ -1025,13 +1026,14 @@ namespace ASCOM.Meade.net private AlignmentStatus GetScopeAlignmentStatus() { - var alignmentString = SharedResourcesWrapper.SendString("GW"); + var alignmentString = CommandString("GW", false); //:GW# Get Scope Alignment Status //Returns: # // where: //mount: A - AzEl mounted, P - Equatorially mounted, G - german mounted equatorial - //tracking: T - tracking, N - not tracking - //alignment: 0 - needs alignment, 1 - one star aligned, 2 - two star aligned, 3 - three star aligned. + //tracking: T - tracking, N - not tracking, S - sleeping + //alignment: 0 - needs alignment, 1 - one star aligned, 2 - two star aligned, 3 - three star aligned., H - Aligned on Home, P - Scope was parked + // https://www.cloudynights.com/topic/72166-lx-200-gps-serial-commands/ var alignmentStatus = new AlignmentStatus(); switch (alignmentString[0]) @@ -1046,8 +1048,8 @@ namespace ASCOM.Meade.net alignmentStatus.AlignmentMode = AlignmentModes.algGermanPolar; break; } - alignmentStatus.Tracking = alignmentString[0] == 'T'; - switch (alignmentString[1]) + alignmentStatus.Tracking = alignmentString[1] == 'T'; + switch (alignmentString[2]) { case '0': alignmentStatus.Status = Alignment.NeedsAlignment; @@ -1061,9 +1063,14 @@ namespace ASCOM.Meade.net case '3': alignmentStatus.Status = Alignment.ThreeStarAligned; break; + case 'H': + alignmentStatus.Status = Alignment.AlignedOnHome; + break; + case 'P': + alignmentStatus.Status = Alignment.ScopeWasParked; + break; } - return alignmentStatus; } @@ -1228,7 +1235,7 @@ namespace ASCOM.Meade.net switch (axis) { case TelescopeAxes.axisPrimary: return true; //RA or AZ - case TelescopeAxes.axisSecondary: return true; //Dev or Alt + case TelescopeAxes.axisSecondary: return true; //DEC or Alt case TelescopeAxes.axisTertiary: return false; //rotator / derotator default: throw new InvalidValueException("CanMoveAxis", axis.ToString(), "0 to 2"); } @@ -1890,24 +1897,25 @@ namespace ASCOM.Meade.net { get { - if (!FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) + if (!IsMeridianFlipOnSlewSupported()) { LogMessage("SideOfPier Get", "Not implemented"); throw new PropertyNotImplementedException("SideOfPier", false); } + + PierSide pierSide; + if (Slewing) + { + // because we update SideOfPier after initiating the slew command we return unknown while still slewing + pierSide = PierSide.pierUnknown; + } else { - var alignmentStatus = GetScopeAlignmentStatus(); - if (alignmentStatus.AlignmentMode != AlignmentModes.algPolar) - throw new PropertyNotImplementedException("SideOfPier", false); - - // while mount is slewing return unknown, this is required since - // DoSlewAsync updates _pierSide before slew is finished - var pierSide = Slewing ? PierSide.pierUnknown : SharedResourcesWrapper.SideOfPier; - - LogMessage("SideOfPier", "Get - " + pierSide); - return pierSide; + pierSide = SharedResourcesWrapper.SideOfPier; } + + LogMessage("SideOfPier", "Get - " + pierSide); + return pierSide; } // ReSharper disable once ValueParameterNotUsed set @@ -2594,19 +2602,18 @@ namespace ASCOM.Meade.net } } - private bool _tracking = true; public bool Tracking { get { - LogMessage("Tracking", $"Get - {_tracking}"); - if (FirmwareIsGreaterThan(TelescopeList.Autostar497_43Eg)) + LogMessage("Tracking", "Get"); + if (IsGWCommandSupported()) { var alignmentStatus = GetScopeAlignmentStatus(); - _tracking = alignmentStatus.Tracking; + return alignmentStatus.Tracking; } - return _tracking; + return true; } set { diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs index 6567a07..440b051 100644 --- a/Meade.net/SharedResources.cs +++ b/Meade.net/SharedResources.cs @@ -124,13 +124,17 @@ namespace ASCOM.Meade.net public static bool SendBool(string command, bool raw = false) { - var result = SendChar(command, raw); return result == "1"; } public static string SendChar(string command, bool raw = false) + { + return SendChars(command, raw, count: 1); + } + + public static string SendChars(string command, bool raw = false, int count = 1) { lock (LockObject) { @@ -141,14 +145,11 @@ namespace ASCOM.Meade.net try { - return SharedSerial.ReceiveCounted(1); + return SharedSerial.ReceiveCounted(count); } - catch (COMException ex) + catch (COMException ex) when (ex.Message.Contains("Timed out waiting for received data")) { - if (ex.Message.Contains("Timed out waiting for received data")) - throw new TimeoutException(ex.Message, ex); - - throw; + throw new TimeoutException(ex.Message, ex); } } } diff --git a/Meade.net/Wrapper/SharedResourcesWrapper.cs b/Meade.net/Wrapper/SharedResourcesWrapper.cs index 8e91bb7..84ecf4a 100644 --- a/Meade.net/Wrapper/SharedResourcesWrapper.cs +++ b/Meade.net/Wrapper/SharedResourcesWrapper.cs @@ -20,6 +20,7 @@ namespace ASCOM.Meade.net.Wrapper void SendBlind(string message, bool raw = false); bool SendBool(string command, bool raw = false); string SendChar(string message, bool raw = false); + string SendChars(string message, bool raw = false, int count = 1); string ReadTerminated(); @@ -94,6 +95,11 @@ namespace ASCOM.Meade.net.Wrapper return SharedResources.SendChar(message, raw); } + public string SendChars(string message, bool raw = false, int count = 1) + { + return SharedResources.SendChars(message, raw, count); + } + public string ReadTerminated() { return SharedResources.ReadTerminated(); From 90713de34bd9acf9bc90bc9355bda60e1a828a84 Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Mon, 28 Jun 2021 12:45:26 +1000 Subject: [PATCH 4/8] Moved parked SiteLat/Long to ParkedPosition data --- Meade.net.Telescope/Telescope.cs | 38 ++++++++++---------------------- Meade.net/ParkedPosition.cs | 2 ++ 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index 402375e..1cdb154 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -1383,7 +1383,6 @@ namespace ASCOM.Meade.net } } - private double _lastGoodDeclination; public double Declination { @@ -1402,7 +1401,6 @@ namespace ASCOM.Meade.net double declination = _utilities.DMSToDegrees(result); LogMessage("Declination", $"Get - {result} convert to {declination} {_utilitiesExtra.DegreesToDMS(declination, ":", ":")}"); - _lastGoodDeclination = declination; return declination; } catch (ParkedException) @@ -1689,7 +1687,9 @@ namespace ASCOM.Meade.net Altitude = Altitude, Azimuth = Azimuth, RightAscension = RightAscension, - Declination = Declination + Declination = Declination, + SiteLatitude = SiteLatitude, + SiteLongitude = SiteLongitude }; break; case ParkedBehaviour.ReportCoordinates: @@ -1703,7 +1703,9 @@ namespace ASCOM.Meade.net Altitude = ParkedAltAz.Altitude, Azimuth = ParkedAltAz.Azimuth, RightAscension = raDec.RightAscension, - Declination = raDec.Declination + Declination = raDec.Declination, + SiteLatitude = latitude, + SiteLongitude = longitude }; break; default: @@ -1837,7 +1839,6 @@ namespace ASCOM.Meade.net return _utilities.HMSToHours(hms); } - double _lastGoodRightAsension; public double RightAscension { @@ -1856,7 +1857,6 @@ namespace ASCOM.Meade.net double rightAscension = HmToHours(result); LogMessage("RightAscension", $"Get - {result} convert to {rightAscension} {_utilitiesExtra.HoursToHMS(rightAscension)}"); - _lastGoodRightAsension = rightAscension; return rightAscension; } catch (ParkedException) @@ -1983,7 +1983,6 @@ namespace ASCOM.Meade.net } } - private double? _lastGoodSiteLatitude; public double SiteLatitude { get @@ -2002,19 +2001,14 @@ namespace ASCOM.Meade.net { var siteLatitude = _utilities.DMSToDegrees(latitude); LogMessage("SiteLatitude Get", $"{_utilitiesExtra.DegreesToDMS(siteLatitude)}"); - - _lastGoodSiteLatitude = siteLatitude; return siteLatitude; } throw new InvalidOperationException("unable to get site latitude from telescope."); } - catch (ParkedException) + catch (ParkedException) when (ParkedBehaviour != ParkedBehaviour.NoCoordinates && SharedResourcesWrapper.ParkedPosition is var parkedPosition) { - if (ParkedBehaviour == ParkedBehaviour.NoCoordinates) - throw; - - return _lastGoodSiteLatitude.Value; + return parkedPosition.SiteLatitude; } } set @@ -2044,12 +2038,9 @@ namespace ASCOM.Meade.net //1 - Valid if (result != "1") throw new InvalidOperationException("Failed to set site latitude."); - - _lastGoodSiteLatitude = value; } } - private double _lastGoodSiteLongitude; public double SiteLongitude { @@ -2067,18 +2058,15 @@ namespace ASCOM.Meade.net double siteLongitude = -_utilities.DMSToDegrees(longitude); if (siteLongitude < -180) - siteLongitude = siteLongitude + 360; + siteLongitude += 360; LogMessage("SiteLongitude Get", $"{_utilitiesExtra.DegreesToDMS(siteLongitude)}"); - _lastGoodSiteLongitude = siteLongitude; + return siteLongitude; } - catch (ParkedException) + catch (ParkedException) when (ParkedBehaviour != ParkedBehaviour.NoCoordinates && SharedResourcesWrapper.ParkedPosition is var parkedPosition) { - if (ParkedBehaviour == ParkedBehaviour.NoCoordinates) - throw; - - return _lastGoodSiteLongitude; + return parkedPosition.SiteLongitude; } } set @@ -2113,8 +2101,6 @@ namespace ASCOM.Meade.net //1 - Valid if (result != "1") throw new InvalidOperationException("Failed to set site longitude."); - - _lastGoodSiteLongitude = value; } } diff --git a/Meade.net/ParkedPosition.cs b/Meade.net/ParkedPosition.cs index 29bbb9e..4423b22 100644 --- a/Meade.net/ParkedPosition.cs +++ b/Meade.net/ParkedPosition.cs @@ -6,5 +6,7 @@ namespace ASCOM.Meade.net public double Azimuth { get; set; } public double RightAscension { get; set; } public double Declination { get; set; } + public double SiteLongitude { get; set; } + public double SiteLatitude { get; set; } } } \ No newline at end of file From 631aa91d9466e7d8668d7348d8b84d0f4485f5e3 Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Mon, 28 Jun 2021 12:53:05 +1000 Subject: [PATCH 5/8] Moved IsTargetCoordinateInitRequired to SharedResourcesWrapper --- Meade.net.Telescope/Telescope.cs | 27 ++++++++++----------- Meade.net/SharedResources.cs | 7 ++++++ Meade.net/Wrapper/SharedResourcesWrapper.cs | 8 ++++++ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index 1cdb154..6505d85 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -142,7 +142,6 @@ namespace ASCOM.Meade.net private bool _isGuiding; - private bool _isTargetCoordinateInitRequired = true; // // PUBLIC COM INTERFACE ITelescopeV3 IMPLEMENTATION // @@ -648,16 +647,16 @@ namespace ASCOM.Meade.net if (SharedResourcesWrapper.ProductName != TelescopeList.LX200CLASSIC) return false; - if (!_isTargetCoordinateInitRequired) - return _isTargetCoordinateInitRequired; + if (!SharedResourcesWrapper.IsTargetCoordinateInitRequired) + return SharedResourcesWrapper.IsTargetCoordinateInitRequired; if (!IsConnected) return true; if (SharedResourcesWrapper.ProductName != TelescopeList.LX200CLASSIC) { - _isTargetCoordinateInitRequired = false; - return _isTargetCoordinateInitRequired; + SharedResourcesWrapper.IsTargetCoordinateInitRequired = false; + return SharedResourcesWrapper.IsTargetCoordinateInitRequired; } const double eps = 0.00001d; @@ -666,16 +665,16 @@ namespace ASCOM.Meade.net //target RA == 0 if (Math.Abs(rightTargetAscension) > eps) { - _isTargetCoordinateInitRequired = false; - return _isTargetCoordinateInitRequired; + SharedResourcesWrapper.IsTargetCoordinateInitRequired = false; + return SharedResourcesWrapper.IsTargetCoordinateInitRequired; } double targetDeclination = Declination; //target DE == 0 if (Math.Abs(targetDeclination) > eps) { - _isTargetCoordinateInitRequired = false; - return _isTargetCoordinateInitRequired; + SharedResourcesWrapper.IsTargetCoordinateInitRequired = false; + return SharedResourcesWrapper.IsTargetCoordinateInitRequired; } //target coordinates are equal current coordinates @@ -683,12 +682,12 @@ namespace ASCOM.Meade.net (Math.Abs(Declination - targetDeclination) <= eps)) { LogMessage("IsTargetCoordinateInitRequired", "0 diff -> false"); - _isTargetCoordinateInitRequired = false; - return _isTargetCoordinateInitRequired; + SharedResourcesWrapper.IsTargetCoordinateInitRequired = false; + return SharedResourcesWrapper.IsTargetCoordinateInitRequired; } - LogMessage("IsTargetCoordinateInitRequired", $"{_isTargetCoordinateInitRequired}"); - return _isTargetCoordinateInitRequired; + LogMessage("IsTargetCoordinateInitRequired", $"{SharedResourcesWrapper.IsTargetCoordinateInitRequired}"); + return SharedResourcesWrapper.IsTargetCoordinateInitRequired; } private void InitTargetCoordinates() @@ -702,7 +701,7 @@ namespace ASCOM.Meade.net SyncToCoordinates(raAndDec.RightAscension, raAndDec.Declination); //do it only once - _isTargetCoordinateInitRequired = false; + SharedResourcesWrapper.IsTargetCoordinateInitRequired = false; } catch (Exception ex) { diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs index 440b051..30c5cc2 100644 --- a/Meade.net/SharedResources.cs +++ b/Meade.net/SharedResources.cs @@ -576,5 +576,12 @@ namespace ASCOM.Meade.net get => _earliestNonSlewingTime; internal set => _earliestNonSlewingTime.Set(value); } + + private static readonly ThreadSafeValue _isTargetCoordinateInitRequired = true; + public static bool IsTargetCoordinateInitRequired + { + get => _isTargetCoordinateInitRequired; + internal set => _isTargetCoordinateInitRequired.Set(value); + } } } \ No newline at end of file diff --git a/Meade.net/Wrapper/SharedResourcesWrapper.cs b/Meade.net/Wrapper/SharedResourcesWrapper.cs index 84ecf4a..33f42a1 100644 --- a/Meade.net/Wrapper/SharedResourcesWrapper.cs +++ b/Meade.net/Wrapper/SharedResourcesWrapper.cs @@ -47,6 +47,8 @@ namespace ASCOM.Meade.net.Wrapper bool MovingSecondary { get; set; } DateTime EarliestNonSlewingTime { get; set; } + + bool IsTargetCoordinateInitRequired { get; set; } } public class SharedResourcesWrapper : ISharedResourcesWrapper @@ -181,5 +183,11 @@ namespace ASCOM.Meade.net.Wrapper get => SharedResources.EarliestNonSlewingTime; set => SharedResources.EarliestNonSlewingTime = value; } + + public bool IsTargetCoordinateInitRequired + { + get => SharedResources.IsTargetCoordinateInitRequired; + set => SharedResources.IsTargetCoordinateInitRequired = value; + } } } From 77c87a51fa2502fc17b29f89a4ceb06f0f5ac72d Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Mon, 28 Jun 2021 13:03:07 +1000 Subject: [PATCH 6/8] Moved IsGuiding to SharedResourcesWrapper --- .../TelescopeUnitTests.cs | 2 ++ Meade.net.Telescope/Telescope.cs | 14 ++++++-------- Meade.net/SharedResources.cs | 7 +++++++ Meade.net/Wrapper/SharedResourcesWrapper.cs | 8 ++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index a5343bd..0276cfe 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -145,6 +145,8 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.SetupGet(x => x.IsParked).Returns(() => _isParked); _sharedResourcesWrapperMock.SetupGet(x => x.ParkedPosition).Returns(() => _parkedPosition); + _sharedResourcesWrapperMock.SetupProperty(x => x.IsGuiding); + _astroMathsMock .Setup(x => x.ConvertHozToEq(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(() => new EquatorialCoordinates { Declination = _testProperties.declination, RightAscension = _testProperties.rightAscension }); diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index 6505d85..7f4afcd 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -140,8 +140,6 @@ namespace ASCOM.Meade.net Initialise(nameof(Telescope)); } - private bool _isGuiding; - // // PUBLIC COM INTERFACE ITelescopeV3 IMPLEMENTATION // @@ -1607,7 +1605,7 @@ namespace ASCOM.Meade.net switch (rate.Compare(0)) { case ComparisonResult.Equals: - if (!_isGuiding) + if (!SharedResourcesWrapper.IsGuiding) { SetSlewingMinEndTime(); } @@ -1638,7 +1636,7 @@ namespace ASCOM.Meade.net switch (rate.Compare(0)) { case ComparisonResult.Equals: - if (!_isGuiding) + if (!SharedResourcesWrapper.IsGuiding) { SetSlewingMinEndTime(); } @@ -1731,7 +1729,7 @@ namespace ASCOM.Meade.net if (IsSlewingToTarget()) throw new InvalidOperationException("Unable to PulseGuide whilst slewing to target."); - _isGuiding = true; + SharedResourcesWrapper.IsGuiding = true; try { if (SharedResourcesWrapper.MovingPrimary && @@ -1814,7 +1812,7 @@ namespace ASCOM.Meade.net } finally { - _isGuiding = false; + SharedResourcesWrapper.IsGuiding = false; } } catch (Exception ex) @@ -2306,7 +2304,7 @@ namespace ASCOM.Meade.net private bool MovingAxis() { - if (_isGuiding) + if (SharedResourcesWrapper.IsGuiding) return false; return SharedResourcesWrapper.MovingPrimary || SharedResourcesWrapper.MovingSecondary; @@ -2358,7 +2356,7 @@ namespace ASCOM.Meade.net { CheckConnected("IsSlewingToTarget"); - if (_isGuiding) + if (SharedResourcesWrapper.IsGuiding) return false; string result; diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs index 30c5cc2..975b093 100644 --- a/Meade.net/SharedResources.cs +++ b/Meade.net/SharedResources.cs @@ -583,5 +583,12 @@ namespace ASCOM.Meade.net get => _isTargetCoordinateInitRequired; internal set => _isTargetCoordinateInitRequired.Set(value); } + + private static readonly ThreadSafeValue _isGuiding = false; + public static bool IsGuiding + { + get => _isGuiding; + internal set => _isGuiding.Set(value); + } } } \ No newline at end of file diff --git a/Meade.net/Wrapper/SharedResourcesWrapper.cs b/Meade.net/Wrapper/SharedResourcesWrapper.cs index 33f42a1..754f341 100644 --- a/Meade.net/Wrapper/SharedResourcesWrapper.cs +++ b/Meade.net/Wrapper/SharedResourcesWrapper.cs @@ -49,6 +49,8 @@ namespace ASCOM.Meade.net.Wrapper DateTime EarliestNonSlewingTime { get; set; } bool IsTargetCoordinateInitRequired { get; set; } + + bool IsGuiding { get; set; } } public class SharedResourcesWrapper : ISharedResourcesWrapper @@ -189,5 +191,11 @@ namespace ASCOM.Meade.net.Wrapper get => SharedResources.IsTargetCoordinateInitRequired; set => SharedResources.IsTargetCoordinateInitRequired = value; } + + public bool IsGuiding + { + get => SharedResources.IsGuiding; + set => SharedResources.IsGuiding = value; + } } } From 8478af26bf4aaf4476459e50948a23b309263d7f Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Mon, 28 Jun 2021 14:16:00 +1000 Subject: [PATCH 7/8] Implemented TrackingRate via GT --- .../TelescopeUnitTests.cs | 10 +++++++++ Meade.net.Telescope/Telescope.cs | 21 +++++-------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index 0276cfe..7536c95 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -53,6 +53,7 @@ namespace Meade.net.Telescope.UnitTests private bool _isParked; private ParkedPosition _parkedPosition; + private string _trackingRate; [SetUp] public void Setup() @@ -134,6 +135,12 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Setup(x => x.SendString("GL", false)).Returns(() => _testProperties.telescopeTime); _sharedResourcesWrapperMock.Setup(x => x.SendString("GG", false)).Returns(() => _testProperties.telescopeUtcCorrection); + const string siderealTrackingRate = "+60.1"; + _trackingRate = siderealTrackingRate; + _sharedResourcesWrapperMock.Setup(x => x.SendString("GT", false)).Returns(() => _trackingRate); + _sharedResourcesWrapperMock.Setup(x => x.SendBlind("TL", false)).Callback(() => _trackingRate = "lunar"); + _sharedResourcesWrapperMock.Setup(x => x.SendBlind("TQ", false)).Callback(() => _trackingRate = siderealTrackingRate); + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => productName); _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => firmwareVersion); @@ -2672,7 +2679,10 @@ namespace Meade.net.Telescope.UnitTests _telescope.TrackingRate = rate; + Assert.That(_telescope.TrackingRate, Is.EqualTo(rate)); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(commandString, false), Times.Once); + _sharedResourcesWrapperMock.Verify(x => x.SendString("GT", false), Times.Once); } [Test] diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index 7f4afcd..a3c5e1e 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -2606,26 +2606,17 @@ namespace ASCOM.Meade.net } } - private DriveRates _trackingRate = DriveRates.driveSidereal; - public DriveRates TrackingRate { get { - //todo implement this with the GW command - //var result = SerialPort.CommandTerminated(":GT#", "#"); + var rate = CommandString("GT", false); - //double rate = double.Parse(result); + if (rate == "+60.1") + return DriveRates.driveSidereal; - - //if (rate == 60.1) - // return DriveRates.driveLunar; - //else if (rate == 60.1) - // return DriveRates.driveSidereal; - - //return DriveRates.driveKing; - LogMessage("TrackingRate Get", $"{_trackingRate}"); - return _trackingRate; + // we only support two rates ATM so return lunar tracking rate + return DriveRates.driveLunar; } set { @@ -2657,8 +2648,6 @@ namespace ASCOM.Meade.net default: throw new ArgumentOutOfRangeException(nameof(value), value, null); } - - _trackingRate = value; } } From 64df8282a06fbedfee07e998ecf22e236489b4f3 Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Mon, 28 Jun 2021 16:33:46 +1000 Subject: [PATCH 8/8] Support Set Tracking when GW is supported --- .../TelescopeUnitTests.cs | 69 +++++++++++++------ Meade.net.Telescope/Telescope.cs | 15 ++-- .../SharedResourcesUnitTests.cs | 6 ++ 3 files changed, 64 insertions(+), 26 deletions(-) diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index 7536c95..0b9a1d9 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -18,20 +18,23 @@ namespace Meade.net.Telescope.UnitTests { public class TestProperties { - internal string telescopeRaResult = "HH:MM:SS"; - internal double rightAscension = 1.2; //todo rename to declination; - internal double declination = 45; + internal string telescopeRaResult { get; set; } = "HH:MM:SS"; + internal double rightAscension { get; set; } = 1.2; //todo rename to declination; + internal double declination { get; set; } = 45; - internal string SiteLatitudeString = "testLatString"; - internal double SiteLatitudeValue = 123.45; + internal string SiteLatitudeString { get; set; } = "testLatString"; + internal double SiteLatitudeValue { get; set; } = 123.45; - internal string telescopeDate = "10/15/20"; - internal string telescopeTime = "20:15:10"; - internal string telescopeUtcCorrection = "-1.0"; + internal string telescopeDate { get; set; } = "10/15/20"; + internal string telescopeTime { get; set; } = "20:15:10"; + internal string telescopeUtcCorrection { get; set; } = "-1.0"; - internal double hourAngle; - internal int telescopeAltitude = 45; - internal int telescopeAzimuth = 200; + internal double hourAngle { get; set; } + internal int telescopeAltitude { get; set; } = 45; + internal int telescopeAzimuth { get; set; } = 200; + + internal char[] AlignmentStatus { get; set; } + internal string TrackingRate { get; set; } } [TestFixture] @@ -53,7 +56,6 @@ namespace Meade.net.Telescope.UnitTests private bool _isParked; private ParkedPosition _parkedPosition; - private string _trackingRate; [SetUp] public void Setup() @@ -124,7 +126,12 @@ namespace Meade.net.Telescope.UnitTests private void ConnectTelescope(string productName = TelescopeList.Autostar497, string firmwareVersion = TelescopeList.Autostar497_31Ee, string alignmentStatus = "GT0") { - _sharedResourcesWrapperMock.Setup(x => x.SendChars("GW", false, 3)).Returns(alignmentStatus); + _testProperties.AlignmentStatus = alignmentStatus.ToCharArray(); + + _sharedResourcesWrapperMock.Setup(x => x.SendChars("GW", false, 3)).Returns(() => new string(_testProperties.AlignmentStatus)); + _sharedResourcesWrapperMock.Setup(x => x.SendBlind("AP", false)).Callback(() => _testProperties.AlignmentStatus[1] = 'T'); + _sharedResourcesWrapperMock.Setup(x => x.SendBlind("AL", false)).Callback(() => _testProperties.AlignmentStatus[1] = 'N'); + _sharedResourcesWrapperMock.Setup(x => x.SendString("Gt", false)).Returns( () => _testProperties.SiteLatitudeString); _utilMock.Setup(x => x.DMSToDegrees(_testProperties.SiteLatitudeString)).Returns( () => _testProperties.SiteLatitudeValue); @@ -136,10 +143,10 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Setup(x => x.SendString("GG", false)).Returns(() => _testProperties.telescopeUtcCorrection); const string siderealTrackingRate = "+60.1"; - _trackingRate = siderealTrackingRate; - _sharedResourcesWrapperMock.Setup(x => x.SendString("GT", false)).Returns(() => _trackingRate); - _sharedResourcesWrapperMock.Setup(x => x.SendBlind("TL", false)).Callback(() => _trackingRate = "lunar"); - _sharedResourcesWrapperMock.Setup(x => x.SendBlind("TQ", false)).Callback(() => _trackingRate = siderealTrackingRate); + _testProperties.TrackingRate = siderealTrackingRate; + _sharedResourcesWrapperMock.Setup(x => x.SendString("GT", false)).Returns(() => _testProperties.TrackingRate); + _sharedResourcesWrapperMock.Setup(x => x.SendBlind("TL", false)).Callback(() => _testProperties.TrackingRate = "lunar"); + _sharedResourcesWrapperMock.Setup(x => x.SendBlind("TQ", false)).Callback(() => _testProperties.TrackingRate = siderealTrackingRate); _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => productName); _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => firmwareVersion); @@ -1121,12 +1128,15 @@ namespace Meade.net.Telescope.UnitTests Assert.That(result, Is.False); } - [Test] - public void CanSetTracking_Get_ReturnsFalse() + [TestCase(TelescopeList.Autostar497_30Ee, false)] + [TestCase(TelescopeList.Autostar497_43Eg, true)] + public void CanSetTracking_Get_ReturnsTrueIffGWCommandIsSupported(string firmware, bool supported) { + ConnectTelescope(firmwareVersion: firmware); + var result = _telescope.CanSetTracking; - Assert.That(result, Is.False); + Assert.That(result, Is.EqualTo(supported)); } [Test] @@ -2659,11 +2669,28 @@ namespace Meade.net.Telescope.UnitTests [TestCase(true)] [TestCase(false)] - public void Tracking_Set_ThenThrowsNotImplementedException(bool tracking) + public void Tracking_Set_WhenCanSetTrackingIsFalse_ThenThrowsNotImplementedException(bool tracking) { + // GW is not supported, so CanSetTracking is false + ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_30Ee); + Assert.Throws( () => { _telescope.Tracking = tracking; } ); } + [TestCase(true, "AP")] + [TestCase(false, "AL")] + public void Tracking_Set_WhenCanSetTrackingIsTrue_ThenValueIsUpdated(bool tracking, string alignmentCommand) + { + // GW is supported, so CanSetTracking is true + ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_43Eg); + + _telescope.Tracking = tracking; + + Assert.That(_telescope.Tracking, Is.EqualTo(tracking)); + + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(alignmentCommand, false), Times.Once); + } + [Test] public void TrackingRate_Set_WhenNotConnected_ThenThrowsException() { diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index a3c5e1e..2c8928e 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -1309,8 +1309,9 @@ namespace ASCOM.Meade.net { get { - LogMessage("CanSetTracking", "Get - " + false); - return false; + var canSetTracking = IsGWCommandSupported(); + LogMessage("CanSetTracking", "Get - " + canSetTracking); + return canSetTracking; } } @@ -2600,9 +2601,13 @@ namespace ASCOM.Meade.net } set { - throw new ASCOM.NotImplementedException("Tracking Set"); - //LogMessage("Tracking Set", $"{value}"); - //_tracking = value; + if (!CanSetTracking) + { + throw new ASCOM.NotImplementedException("Tracking Set"); + } + + LogMessage("Tracking Set", $"{value}"); + SharedResourcesWrapper.SendBlind(value ? "AP" : "AL"); } } diff --git a/Meade.net.UnitTests/SharedResourcesUnitTests.cs b/Meade.net.UnitTests/SharedResourcesUnitTests.cs index 8c5fb79..b9becdf 100644 --- a/Meade.net.UnitTests/SharedResourcesUnitTests.cs +++ b/Meade.net.UnitTests/SharedResourcesUnitTests.cs @@ -649,5 +649,11 @@ namespace Meade.net.UnitTests [Test] public void CheckTargetRightAscensionIsNullByDefault() => Assert.That(SharedResources.TargetRightAscension.HasValue, Is.False); + + [Test] + public void CheckIsTargetCoordinateInitRequired() => Assert.That(SharedResources.IsTargetCoordinateInitRequired, Is.True); + + [Test] + public void CheckIsGuiding() => Assert.That(SharedResources.IsGuiding, Is.False); } }