From 650fc04bcaa97983579f118f29e71f6b17b90e12 Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Mon, 16 May 2022 18:59:55 +0100 Subject: [PATCH] Changing how side of pier is calculated. --- .../TelescopeUnitTests.cs | 276 +++++++++--------- Meade.net.Telescope/Telescope.cs | 41 +-- Meade.net/Wrapper/SharedResourcesWrapper.cs | 3 +- 3 files changed, 150 insertions(+), 170 deletions(-) diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index 0498a75..6ef8ca5 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -110,7 +110,6 @@ namespace Meade.net.Telescope.UnitTests _sharedResourcesWrapperMock.Setup(x => x.ReadProfile()).Returns(_profileProperties); _sharedResourcesWrapperMock - .SetupProperty(x => x.SideOfPier) .SetupProperty(x => x.TargetRightAscension) .SetupProperty(x => x.TargetDeclination) .SetupProperty(x => x.SlewSettleTime) @@ -1314,8 +1313,8 @@ namespace Meade.net.Telescope.UnitTests [TestCase(1, -1, 4, PierSide.pierEast)] [TestCase(4, 1, 1, PierSide.pierWest)] [TestCase(4, -1, 1, PierSide.pierWest)] - [TestCase(0, 0, 0, PierSide.pierUnknown)] - [TestCase(5, 0, 5, PierSide.pierUnknown)] + [TestCase(0, 0, 0, PierSide.pierWest)] + [TestCase(5, 0, 5, PierSide.pierWest)] [TestCase(23.8, 1, 23.9, PierSide.pierEast)] [TestCase(23.8, -1, 23.9, PierSide.pierEast)] [TestCase(23.9, 1, 1, PierSide.pierEast)] @@ -1326,9 +1325,6 @@ namespace Meade.net.Telescope.UnitTests { // given - // deterministic start - _sharedResourcesWrapperMock.Object.SideOfPier = PierSide.pierUnknown; - // SideralTime uses ConditionRA to normalize to [0..24h), so we use it to mock the property _astroUtilsMock.Setup(x => x.ConditionRA(It.IsAny())).Returns(siderealTime); @@ -2024,172 +2020,172 @@ namespace Meade.net.Telescope.UnitTests Assert.That(excpetion.AccessorSet, Is.True); } - [TestCase(0, 34, PierSide.pierEast)] - [TestCase(12, 34, PierSide.pierEast)] - [TestCase(23.4, 34, PierSide.pierWest)] - public void SideOfPier_WhenSecondConnectionMade_ThenValueIsPreserved(double ra, double dec, PierSide expectedPierSide) - { - _sharedResourcesWrapperMock.Setup(x => x.SendChar("MS", false)).Returns("0"); - _utilMock.Setup(x => x.HMSToHours(null)).Returns(ra); - _utilMock.Setup(x => x.DMSToDegrees(null)).Returns(dec); - _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); + //[TestCase(0, 34, PierSide.pierEast)] + //[TestCase(12, 34, PierSide.pierEast)] + //[TestCase(23.4, 34, PierSide.pierWest)] + //public void SideOfPier_WhenSecondConnectionMade_ThenValueIsPreserved(double ra, double dec, PierSide expectedPierSide) + //{ + // _sharedResourcesWrapperMock.Setup(x => x.SendChar("MS", false)).Returns("0"); + // _utilMock.Setup(x => x.HMSToHours(null)).Returns(ra); + // _utilMock.Setup(x => x.DMSToDegrees(null)).Returns(dec); + // _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(firmwareVersion: TelescopeList.Autostar497_43Eg); - Assert.That(_connectionInfo.SameDevice, Is.EqualTo(1)); + // ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_43Eg); + // Assert.That(_connectionInfo.SameDevice, Is.EqualTo(1)); - _telescope.SlewToCoordinates(ra, dec); - var sideOfPierAfterSlew = _telescope.SideOfPier; + // _telescope.SlewToCoordinates(ra, dec); + // var sideOfPierAfterSlew = _telescope.SideOfPier; - Assert.That(sideOfPierAfterSlew, Is.EqualTo(expectedPierSide)); + // Assert.That(sideOfPierAfterSlew, Is.EqualTo(expectedPierSide)); - var secondTelescopeInstance = - new ASCOM.Meade.net.Telescope(_utilMock.Object, _utilExtraMock.Object, _astroUtilsMock.Object, - _sharedResourcesWrapperMock.Object, _astroMathsMock.Object, _clockMock.Object, _novasMock.Object); + // var secondTelescopeInstance = + // new ASCOM.Meade.net.Telescope(_utilMock.Object, _utilExtraMock.Object, _astroUtilsMock.Object, + // _sharedResourcesWrapperMock.Object, _astroMathsMock.Object, _clockMock.Object, _novasMock.Object); - Assert.That(secondTelescopeInstance.Connected, Is.False); + // Assert.That(secondTelescopeInstance.Connected, Is.False); - _connectionInfo.SameDevice = 2; - secondTelescopeInstance.Connected = true; + // _connectionInfo.SameDevice = 2; + // secondTelescopeInstance.Connected = true; - Assert.That(secondTelescopeInstance.SideOfPier, Is.EqualTo(sideOfPierAfterSlew)); + // Assert.That(secondTelescopeInstance.SideOfPier, Is.EqualTo(sideOfPierAfterSlew)); - _sharedResourcesWrapperMock.Verify(x => x.SendChar("MS", false), Times.Once); - _utilMock.Verify(x => x.HMSToHours(null), Times.Once); - _utilMock.Verify(x => x.DMSToDegrees(null), Times.AtLeast(2)); - _astroUtilsMock.Verify(x => x.ConditionHA(It.IsAny()), Times.Once); - _astroUtilsMock.Verify(x => x.ConditionRA(It.IsAny()), Times.Once); - } + // _sharedResourcesWrapperMock.Verify(x => x.SendChar("MS", false), Times.Once); + // _utilMock.Verify(x => x.HMSToHours(null), Times.Once); + // _utilMock.Verify(x => x.DMSToDegrees(null), Times.AtLeast(2)); + // _astroUtilsMock.Verify(x => x.ConditionHA(It.IsAny()), Times.Once); + // _astroUtilsMock.Verify(x => x.ConditionRA(It.IsAny()), Times.Once); + //} delegate void NovasSiderealTimeDelegate(double jdHigh, double jdLow, double jdDelta, GstType gstType, Method method, Accuracy accuracy, ref double sideralTime); /// /// Test cases obtained via .NET telescope simulator /// - [TestCase(9.4337648353882, -76.7178112042103, "2021-06-07T05:23:41.7610000Z", 8.13556526999591, 145.166333333333, 2d, PierSide.pierWest, PierSide.pierEast)] - [TestCase(10.1581570159006, 11.8639491368916, "2021-06-07T10:59:19.7000000Z", 9.72726050605156, 145.166333333333, 1d, PierSide.pierWest, PierSide.pierEast)] - [TestCase(9.66583199112222, 81.2310578173083, "2021-06-07T11:19:24.5540000Z", 7.73744116673785, 110.285166666667, 2d, PierSide.pierWest, PierSide.pierEast)] - [TestCase(8.32978972808615, -29.816491813155, "2021-06-07T11:29:33.7040000Z", 7.90712206850482, 110.285166666667, 1d, PierSide.pierWest, PierSide.pierEast)] - [TestCase(1.76405553984887, 60.7756226366989, "2021-06-07T11:34:07.5270000Z", 0.214893775091689, -6.24266666666667, 2d, PierSide.pierWest, PierSide.pierEast)] - [TestCase(0.523375885742411, -33.1288722052936, "2021-06-07T11:38:25.1670000Z", 0.286661722506396, -6.24266666666667, 0.5d, PierSide.pierWest, PierSide.pierEast)] - public void SideOfPier_WhenTrackingThroughMeridianAfterSubsequentGoto_ThenAMeridianFlipIsPerformed( - double ra, - double dec, - string jnowTimeStr, /* JNOW of object before transit */ - double jnowSiderealTime, - double siteLongitude, - double trackingTimeHours, - PierSide pierSideBeforeTransit, - PierSide pierSideAfterRetargeting - ) - { - // given - var jnowTime = DateTimeOffset.ParseExact(jnowTimeStr, "o", CultureInfo.InvariantCulture).UtcDateTime; - var trackingTimeDiff = TimeSpan.FromHours(trackingTimeHours); - var timeAfterTracking = jnowTime + trackingTimeDiff; - var raAsHMS = ra + "HMS"; - var decAsDMS = dec + "DMS"; - var currentTime = jnowTime; + //[TestCase(9.4337648353882, -76.7178112042103, "2021-06-07T05:23:41.7610000Z", 8.13556526999591, 145.166333333333, 2d, PierSide.pierWest, PierSide.pierEast)] + //[TestCase(10.1581570159006, 11.8639491368916, "2021-06-07T10:59:19.7000000Z", 9.72726050605156, 145.166333333333, 1d, PierSide.pierWest, PierSide.pierEast)] + //[TestCase(9.66583199112222, 81.2310578173083, "2021-06-07T11:19:24.5540000Z", 7.73744116673785, 110.285166666667, 2d, PierSide.pierWest, PierSide.pierEast)] + //[TestCase(8.32978972808615, -29.816491813155, "2021-06-07T11:29:33.7040000Z", 7.90712206850482, 110.285166666667, 1d, PierSide.pierWest, PierSide.pierEast)] + //[TestCase(1.76405553984887, 60.7756226366989, "2021-06-07T11:34:07.5270000Z", 0.214893775091689, -6.24266666666667, 2d, PierSide.pierWest, PierSide.pierEast)] + //[TestCase(0.523375885742411, -33.1288722052936, "2021-06-07T11:38:25.1670000Z", 0.286661722506396, -6.24266666666667, 0.5d, PierSide.pierWest, PierSide.pierEast)] + //public void SideOfPier_WhenTrackingThroughMeridianAfterSubsequentGoto_ThenAMeridianFlipIsPerformed( + // double ra, + // double dec, + // string jnowTimeStr, /* JNOW of object before transit */ + // double jnowSiderealTime, + // double siteLongitude, + // double trackingTimeHours, + // PierSide pierSideBeforeTransit, + // PierSide pierSideAfterRetargeting + //) + //{ + // // given + // var jnowTime = DateTimeOffset.ParseExact(jnowTimeStr, "o", CultureInfo.InvariantCulture).UtcDateTime; + // var trackingTimeDiff = TimeSpan.FromHours(trackingTimeHours); + // var timeAfterTracking = jnowTime + trackingTimeDiff; + // var raAsHMS = ra + "HMS"; + // var decAsDMS = dec + "DMS"; + // var currentTime = jnowTime; - _clockMock.Setup(x => x.UtcNow).Returns(() => currentTime); + // _clockMock.Setup(x => x.UtcNow).Returns(() => currentTime); - _sharedResourcesWrapperMock.Setup(x => x.SendChar("MS", false)).Returns("0"); + // _sharedResourcesWrapperMock.Setup(x => x.SendChar("MS", false)).Returns("0"); - // setup for RA - _utilMock.Setup(x => x.HoursToHMS(ra, ":", ":", ":", 2)).Returns(raAsHMS); - _utilMock.Setup(x => x.HMSToHours(raAsHMS)).Returns(ra); + // // setup for RA + // _utilMock.Setup(x => x.HoursToHMS(ra, ":", ":", ":", 2)).Returns(raAsHMS); + // _utilMock.Setup(x => x.HMSToHours(raAsHMS)).Returns(ra); - // setup for DEC - _utilMock.Setup(x => x.DMSToDegrees(decAsDMS)).Returns(dec); - _utilMock.Setup(x => x.DegreesToDMS(dec, "*", ":", ":", 2)).Returns(decAsDMS); + // // setup for DEC + // _utilMock.Setup(x => x.DMSToDegrees(decAsDMS)).Returns(dec); + // _utilMock.Setup(x => x.DegreesToDMS(dec, "*", ":", ":", 2)).Returns(decAsDMS); - // setup for SiteLongitude - var siteLongitudeResult = siteLongitude + "Gg"; - _sharedResourcesWrapperMock.Setup(x => x.SendString("Gg", false)).Returns(siteLongitudeResult); - // remember to invert longitude - _utilMock.Setup(x => x.DMSToDegrees(siteLongitudeResult)).Returns(-siteLongitude); + // // setup for SiteLongitude + // var siteLongitudeResult = siteLongitude + "Gg"; + // _sharedResourcesWrapperMock.Setup(x => x.SendString("Gg", false)).Returns(siteLongitudeResult); + // // remember to invert longitude + // _utilMock.Setup(x => x.DMSToDegrees(siteLongitudeResult)).Returns(-siteLongitude); - // setup for SideralTime - var siteLongitudeAdj = siteLongitude / 360.0 * 24.0; - var jnowSiderealTimeWithoutLongAdj = jnowSiderealTime - siteLongitudeAdj; - var afterTrackingSiderealTimeWithoutLongAdj = jnowSiderealTimeWithoutLongAdj + trackingTimeHours; + // // setup for SideralTime + // var siteLongitudeAdj = siteLongitude / 360.0 * 24.0; + // var jnowSiderealTimeWithoutLongAdj = jnowSiderealTime - siteLongitudeAdj; + // var afterTrackingSiderealTimeWithoutLongAdj = jnowSiderealTimeWithoutLongAdj + trackingTimeHours; - _utilMock.Setup(x => x.DateUTCToJulian(It.IsAny())).Returns(pDateTime => pDateTime.Ticks); + // _utilMock.Setup(x => x.DateUTCToJulian(It.IsAny())).Returns(pDateTime => pDateTime.Ticks); - _novasMock - .Setup(x => x.SiderealTime( - It.IsAny(), - 0d, - 0d, - GstType.GreenwichApparentSiderealTime, - Method.EquinoxBased, - Accuracy.Reduced, - ref It.Ref.IsAny)) - .Callback(new NovasSiderealTimeDelegate(NovasSiderealTime)) - .Returns(0); + // _novasMock + // .Setup(x => x.SiderealTime( + // It.IsAny(), + // 0d, + // 0d, + // GstType.GreenwichApparentSiderealTime, + // Method.EquinoxBased, + // Accuracy.Reduced, + // ref It.Ref.IsAny)) + // .Callback(new NovasSiderealTimeDelegate(NovasSiderealTime)) + // .Returns(0); - _astroUtilsMock.Setup(x => x.ConditionRA(It.IsAny())).Returns(pRA => pRA < 0 ? pRA + 24 : pRA >= 24 ? pRA - 24 : pRA); + // _astroUtilsMock.Setup(x => x.ConditionRA(It.IsAny())).Returns(pRA => pRA < 0 ? pRA + 24 : pRA >= 24 ? pRA - 24 : pRA); - void NovasSiderealTime(double pJDHigh, double pJDLow, double pJDDelta, GstType pGSTType, Method pMethod, Accuracy pAccuracy, ref double pSideralTime) - { - if (pJDHigh == jnowTime.Ticks) - { - pSideralTime = jnowSiderealTimeWithoutLongAdj; - } - else if (pJDHigh == timeAfterTracking.Ticks) - { - pSideralTime = afterTrackingSiderealTimeWithoutLongAdj; - } - else - { - Assert.Fail($"No sideral time defined for {pJDHigh}"); - } - } + // void NovasSiderealTime(double pJDHigh, double pJDLow, double pJDDelta, GstType pGSTType, Method pMethod, Accuracy pAccuracy, ref double pSideralTime) + // { + // if (pJDHigh == jnowTime.Ticks) + // { + // pSideralTime = jnowSiderealTimeWithoutLongAdj; + // } + // else if (pJDHigh == timeAfterTracking.Ticks) + // { + // pSideralTime = afterTrackingSiderealTimeWithoutLongAdj; + // } + // else + // { + // Assert.Fail($"No sideral time defined for {pJDHigh}"); + // } + // } - // Setup DestinationSideOfPier - _astroUtilsMock.Setup(x => x.ConditionHA(It.IsAny())).Returns(pHA => pHA < -12 ? pHA + 12 : pHA > 12 ? pHA - 12 : pHA); + // // Setup DestinationSideOfPier + // _astroUtilsMock.Setup(x => x.ConditionHA(It.IsAny())).Returns(pHA => pHA < -12 ? pHA + 12 : pHA > 12 ? pHA - 12 : pHA); - // Use firmware that supports GW - ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_43Eg); + // // Use firmware that supports GW + // ConnectTelescope(firmwareVersion: TelescopeList.Autostar497_43Eg); - // when - _telescope.SlewToCoordinatesAsync(ra, dec); - var actualSideOfPierAfterSlew = _telescope.SideOfPier; - // simulate tracking time - currentTime += trackingTimeDiff; - var actualSideOfPierAfterTracking = _telescope.SideOfPier; - _telescope.SlewToTargetAsync(); - var actualSideOfPierAfterRetargeting = _telescope.SideOfPier; + // // when + // _telescope.SlewToCoordinatesAsync(ra, dec); + // var actualSideOfPierAfterSlew = _telescope.SideOfPier; + // // simulate tracking time + // currentTime += trackingTimeDiff; + // var actualSideOfPierAfterTracking = _telescope.SideOfPier; + // _telescope.SlewToTargetAsync(); + // var actualSideOfPierAfterRetargeting = _telescope.SideOfPier; - // then - Assert.That(_telescope.TargetRightAscension, Is.EqualTo(ra)); - Assert.That(_telescope.TargetDeclination, Is.EqualTo(dec)); - Assert.That(actualSideOfPierAfterSlew, Is.EqualTo(pierSideBeforeTransit)); - Assert.That(actualSideOfPierAfterTracking, Is.EqualTo(pierSideBeforeTransit)); - Assert.That(actualSideOfPierAfterRetargeting, Is.EqualTo(pierSideAfterRetargeting)); + // // then + // Assert.That(_telescope.TargetRightAscension, Is.EqualTo(ra)); + // Assert.That(_telescope.TargetDeclination, Is.EqualTo(dec)); + // Assert.That(actualSideOfPierAfterSlew, Is.EqualTo(pierSideBeforeTransit)); + // Assert.That(actualSideOfPierAfterTracking, Is.EqualTo(pierSideBeforeTransit)); + // Assert.That(actualSideOfPierAfterRetargeting, Is.EqualTo(pierSideAfterRetargeting)); - _clockMock.Verify(x => x.UtcNow, Times.AtLeast(2)); + // _clockMock.Verify(x => x.UtcNow, Times.AtLeast(2)); - foreach (var time in new[] { jnowTime, timeAfterTracking }) - { - _utilMock.Verify(x => x.DateUTCToJulian(time)); + // foreach (var time in new[] { jnowTime, timeAfterTracking }) + // { + // _utilMock.Verify(x => x.DateUTCToJulian(time)); - _novasMock - .Verify(x => x.SiderealTime( - time.Ticks, - 0d, - 0d, - GstType.GreenwichApparentSiderealTime, - Method.EquinoxBased, - Accuracy.Reduced, - ref It.Ref.IsAny), - Times.Once); - } + // _novasMock + // .Verify(x => x.SiderealTime( + // time.Ticks, + // 0d, + // 0d, + // GstType.GreenwichApparentSiderealTime, + // Method.EquinoxBased, + // Accuracy.Reduced, + // ref It.Ref.IsAny), + // Times.Once); + // } - _sharedResourcesWrapperMock.Verify(x => x.SendString("Gg", false), Times.Exactly(3)); - _sharedResourcesWrapperMock.Verify(x => x.SendChar("MS", false), Times.Exactly(2)); - _sharedResourcesWrapperMock.Verify(x => x.SendString("D", false), Times.AtLeast(3)); - } + // _sharedResourcesWrapperMock.Verify(x => x.SendString("Gg", false), Times.Exactly(3)); + // _sharedResourcesWrapperMock.Verify(x => x.SendChar("MS", false), Times.Exactly(2)); + // _sharedResourcesWrapperMock.Verify(x => x.SendString("D", false), Times.AtLeast(3)); + //} [Test] public void SiteElevation_Get_WhenNotConnectedThrowsException() diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index b334430..cc0e097 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -512,7 +512,6 @@ namespace ASCOM.Meade.net SetTelescopePrecision("Connect"); // target RA, DEC and SideOfPier are set to default values - SharedResourcesWrapper.SideOfPier = PierSide.pierUnknown; SharedResourcesWrapper.TargetDeclination = InvalidParameter; SharedResourcesWrapper.TargetRightAscension = InvalidParameter; @@ -1857,13 +1856,7 @@ namespace ASCOM.Meade.net { CheckConnected("DestinationSideOfPier"); - double hourAngle = _astroUtilities.ConditionHA(SiderealTime - rightAscension); - - var destinationSOP = hourAngle > 0 - ? PierSide.pierEast - : (hourAngle < 0 - ? PierSide.pierWest - : SharedResourcesWrapper.SideOfPier); // avoid pierUnknown while Slewing + var destinationSOP = CalculateSideOfPier(rightAscension); LogMessage("DestinationSideOfPier", $"Destination SOP of RA {rightAscension.ToString(CultureInfo.InvariantCulture)} is {destinationSOP}"); @@ -1877,6 +1870,16 @@ namespace ASCOM.Meade.net } } + private PierSide CalculateSideOfPier(double rightAscension) + { + double hourAngle = _astroUtilities.ConditionHA(SiderealTime - rightAscension); + + var destinationSOP = hourAngle > 0 + ? PierSide.pierEast + : PierSide.pierWest; + return destinationSOP; + } + public bool DoesRefraction { get @@ -2502,16 +2505,7 @@ namespace ASCOM.Meade.net 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 - { - pierSide = SharedResourcesWrapper.SideOfPier; - } + var pierSide = CalculateSideOfPier(RightAscension); LogMessage("SideOfPier", "Get - " + pierSide); return pierSide; @@ -2990,21 +2984,12 @@ namespace ASCOM.Meade.net //0 Slew is Possible //1# Object Below Horizon w/string message //2# Object Below Higher w/string message - + switch (response) { case "0": //We're slewing everything should be working just fine. LogMessage("DoSlewAsync", "Slewing to target"); - - if (IsMeridianFlipOnSlewSupported()) - { - // Update side of pier to destination side of pier - // Assumption: Mount will do meridian flip if required - SharedResourcesWrapper.SideOfPier = - DestinationSideOfPier(TargetRightAscension, TargetDeclination); - } - SetSlewingMinEndTime(); break; case "1": diff --git a/Meade.net/Wrapper/SharedResourcesWrapper.cs b/Meade.net/Wrapper/SharedResourcesWrapper.cs index bbd9f82..052350a 100644 --- a/Meade.net/Wrapper/SharedResourcesWrapper.cs +++ b/Meade.net/Wrapper/SharedResourcesWrapper.cs @@ -31,8 +31,7 @@ namespace ASCOM.Meade.net.Wrapper bool IsParked { get; } ParkedPosition ParkedPosition { get; } bool RestartTracking { get; } - - PierSide SideOfPier { get; set; } + double? TargetRightAscension { get; set; } double? TargetDeclination { get; set; }