Merged in develop (pull request #3)

Develop

* Removed unwanted files

* Adding git ignore file

* Started working on getting the basic communications with the scope working.
    Working on routines to get and set the date and time in the handbox.

* Switched the serial port over to using the .net frameworks serial port.
    Extracted the serial port into it's own class and created a simpler command processing mechanism.

* Implemented AbortSlew and did some code tidy up.

* Forced all code to 64-bit only, will make this 32/64 bit before release.
    Fixed issue in the SerialProcessor when setting the time, makes sure that there's no chance of thread stealing when pulling out the junk messages
    Added ConformanceResult.txt to show the progress of the driver development

* Added code for the site latitude
    and started work on the longitude.

* Added unit tests for reading and writing the utcDate.
    Fixed a couple of defects in the code that was setting the utcDate.

* Corrected Longitude value range

* Added support for UTC offset.

* Pulse guiding support added

* Added SiteLatitude unit tests

* Added unit tests for SiteLongitude

* Added unit tests for the new Pulse guide implementation.

* Added support for AlignmentMode

* Added support for AtPark and Park

* Added support for parking the scope
    Added support for reading the scope Azimuth

* Added support for reading Declination

* Added 5 second timeout for the serial port.
    Fixed problem with the GW command not working on the Autostar 497.

* Fixed broken unit test

* Added support for altitude

* Tidying up resharper warinings

* Implemented RightAscension
    TargetRightAscension
    TargetDec
    SlewToCoord
    and SlewToCoordAsync

* Sorted out the target RA and Dec exceptions to be compliant with ascom.

* Implemented SlewToAltAz and SlewToAltAzAsync

* Implemented SyncToTarget functionality

* Implemented slew to target

* Added support for MoveAxis

* Added support for tracking rate

* Added IFocuserV3 to the driver and made sure that it's registered for ASCOM as a focuser as well.

* Fixed issue with Target RA and Dec loosing precision

* Telescope driver now passes the Ascom conformance.
This commit is contained in:
2019-05-08 17:23:13 +00:00
parent eca366dd10
commit 777adb260a
25 changed files with 3057 additions and 181 deletions
@@ -0,0 +1,268 @@
Conform Report Hash (V1): 671D83C15427DD14D9FA7F5A6C62D6B21372362C5173A2B95171D14D7442358DCF3950481797D63EB94E642D2563C3094C387C23D65466833FEA5E64CD045B46
ConformanceCheck ASCOM Device Conformance Checker Version 6.4.63.0, Build time: 18/12/2018 08:58:34
ConformanceCheck Running on: ASCOM Platform 6.4 SP1 6.4.1.2695
ConformanceCheck Driver ProgID: ASCOM.MeadeAutostar497.Telescope
Error handling
Error number for "Not Implemented" is: 80040400
Error number for "Invalid Value 1" is: 80040401
Error number for "Invalid Value 2" is: 80040405
Error number for "Value Not Set 1" is: 80040402
Error number for "Value Not Set 2" is: 80040403
Error messages will not be interpreted to infer state.
18:07:45.625 Driver Access Checks OK
18:07:46.272 AccessChecks OK Successfully created driver using late binding
18:07:46.685 AccessChecks OK Successfully connected using late binding
18:07:46.689 AccessChecks INFO The driver is a .NET object
18:07:46.693 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.MeadeAutostar497.Telescope, ASCOM.MeadeAutostar497.Telescope, Version=
18:07:46.697 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.ITelescopeV3
18:07:46.701 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.IFocuserV3
18:07:47.416 AccessChecks INFO Device does not expose interface ITelescopeV2
18:07:48.387 AccessChecks INFO Device exposes interface ITelescopeV3
18:07:49.708 AccessChecks OK Successfully created driver using driver access toolkit
18:07:50.029 AccessChecks OK Successfully connected using driver access toolkit
Conform is using ASCOM.DriverAccess.Telescope to get a Telescope object
18:07:51.351 ConformanceCheck OK Driver instance created successfully
18:07:51.775 ConformanceCheck OK Connected OK
Common Driver Methods
18:07:51.817 InterfaceVersion OK 3
18:07:51.845 Connected OK True
18:07:51.874 Description OK Meade Autostar 497 .net
18:07:51.903 DriverInfo OK Information about the driver itself. Version: 0.0
18:07:51.932 DriverVersion OK 0.0
18:07:51.961 Name OK Meade Autostar 497 .net
18:07:51.990 CommandString INFO Conform cannot test the CommandString method
18:07:51.996 CommandBlind INFO Conform cannot test the CommandBlind method
18:07:52.002 CommandBool INFO Conform cannot test the CommandBool method
18:07:52.008 Action INFO Conform cannot test the Action method
18:07:52.015 SupportedActions OK Driver returned an empty action list
Can Properties
18:07:52.082 CanFindHome OK False
18:07:52.089 CanPark OK True
18:07:52.096 CanPulseGuide OK True
18:07:52.102 CanSetDeclinationRate OK False
18:07:52.109 CanSetGuideRates OK False
18:07:52.117 CanSetPark OK False
18:07:52.125 CanSetPierSide OK False
18:07:52.177 CanSetRightAscensionRate OK False
18:07:52.185 CanSetTracking OK False
18:07:52.193 CanSlew OK True
18:07:52.200 CanSlewltAz OK True
18:07:52.208 CanSlewAltAzAsync OK True
18:07:52.216 CanSlewAsync OK True
18:07:52.224 CanSync OK True
18:07:52.231 CanSyncAltAz OK False
18:07:52.239 CanUnPark OK False
Pre-run Checks
18:07:52.286 Mount Safety INFO Scope is not parked, continuing testing
18:07:52.339 TimeCheck INFO PC Time Zone: GMT Summer Time, offset -1 hours.
18:07:52.348 TimeCheck INFO PC UTCDate: 08-May-2019 17:07:52.347
18:07:53.254 TimeCheck INFO Mount UTCDate: 02-May-2019 19:33:55.000
Properties
18:07:53.358 AlignmentMode OK algPolar
18:07:53.515 Altitude OK 1.00
18:07:53.555 ApertureArea OK Optional member threw a PropertyNotImplementedException exception.
18:07:53.591 ApertureDiameter OK Optional member threw a PropertyNotImplementedException exception.
18:07:53.622 AtHome OK False
18:07:53.654 AtPark OK False
18:07:53.847 Azimuth OK 45.67
18:07:54.028 Declination OK -01:00:01.00
18:07:54.060 DeclinationRate Read OK 0.00
18:07:54.093 DeclinationRate Write OK CanSetDeclinationRate is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.126 DoesRefraction Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.159 DoesRefraction Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.193 EquatorialSystem OK equLocalTopocentric
18:07:54.227 FocalLength OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.260 GuideRateDeclination Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.270 GuideRateDeclination Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.303 GuideRateRightAscension Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.314 GuideRateRightAscension Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.347 IsPulseGuiding OK False
18:07:54.541 RightAscension OK 03:59:09.00
18:07:54.575 RightAscensionRate Read OK 0.00
18:07:54.609 RightAscensionRate Write OK CanSetRightAscensionRate is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.644 SiteElevation Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.678 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.691 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.703 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.861 SiteLatitude Read OK 00:00:00.00
18:07:54.900 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude < -90 degrees
18:07:54.912 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude > 90 degrees
18:07:55.315 SiteLatitude Write OK Legal value 00:00:00.00 degrees written successfully
18:07:55.455 SiteLongitude Read OK -42:12:00.00
18:07:55.490 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude < -180 degrees
18:07:55.502 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude > 180 degrees
18:07:56.090 SiteLongitude Write OK Legal value -42:12:00.00 degrees written successfully
18:07:56.246 Slewing OK False
18:07:56.280 SlewSettleTime Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.315 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.328 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.363 SideOfPier Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.578 SiderealTime OK 05:17:41.24
18:07:56.590 SiderealTime INFO Scope and ASCOM sidereal times are up to 0.5 hour different, Scope: 05:17:41.24, ASCOM: 05:24:06.50
18:07:56.626 TargetDeclination Read OK .NET Not InvalidOperationException generated on read before write
18:07:56.661 TargetDeclination Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
18:07:56.673 TargetRightAscension Read OK .NET Not InvalidOperationException generated on read before write
18:07:56.708 TargetRightAscension Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
18:07:56.720 Tracking Read OK True
18:07:56.756 Tracking Write OK CanSetTracking is False and a PropertyNotImplementedException exception was generated as expected
18:07:56.797 TrackingRates Found drive rate: driveSidereal
18:07:56.809 TrackingRates OK Drive rates read OK
18:07:56.822 TrackingRates OK Disposed tracking rates OK
18:07:56.858 TrackingRates OK Successfully obtained a TrackingRates object after the previous TrackingRates object was disposed
18:07:57.039 TrackingRate Read OK driveLunar
18:07:57.075 TrackingRate Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:57.088 TrackingRate Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:57.624 UTCDate Read OK 02-May-2019 19:33:59.000
18:07:58.626 UTCDate Write OK New UTCDate written successfully: 02/05/2019 20:33:59
Methods
18:07:59.997 CanMoveAxis:Primary OK CanMoveAxis:Primary True
18:08:00.035 CanMoveAxis:Secondary OK CanMoveAxis:Secondary True
18:08:00.072 CanMoveAxis:Tertiary OK CanMoveAxis:Tertiary False
18:08:00.108 Park/Unpark INFO Tests skipped
18:08:00.131 AbortSlew OK AbortSlew OK when not slewing
18:08:00.199 AxisRate:Primary OK Axis rate minimum: 1 Axis rate maximum: 1
18:08:00.211 AxisRate:Primary OK Axis rate minimum: 2 Axis rate maximum: 2
18:08:00.225 AxisRate:Primary OK Axis rate minimum: 3 Axis rate maximum: 3
18:08:00.239 AxisRate:Primary OK Axis rate minimum: 4 Axis rate maximum: 4
18:08:00.253 AxisRate:Primary OK No overlapping axis rates found
18:08:00.266 AxisRate:Primary OK No duplicate axis rates found
18:08:00.279 AxisRate:Primary OK Successfully disposed of rate 1 - 1
18:08:00.295 AxisRate:Primary OK Successfully disposed of rate 2 - 2
18:08:00.310 AxisRate:Primary OK Successfully disposed of rate 3 - 3
18:08:00.322 AxisRate:Primary OK Successfully disposed of rate 4 - 4
18:08:00.336 AxisRate:Primary OK Disposed axis rates OK
18:08:00.350 AxisRate:Secondary OK Axis rate minimum: 1 Axis rate maximum: 1
18:08:00.362 AxisRate:Secondary OK Axis rate minimum: 2 Axis rate maximum: 2
18:08:00.375 AxisRate:Secondary OK Axis rate minimum: 3 Axis rate maximum: 3
18:08:00.387 AxisRate:Secondary OK Axis rate minimum: 4 Axis rate maximum: 4
18:08:00.400 AxisRate:Secondary OK No overlapping axis rates found
18:08:00.414 AxisRate:Secondary OK No duplicate axis rates found
18:08:00.445 AxisRate:Secondary OK Successfully disposed of rate 1 - 1
18:08:00.458 AxisRate:Secondary OK Successfully disposed of rate 2 - 2
18:08:00.472 AxisRate:Secondary OK Successfully disposed of rate 3 - 3
18:08:00.487 AxisRate:Secondary OK Successfully disposed of rate 4 - 4
18:08:00.501 AxisRate:Secondary OK Disposed axis rates OK
18:08:00.517 AxisRate:Tertiary OK Empty axis rate returned
18:08:00.531 AxisRate:Tertiary OK Disposed axis rates OK
18:08:00.550 FindHome OK CanFindHome is False and a MethodNotImplementedException exception was generated as expected
18:08:00.606 MoveAxis Primary OK Can successfully set a movement rate of zero
18:08:00.622 MoveAxis Primary OK Exception correctly generated when move axis is set below lowest rate (0.5)
18:08:00.659 MoveAxis Primary OK Exception correctly generated when move axis is set above highest rate (5)
18:08:04.867 MoveAxis Primary OK Successfully moved axis at minimum rate: 1
18:08:09.770 MoveAxis Primary OK Successfully moved axis at maximum rate: 4
18:08:13.981 MoveAxis Primary OK Tracking state correctly restored after MoveAxis when CanSetTracking is false
18:08:13.998 MoveAxis Primary OK AxisRates object successfully disposed
18:08:14.057 MoveAxis Secondary OK Can successfully set a movement rate of zero
18:08:14.072 MoveAxis Secondary OK Exception correctly generated when move axis is set below lowest rate (0.5)
18:08:14.107 MoveAxis Secondary OK Exception correctly generated when move axis is set above highest rate (5)
18:08:18.317 MoveAxis Secondary OK Successfully moved axis at minimum rate: 1
18:08:23.262 MoveAxis Secondary OK Successfully moved axis at maximum rate: 4
18:08:27.473 MoveAxis Secondary OK Tracking state correctly restored after MoveAxis when CanSetTracking is false
18:08:27.492 MoveAxis Secondary OK AxisRates object successfully disposed
18:08:27.551 MoveAxis Tertiary OK CanMoveAxis Tertiary is False and a MethodNotImplementedException exception was generated as expected
18:08:29.592 PulseGuide OK Synchronous pulse guide found OK
18:08:54.449 SlewToCoordinates INFO Slewed within 39.2 arc seconds of expected RA: 04:18:14.61, actual RA: 04:18:12.00
18:08:54.463 SlewToCoordinates INFO Slewed within 7199.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -00:59:59.00
18:08:54.478 SlewToCoordinates OK The TargetRightAscension property 04:18:14.61 matches the expected RA OK.
18:08:54.492 SlewToCoordinates OK The TargetDeclination property 01:00:00.00 matches the expected Declination OK.
18:08:54.548 SlewToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
18:08:55.301 SlewToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
18:08:55.360 SlewToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
18:08:56.199 SlewToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
18:09:20.477 SlewToCoordinatesAsync INFO Slewed within 19.3 arc seconds of expected RA: 03:18:41.28, actual RA: 03:18:40.00
18:09:20.490 SlewToCoordinatesAsync INFO Slewed within 14398.0 arc seconds of expected DEC: 02:00:00.00, actual DEC: -01:59:58.00
18:09:20.503 SlewToCoordinatesAsync OK The TargetRightAscension property 03:18:41.28 matches the expected RA OK.
18:09:20.516 SlewToCoordinatesAsync OK The TargetDeclination property 02:00:00.00 matches the expected Declination OK.
18:09:20.558 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
18:09:21.381 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
18:09:21.442 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
18:09:22.292 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
18:09:44.520 SyncToCoordinates INFO Slewed to start position within 56.8 arc seconds of expected RA: 02:19:07.79, actual RA: 02:19:04.00
18:09:44.534 SyncToCoordinates OK Slewed to start position OK. DEC: 00:00:00.00
18:09:47.045 SyncToCoordinates INFO Synced to sync position within 71.8 arc seconds of expected RA: 02:15:07.79, actual RA: 02:15:03.00
18:09:47.058 SyncToCoordinates INFO Synced to sync position within 3660.0 arc seconds of expected DEC: -01:00:00.00, actual DEC: 00:01:00.00
18:09:47.071 SyncToCoordinates OK The TargetRightAscension property 02:15:07.79 matches the expected RA OK.
18:09:47.085 SyncToCoordinates OK The TargetDeclination property -01:00:00.00 matches the expected Declination OK.
18:10:08.444 SyncToCoordinates INFO Slewed back to start position within 56.8 arc seconds of expected RA: 02:19:07.79, actual RA: 02:19:04.00
18:10:08.458 SyncToCoordinates OK Slewed back to start position OK. DEC: 00:00:00.00
18:10:10.791 SyncToCoordinates INFO Synced to reversed sync position within 71.8 arc seconds of expected RA: 02:23:07.79, actual RA: 02:23:03.00
18:10:10.806 SyncToCoordinates INFO Synced to reversed sync position within 7200.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -01:00:00.00
18:10:32.484 SyncToCoordinates INFO Slewed back to start position within 56.8 arc seconds of expected RA: 02:19:07.79, actual RA: 02:19:04.00
18:10:32.498 SyncToCoordinates OK Slewed back to start position OK. DEC: 00:00:00.00
18:10:32.537 SyncToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
18:10:33.329 SyncToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
18:10:33.389 SyncToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
18:10:34.242 SyncToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
18:10:34.301 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension < 0 hours
18:10:34.315 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension > 24 hours
18:10:34.979 TargetRightAscension Write OK Legal value 01:20:19.62 HH:MM:SS written successfully
18:10:35.016 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees
18:10:35.032 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees
18:10:35.652 TargetDeclination Write OK Legal value 01:00:00.00 DD:MM:SS written successfully
18:10:56.417 SlewToTarget INFO Slewed within 14.8 arc seconds of expected RA: 02:20:20.99, actual RA: 02:20:20.00
18:10:56.434 SlewToTarget INFO Slewed within 21596.0 arc seconds of expected DEC: 03:00:00.00, actual DEC: -02:59:56.00
18:10:56.449 SlewToTarget OK The TargetRightAscension property 02:20:20.99 matches the expected RA OK.
18:10:56.463 SlewToTarget OK The TargetDeclination property 03:00:00.00 matches the expected Declination OK.
18:10:56.504 SlewToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
18:10:56.676 SlewToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
18:10:56.736 SlewToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
18:10:56.915 SlewToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
18:11:20.512 SlewToTargetAsync INFO Slewed within 35.1 arc seconds of expected RA: 01:20:42.34, actual RA: 01:20:40.00
18:11:20.526 SlewToTargetAsync INFO Slewed within 28797.0 arc seconds of expected DEC: 04:00:00.00, actual DEC: -03:59:57.00
18:11:20.539 SlewToTargetAsync OK The TargetRightAscension property 01:20:42.34 matches the expected RA OK.
18:11:20.553 SlewToTargetAsync OK The TargetDeclination property 04:00:00.00 matches the expected Declination OK.
18:11:20.593 SlewToTargetAsync (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
18:11:20.774 SlewToTargetAsync (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
18:11:20.833 SlewToTargetAsync (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
18:11:21.032 SlewToTargetAsync (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
18:11:21.091 DestinationSideOfPier Test skipped as AligmentMode is not German Polar
18:11:22.864 SlewToAltAz INFO Slewed to within 144:49:47.00 DD:MM:SS of expected Azimuth: 150:00:00.00
18:11:22.880 SlewToAltAz INFO Slewed to within 46:00:01.00 DD:MM:SS of expected Altitude: 50:00:00.00
18:11:22.920 SlewToAltAz (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00
18:11:23.710 SlewToAltAz (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00
18:11:23.771 SlewToAltAz (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00
18:11:24.447 SlewToAltAz (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00
18:11:31.196 SlewToAltAzAsync INFO Slewed to within 149:51:53.00 DD:MM:SS of expected Azimuth: 155:00:00.00
18:11:31.210 SlewToAltAzAsync INFO Slewed to within 51:00:01.00 DD:MM:SS of expected Altitude: 55:00:00.00
18:11:31.251 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00
18:11:32.060 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00
18:11:32.121 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00
18:11:32.814 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00
18:11:56.494 SyncToTarget INFO Slewed to start position within 40.1 arc seconds of expected RA: 02:21:18.67, actual RA: 02:21:16.00
18:11:56.509 SyncToTarget OK Slewed to start position OK. DEC: 00:00:00.00
18:11:59.005 SyncToTarget INFO Synced to sync position within 55.1 arc seconds of expected RA: 02:17:18.67, actual RA: 02:17:15.00
18:11:59.019 SyncToTarget INFO Synced to sync position within 3660.0 arc seconds of expected DEC: -01:00:00.00, actual DEC: 00:01:00.00
18:12:22.398 SyncToTarget INFO Slewed back to start position within 40.1 arc seconds of expected RA: 02:21:18.67, actual RA: 02:21:16.00
18:12:22.416 SyncToTarget OK Slewed back to start position OK. DEC: 00:00:00.00
18:12:24.739 SyncToTarget INFO Synced to reversed sync position within 55.1 arc seconds of expected RA: 02:25:18.67, actual RA: 02:25:15.00
18:12:24.754 SyncToTarget INFO Synced to reversed sync position within 7200.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -01:00:00.00
18:12:46.438 SyncToTarget INFO Slewed back to start position within 40.1 arc seconds of expected RA: 02:21:18.67, actual RA: 02:21:16.00
18:12:46.452 SyncToTarget OK Slewed back to start position OK. DEC: 00:00:00.00
18:12:46.491 SyncToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
18:12:46.643 SyncToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
18:12:46.702 SyncToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
18:12:46.884 SyncToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
18:12:47.702 SyncToAltAz OK CanSyncAltAz is False and a MethodNotImplementedException exception was generated as expected
SideOfPier Model Tests
18:12:47.769 SideOfPier Model Tests INFO Tests skipped because this driver does Not support SideOfPier Read
Post-run Checks
18:12:47.862 Mount Safety INFO Tracking can't be turned off for this mount, please switch off manually.
Conformance test complete
No errors, warnings or issues found: your driver passes ASCOM validation!!
Driver Hash Value: 0C55C8535B9B3A4048581454F9D6A263EFD16E20AEC783762006739F671F586B64F1D8DD3E1E613C27A5B24838AEB8656C2A19BD1EE69177ECF2619599C0DA3C
+272
View File
@@ -0,0 +1,272 @@
Start-up ASCOM Device Conformance Checker - 64bit mode
Start-up ASCOM Platform 6.4 SP1 6.4.1.2695
ConformanceCheck ASCOM Device Conformance Checker Version 6.4.63.0, Build time: 18/12/2018 08:58:34
ConformanceCheck Running on: ASCOM Platform 6.4 SP1 6.4.1.2695
ConformanceCheck Driver ProgID: ASCOM.MeadeAutostar497.Telescope
Error handling
Error number for "Not Implemented" is: 80040400
Error number for "Invalid Value 1" is: 80040401
Error number for "Invalid Value 2" is: 80040405
Error number for "Value Not Set 1" is: 80040402
Error number for "Value Not Set 2" is: 80040403
Error messages will not be interpreted to infer state.
18:07:45.625 Driver Access Checks OK
18:07:46.272 AccessChecks OK Successfully created driver using late binding
18:07:46.685 AccessChecks OK Successfully connected using late binding
18:07:46.689 AccessChecks INFO The driver is a .NET object
18:07:46.693 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.MeadeAutostar497.Telescope, ASCOM.MeadeAutostar497.Telescope, Version=
18:07:46.697 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.ITelescopeV3
18:07:46.701 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.IFocuserV3
18:07:47.416 AccessChecks INFO Device does not expose interface ITelescopeV2
18:07:48.387 AccessChecks INFO Device exposes interface ITelescopeV3
18:07:49.708 AccessChecks OK Successfully created driver using driver access toolkit
18:07:50.029 AccessChecks OK Successfully connected using driver access toolkit
Conform is using ASCOM.DriverAccess.Telescope to get a Telescope object
18:07:51.351 ConformanceCheck OK Driver instance created successfully
18:07:51.775 ConformanceCheck OK Connected OK
Common Driver Methods
18:07:51.817 InterfaceVersion OK 3
18:07:51.845 Connected OK True
18:07:51.874 Description OK Meade Autostar 497 .net
18:07:51.903 DriverInfo OK Information about the driver itself. Version: 0.0
18:07:51.932 DriverVersion OK 0.0
18:07:51.961 Name OK Meade Autostar 497 .net
18:07:51.990 CommandString INFO Conform cannot test the CommandString method
18:07:51.996 CommandBlind INFO Conform cannot test the CommandBlind method
18:07:52.002 CommandBool INFO Conform cannot test the CommandBool method
18:07:52.008 Action INFO Conform cannot test the Action method
18:07:52.015 SupportedActions OK Driver returned an empty action list
Can Properties
18:07:52.082 CanFindHome OK False
18:07:52.089 CanPark OK True
18:07:52.096 CanPulseGuide OK True
18:07:52.102 CanSetDeclinationRate OK False
18:07:52.109 CanSetGuideRates OK False
18:07:52.117 CanSetPark OK False
18:07:52.125 CanSetPierSide OK False
18:07:52.177 CanSetRightAscensionRate OK False
18:07:52.185 CanSetTracking OK False
18:07:52.193 CanSlew OK True
18:07:52.200 CanSlewltAz OK True
18:07:52.208 CanSlewAltAzAsync OK True
18:07:52.216 CanSlewAsync OK True
18:07:52.224 CanSync OK True
18:07:52.231 CanSyncAltAz OK False
18:07:52.239 CanUnPark OK False
Pre-run Checks
18:07:52.286 Mount Safety INFO Scope is not parked, continuing testing
18:07:52.339 TimeCheck INFO PC Time Zone: GMT Summer Time, offset -1 hours.
18:07:52.348 TimeCheck INFO PC UTCDate: 08-May-2019 17:07:52.347
18:07:53.254 TimeCheck INFO Mount UTCDate: 02-May-2019 19:33:55.000
Properties
18:07:53.358 AlignmentMode OK algPolar
18:07:53.515 Altitude OK 1.00
18:07:53.555 ApertureArea OK Optional member threw a PropertyNotImplementedException exception.
18:07:53.591 ApertureDiameter OK Optional member threw a PropertyNotImplementedException exception.
18:07:53.622 AtHome OK False
18:07:53.654 AtPark OK False
18:07:53.847 Azimuth OK 45.67
18:07:54.028 Declination OK -01:00:01.00
18:07:54.060 DeclinationRate Read OK 0.00
18:07:54.093 DeclinationRate Write OK CanSetDeclinationRate is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.126 DoesRefraction Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.159 DoesRefraction Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.193 EquatorialSystem OK equLocalTopocentric
18:07:54.227 FocalLength OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.260 GuideRateDeclination Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.270 GuideRateDeclination Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.303 GuideRateRightAscension Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.314 GuideRateRightAscension Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.347 IsPulseGuiding OK False
18:07:54.541 RightAscension OK 03:59:09.00
18:07:54.575 RightAscensionRate Read OK 0.00
18:07:54.609 RightAscensionRate Write OK CanSetRightAscensionRate is False and a PropertyNotImplementedException exception was generated as expected
18:07:54.644 SiteElevation Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.678 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.691 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.703 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:54.861 SiteLatitude Read OK 00:00:00.00
18:07:54.900 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude < -90 degrees
18:07:54.912 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude > 90 degrees
18:07:55.315 SiteLatitude Write OK Legal value 00:00:00.00 degrees written successfully
18:07:55.455 SiteLongitude Read OK -42:12:00.00
18:07:55.490 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude < -180 degrees
18:07:55.502 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude > 180 degrees
18:07:56.090 SiteLongitude Write OK Legal value -42:12:00.00 degrees written successfully
18:07:56.246 Slewing OK False
18:07:56.280 SlewSettleTime Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.315 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.328 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.363 SideOfPier Read OK Optional member threw a PropertyNotImplementedException exception.
18:07:56.578 SiderealTime OK 05:17:41.24
18:07:56.590 SiderealTime INFO Scope and ASCOM sidereal times are up to 0.5 hour different, Scope: 05:17:41.24, ASCOM: 05:24:06.50
18:07:56.626 TargetDeclination Read OK .NET Not InvalidOperationException generated on read before write
18:07:56.661 TargetDeclination Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
18:07:56.673 TargetRightAscension Read OK .NET Not InvalidOperationException generated on read before write
18:07:56.708 TargetRightAscension Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
18:07:56.720 Tracking Read OK True
18:07:56.756 Tracking Write OK CanSetTracking is False and a PropertyNotImplementedException exception was generated as expected
18:07:56.797 TrackingRates Found drive rate: driveSidereal
18:07:56.809 TrackingRates OK Drive rates read OK
18:07:56.822 TrackingRates OK Disposed tracking rates OK
18:07:56.858 TrackingRates OK Successfully obtained a TrackingRates object after the previous TrackingRates object was disposed
18:07:57.039 TrackingRate Read OK driveLunar
18:07:57.075 TrackingRate Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:57.088 TrackingRate Write OK Optional member threw a PropertyNotImplementedException exception.
18:07:57.624 UTCDate Read OK 02-May-2019 19:33:59.000
18:07:58.626 UTCDate Write OK New UTCDate written successfully: 02/05/2019 20:33:59
Methods
18:07:59.997 CanMoveAxis:Primary OK CanMoveAxis:Primary True
18:08:00.035 CanMoveAxis:Secondary OK CanMoveAxis:Secondary True
18:08:00.072 CanMoveAxis:Tertiary OK CanMoveAxis:Tertiary False
18:08:00.108 Park/Unpark INFO Tests skipped
18:08:00.131 AbortSlew OK AbortSlew OK when not slewing
18:08:00.199 AxisRate:Primary OK Axis rate minimum: 1 Axis rate maximum: 1
18:08:00.211 AxisRate:Primary OK Axis rate minimum: 2 Axis rate maximum: 2
18:08:00.225 AxisRate:Primary OK Axis rate minimum: 3 Axis rate maximum: 3
18:08:00.239 AxisRate:Primary OK Axis rate minimum: 4 Axis rate maximum: 4
18:08:00.253 AxisRate:Primary OK No overlapping axis rates found
18:08:00.266 AxisRate:Primary OK No duplicate axis rates found
18:08:00.279 AxisRate:Primary OK Successfully disposed of rate 1 - 1
18:08:00.295 AxisRate:Primary OK Successfully disposed of rate 2 - 2
18:08:00.310 AxisRate:Primary OK Successfully disposed of rate 3 - 3
18:08:00.322 AxisRate:Primary OK Successfully disposed of rate 4 - 4
18:08:00.336 AxisRate:Primary OK Disposed axis rates OK
18:08:00.350 AxisRate:Secondary OK Axis rate minimum: 1 Axis rate maximum: 1
18:08:00.362 AxisRate:Secondary OK Axis rate minimum: 2 Axis rate maximum: 2
18:08:00.375 AxisRate:Secondary OK Axis rate minimum: 3 Axis rate maximum: 3
18:08:00.387 AxisRate:Secondary OK Axis rate minimum: 4 Axis rate maximum: 4
18:08:00.400 AxisRate:Secondary OK No overlapping axis rates found
18:08:00.414 AxisRate:Secondary OK No duplicate axis rates found
18:08:00.445 AxisRate:Secondary OK Successfully disposed of rate 1 - 1
18:08:00.458 AxisRate:Secondary OK Successfully disposed of rate 2 - 2
18:08:00.472 AxisRate:Secondary OK Successfully disposed of rate 3 - 3
18:08:00.487 AxisRate:Secondary OK Successfully disposed of rate 4 - 4
18:08:00.501 AxisRate:Secondary OK Disposed axis rates OK
18:08:00.517 AxisRate:Tertiary OK Empty axis rate returned
18:08:00.531 AxisRate:Tertiary OK Disposed axis rates OK
18:08:00.550 FindHome OK CanFindHome is False and a MethodNotImplementedException exception was generated as expected
18:08:00.606 MoveAxis Primary OK Can successfully set a movement rate of zero
18:08:00.622 MoveAxis Primary OK Exception correctly generated when move axis is set below lowest rate (0.5)
18:08:00.659 MoveAxis Primary OK Exception correctly generated when move axis is set above highest rate (5)
18:08:04.867 MoveAxis Primary OK Successfully moved axis at minimum rate: 1
18:08:09.770 MoveAxis Primary OK Successfully moved axis at maximum rate: 4
18:08:13.981 MoveAxis Primary OK Tracking state correctly restored after MoveAxis when CanSetTracking is false
18:08:13.998 MoveAxis Primary OK AxisRates object successfully disposed
18:08:14.057 MoveAxis Secondary OK Can successfully set a movement rate of zero
18:08:14.072 MoveAxis Secondary OK Exception correctly generated when move axis is set below lowest rate (0.5)
18:08:14.107 MoveAxis Secondary OK Exception correctly generated when move axis is set above highest rate (5)
18:08:18.317 MoveAxis Secondary OK Successfully moved axis at minimum rate: 1
18:08:23.262 MoveAxis Secondary OK Successfully moved axis at maximum rate: 4
18:08:27.473 MoveAxis Secondary OK Tracking state correctly restored after MoveAxis when CanSetTracking is false
18:08:27.492 MoveAxis Secondary OK AxisRates object successfully disposed
18:08:27.551 MoveAxis Tertiary OK CanMoveAxis Tertiary is False and a MethodNotImplementedException exception was generated as expected
18:08:29.592 PulseGuide OK Synchronous pulse guide found OK
18:08:54.449 SlewToCoordinates INFO Slewed within 39.2 arc seconds of expected RA: 04:18:14.61, actual RA: 04:18:12.00
18:08:54.463 SlewToCoordinates INFO Slewed within 7199.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -00:59:59.00
18:08:54.478 SlewToCoordinates OK The TargetRightAscension property 04:18:14.61 matches the expected RA OK.
18:08:54.492 SlewToCoordinates OK The TargetDeclination property 01:00:00.00 matches the expected Declination OK.
18:08:54.548 SlewToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
18:08:55.301 SlewToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
18:08:55.360 SlewToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
18:08:56.199 SlewToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
18:09:20.477 SlewToCoordinatesAsync INFO Slewed within 19.3 arc seconds of expected RA: 03:18:41.28, actual RA: 03:18:40.00
18:09:20.490 SlewToCoordinatesAsync INFO Slewed within 14398.0 arc seconds of expected DEC: 02:00:00.00, actual DEC: -01:59:58.00
18:09:20.503 SlewToCoordinatesAsync OK The TargetRightAscension property 03:18:41.28 matches the expected RA OK.
18:09:20.516 SlewToCoordinatesAsync OK The TargetDeclination property 02:00:00.00 matches the expected Declination OK.
18:09:20.558 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
18:09:21.381 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
18:09:21.442 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
18:09:22.292 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
18:09:44.520 SyncToCoordinates INFO Slewed to start position within 56.8 arc seconds of expected RA: 02:19:07.79, actual RA: 02:19:04.00
18:09:44.534 SyncToCoordinates OK Slewed to start position OK. DEC: 00:00:00.00
18:09:47.045 SyncToCoordinates INFO Synced to sync position within 71.8 arc seconds of expected RA: 02:15:07.79, actual RA: 02:15:03.00
18:09:47.058 SyncToCoordinates INFO Synced to sync position within 3660.0 arc seconds of expected DEC: -01:00:00.00, actual DEC: 00:01:00.00
18:09:47.071 SyncToCoordinates OK The TargetRightAscension property 02:15:07.79 matches the expected RA OK.
18:09:47.085 SyncToCoordinates OK The TargetDeclination property -01:00:00.00 matches the expected Declination OK.
18:10:08.444 SyncToCoordinates INFO Slewed back to start position within 56.8 arc seconds of expected RA: 02:19:07.79, actual RA: 02:19:04.00
18:10:08.458 SyncToCoordinates OK Slewed back to start position OK. DEC: 00:00:00.00
18:10:10.791 SyncToCoordinates INFO Synced to reversed sync position within 71.8 arc seconds of expected RA: 02:23:07.79, actual RA: 02:23:03.00
18:10:10.806 SyncToCoordinates INFO Synced to reversed sync position within 7200.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -01:00:00.00
18:10:32.484 SyncToCoordinates INFO Slewed back to start position within 56.8 arc seconds of expected RA: 02:19:07.79, actual RA: 02:19:04.00
18:10:32.498 SyncToCoordinates OK Slewed back to start position OK. DEC: 00:00:00.00
18:10:32.537 SyncToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
18:10:33.329 SyncToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
18:10:33.389 SyncToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
18:10:34.242 SyncToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
18:10:34.301 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension < 0 hours
18:10:34.315 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension > 24 hours
18:10:34.979 TargetRightAscension Write OK Legal value 01:20:19.62 HH:MM:SS written successfully
18:10:35.016 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees
18:10:35.032 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees
18:10:35.652 TargetDeclination Write OK Legal value 01:00:00.00 DD:MM:SS written successfully
18:10:56.417 SlewToTarget INFO Slewed within 14.8 arc seconds of expected RA: 02:20:20.99, actual RA: 02:20:20.00
18:10:56.434 SlewToTarget INFO Slewed within 21596.0 arc seconds of expected DEC: 03:00:00.00, actual DEC: -02:59:56.00
18:10:56.449 SlewToTarget OK The TargetRightAscension property 02:20:20.99 matches the expected RA OK.
18:10:56.463 SlewToTarget OK The TargetDeclination property 03:00:00.00 matches the expected Declination OK.
18:10:56.504 SlewToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
18:10:56.676 SlewToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
18:10:56.736 SlewToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
18:10:56.915 SlewToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
18:11:20.512 SlewToTargetAsync INFO Slewed within 35.1 arc seconds of expected RA: 01:20:42.34, actual RA: 01:20:40.00
18:11:20.526 SlewToTargetAsync INFO Slewed within 28797.0 arc seconds of expected DEC: 04:00:00.00, actual DEC: -03:59:57.00
18:11:20.539 SlewToTargetAsync OK The TargetRightAscension property 01:20:42.34 matches the expected RA OK.
18:11:20.553 SlewToTargetAsync OK The TargetDeclination property 04:00:00.00 matches the expected Declination OK.
18:11:20.593 SlewToTargetAsync (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
18:11:20.774 SlewToTargetAsync (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
18:11:20.833 SlewToTargetAsync (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
18:11:21.032 SlewToTargetAsync (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
18:11:21.091 DestinationSideOfPier Test skipped as AligmentMode is not German Polar
18:11:22.864 SlewToAltAz INFO Slewed to within 144:49:47.00 DD:MM:SS of expected Azimuth: 150:00:00.00
18:11:22.880 SlewToAltAz INFO Slewed to within 46:00:01.00 DD:MM:SS of expected Altitude: 50:00:00.00
18:11:22.920 SlewToAltAz (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00
18:11:23.710 SlewToAltAz (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00
18:11:23.771 SlewToAltAz (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00
18:11:24.447 SlewToAltAz (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00
18:11:31.196 SlewToAltAzAsync INFO Slewed to within 149:51:53.00 DD:MM:SS of expected Azimuth: 155:00:00.00
18:11:31.210 SlewToAltAzAsync INFO Slewed to within 51:00:01.00 DD:MM:SS of expected Altitude: 55:00:00.00
18:11:31.251 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00
18:11:32.060 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00
18:11:32.121 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00
18:11:32.814 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00
18:11:56.494 SyncToTarget INFO Slewed to start position within 40.1 arc seconds of expected RA: 02:21:18.67, actual RA: 02:21:16.00
18:11:56.509 SyncToTarget OK Slewed to start position OK. DEC: 00:00:00.00
18:11:59.005 SyncToTarget INFO Synced to sync position within 55.1 arc seconds of expected RA: 02:17:18.67, actual RA: 02:17:15.00
18:11:59.019 SyncToTarget INFO Synced to sync position within 3660.0 arc seconds of expected DEC: -01:00:00.00, actual DEC: 00:01:00.00
18:12:22.398 SyncToTarget INFO Slewed back to start position within 40.1 arc seconds of expected RA: 02:21:18.67, actual RA: 02:21:16.00
18:12:22.416 SyncToTarget OK Slewed back to start position OK. DEC: 00:00:00.00
18:12:24.739 SyncToTarget INFO Synced to reversed sync position within 55.1 arc seconds of expected RA: 02:25:18.67, actual RA: 02:25:15.00
18:12:24.754 SyncToTarget INFO Synced to reversed sync position within 7200.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -01:00:00.00
18:12:46.438 SyncToTarget INFO Slewed back to start position within 40.1 arc seconds of expected RA: 02:21:18.67, actual RA: 02:21:16.00
18:12:46.452 SyncToTarget OK Slewed back to start position OK. DEC: 00:00:00.00
18:12:46.491 SyncToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
18:12:46.643 SyncToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
18:12:46.702 SyncToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
18:12:46.884 SyncToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
18:12:47.702 SyncToAltAz OK CanSyncAltAz is False and a MethodNotImplementedException exception was generated as expected
SideOfPier Model Tests
18:12:47.769 SideOfPier Model Tests INFO Tests skipped because this driver does Not support SideOfPier Read
Post-run Checks
18:12:47.862 Mount Safety INFO Tracking can't be turned off for this mount, please switch off manually.
Conformance test complete
No errors, warnings or issues found: your driver passes ASCOM validation!!
Driver Hash Value: 0C55C8535B9B3A4048581454F9D6A263EFD16E20AEC783762006739F671F586B64F1D8DD3E1E613C27A5B24838AEB8656C2A19BD1EE69177ECF2619599C0DA3C
Report Hash Value: 671D83C15427DD14D9FA7F5A6C62D6B21372362C5173A2B95171D14D7442358DCF3950481797D63EB94E642D2563C3094C387C23D65466833FEA5E64CD045B46
The validation file is: C:\Users\colin\Documents\ASCOM\Logs 2019-05-08\ASCOM.MeadeAutostar497.Telescope.Validation.txt
@@ -0,0 +1,36 @@
<#
This script initializes a bare minimum set of registry entries required for ASCOM.Utilities.Profile to work
without throwing any exceptions. When building on a build server, or on a computer without the ASCOM Platform installed,
it may be useful to execute this script as a build step prior to running any unit tests, or calling any code that relies on
ASCOM.Utilities.Profile. The alternative is to install the ASCOM Platform on the build agent.
NOTE: This script equires elevated permissions because it creates registry keys in the LocalMachine hive.
#>
$wow = Test-Path HKLM:\SOFTWARE\Wow6432Node
if ($wow)
{
$root = "HKLM:\SOFTWARE\Wow6432Node"
}
else
{
$root = "HKLM:\SOFTWARE"
}
$ascomRoot = $root + "\ASCOM"
if (Test-Path $ascomRoot)
{
<# Don't upset an already-existing ASCOM registry #>
exit
}
<# Create the ASCOM root key and set it's ACL to allow all users read/write access #>
New-Item -Path $root -Name ASCOM Force
$ascomAcl = Get-Acl $ascomRoot
$aclRule = New-Object System.Security.AccessControl.RegistryAccessRule ("Users","FullControl","Allow")
$ascomAcl.SetAccessRule($aclRule)
$ascomAcl | Set-Acl -Path $ascomRoot
<# Now create the bare minimum keys required so that ASCOM.Utilities.Profile doesn't crash and burn #>
New-ItemProperty -Path $ascomRoot -Name PlatformVersion -Value "6.1" -PropertyType String Force
New-ItemProperty -Path $ascomRoot -Name SerTraceFile -Value "C:\SerialTraceAuto.txt" -PropertyType String Force
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\NUnit.3.11.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.11.0\build\NUnit.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9638DA27-77C7-4B30-A730-6E7159A4A09F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MeadeAutostar497.UnitTests</RootNamespace>
<AssemblyName>MeadeAutostar497.UnitTests</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="ASCOM.Astrometry, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Astrometry.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Attributes, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Attributes.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Cache, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Cache.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Controls, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Controls.dll</HintPath>
</Reference>
<Reference Include="ASCOM.DeviceInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DeviceInterfaces.dll</HintPath>
</Reference>
<Reference Include="ASCOM.DriverAccess, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DriverAccess.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Exceptions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Exceptions.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Internal.Extensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Internal.Extensions.dll</HintPath>
</Reference>
<Reference Include="ASCOM.SettingsProvider, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.SettingsProvider.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Utilities, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.dll</HintPath>
</Reference>
<Reference Include="ASCOM.Utilities.Video, Version=6.1.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL">
<HintPath>..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.Video.dll</HintPath>
</Reference>
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="Moq, Version=4.10.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.10.1\lib\net45\Moq.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.11.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Transactions" />
<Reference Include="System.Windows" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="TelescopeControllerUnitTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MeadeAutostar497\MeadeAutostar497.csproj">
<Project>{64308775-bd4a-469c-bcab-3ed830b811af}</Project>
<Name>MeadeAutostar497</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="BootstrapAscomProfileStore.ps1" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NUnit.3.11.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.11.0\build\NUnit.props'))" />
</Target>
</Project>
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MeadeAutostar497.UnitTests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MeadeAutostar497.UnitTests")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9638da27-77c7-4b30-a730-6e7159a4a09f")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,556 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO.Ports;
using ASCOM;
using ASCOM.DeviceInterface;
using ASCOM.MeadeAutostar497.Controller;
using Moq;
using NUnit.Framework;
namespace MeadeAutostar497.UnitTests
{
[TestFixture]
public class TelescopeControllerUnitTests
{
private Mock<ISerialProcessor> serialMock;
private readonly List<string> _availableComPorts = new List<string> { "COM1", "COM2", "COM3" };
private TelescopeController _telescopeController;
private string _stringToRecieve = string.Empty;
private bool _isConnected = false;
[SetUp]
public void Setup()
{
_stringToRecieve = string.Empty;
_isConnected = false;
serialMock = new Mock<ISerialProcessor>();
serialMock.SetupAllProperties();
serialMock.Setup(x => x.GetPortNames()).Returns(() => _availableComPorts.ToArray());
serialMock.Setup(x => x.CommandTerminated(It.IsAny<string>(), It.IsAny<string>()))
.Returns(() => _stringToRecieve);
serialMock.Setup(x => x.IsOpen).Returns(() => _isConnected);
//Todo inject the serialMock instead of using a singleton to increase code stability.
_telescopeController = TelescopeController.Instance;
_telescopeController.SerialPort = serialMock.Object;
}
[TearDown]
public void TearDown()
{
_isConnected = false;
_telescopeController.Connected = false;
_telescopeController.Port = "COM1";
}
[Test]
public void ImplementsExpectedInterfaces()
{
Assert.That(_telescopeController, Is.Not.Null);
Assert.That(_telescopeController, Is.AssignableTo<ITelescopeController>());
}
[Test]
public void NotConnectedByDefault()
{
Assert.That(_telescopeController.Connected, Is.False);
}
[Test]
public void ConnectedCanBeSetTrue()
{
_stringToRecieve = "test#";
_isConnected = true;
_telescopeController.Connected = true;
Assert.That(_telescopeController.Connected, Is.True);
}
[Test]
public void EnsureThatTheSerialCommunicationsAreSetCorrectly()
{
Assert.That(serialMock.Object.IsOpen, Is.False);
_stringToRecieve = "test#";
_telescopeController.Connected = true;
_isConnected = true;
Assert.That(_telescopeController.Connected, Is.True);
serialMock.Verify(x => x.Open(), Times.Once);
Assert.That(serialMock.Object.DtrEnable, Is.False);
Assert.That(serialMock.Object.RtsEnable, Is.False);
Assert.That(serialMock.Object.BaudRate, Is.EqualTo(9600));
Assert.That(serialMock.Object.DataBits, Is.EqualTo(8));
Assert.That(serialMock.Object.StopBits, Is.EqualTo(StopBits.One));
Assert.That(serialMock.Object.Parity, Is.EqualTo(Parity.None));
Assert.That(serialMock.Object.PortName, Is.EqualTo(_telescopeController.Port));
Assert.That(serialMock.Object.IsOpen, Is.True);
}
[Test]
public void WhenOpensComPortToNonAutostarThrowException()
{
Assert.That(serialMock.Object.IsOpen, Is.False);
var exception = Assert.Throws<ASCOM.InvalidOperationException>(() => { _telescopeController.Connected = true; });
Assert.That(exception.Message, Is.EqualTo("Failed to communicate with telescope."));
Assert.That(_telescopeController.Connected, Is.False);
}
[Test]
public void CannotChangeSerialPortObjectWhenConnected()
{
_stringToRecieve = "test#";
_isConnected = true;
_telescopeController.Connected = true;
Mock<ISerialProcessor> newSerialMock = new Mock<ISerialProcessor>();
var exception = Assert.Throws<ASCOM.InvalidOperationException>( () => { _telescopeController.SerialPort = newSerialMock.Object; });
Assert.That(exception, Is.Not.Null);
Assert.That(exception.Message, Is.EqualTo("Please disconnect before changing the serial engine."));
}
[Test]
public void PortIsSetToCom1ByDefault()
{
Assert.That(_telescopeController.Port, Is.EqualTo("COM1"));
}
[Test]
public void SettingPortToValidPortAllowed()
{
_telescopeController.Port = "COM2";
Assert.That(_telescopeController.Port, Is.EqualTo("COM2"));
}
[Test]
public void SettingPortToValidPortWhenConnectedFails()
{
_stringToRecieve = "test#";
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<ASCOM.InvalidOperationException>( () => _telescopeController.Port = "COM2");
Assert.That(exception.Message, Is.EqualTo("Please disconnect from the scope before changing port."));
Assert.That(_telescopeController.Port, Is.EqualTo("COM1")); //port hasn't changed
}
[Test]
public void SettingPortToInvalidPortFails()
{
var exception = Assert.Throws<ASCOM.InvalidOperationException>(() => _telescopeController.Port = "COM5");
Assert.That(exception.Message, Is.EqualTo("Unable to select port COM5 as it does not exist."));
Assert.That(_telescopeController.Port, Is.EqualTo("COM1")); //port hasn't changed
}
[Test]
public void AbortSlewWorks()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.AbortSlew();
serialMock.Verify(x => x.Command("#:Q#"), Times.Once);
}
[Test]
public void SlewingReturnTrueAsExpected()
{
_isConnected = true;
_telescopeController.Connected = true;
serialMock.Setup(x => x.CommandTerminated(":D#", "#")).Returns("|");
var slewing = _telescopeController.Slewing;
Assert.That(slewing, Is.True);
}
[Test]
public void SlewingReturnFalseAsExpected()
{
_isConnected = true;
_telescopeController.Connected = true;
serialMock.Setup(x => x.CommandTerminated(":D#", "#")).Returns(string.Empty);
var slewing = _telescopeController.Slewing;
Assert.That(slewing, Is.False);
}
[Test]
public void utcDate_Get_ReturnsExpectedValue()
{
DateTime expectedDate = new DateTime(2019, 04, 30, 11, 32, 24, DateTimeKind.Local);
var dateString = "04/30/19";
var timeString = "12:32:24";
_isConnected = true;
_telescopeController.Connected = true;
serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
serialMock.Setup(x => x.CommandTerminated(":GC#", "#")).Returns(dateString);
serialMock.Setup(x => x.CommandTerminated(":GL#", "#")).Returns(timeString);
var result = _telescopeController.utcDate;
Assert.That(result, Is.EqualTo(expectedDate));
}
[Test]
public void utcDate_Set_SetsTelescopeDateAndTime()
{
DateTime testDateTime = new DateTime(2019, 04, 30, 19, 53, 32, DateTimeKind.Utc);
serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
serialMock.Setup(x => x.CommandChar($":SL{testDateTime.Hour+1:00}:{testDateTime.Minute:00}:{testDateTime.Second:00}#")).Returns('1');
serialMock.Setup(x => x.CommandChar($":SC{testDateTime.Month:00}/{testDateTime.Day:00}/{testDateTime:yy}#")).Returns('1');
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.utcDate = testDateTime;
}
[Test]
public void utcDate_Set_ThrowsExceptionWhenTimeInvalid()
{
DateTime testDateTime = new DateTime(2019, 04, 30, 19, 53, 32, DateTimeKind.Utc);
serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
//serialMock.Setup(x => x.CommandChar($":SL{testDateTime.Hour:00}:{testDateTime.Minute:00}:{testDateTime.Second:00}#")).Returns('1');
serialMock.Setup(x => x.CommandChar($":SC{testDateTime.Month:00}/{testDateTime.Day:00}/{testDateTime:yy}#")).Returns('1');
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<ASCOM.InvalidOperationException>( () => {_telescopeController.utcDate = testDateTime; });
Assert.That( exception.Message, Is.EqualTo("Failed to set local time"));
}
[Test]
public void utcDate_Set_ThrowsExceptionWhenDateInvalid()
{
DateTime testDateTime = new DateTime(2019, 04, 30, 19, 53, 32, DateTimeKind.Local);
serialMock.Setup(x => x.CommandTerminated(":GG#", "#")).Returns("-01");
serialMock.Setup(x => x.CommandChar($":SL{testDateTime.Hour+1:00}:{testDateTime.Minute:00}:{testDateTime.Second:00}#")).Returns('1');
//serialMock.Setup(x => x.CommandChar($":SC{testDateTime.Month:00}/{testDateTime.Day:00}/{testDateTime:yy}#")).Returns('1');
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<ASCOM.InvalidOperationException>(() => { _telescopeController.utcDate = testDateTime; });
Assert.That(exception.Message, Is.EqualTo("Failed to set local date"));
}
[TestCase("+12*34", 12.566666666666666)]
[TestCase("+12*34.56", 12.582222222222223)]
[TestCase("-67*34.56", -67.582222222222214)]
public void SiteLatitude_Get_ReturnsExpectedDouble( string latitude, double expectedResult)
{
serialMock.Setup(x => x.CommandTerminated(":Gt#", "#")).Returns(latitude);
_isConnected = true;
_telescopeController.Connected = true;
var result = _telescopeController.SiteLatitude;
Assert.That(result, Is.EqualTo(expectedResult));
}
[Test]
public void SiteLatitude_Set_ThrowsExeptionWhenValueTooSmall()
{
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<InvalidValueException>( () => { _telescopeController.SiteLatitude = -91;});
Assert.That(exception.Message, Is.EqualTo("Latitude cannot be less than -90 degrees."));
}
[Test]
public void SiteLatitude_Set_ThrowsExeptionWhenValueTooLarge()
{
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<InvalidValueException>(() => { _telescopeController.SiteLatitude = 91; });
Assert.That(exception.Message, Is.EqualTo("Latitude cannot be greater than 90 degrees."));
}
[Test]
public void SiteLatitude_Set_ThrowsExeptionWhenTelescopeReportsFail()
{
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<ASCOM.InvalidOperationException>(() => { _telescopeController.SiteLatitude = 10; });
Assert.That(exception.Message, Is.EqualTo("Failed to set site latitude."));
}
[Test]
public void SiteLatitude_Set_NoErrorWhenValidValueSentSuccessfully()
{
serialMock.Setup(x => x.CommandChar(":Sts10*00#")).Returns('1');
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.SiteLatitude = 10;
}
[TestCase("012*34", 12.566666666666666)]
[TestCase("012:34.56", 12.582222222222223)]
[TestCase("350:34.56", -9.4177777777777578)]
public void SiteLongitude_Get_ReturnsExpectedDouble(string longitude, double expectedResult)
{
serialMock.Setup(x => x.CommandTerminated(":Gg#", "#")).Returns(longitude);
_isConnected = true;
_telescopeController.Connected = true;
var result = _telescopeController.SiteLongitude;
Assert.That(result, Is.EqualTo(expectedResult));
}
[Test]
public void SiteLongitude_Set_ThrowsExeptionWhenValueTooSmall()
{
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<InvalidValueException>(() => { _telescopeController.SiteLongitude = -181; });
Assert.That(exception.Message, Is.EqualTo("Longitude cannot be lower than -180 degrees."));
}
[Test]
public void SiteLongitude_Set_ThrowsExeptionWhenValueTooLarge()
{
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<InvalidValueException>(() => { _telescopeController.SiteLongitude = 181; });
Assert.That(exception.Message, Is.EqualTo("Longitude cannot be greater than 180 degrees."));
}
[Test]
public void SiteLongitude_Set_ThrowsExeptionWhenTelescopeReportsFail()
{
_isConnected = true;
_telescopeController.Connected = true;
var exception = Assert.Throws<ASCOM.InvalidOperationException>(() => { _telescopeController.SiteLongitude = 10; });
Assert.That(exception.Message, Is.EqualTo("Failed to set site longitude."));
}
[Test]
public void SiteLongitude_Set_NoErrorWhenValidValueSentSuccessfully()
{
serialMock.Setup(x => x.CommandChar(":Sg010*00#")).Returns('1');
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.SiteLongitude = 10;
}
[Test]
public void PulseGuideEast()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.PulseGuide(GuideDirections.guideEast,100);
serialMock.Verify( x => x.Command(":Mge0100#"), Times.Once);
}
[Test]
public void PulseGuideWest()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.PulseGuide(GuideDirections.guideWest, 1200);
serialMock.Verify(x => x.Command(":Mgw1200#"), Times.Once);
}
[Test]
public void PulseGuideNorth()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.PulseGuide(GuideDirections.guideNorth, 256);
serialMock.Verify(x => x.Command(":Mgn0256#"), Times.Once);
}
[Test]
public void PulseGuideSouth()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.PulseGuide(GuideDirections.guideSouth, 1024);
serialMock.Verify(x => x.Command(":Mgs1024#"), Times.Once);
}
[TestCase('A', AlignmentModes.algAltAz)]
[TestCase('P', AlignmentModes.algPolar)]
public void AlignmentMode_Get_ReturnsExpectedValue(char commandResponse, AlignmentModes mode)
{
const char ack = (char)6;
serialMock.Setup(x => x.CommandChar(ack.ToString())).Returns(commandResponse);
_isConnected = true;
_telescopeController.Connected = true;
var result = _telescopeController.AlignmentMode;
Assert.That(result, Is.EqualTo(mode));
}
[TestCase(AlignmentModes.algAltAz, ":AA#")]
[TestCase(AlignmentModes.algPolar, ":AP#")]
[TestCase(AlignmentModes.algGermanPolar, ":AP#")]
public void AligmentMode_Set_WorksAsExpected(AlignmentModes mode, string command)
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.AlignmentMode = mode;
serialMock.Verify( x => x.Command(command), Times.Once);
}
[Test]
public void AtParkIsFalseByDefault()
{
_isConnected = true;
_telescopeController.Connected = true;
Assert.That( _telescopeController.AtPark, Is.False );
}
[Test]
public void AtParkIsTrueAfterParkingScope()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.Park();
Assert.That(_telescopeController.AtPark, Is.True);
}
[Test]
public void Park_CallingParkSendsTheParkCommand()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.Park();
serialMock.Verify( x => x.Command(":hP#"), Times.Once);
}
[Test]
public void Park_ParkingSecondTimeDoesNothing()
{
_isConnected = true;
_telescopeController.Connected = true;
_telescopeController.Park();
_telescopeController.Park();
serialMock.Verify(x => x.Command(":hP#"), Times.Once);
}
[TestCase("356*13",356.21666666666664)]
[TestCase("356*13'21", 356.22249999999997)]
public void Azimuth_CanGetValue( string response, double expectedResult )
{
serialMock.Setup(x => x.CommandTerminated(":GZ#", "#")).Returns(response);
_isConnected = true;
_telescopeController.Connected = true;
var az = _telescopeController.Azimuth;
Assert.That( az, Is.EqualTo(expectedResult));
}
[TestCase("+75*13", 75.2166666666666654)]
[TestCase("+65*13'21", 65.222499999999997)]
public void Declination_CanGetValue(string response, double expectedResult)
{
serialMock.Setup(x => x.CommandTerminated(":GD#", "#")).Returns(response);
_isConnected = true;
_telescopeController.Connected = true;
var result = _telescopeController.Declination;
Assert.That(result, Is.EqualTo(expectedResult));
}
}
}
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ASCOM.Platform" version="6.4.2" targetFramework="net45" />
<package id="Castle.Core" version="4.3.1" targetFramework="net45" />
<package id="Moq" version="4.10.1" targetFramework="net45" />
<package id="NUnit" version="3.11.0" targetFramework="net45" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.0" targetFramework="net45" requireReinstallation="true" />
<package id="System.Threading.Tasks.Extensions" version="4.5.1" targetFramework="net45" requireReinstallation="true" />
</packages>
+24
View File
@@ -5,16 +5,40 @@ VisualStudioVersion = 15.0.28307.136
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeadeAutostar497", "MeadeAutostar497\MeadeAutostar497.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeadeAutostar497", "MeadeAutostar497\MeadeAutostar497.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeadeAutostar497.UnitTests", "MeadeAutostar497.UnitTests\MeadeAutostar497.UnitTests.csproj", "{9638DA27-77C7-4B30-A730-6E7159A4A09F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestConsole", "TestConsole\TestConsole.csproj", "{D5207217-61C7-4E94-8097-91DBACE57D2A}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.ActiveCfg = Debug|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.Build.0 = Debug|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.ActiveCfg = Release|Any CPU {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.Build.0 = Release|Any CPU {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.Build.0 = Release|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.ActiveCfg = Release|Any CPU
{64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.Build.0 = Release|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|x86.ActiveCfg = Debug|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Debug|x86.Build.0 = Debug|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|Any CPU.Build.0 = Release|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|x86.ActiveCfg = Release|Any CPU
{9638DA27-77C7-4B30-A730-6E7159A4A09F}.Release|x86.Build.0 = Release|Any CPU
{D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|Any CPU.ActiveCfg = Debug|x86
{D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x86.ActiveCfg = Debug|x86
{D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x86.Build.0 = Debug|x86
{D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|Any CPU.ActiveCfg = Release|x86
{D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|x86.ActiveCfg = Release|x86
{D5207217-61C7-4E94-8097-91DBACE57D2A}.Release|x86.Build.0 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
+4 -2
View File
@@ -99,11 +99,13 @@ namespace ASCOM.MeadeAutostar497
case TelescopeAxes.axisPrimary: case TelescopeAxes.axisPrimary:
// TODO Initialize this array with any Primary axis rates that your driver may provide // TODO Initialize this array with any Primary axis rates that your driver may provide
// Example: m_Rates = new Rate[] { new Rate(10.5, 30.2), new Rate(54.0, 43.6) } // Example: m_Rates = new Rate[] { new Rate(10.5, 30.2), new Rate(54.0, 43.6) }
this.rates = new Rate[0]; //this.rates = new Rate[0];
this.rates = new Rate[] {new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4)};
break; break;
case TelescopeAxes.axisSecondary: case TelescopeAxes.axisSecondary:
// TODO Initialize this array with any Secondary axis rates that your driver may provide // TODO Initialize this array with any Secondary axis rates that your driver may provide
this.rates = new Rate[0]; //this.rates = new Rate[0];
this.rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) };
break; break;
case TelescopeAxes.axisTertiary: case TelescopeAxes.axisTertiary:
// TODO Initialize this array with any Tertiary axis rates that your driver may provide // TODO Initialize this array with any Tertiary axis rates that your driver may provide
+242 -91
View File
@@ -27,11 +27,7 @@
#define Telescope #define Telescope
using System; using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using ASCOM; using ASCOM;
using ASCOM.Astrometry; using ASCOM.Astrometry;
using ASCOM.Astrometry.AstroUtils; using ASCOM.Astrometry.AstroUtils;
@@ -60,7 +56,7 @@ namespace ASCOM.MeadeAutostar497
/// </summary> /// </summary>
[Guid("58e4fe97-1760-4e22-8ecd-2225876aeefc")] [Guid("58e4fe97-1760-4e22-8ecd-2225876aeefc")]
[ClassInterface(ClassInterfaceType.None)] [ClassInterface(ClassInterfaceType.None)]
public class Telescope : ITelescopeV3 public class Telescope : ITelescopeV3, IFocuserV3
{ {
private ITelescopeController _telescopeController; private ITelescopeController _telescopeController;
@@ -73,7 +69,7 @@ namespace ASCOM.MeadeAutostar497
/// <summary> /// <summary>
/// Driver description that displays in the ASCOM Chooser. /// Driver description that displays in the ASCOM Chooser.
/// </summary> /// </summary>
private static string driverDescription = "ASCOM Telescope Driver for Meade Autostar 497 based telescopes."; private static string driverDescription = "Meade Autostar 497 .net";
internal static string comPortProfileName = "COM Port"; // Constants used for Profile persistence internal static string comPortProfileName = "COM Port"; // Constants used for Profile persistence
internal static string comPortDefault = "COM1"; internal static string comPortDefault = "COM1";
@@ -169,9 +165,9 @@ namespace ASCOM.MeadeAutostar497
{ {
CheckConnected("CommandBlind"); CheckConnected("CommandBlind");
// Call CommandString and return as soon as it finishes // Call CommandString and return as soon as it finishes
this.CommandString(command, raw); //this.CommandString(command, raw);
// or // or
//throw new ASCOM.MethodNotImplementedException("CommandBlind"); throw new ASCOM.MethodNotImplementedException("CommandBlind");
// DO NOT have both these sections! One or the other // DO NOT have both these sections! One or the other
} }
@@ -187,8 +183,11 @@ namespace ASCOM.MeadeAutostar497
public string CommandString(string command, bool raw) public string CommandString(string command, bool raw)
{ {
// 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
CheckConnected("CommandString"); CheckConnected("CommandString");
return _telescopeController.CommandString(command, raw); throw new ASCOM.MethodNotImplementedException("CommandString");
} }
public void Dispose() public void Dispose()
@@ -221,6 +220,7 @@ namespace ASCOM.MeadeAutostar497
if (value) if (value)
{ {
LogMessage("Connected Set", "Connecting to port {0}", comPort); LogMessage("Connected Set", "Connecting to port {0}", comPort);
_telescopeController.Port = comPort;
_telescopeController.Connected = true; _telescopeController.Connected = true;
} }
else else
@@ -289,16 +289,18 @@ namespace ASCOM.MeadeAutostar497
#region ITelescope Implementation #region ITelescope Implementation
public void AbortSlew() public void AbortSlew()
{ {
tl.LogMessage("AbortSlew", "Not implemented"); tl.LogMessage("AbortSlew", "Aborting slew");
throw new ASCOM.MethodNotImplementedException("AbortSlew"); _telescopeController.AbortSlew();
} }
public AlignmentModes AlignmentMode public AlignmentModes AlignmentMode
{ {
get get
{ {
tl.LogMessage("AlignmentMode Get", "Not implemented"); tl.LogMessage("AlignmentMode Get", "Getting alignmode");
throw new ASCOM.PropertyNotImplementedException("AlignmentMode", false); var alignmode = _telescopeController.AlignmentMode;
tl.LogMessage("AlignmentMode Get", $"alignmode = {alignmode}");
return alignmode;
} }
} }
@@ -306,8 +308,9 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("Altitude", "Not implemented"); var alt = _telescopeController.Altitude;
throw new ASCOM.PropertyNotImplementedException("Altitude", false); tl.LogMessage("Altitude", $"{alt}");
return alt;
} }
} }
@@ -342,8 +345,9 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("AtPark", "Get - " + false.ToString()); var atPatk = _telescopeController.AtPark;
return false; tl.LogMessage("AtPark", "Get - " + atPatk.ToString());
return atPatk;
} }
} }
@@ -357,8 +361,9 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("Azimuth Get", "Not implemented"); var az = _telescopeController.Azimuth;
throw new ASCOM.PropertyNotImplementedException("Azimuth", false); tl.LogMessage("Azimuth Get", $"{az}");
return az;
} }
} }
@@ -376,9 +381,9 @@ namespace ASCOM.MeadeAutostar497
tl.LogMessage("CanMoveAxis", "Get - " + Axis.ToString()); tl.LogMessage("CanMoveAxis", "Get - " + Axis.ToString());
switch (Axis) switch (Axis)
{ {
case TelescopeAxes.axisPrimary: return false; case TelescopeAxes.axisPrimary: return true; //RA or AZ
case TelescopeAxes.axisSecondary: return false; case TelescopeAxes.axisSecondary: return true; //Dev or Alt
case TelescopeAxes.axisTertiary: return false; case TelescopeAxes.axisTertiary: return false; //rotator / derotator
default: throw new InvalidValueException("CanMoveAxis", Axis.ToString(), "0 to 2"); default: throw new InvalidValueException("CanMoveAxis", Axis.ToString(), "0 to 2");
} }
} }
@@ -387,8 +392,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanPark", "Get - " + false.ToString()); tl.LogMessage("CanPark", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -396,8 +401,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanPulseGuide", "Get - " + false.ToString()); tl.LogMessage("CanPulseGuide", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -459,8 +464,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanSlew", "Get - " + false.ToString()); tl.LogMessage("CanSlew", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -468,8 +473,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanSlewAltAz", "Get - " + false.ToString()); tl.LogMessage("CanSlewAltAz", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -477,8 +482,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanSlewAltAzAsync", "Get - " + false.ToString()); tl.LogMessage("CanSlewAltAzAsync", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -486,8 +491,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanSlewAsync", "Get - " + false.ToString()); tl.LogMessage("CanSlewAsync", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -495,8 +500,8 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("CanSync", "Get - " + false.ToString()); tl.LogMessage("CanSync", "Get - " + true.ToString());
return false; return true;
} }
} }
@@ -522,7 +527,7 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
double declination = 0.0; double declination = _telescopeController.Declination;
tl.LogMessage("Declination", "Get - " + utilities.DegreesToDMS(declination, ":", ":")); tl.LogMessage("Declination", "Get - " + utilities.DegreesToDMS(declination, ":", ":"));
return declination; return declination;
} }
@@ -620,34 +625,35 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("IsPulseGuiding Get", "Not implemented"); tl.LogMessage("IsPulseGuiding Get", "pulse guiding is synchronous for this driver");
throw new ASCOM.PropertyNotImplementedException("IsPulseGuiding", false); //throw new ASCOM.PropertyNotImplementedException("IsPulseGuiding", false);
return false;
} }
} }
public void MoveAxis(TelescopeAxes Axis, double Rate) public void MoveAxis(TelescopeAxes Axis, double Rate)
{ {
tl.LogMessage("MoveAxis", "Not implemented"); tl.LogMessage("MoveAxis", $"Axis={Axis} rate={Rate}");
throw new ASCOM.MethodNotImplementedException("MoveAxis"); _telescopeController.MoveAxis(Axis, Rate);
} }
public void Park() public void Park()
{ {
tl.LogMessage("Park", "Not implemented"); tl.LogMessage("Park", "Parking telescope");
throw new ASCOM.MethodNotImplementedException("Park"); _telescopeController.Park();
} }
public void PulseGuide(GuideDirections Direction, int Duration) public void PulseGuide(GuideDirections Direction, int Duration)
{ {
tl.LogMessage("PulseGuide", "Not implemented"); tl.LogMessage("PulseGuide", $"pulse guide direction {Direction} duration {Duration}");
throw new ASCOM.MethodNotImplementedException("PulseGuide"); _telescopeController.PulseGuide(Direction, Duration);
} }
public double RightAscension public double RightAscension
{ {
get get
{ {
double rightAscension = 0.0; double rightAscension = _telescopeController.RightAscension;
tl.LogMessage("RightAscension", "Get - " + utilities.HoursToHMS(rightAscension)); tl.LogMessage("RightAscension", "Get - " + utilities.HoursToHMS(rightAscension));
return rightAscension; return rightAscension;
} }
@@ -732,13 +738,14 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("SiteLatitude Get", "Not implemented"); var siteLatitude = _telescopeController.SiteLatitude;
throw new ASCOM.PropertyNotImplementedException("SiteLatitude", false); tl.LogMessage("SiteLatitude Get", $"{utilities.DegreesToDMS(siteLatitude)}");
return siteLatitude;
} }
set set
{ {
tl.LogMessage("SiteLatitude Set", "Not implemented"); tl.LogMessage("SiteLatitude Set", $"{utilities.DegreesToDMS(value)}");
throw new ASCOM.PropertyNotImplementedException("SiteLatitude", true); _telescopeController.SiteLatitude = value;
} }
} }
@@ -746,13 +753,14 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("SiteLongitude Get", "Not implemented"); var siteLongitude = _telescopeController.SiteLongitude;
throw new ASCOM.PropertyNotImplementedException("SiteLongitude", false); tl.LogMessage("SiteLongitude Get", $"{utilities.DegreesToDMS(siteLongitude)}");
return siteLongitude;
} }
set set
{ {
tl.LogMessage("SiteLongitude Set", "Not implemented"); tl.LogMessage("SiteLongitude Set", $"{utilities.DegreesToDMS(value)}");
throw new ASCOM.PropertyNotImplementedException("SiteLongitude", true); _telescopeController.SiteLongitude = value;
} }
} }
@@ -772,46 +780,48 @@ namespace ASCOM.MeadeAutostar497
public void SlewToAltAz(double Azimuth, double Altitude) public void SlewToAltAz(double Azimuth, double Altitude)
{ {
tl.LogMessage("SlewToAltAz", "Not implemented"); tl.LogMessage("SlewToAltAz", $"Az=~{Azimuth} Alt={Altitude}");
throw new ASCOM.MethodNotImplementedException("SlewToAltAz"); _telescopeController.SlewToAltAz(Azimuth, Altitude);
} }
public void SlewToAltAzAsync(double Azimuth, double Altitude) public void SlewToAltAzAsync(double Azimuth, double Altitude)
{ {
tl.LogMessage("SlewToAltAzAsync", "Not implemented"); tl.LogMessage("SlewToAltAzAsync", $"Az=~{Azimuth} Alt={Altitude}");
throw new ASCOM.MethodNotImplementedException("SlewToAltAzAsync"); _telescopeController.SlewToAltAzAsync(Azimuth, Altitude);
} }
public void SlewToCoordinates(double RightAscension, double Declination) public void SlewToCoordinates(double RightAscension, double Declination)
{ {
tl.LogMessage("SlewToCoordinates", "Not implemented"); tl.LogMessage("SlewToCoordinates", $"Ra={RightAscension}, Dec={Declination}");
throw new ASCOM.MethodNotImplementedException("SlewToCoordinates"); _telescopeController.SlewToCoordinates(RightAscension, Declination);
} }
public void SlewToCoordinatesAsync(double RightAscension, double Declination) public void SlewToCoordinatesAsync(double RightAscension, double Declination)
{ {
tl.LogMessage("SlewToCoordinatesAsync", "Not implemented"); tl.LogMessage("SlewToCoordinatesAsync", $"Ra={RightAscension}, Dec={Declination}");
throw new ASCOM.MethodNotImplementedException("SlewToCoordinatesAsync"); _telescopeController.SlewToCoordinatesAsync(RightAscension, Declination);
} }
public void SlewToTarget() public void SlewToTarget()
{ {
tl.LogMessage("SlewToTarget", "Not implemented"); tl.LogMessage("SlewToTarget", "Executing");
throw new ASCOM.MethodNotImplementedException("SlewToTarget"); _telescopeController.SlewToTarget();
} }
public void SlewToTargetAsync() public void SlewToTargetAsync()
{ {
tl.LogMessage("SlewToTargetAsync", "Not implemented"); tl.LogMessage("SlewToTargetAsync", "Executing");
throw new ASCOM.MethodNotImplementedException("SlewToTargetAsync"); _telescopeController.SlewToTargetAsync();
} }
public bool Slewing public bool Slewing
{ {
get get
{ {
tl.LogMessage("Slewing Get", "Not implemented"); tl.LogMessage("Slewing Get", "Started");
throw new ASCOM.PropertyNotImplementedException("Slewing", false); var result = _telescopeController.Slewing;
tl.LogMessage("Slewing Get", $"Result = {result}");
return result;
} }
} }
@@ -823,27 +833,31 @@ namespace ASCOM.MeadeAutostar497
public void SyncToCoordinates(double RightAscension, double Declination) public void SyncToCoordinates(double RightAscension, double Declination)
{ {
tl.LogMessage("SyncToCoordinates", "Not implemented"); tl.LogMessage("SyncToCoordinates", $"RA={RightAscension} Dec={Declination}");
throw new ASCOM.MethodNotImplementedException("SyncToCoordinates"); _telescopeController.TargetRightAscension = RightAscension;
_telescopeController.TargetDeclination = Declination;
SyncToTarget();
} }
public void SyncToTarget() public void SyncToTarget()
{ {
tl.LogMessage("SyncToTarget", "Not implemented"); tl.LogMessage("SyncToTarget", "Executing");
throw new ASCOM.MethodNotImplementedException("SyncToTarget"); _telescopeController.SyncToTarget();
} }
public double TargetDeclination public double TargetDeclination
{ {
get get
{ {
tl.LogMessage("TargetDeclination Get", "Not implemented"); var targetDec = _telescopeController.TargetDeclination;
throw new ASCOM.PropertyNotImplementedException("TargetDeclination", false); tl.LogMessage("TargetDeclination Get", $"{targetDec}");
return targetDec;
} }
set set
{ {
tl.LogMessage("TargetDeclination Set", "Not implemented"); tl.LogMessage("TargetDeclination Set", $"{value}");
throw new ASCOM.PropertyNotImplementedException("TargetDeclination", true); _telescopeController.TargetDeclination = value;
} }
} }
@@ -851,13 +865,14 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("TargetRightAscension Get", "Not implemented"); var targetRa = _telescopeController.TargetRightAscension;
throw new ASCOM.PropertyNotImplementedException("TargetRightAscension", false); tl.LogMessage("TargetRightAscension Get", $"{targetRa}");
return targetRa;
} }
set set
{ {
tl.LogMessage("TargetRightAscension Set", "Not implemented"); tl.LogMessage("TargetRightAscension Set", $"{value}");
throw new ASCOM.PropertyNotImplementedException("TargetRightAscension", true); _telescopeController.TargetRightAscension = value;
} }
} }
@@ -865,6 +880,7 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
//todo implementing this, it exists.
bool tracking = true; bool tracking = true;
tl.LogMessage("Tracking", "Get - " + tracking.ToString()); tl.LogMessage("Tracking", "Get - " + tracking.ToString());
return tracking; return tracking;
@@ -880,8 +896,9 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
tl.LogMessage("TrackingRate Get", "Not implemented"); var tr = _telescopeController.TrackingRate;
throw new ASCOM.PropertyNotImplementedException("TrackingRate", false); tl.LogMessage("TrackingRate Get", $"{tr}");
return tr;
} }
set set
{ {
@@ -908,14 +925,17 @@ namespace ASCOM.MeadeAutostar497
{ {
get get
{ {
DateTime utcDate = DateTime.UtcNow; tl.LogMessage("UTCDate", "Get started");
tl.LogMessage("TrackingRates", "Get - " + Format("MM/dd/yy HH:mm:ss", utcDate));
var utcDate = _telescopeController.utcDate;
tl.LogMessage("UTCDate", "Get - " + Format("MM/dd/yy HH:mm:ss", utcDate));
return utcDate; return utcDate;
} }
set set
{ {
tl.LogMessage("UTCDate Set", "Not implemented"); tl.LogMessage("UTCDate", "Set - " + Format("MM/dd/yy HH:mm:ss", value));
throw new ASCOM.PropertyNotImplementedException("UTCDate", true); _telescopeController.utcDate = value;
} }
} }
@@ -927,6 +947,124 @@ namespace ASCOM.MeadeAutostar497
#endregion #endregion
#region IFocuser Implementation
private int focuserPosition = 0; // Class level variable to hold the current focuser position
private const int focuserSteps = 10000;
public bool Absolute
{
get
{
tl.LogMessage("Absolute Get", true.ToString());
return true; // This is an absolute focuser
}
}
public void Halt()
{
tl.LogMessage("Halt", "Not implemented");
throw new ASCOM.MethodNotImplementedException("Halt");
}
public bool IsMoving
{
get
{
tl.LogMessage("IsMoving Get", false.ToString());
return false; // This focuser always moves instantaneously so no need for IsMoving ever to be True
}
}
public bool Link
{
get
{
tl.LogMessage("Link Get", this.Connected.ToString());
return this.Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility
}
set
{
tl.LogMessage("Link Set", value.ToString());
this.Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility
}
}
public int MaxIncrement
{
get
{
tl.LogMessage("MaxIncrement Get", focuserSteps.ToString());
return focuserSteps; // Maximum change in one move
}
}
public int MaxStep
{
get
{
tl.LogMessage("MaxStep Get", focuserSteps.ToString());
return focuserSteps; // Maximum extent of the focuser, so position range is 0 to 10,000
}
}
public void Move(int Position)
{
tl.LogMessage("Move", Position.ToString());
focuserPosition = Position; // Set the focuser position
}
public int Position
{
get
{
return focuserPosition; // Return the focuser position
}
}
public double StepSize
{
get
{
tl.LogMessage("StepSize Get", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("StepSize", false);
}
}
public bool TempComp
{
get
{
tl.LogMessage("TempComp Get", false.ToString());
return false;
}
set
{
tl.LogMessage("TempComp Set", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("TempComp", false);
}
}
public bool TempCompAvailable
{
get
{
tl.LogMessage("TempCompAvailable Get", false.ToString());
return false; // Temperature compensation is not available in this driver
}
}
public double Temperature
{
get
{
tl.LogMessage("Temperature Get", "Not implemented");
throw new ASCOM.PropertyNotImplementedException("Temperature", false);
}
}
#endregion
#region Private properties and methods #region Private properties and methods
// here are some useful properties and methods that can be used as required // here are some useful properties and methods that can be used as required
// to help with driver development // to help with driver development
@@ -943,16 +1081,29 @@ namespace ASCOM.MeadeAutostar497
/// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param> /// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param>
private static void RegUnregASCOM(bool bRegister) private static void RegUnregASCOM(bool bRegister)
{ {
using (var P = new ASCOM.Utilities.Profile()) using (var p = new ASCOM.Utilities.Profile())
{ {
P.DeviceType = "Telescope"; p.DeviceType = "Telescope";
if (bRegister) if (bRegister)
{ {
P.Register(driverID, driverDescription); p.Register(driverID, driverDescription);
} }
else else
{ {
P.Unregister(driverID); p.Unregister(driverID);
}
}
using (var p = new ASCOM.Utilities.Profile())
{
p.DeviceType = "Focuser";
if (bRegister)
{
p.Register(driverID, driverDescription);
}
else
{
p.Unregister(driverID);
} }
} }
} }
@@ -0,0 +1,28 @@
using System.IO.Ports;
using System.Runtime.InteropServices;
namespace ASCOM.MeadeAutostar497.Controller
{
[ComVisible(false)]
public interface ISerialProcessor
{
bool IsOpen { get; }
bool DtrEnable { get; set; }
bool RtsEnable { get; set; }
int BaudRate { get; set; }
int DataBits { get; set; }
StopBits StopBits { get; set; }
Parity Parity { get; set; }
string PortName { get; set; }
string[] GetPortNames();
void Open();
void Close();
string CommandTerminated(string command, string terminator);
char CommandChar(string command);
string ReadTerminated(string terminator);
void Command(string command);
void Lock();
void Unlock();
}
}
@@ -1,13 +1,36 @@
using ASCOM.Utilities.Interfaces; using System;
using ASCOM.DeviceInterface;
namespace ASCOM.MeadeAutostar497.Controller namespace ASCOM.MeadeAutostar497.Controller
{ {
public interface ITelescopeController public interface ITelescopeController
{ {
ISerial SerialPort { get; set; }
string Port { get; set; } string Port { get; set; }
bool Connected { get; set; } bool Connected { get; set; }
string CommandString(string command, bool raw); bool Slewing { get; }
DateTime utcDate { get; set; }
double SiteLatitude { get; set; }
double SiteLongitude { get; set; }
AlignmentModes AlignmentMode { get; set; }
bool AtPark { get; }
double Altitude { get; }
double Azimuth { get; }
double RightAscension { get; }
double Declination { get; }
double TargetRightAscension { get; set; }
double TargetDeclination { get; set; }
DriveRates TrackingRate { get; }
void AbortSlew();
void PulseGuide(GuideDirections direction, int duration);
void Park();
void SlewToCoordinates(double rightAscension, double declination);
void SlewToCoordinatesAsync(double rightAscension, double declination);
void SlewToAltAz(double azimuth, double altitude);
void SlewToAltAzAsync(double azimuth, double altitude);
void SyncToTarget();
void SlewToTarget();
void SlewToTargetAsync();
void MoveAxis(TelescopeAxes axis, double rate);
} }
} }
@@ -0,0 +1,142 @@
using System;
using System.IO.Ports;
using System.Runtime.InteropServices;
using System.Threading;
namespace ASCOM.MeadeAutostar497.Controller
{
[ComVisible(false)]
public class SerialProcessor : ISerialProcessor
{
private SerialPort _serialPort = new SerialPort();
private Mutex serialMutex = new Mutex();
public bool IsOpen => _serialPort.IsOpen;
public bool DtrEnable
{
get => _serialPort.DtrEnable;
set => _serialPort.DtrEnable = value;
}
public bool RtsEnable
{
get => _serialPort.RtsEnable;
set => _serialPort.RtsEnable = value;
}
public int BaudRate
{
get => _serialPort.BaudRate;
set => _serialPort.BaudRate = value;
}
public int DataBits
{
get => _serialPort.DataBits;
set => _serialPort.DataBits = value;
}
public StopBits StopBits
{
get => _serialPort.StopBits;
set => _serialPort.StopBits = value;
}
public Parity Parity
{
get => _serialPort.Parity;
set => _serialPort.Parity = value;
}
public string PortName
{
get => _serialPort.PortName;
set => _serialPort.PortName = value;
}
public string[] GetPortNames()
{
return SerialPort.GetPortNames();
}
public void Open()
{
_serialPort.ReadTimeout = 5000;
_serialPort.WriteTimeout = 5000;
_serialPort.Open();
}
public void Close()
{
_serialPort.Close();
}
public string CommandTerminated(string command, string terminator)
{
Lock();
try
{
_serialPort.Write(command);
string result = _serialPort.ReadTo("#");
return result;
}
finally
{
Unlock();
}
}
public char CommandChar(string command)
{
Lock();
try
{
_serialPort.Write(command);
var result = _serialPort.ReadChar();
return Convert.ToChar(result);
}
finally
{
Unlock();
}
}
public string ReadTerminated(string terminator)
{
Lock();
try
{
string result = _serialPort.ReadTo("#");
return result;
}
finally
{
Unlock();
}
}
public void Command(string command)
{
Lock();
try
{
_serialPort.Write(command);
}
finally
{
Unlock();
}
}
public void Lock()
{
serialMutex.WaitOne();
}
public void Unlock()
{
serialMutex.ReleaseMutex();
}
}
}
@@ -1,19 +1,27 @@
using System; using System;
using System.IO.Ports;
using System.Linq;
using System.Threading;
using ASCOM.DeviceInterface;
using ASCOM.Utilities; using ASCOM.Utilities;
using ASCOM.Utilities.Interfaces; using ASCOM.Utilities.Interfaces;
namespace ASCOM.MeadeAutostar497.Controller namespace ASCOM.MeadeAutostar497.Controller
{ {
//todo stop this being a singleton, and instead use a server to make only a single instance.
public sealed class TelescopeController : ITelescopeController public sealed class TelescopeController : ITelescopeController
{ {
private static readonly Lazy<TelescopeController> lazy = new Lazy<TelescopeController>(); private const double INVALID_PARAMETER = -1000;
public static TelescopeController Instance => lazy.Value; private static readonly Lazy<TelescopeController> Lazy = new Lazy<TelescopeController>();
private ISerial _serialPort; public static TelescopeController Instance => Lazy.Value;
public ISerial SerialPort
//todo remove this as it can cause problems in production
private ISerialProcessor _serialPort;
public ISerialProcessor SerialPort
{ {
get => _serialPort ?? (_serialPort = new Serial()); get => _serialPort ?? (_serialPort = new SerialProcessor());
set set
{ {
if (_serialPort == value) if (_serialPort == value)
@@ -21,14 +29,27 @@ namespace ASCOM.MeadeAutostar497.Controller
if (_serialPort != null) if (_serialPort != null)
{ {
if (_serialPort.Connected) if (_serialPort.IsOpen)
throw new InvalidOperationException("Please disconnect before changing the port."); throw new InvalidOperationException("Please disconnect before changing the serial engine.");
} }
_serialPort = value; _serialPort = value;
} }
} }
private IUtil _util;
public IUtil Util
{
get => _util ?? (_util = new Util());
set
{
if (Equals(_util, value))
return;
_util = value;
}
}
private string _port = "COM1"; private string _port = "COM1";
public string Port public string Port
{ {
@@ -40,13 +61,21 @@ namespace ASCOM.MeadeAutostar497.Controller
if (Connected) if (Connected)
throw new InvalidOperationException("Please disconnect from the scope before changing port."); throw new InvalidOperationException("Please disconnect from the scope before changing port.");
if (!ValidPort(value))
throw new InvalidOperationException($"Unable to select port {value} as it does not exist.");
_port = value; _port = value;
} }
} }
private bool ValidPort(string value)
{
return SerialPort.GetPortNames().Contains(value);
}
public bool Connected public bool Connected
{ {
get => SerialPort.Connected; get => SerialPort.IsOpen;
set set
{ {
if (value == Connected) if (value == Connected)
@@ -55,32 +84,769 @@ namespace ASCOM.MeadeAutostar497.Controller
if (value) if (value)
{ {
//Connecting //Connecting
SerialPort.DTREnable = false; try
SerialPort.RTSEnable = false; {
SerialPort.Speed = SerialSpeed.ps9600; AtPark = false;
SerialPort.DataBits = 8; SerialPort.DtrEnable = false;
SerialPort.StopBits = SerialStopBits.One; SerialPort.RtsEnable = false;
SerialPort.Parity = SerialParity.None; SerialPort.BaudRate = 9600;
SerialPort.PortName = Port; SerialPort.DataBits = 8;
SerialPort.Connected = true; SerialPort.StopBits = StopBits.One;
SerialPort.Parity = Parity.None;
SerialPort.PortName = Port;
SerialPort.Open();
//todo perform test to ensure that connection has been made correctly. TestConnectionActive();
}
catch (Exception)
{
if (SerialPort.IsOpen)
SerialPort.Close();
throw;
}
} }
else else
{ {
//Disconnecting //Disconnecting
SerialPort.Connected = false; SerialPort.Close();
AtPark = false;
} }
} }
} }
public string CommandString(string command, bool raw) private void TestConnectionActive()
{ {
// it's a good idea to put all the low level communication with the device here, var firmwareVersionNumber = SerialPort.CommandTerminated(":GVN#", "#");
// then all communication calls this function if (string.IsNullOrEmpty(firmwareVersionNumber))
// you need something to ensure that only one command is in progress at a time {
throw new InvalidOperationException("Failed to communicate with telescope.");
throw new ASCOM.MethodNotImplementedException("CommandString"); }
} }
public bool Slewing
{
get
{
if (!Connected) return false;
if (movingAxis())
return true;
var result = SerialPort.CommandTerminated(":D#", "#");
return result != string.Empty;
}
}
public DateTime utcDate
{
get
{
string telescopeDate = SerialPort.CommandTerminated(":GC#", "#");
string telescopeTime = SerialPort.CommandTerminated(":GL#", "#");
int month = telescopeDate.Substring(0, 2).ToInteger();
int day = telescopeDate.Substring(3, 2).ToInteger();
int year = telescopeDate.Substring(6, 2).ToInteger();
if (year < 2000) //todo fix this hack that will create a Y2K100 bug
{
year = year + 2000;
}
int hour = telescopeTime.Substring(0, 2).ToInteger();
int minute = telescopeTime.Substring(3, 2).ToInteger();
int second = telescopeTime.Substring(6, 2).ToInteger();
var utcCorrection = GetUtcCorrection();
//Todo is this telescope local time, or real utc?
var newDate = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc) + utcCorrection;
return newDate;
}
set
{
var utcCorrection = GetUtcCorrection();
var localDateTime = value - utcCorrection;
//Todo is this telescope local time, or real utc?
var timeResult = SerialPort.CommandChar($":SL{localDateTime:HH:mm:ss}#");
if (timeResult != '1')
{
throw new InvalidOperationException("Failed to set local time");
}
SerialPort.Lock();
try
{
var dateResult = SerialPort.CommandChar($":SC{localDateTime:MM/dd/yy}#");
if (dateResult != '1')
{
throw new InvalidOperationException("Failed to set local date");
}
//throwing away these two strings which represent
SerialPort.ReadTerminated("#"); //Updating Planetary Data#
SerialPort.ReadTerminated("#"); // #
}
finally
{
SerialPort.Unlock();
}
}
}
private TimeSpan GetUtcCorrection()
{
string utcOffSet = SerialPort.CommandTerminated(":GG#", "#");
double utcOffsetHours = double.Parse(utcOffSet);
TimeSpan utcCorrection = TimeSpan.FromHours(utcOffsetHours);
return utcCorrection;
}
public double SiteLatitude
{
get
{
var latitude = SerialPort.CommandTerminated( ":Gt#", "#");
return DmsToDouble(latitude);
}
set
{
if (value > 90)
throw new InvalidValueException("Latitude cannot be greater than 90 degrees.");
if (value < -90)
throw new InvalidValueException("Latitude cannot be less than -90 degrees.");
int d = Convert.ToInt32(Math.Floor(value));
int m = Convert.ToInt32(60 * (value - d));
var result = SerialPort.CommandChar($":Sts{d:00}*{m:00}#");
if (result != '1')
throw new InvalidOperationException("Failed to set site latitude.");
}
}
private double DmsToDouble(string dms)
{
if (IsNumeric(dms[0]))
{
double l = int.Parse(dms.Substring(0, 3));
l = l + double.Parse(dms.Substring(4, 2)) / 60;
if (dms.Length == 9)
l = l + double.Parse(dms.Substring(7, 2)) / 60 / 60;
return l;
}
double lat = int.Parse(dms.Substring(1, 2));
lat = lat + double.Parse(dms.Substring(4, 2)) / 60;
if (dms.Length == 9)
lat = lat + double.Parse(dms.Substring(7, 2)) / 60 / 60;
if (dms[0] == '-')
lat = -lat;
return lat;
}
private bool IsNumeric(char c)
{
char[] nums = new[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
return nums.Contains(c);
}
public double SiteLongitude
{
get
{
var longitude = SerialPort.CommandTerminated(":Gg#", "#");
double l = DmsToDouble(longitude);
if (l > 180)
l = l - 360;
return l;
}
set
{
if (value > 180)
throw new InvalidValueException("Longitude cannot be greater than 180 degrees.");
if (value < -180)
throw new InvalidValueException("Longitude cannot be lower than -180 degrees.");
int d = Convert.ToInt32(Math.Floor(value));
int m = Convert.ToInt32(60 * (value - d));
var result = SerialPort.CommandChar($":Sg{d:000}*{m:00}#");
if (result != '1')
throw new InvalidOperationException("Failed to set site longitude.");
}
}
public AlignmentModes AlignmentMode
{
get
{
const char ack = (char)6;
//var alignmentString = SerialPort.CommandTerminated(":GW#", "#");
var alignmentString = SerialPort.CommandChar(ack.ToString());
//:GW# Get Scope Alignment Status
//Returns: <mount><tracking><alignment>#
// 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.
switch (alignmentString)
{
case 'A': return AlignmentModes.algAltAz;
case 'P': return AlignmentModes.algPolar;
case 'G': return AlignmentModes.algGermanPolar;
default:
throw new InvalidValueException($"unknown alignment returned from telescope: {alignmentString}");
}
}
set
{
switch (value)
{
case AlignmentModes.algAltAz:
SerialPort.Command(":AA#");
//:AA# Sets telescope the AltAz alignment mode
//Returns: nothing
break;
case AlignmentModes.algPolar:
case AlignmentModes.algGermanPolar:
SerialPort.Command(":AP#");
//:AP# Sets telescope to Polar alignment mode
//Returns: nothing
break;
default:
throw new ArgumentOutOfRangeException(nameof(value), value, null);
}
//:AL# Sets telescope to Land alignment mode
//Returns: nothing
}
}
public bool AtPark { get; private set; }
public double Azimuth
{
get
{
var result = SerialPort.CommandTerminated(":GZ#", "#");
//:GZ# Get telescope azimuth
//Returns: DDD*MM#T or DDD*MMSS#
//The current telescope Azimuth depending on the selected precision.
double az = DmsToDouble(result);
return az;
}
}
public double RightAscension {
get
{
var result = SerialPort.CommandTerminated(":GR#", "#");
//:GR# Get Telescope RA
//Returns: HH: MM.T# or HH:MM:SS#
//Depending which precision is set for the telescope
double ra = HmsToDouble(result);
return ra;
}
}
private double HmsToDouble(string hms)
{
return Util.HMSToHours(hms);
}
public double Declination
{
get
{
var result = SerialPort.CommandTerminated(":GD#", "#");
//:GD# Get Telescope Declination.
//Returns: sDD* MM# or sDD*MMSS#
//Depending upon the current precision setting for the telescope.
double az = DmsToDouble(result);
return az;
}
}
private double _targetRightAscension = INVALID_PARAMETER;
public double TargetRightAscension {
get
{
if (_targetRightAscension == INVALID_PARAMETER)
throw new ASCOM.InvalidOperationException("Target not set");
//var result = SerialPort.CommandTerminated(":Gr#", "#");
////:Gr# Get current/target object RA
////Returns: HH: MM.T# or HH:MM:SS
////Depending upon which precision is set for the telescope
//double targetRa = HmsToDouble(result);
//return targetRa;
return _targetRightAscension;
}
set
{
if (value < 0)
throw new InvalidValueException("Right ascension value cannot be below 0");
if (value >= 24)
throw new InvalidValueException("Right ascension value cannot be greater than 23:59:59");
//todo implement the low precision version
var hms = Util.HoursToHMS(value, ":", ":", ":", 2);
var response = SerialPort.CommandChar($":Sr{hms}#");
//:SrHH:MM.T#
//:SrHH:MM:SS#
//Set target object RA to HH:MM.T or HH: MM: SS depending on the current precision setting.
// Returns:
//0 Invalid
//1 - Valid
if (response == '0')
throw new InvalidOperationException("Failed to set TargetRightAscension.");
_targetRightAscension = value;
}
}
private double _targetDeclination = INVALID_PARAMETER;
public double TargetDeclination {
get
{
if (_targetDeclination == INVALID_PARAMETER)
throw new ASCOM.InvalidOperationException("Target not set");
//var result = SerialPort.CommandTerminated(":Gd#", "#");
////:Gd# Get Currently Selected Object/Target Declination
////Returns: sDD* MM# or sDD*MMSS#
////Depending upon the current precision setting for the telescope.
//double targetDec = DmsToDouble(result);
//return targetDec;
return _targetDeclination;
}
set
{
//todo implement low precision version of this.
if (value > 90)
throw new ASCOM.InvalidValueException("Declination cannot be greater than 90.");
if (value < -90)
throw new ASCOM.InvalidValueException("Declination cannot be less than -90.");
var dms = Util.DegreesToDMS(value, "*", ":", ":", 2);
var s = value < 0 ? '-' : '+';
var result = SerialPort.CommandChar($":Sd{s}{dms}#");
//:SdsDD*MM#
//Set target object declination to sDD*MM or sDD*MM:SS depending on the current precision setting
//Returns:
//1 - Dec Accepted
//0 Dec invalid
if (result == '0')
{
throw new ASCOM.InvalidOperationException("Target declination invalid");
}
_targetDeclination = value;
}
}
public DriveRates TrackingRate
{
get
{
var result = SerialPort.CommandTerminated(":GT#", "#");
double rate = double.Parse(result);
if (rate == 60.1)
return DriveRates.driveLunar;
else if (rate == 60.1)
return DriveRates.driveSidereal;
return DriveRates.driveKing;
}
set
{
switch (value)
{
case DriveRates.driveSidereal:
SerialPort.Command(":TQ#");
//:TQ# Selects sidereal tracking rate
//Returns: Nothing
break;
case DriveRates.driveLunar:
SerialPort.Command(":TL#");
//:TL# Set Lunar Tracking Rage
//Returns: Nothing
break;
case DriveRates.driveSolar:
SerialPort.Command(":TS#");
//:TS# Select Solar tracking rate. [LS Only]
//Returns: Nothing
break;
case DriveRates.driveKing:
break;
default:
throw new ArgumentOutOfRangeException(nameof(value), value, null);
}
}
}
public double Altitude {
get
{
var result = SerialPort.CommandTerminated(":GA#", "#");
//:GA# Get Telescope Altitude
//Returns: sDD* MM# or sDD*MMSS#
//The current scope altitude. The returned format depending on the current precision setting.
return DmsToDouble(result);
}
}
public void AbortSlew()
{
SerialPort.Command("#:Q#");
}
public void PulseGuide(GuideDirections direction, int duration)
{
string d = string.Empty;
switch (direction)
{
case GuideDirections.guideEast:
d = "e";
break;
case GuideDirections.guideNorth:
d = "n";
break;
case GuideDirections.guideSouth:
d = "s";
break;
case GuideDirections.guideWest:
d = "w";
break;
}
if (UserNewerPulseGuiding)
{
_serialPort.Command($":Mg{d}{duration:0000}#");
Thread.Sleep(duration); //todo figure out if this is really needed
}
else
{
_serialPort.Command(":RG#"); //Make sure we are at guide rate
_serialPort.Command($":M{d}#");
Thread.Sleep(duration);
_serialPort.Command($":Q{d}#");
//classic only !!!, this is needed since once in a while one is not enough
Thread.Sleep(200);
_serialPort.Command($":Q{d}#");
}
}
public void Park()
{
if (AtPark)
return;
AtPark = true;
_serialPort.Command(":hP#");
}
public void SlewToCoordinates(double rightAscension, double declination)
{
SlewToCoordinatesAsync(rightAscension, declination);
while (Slewing) //wait for slew to complete
{
Util.WaitForMilliseconds(200); //be responsive to AbortSlew();
}
}
public void SlewToCoordinatesAsync(double rightAscension, double declination)
{
TargetRightAscension = rightAscension;
TargetDeclination = declination;
DoSlewAsync(true);
}
public void SlewToAltAz(double azimuth, double altitude)
{
SlewToAltAzAsync(azimuth, altitude);
while (Slewing) //wait for slew to complete
{
Util.WaitForMilliseconds(200); //be responsive to AbortSlew();
}
}
private double TargetAltitude
{
set
{
if (value > 90)
throw new ASCOM.InvalidValueException("Altitude cannot be greater than 90.");
if (value < 0)
throw new ASCOM.InvalidValueException("Altitide cannot be less than 0.");
var dms = Util.DegreesToDMS(value, "*", "'", ".", 2);
var s = value < 0 ? '-' : '+';
var result = SerialPort.CommandChar($":Sa{s}{dms}#");
//:SasDD*MM#
//Set target object altitude to sDD*MM# or sDD*MMSS# [LX 16”, Autostar, Autostar II]
//Returns:
//1 Object within slew range
//0 Object out of slew range
if (result == '0')
throw new ASCOM.InvalidOperationException("Target altitude out of slew range");
}
}
private double TargetAzimuth
{
set
{
if (value >= 360)
throw new ASCOM.InvalidValueException("Azimuth cannot be 360 or higher.");
if (value < 0)
throw new ASCOM.InvalidValueException("Azimuth cannot be less than 0.");
var dms = Util.DegreesToDM(value, "*", ":", 2);
var result = SerialPort.CommandChar($":Sd{dms}#");
//:SzDDD*MM#
//Sets the target Object Azimuth[LX 16” and Autostar II only]
//Returns:
//0 Invalid
//1 - Valid
if (result == '0')
throw new ASCOM.InvalidOperationException("Target Azimuth out of slew range");
}
}
public void SlewToAltAzAsync(double azimuth, double altitude)
{
TargetAltitude = altitude;
TargetAzimuth = azimuth;
DoSlewAsync(false);
}
public void SyncToTarget()
{
var result = SerialPort.CommandTerminated(":CM#", "#");
//:CM# Synchronizes the telescope's position with the currently selected database object's coordinates.
//Returns:
//LX200's - a "#" terminated string with the name of the object that was synced.
// Autostars & Autostar II - At static string: " M31 EX GAL MAG 3.5 SZ178.0'#"
if (result == string.Empty)
throw new ASCOM.InvalidOperationException("Unable to perform sync");
}
public void SlewToTarget()
{
SlewToTargetAsync();
while (Slewing)
{
Util.WaitForMilliseconds(200);
}
}
public void SlewToTargetAsync()
{
if (TargetDeclination == INVALID_PARAMETER || TargetRightAscension == INVALID_PARAMETER )
throw new ASCOM.InvalidOperationException("No target selected to slew to.");
DoSlewAsync(true);
}
private bool movingAxis()
{
return _movingPrimary || _movingSecondary;
}
private bool _movingPrimary;
private bool _movingSecondary;
public void MoveAxis(TelescopeAxes axis, double rate)
{
var absrate = Math.Abs(rate);
switch(absrate)
{
case 0:
//do nothing, it's ok this time as we're halting the slew.
break;
case 1:
SerialPort.Command(":RG#");
//:RG# Set Slew rate to Guiding Rate (slowest)
//Returns: Nothing
break;
case 2:
SerialPort.Command(":RC#");
//:RC# Set Slew rate to Centering rate (2nd slowest)
//Returns: Nothing
break;
case 3:
SerialPort.Command(":RM#");
//:RM# Set Slew rate to Find Rate (2nd Fastest)
//Returns: Nothing
break;
case 4:
SerialPort.Command(":RS#");
//:RS# Set Slew rate to max (fastest)
//Returns: Nothing
break;
default:
throw new ASCOM.InvalidValueException($"Rate {rate} not supported");
}
switch (axis)
{
case TelescopeAxes.axisPrimary:
if (rate == 0)
{
_movingPrimary = false;
SerialPort.Command(":Qe#");
//:Qe# Halt eastward Slews
//Returns: Nothing
SerialPort.Command(":Qw#");
//:Qw# Halt westward Slews
//Returns: Nothing
}
else if (rate > 0)
{
SerialPort.Command(":Me#");
//:Me# Move Telescope East at current slew rate
//Returns: Nothing
_movingPrimary = true;
}
else
{
SerialPort.Command(":Mw#");
//:Mw# Move Telescope West at current slew rate
//Returns: Nothing
_movingPrimary = true;
}
break;
case TelescopeAxes.axisSecondary:
if (rate == 0)
{
_movingSecondary = false;
SerialPort.Command(":Qn#");
//:Qn# Halt northward Slews
//Returns: Nothing
SerialPort.Command(":Qs#");
//:Qs# Halt southward Slews
//Returns: Nothing
}
else if (rate > 0)
{
SerialPort.Command(":Mn#");
//:Mn# Move Telescope North at current slew rate
//Returns: Nothing
_movingSecondary = true;
}
else
{
SerialPort.Command(":Ms#");
//:Ms# Move Telescope South at current slew rate
//Returns: Nothing
_movingSecondary = true;
}
break;
default:
throw new ASCOM.MethodNotImplementedException("Can not move this axis.");
}
}
//todo remove the polar parameter and split method into two.
private void DoSlewAsync( bool polar)
{
switch (polar)
{
case true:
var response = SerialPort.CommandChar(":MS#");
//:MS# Slew to Target Object
//Returns:
//0 Slew is Possible
//1<string># Object Below Horizon w/string message
//2<string># Object Below Higher w/string message
switch (response)
{
case '0':
//We're slewing everything should be working just fine.
break;
case '1':
//Below Horizon
string belowHorizonMessage = SerialPort.ReadTerminated("#");
throw new ASCOM.InvalidOperationException(belowHorizonMessage);
case '2':
//Below Horizon
string belowMinimumElevationMessage = SerialPort.ReadTerminated("#");
throw new ASCOM.InvalidOperationException(belowMinimumElevationMessage);
default:
throw new ASCOM.DriverException("This error should not happen");
}
break;
case false:
var maResponse = SerialPort.CommandChar(":MA#");
//:MA# Autostar, LX 16”, Autostar II Slew to target Alt and Az
//Returns:
//0 - No fault
//1 Fault
// LX200 Not supported
if (maResponse == '1')
{
throw new ASCOM.InvalidOperationException("fault");
}
break;
}
}
public bool UserNewerPulseGuiding { get; set; } = true; //todo make this a device setting
} }
} }
+17 -4
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -15,7 +15,7 @@
<UpgradeBackupLocation> <UpgradeBackupLocation>
</UpgradeBackupLocation> </UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion> <OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<ApplicationIcon>ASCOM.ico</ApplicationIcon> <ApplicationIcon>ASCOM.ico</ApplicationIcon>
<SignAssembly>true</SignAssembly> <SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>ASCOMDriverTemplate.snk</AssemblyOriginatorKeyFile> <AssemblyOriginatorKeyFile>ASCOMDriverTemplate.snk</AssemblyOriginatorKeyFile>
@@ -34,7 +34,8 @@
<IsWebBootstrapper>false</IsWebBootstrapper> <IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile>Client</TargetFrameworkProfile> <TargetFrameworkProfile>
</TargetFrameworkProfile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@@ -45,7 +46,8 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<RegisterForComInterop>true</RegisterForComInterop> <RegisterForComInterop>true</RegisterForComInterop>
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@@ -56,6 +58,7 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<RegisterForComInterop>false</RegisterForComInterop> <RegisterForComInterop>false</RegisterForComInterop>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="ASCOM.Astrometry, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" /> <Reference Include="ASCOM.Astrometry, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
@@ -66,6 +69,7 @@
<Reference Include="ASCOM.SettingsProvider, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" /> <Reference Include="ASCOM.SettingsProvider, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.Utilities, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" /> <Reference Include="ASCOM.Utilities, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.Utilities.Video, Version=6.1.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" /> <Reference Include="ASCOM.Utilities.Video, Version=6.1.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.configuration" /> <Reference Include="System.configuration" />
<Reference Include="System.Configuration.Install" /> <Reference Include="System.Configuration.Install" />
@@ -74,13 +78,22 @@
</Reference> </Reference>
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Transactions" />
<Reference Include="System.Windows" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AscomClasses\Telescope.cs" /> <Compile Include="AscomClasses\Telescope.cs" />
<Compile Include="Controller\ISerialProcessor.cs" />
<Compile Include="Controller\ITelescopeController.cs" /> <Compile Include="Controller\ITelescopeController.cs" />
<Compile Include="Controller\SerialProcessor.cs" />
<Compile Include="Controller\TelescopeController.cs" /> <Compile Include="Controller\TelescopeController.cs" />
<Compile Include="StringExtensions.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs"> <Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
+5 -5
View File
@@ -8,11 +8,11 @@ using System.Runtime.InteropServices;
// //
// TODO - Add your authorship information here // TODO - Add your authorship information here
[assembly: AssemblyTitle("ASCOM.MeadeAutostar497.Telescope")] [assembly: AssemblyTitle("ASCOM.MeadeAutostar497.Telescope")]
[assembly: AssemblyDescription("ASCOM Telescope driver for MeadeAutostar497")] [assembly: AssemblyDescription("ASCOM MeadeAutostar497 .net")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("The ASCOM Initiative")] [assembly: AssemblyCompany("Cjdawson.com")]
[assembly: AssemblyProduct("ASCOM Telescope driver for MeadeAutostar497")] [assembly: AssemblyProduct("ASCOM Telescope driver for MeadeAutostar497")]
[assembly: AssemblyCopyright("Copyright © 2019 The ASCOM Initiative")] [assembly: AssemblyCopyright("Copyright © 2019 cjdawson.com")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below: // by using the '*' as shown below:
// //
// TODO - Set your driver's version here // TODO - Set your driver's version here
[assembly: AssemblyVersion("6.4.0.0")] [assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("6.4.0.0")] [assembly: AssemblyFileVersion("0.0.0.0")]
+24 -37
View File
@@ -1,18 +1,17 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.18052 // Runtime Version:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace ASCOM.MeadeAutostar497.Properties namespace ASCOM.MeadeAutostar497.Properties {
{
using System; using System;
/// <summary> /// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc. /// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary> /// </summary>
@@ -20,74 +19,62 @@ namespace ASCOM.MeadeAutostar497.Properties
// class via a tool like ResGen or Visual Studio. // class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen // To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project. // with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources internal class Resources {
{
private static global::System.Resources.ResourceManager resourceMan; private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture; private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() internal Resources() {
{
} }
/// <summary> /// <summary>
/// Returns the cached ResourceManager instance used by this class. /// Returns the cached ResourceManager instance used by this class.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager internal static global::System.Resources.ResourceManager ResourceManager {
{ get {
get if (object.ReferenceEquals(resourceMan, null)) {
{
if (object.ReferenceEquals(resourceMan, null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.MeadeAutostar497.Properties.Resources", typeof(Resources).Assembly); global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.MeadeAutostar497.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp; resourceMan = temp;
} }
return resourceMan; return resourceMan;
} }
} }
/// <summary> /// <summary>
/// Overrides the current thread's CurrentUICulture property for all /// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class. /// resource lookups using this strongly typed resource class.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture internal static global::System.Globalization.CultureInfo Culture {
{ get {
get
{
return resourceCulture; return resourceCulture;
} }
set set {
{
resourceCulture = value; resourceCulture = value;
} }
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap. /// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary> /// </summary>
internal static System.Drawing.Bitmap ASCOM internal static System.Drawing.Bitmap ASCOM {
{ get {
get
{
object obj = ResourceManager.GetObject("ASCOM", resourceCulture); object obj = ResourceManager.GetObject("ASCOM", resourceCulture);
return ((System.Drawing.Bitmap)(obj)); return ((System.Drawing.Bitmap)(obj));
} }
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary> /// </summary>
internal static System.Drawing.Icon DefaultIcon internal static System.Drawing.Icon DefaultIcon {
{ get {
get
{
object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture); object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture);
return ((System.Drawing.Icon)(obj)); return ((System.Drawing.Icon)(obj));
} }
+10 -14
View File
@@ -1,28 +1,24 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.18052 // Runtime Version:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace ASCOM.MeadeAutostar497.Properties namespace ASCOM.MeadeAutostar497.Properties {
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default public static Settings Default {
{ get {
get
{
return defaultInstance; return defaultInstance;
} }
} }
+16
View File
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ASCOM.MeadeAutostar497
{
public static class StringExtensions
{
public static int ToInteger(this string str)
{
return int.Parse(str);
}
}
}
+1 -1
View File
@@ -5,4 +5,4 @@
<section name="ASCOM.DeviceName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> <section name="ASCOM.DeviceName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup> </sectionGroup>
</configSections> </configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup></configuration>
+249
View File
@@ -0,0 +1,249 @@
ConformanceCheck ASCOM Device Conformance Checker Version 6.4.63.0, Build time: 18/12/2018 08:58:34
ConformanceCheck Running on: ASCOM Platform 6.4 SP1 6.4.1.2695
ConformanceCheck Driver ProgID: MeadeEx.Telescope
Error handling
Error number for "Not Implemented" is: 80040400
Error number for "Invalid Value 1" is: 80040401
Error number for "Invalid Value 2" is: 80040405
Error number for "Value Not Set 1" is: 80040402
Error number for "Value Not Set 2" is: 80040403
Error messages will not be interpreted to infer state.
21:04:42.255 Driver Access Checks OK
21:04:42.997 AccessChecks OK Successfully created driver using late binding
21:04:50.059 AccessChecks OK Successfully connected using late binding
21:04:50.063 AccessChecks INFO The driver is a COM object
21:04:57.769 AccessChecks INFO Device exposes interface ITelescopeV2
21:04:58.546 AccessChecks INFO Device does not expose interface ITelescopeV3
21:04:59.881 AccessChecks OK Successfully created driver using driver access toolkit
21:05:06.873 AccessChecks OK Successfully connected using driver access toolkit
Conform is using ASCOM.DriverAccess.Telescope to get a Telescope object
21:05:08.261 ConformanceCheck OK Driver instance created successfully
21:05:15.293 ConformanceCheck OK Connected OK
Common Driver Methods
21:05:15.333 InterfaceVersion OK 2
21:05:15.362 Connected OK True
21:05:15.448 Description OK Meade Autostar 497: ETX Autostar|A|43Ea|Jun 02 2006@10:09:40
21:05:15.480 DriverInfo OK ASCOM Meade Telescope/Focuser driver for classic and Autostar I 5.0.4
ASCOM Iniative
http://ascom-standards.org/
Last Modified 10/06/2013 19:06:54
21:05:15.509 DriverVersion OK 5.0
21:05:15.539 Name OK Autostar 497
21:05:15.568 CommandString INFO Conform cannot test the CommandString method
21:05:15.572 CommandBlind INFO Conform cannot test the CommandBlind method
21:05:15.582 CommandBool INFO Conform cannot test the CommandBool method
21:05:15.588 Action INFO Conform cannot test the Action method
21:05:15.595 SupportedActions OK Driver returned an empty action list
Can Properties
21:05:15.663 CanFindHome OK False
21:05:15.671 CanPark OK True
21:05:15.679 CanPulseGuide OK True
21:05:15.687 CanSetDeclinationRate OK False
21:05:15.695 CanSetGuideRates OK False
21:05:15.703 CanSetPark OK False
21:05:15.711 CanSetPierSide OK False
21:05:15.719 CanSetRightAscensionRate OK False
21:05:15.727 CanSetTracking OK False
21:05:15.735 CanSlew OK True
21:05:15.743 CanSlewltAz OK True
21:05:15.752 CanSlewAltAzAsync OK True
21:05:15.761 CanSlewAsync OK True
21:05:15.769 CanSync OK True
21:05:15.777 CanSyncAltAz OK False
21:05:15.785 CanUnPark OK False
Pre-run Checks
21:05:15.834 Mount Safety INFO Scope is not parked, continuing testing
21:05:15.887 TimeCheck INFO PC Time Zone: GMT Summer Time, offset -1 hours.
21:05:15.894 TimeCheck INFO PC UTCDate: 30-Apr-2019 20:05:15.894
21:05:16.013 TimeCheck INFO Mount UTCDate: 30-Apr-2019 20:04:15.000
Properties
21:05:16.063 AlignmentMode OK algPolar
21:05:16.117 Altitude OK 90.00
21:05:16.149 ApertureArea ERROR Unexpected DriverAccessCOMException, : Property ApertureAreaThe supplied value is out of range for this property.
21:05:16.182 ApertureDiameter ERROR Unexpected DriverAccessCOMException, : Property ApertureDiameterThe supplied value is out of range for this property.
21:05:16.214 AtHome OK False
21:05:16.245 AtPark OK False
21:05:16.310 Azimuth OK 0.57
21:05:16.369 Declination OK 89:59:59.00
21:05:16.402 DeclinationRate Read OK 0.00
21:05:16.434 DeclinationRate Write OK CanSetDeclinationRate is False and a PropertyNotImplementedException exception was generated as expected
21:05:16.469 DoesRefraction Read OK True
21:05:16.501 DoesRefraction Write ERROR Unexpected DriverAccessCOMException, : Property DoesRefractionThe supplied value is out of range for this property.
21:05:16.534 EquatorialSystem OK equLocalTopocentric
21:05:16.568 FocalLength ERROR Unexpected DriverAccessCOMException, : Property FocalLengthThe supplied value is out of range for this property.
21:05:16.602 GuideRateDeclination Read OK 0.00
21:05:16.613 GuideRateDeclination Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
21:05:16.646 GuideRateRightAscension Read OK 0.00
21:05:16.661 GuideRateRightAscension Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
21:05:16.694 IsPulseGuiding OK False
21:05:16.748 RightAscension OK 22:28:48.00
21:05:16.781 RightAscensionRate Read OK 0.00
21:05:16.814 RightAscensionRate Write OK CanSetRightAscensionRate is False and a PropertyNotImplementedException exception was generated as expected
21:05:16.848 SiteElevation Read OK 0
21:05:16.884 SiteElevation Write ERROR Unexpected DriverAccessCOMException, : Property SiteElevation The supplied value is out of range for this property.
21:05:16.896 SiteElevation Write ERROR Unexpected DriverAccessCOMException, : Property SiteElevation The supplied value is out of range for this property.
21:05:16.908 SiteElevation Write OK Legal value 0m written successfully
21:05:16.965 SiteLatitude Read OK 53:50:00.00
21:05:16.999 SiteLatitude Write OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.012 SiteLatitude Write OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.025 SiteLatitude Write OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.096 SiteLongitude Read OK -01:46:00.00
21:05:17.130 SiteLongitude Write OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.144 SiteLongitude Write OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.156 SiteLongitude Write OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.192 Slewing OK False
21:05:17.226 SlewSettleTime Read OK 0
21:05:17.262 SlewSettleTime Write ERROR Unexpected DriverAccessCOMException, : Property SlewSettleTime The supplied value is out of range for this property.
21:05:17.277 SlewSettleTime Write OK Legal value 0 seconds written successfully
21:05:17.313 SideOfPier Read OK Optional member threw a PropertyNotImplementedException exception.
21:05:17.356 SiderealTime OK 10:31:06.00
21:05:17.368 SiderealTime OK Scope and ASCOM sidereal times agree to better than 5 minutes, Scope: 10:31:06.00, ASCOM: 10:32:07.97
21:05:17.405 TargetDeclination Read ERROR Unexpected DriverAccessCOMException, : The target value is not set.
21:05:17.440 TargetDeclination Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
21:05:17.454 TargetRightAscension Read ERROR Unexpected DriverAccessCOMException, : The target value is not set.
21:05:17.489 TargetRightAscension Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
21:05:17.502 Tracking Read OK True
21:05:17.537 Tracking Write OK CanSetTracking is False and a PropertyNotImplementedException exception was generated as expected
21:05:17.575 TrackingRates ERROR Unexpected System.Reflection.TargetInvocationException exception, : Exception has been thrown by the target of an invocation.
21:05:17.590 TrackingRates ERROR Unexpected System.Reflection.TargetInvocationException exception, : Exception has been thrown by the target of an invocation.
21:05:17.603 TrackingRates OK Dispose member not present
21:05:17.638 TrackingRates OK Successfully obtained a TrackingRates object after the previous TrackingRates object was disposed
21:05:17.651 TrackingRate Read OK driveSidereal
21:05:17.665 TrackingRate Write ERROR Unexpected System.Reflection.TargetInvocationException exception, : Exception has been thrown by the target of an invocation.
21:05:17.760 UTCDate Read OK 30-Apr-2019 20:04:16.000
21:05:17.774 UTCDate Write OK Optional member threw a PropertyNotImplementedException exception.
Methods
21:05:17.858 CanMoveAxis:Primary OK CanMoveAxis:Primary False
21:05:17.894 CanMoveAxis:Secondary OK CanMoveAxis:Secondary False
21:05:17.931 CanMoveAxis:Tertiary OK CanMoveAxis:Tertiary False
21:05:17.967 Park/Unpark INFO Tests skipped
21:05:18.981 AbortSlew OK AbortSlew OK when not slewing
21:05:19.040 AxisRate:Primary Enum ERROR .NET - Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
--- End of inner exception stack trace ---
at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Conform.TelescopeTester.TelescopeAxisRateTest(String p_Name, TelescopeAxes p_Axis) in J:\Conform\Conform\Devices\TelescopeTester.vb:line 3022
21:05:19.055 AxisRate:Primary OK Empty axis rate returned
21:05:19.069 AxisRate:Primary OK AxisRates.Dispose() member not present for axis axisPrimary
21:05:19.085 AxisRate:Secondary Enum ERROR .NET - Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
--- End of inner exception stack trace ---
at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Conform.TelescopeTester.TelescopeAxisRateTest(String p_Name, TelescopeAxes p_Axis) in J:\Conform\Conform\Devices\TelescopeTester.vb:line 3022
21:05:19.100 AxisRate:Secondary OK Empty axis rate returned
21:05:19.117 AxisRate:Secondary OK AxisRates.Dispose() member not present for axis axisSecondary
21:05:19.132 AxisRate:Tertiary Enum ERROR .NET - Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
--- End of inner exception stack trace ---
at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Conform.TelescopeTester.TelescopeAxisRateTest(String p_Name, TelescopeAxes p_Axis) in J:\Conform\Conform\Devices\TelescopeTester.vb:line 3022
21:05:19.149 AxisRate:Tertiary OK Empty axis rate returned
21:05:19.178 AxisRate:Tertiary OK AxisRates.Dispose() member not present for axis axisTertiary
21:05:19.195 FindHome OK CanFindHome is False and a MethodNotImplementedException exception was generated as expected
21:05:19.234 MoveAxis Primary OK CanMoveAxis Primary is False and a MethodNotImplementedException exception was generated as expected
21:05:19.273 MoveAxis Secondary OK CanMoveAxis Secondary is False and a MethodNotImplementedException exception was generated as expected
21:05:19.314 MoveAxis Tertiary OK CanMoveAxis Tertiary is False and a MethodNotImplementedException exception was generated as expected
21:05:21.349 PulseGuide OK Synchronous pulse guide found OK
21:06:13.942 SlewToCoordinates INFO Slewed within 15.0 arc seconds of expected RA: 09:31:10.00, actual RA: 09:31:09.00
21:06:13.956 SlewToCoordinates OK Slewed OK. DEC: 01:00:00.00
21:06:13.971 SlewToCoordinates OK The TargetRightAscension property 09:31:10.00 matches the expected RA OK.
21:06:13.987 SlewToCoordinates OK The TargetDeclination property 01:00:00.00 matches the expected Declination OK.
21:06:14.028 SlewToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:06:14.102 SlewToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:06:14.164 SlewToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:06:14.262 SlewToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:06:48.075 SlewToCoordinatesAsync INFO Slewed within 45.0 arc seconds of expected RA: 08:32:03.00, actual RA: 08:32:00.00
21:06:48.090 SlewToCoordinatesAsync OK Slewed OK. DEC: 02:00:00.00
21:06:48.106 SlewToCoordinatesAsync OK The TargetRightAscension property 08:32:03.00 matches the expected RA OK.
21:06:48.122 SlewToCoordinatesAsync OK The TargetDeclination property 02:00:00.00 matches the expected Declination OK.
21:06:48.164 SlewToCoordinatesAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:06:48.239 SlewToCoordinatesAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:06:48.302 SlewToCoordinatesAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:06:48.436 SlewToCoordinatesAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:07:22.044 SyncToCoordinates INFO Slewed to start position within 15.0 arc seconds of expected RA: 07:32:37.00, actual RA: 07:32:36.00
21:07:22.061 SyncToCoordinates OK Slewed to start position OK. DEC: 26:55:00.00
21:07:22.782 SyncToCoordinates INFO Synced to sync position within 15.0 arc seconds of expected RA: 07:28:37.00, actual RA: 07:28:36.00
21:07:22.796 SyncToCoordinates OK Synced to sync position OK. DEC: 25:55:00.00
21:07:22.812 SyncToCoordinates OK The TargetRightAscension property 07:28:37.00 matches the expected RA OK.
21:07:22.828 SyncToCoordinates OK The TargetDeclination property 25:55:00.00 matches the expected Declination OK.
21:07:53.961 SyncToCoordinates INFO Slewed back to start position within 15.0 arc seconds of expected RA: 07:32:37.00, actual RA: 07:32:36.00
21:07:53.976 SyncToCoordinates OK Slewed back to start position OK. DEC: 26:55:00.00
21:07:54.692 SyncToCoordinates INFO Synced to reversed sync position within 30.0 arc seconds of expected RA: 07:36:37.00, actual RA: 07:36:35.00
21:07:54.708 SyncToCoordinates OK Synced to reversed sync position OK. DEC: 27:55:00.00
21:08:25.954 SyncToCoordinates INFO Slewed back to start position within 15.0 arc seconds of expected RA: 07:32:37.00, actual RA: 07:32:36.00
21:08:25.969 SyncToCoordinates OK Slewed back to start position OK. DEC: 26:55:00.00
21:08:26.009 SyncToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, syncing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:08:26.087 SyncToCoordinates (Bad L) ERROR Unexpected DriverAccessCOMException, syncing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:08:26.150 SyncToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, syncing to bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:08:26.229 SyncToCoordinates (Bad H) ERROR Unexpected DriverAccessCOMException, syncing to bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:08:26.292 TargetRightAscension Write ERROR Unexpected DriverAccessCOMException, : Property TargetRightAscension The supplied value is out of range for this property.
21:08:26.311 TargetRightAscension Write ERROR Unexpected DriverAccessCOMException, : Property TargetRightAscension The supplied value is out of range for this property.
21:08:26.395 TargetRightAscension Write OK Legal value 06:34:15.00 HH:MM:SS written successfully
21:08:26.435 TargetDeclination Write ERROR Unexpected DriverAccessCOMException, : Property TargetDeclination The supplied value is out of range for this property.
21:08:26.454 TargetDeclination Write ERROR Unexpected DriverAccessCOMException, : Property TargetDeclination The supplied value is out of range for this property.
21:08:26.506 TargetDeclination Write OK Legal value 01:00:00.00 DD:MM:SS written successfully
21:08:57.865 SlewToTarget INFO Slewed within 45.0 arc seconds of expected RA: 07:34:15.00, actual RA: 07:34:12.00
21:08:57.880 SlewToTarget OK Slewed OK. DEC: 03:00:00.00
21:08:57.897 SlewToTarget OK The TargetRightAscension property 07:34:15.00 matches the expected RA OK.
21:08:57.915 SlewToTarget OK The TargetDeclination property 03:00:00.00 matches the expected Declination OK.
21:08:57.959 SlewToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:08:58.003 SlewToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:08:58.064 SlewToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:08:58.114 SlewToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:09:29.948 SlewToTargetAsync INFO Slewed within 45.0 arc seconds of expected RA: 06:34:47.00, actual RA: 06:34:44.00
21:09:29.964 SlewToTargetAsync OK Slewed OK. DEC: 04:00:00.00
21:09:29.979 SlewToTargetAsync OK The TargetRightAscension property 06:34:47.00 matches the expected RA OK.
21:09:29.996 SlewToTargetAsync OK The TargetDeclination property 04:00:00.00 matches the expected Declination OK.
21:09:30.038 SlewToTargetAsync (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:09:30.085 SlewToTargetAsync (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:09:30.150 SlewToTargetAsync (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:09:30.196 SlewToTargetAsync (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:09:30.257 DestinationSideOfPier Test skipped as AligmentMode is not German Polar
21:09:30.278 SlewToAltAz ERROR Unexpected DriverAccessCOMException, CanSlewAltAz is True: Wrong tracking state
21:09:30.322 SlewToAltAz (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
21:09:30.343 SlewToAltAz (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
21:09:30.407 SlewToAltAz (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
21:09:30.426 SlewToAltAz (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
21:09:30.492 SlewToAltAzAsync ERROR Unexpected DriverAccessCOMException, CanSlewAltAzAsync is True: Wrong tracking state
21:09:30.534 SlewToAltAzAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
21:09:30.552 SlewToAltAzAsync (Bad L) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
21:09:30.617 SlewToAltAzAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Altitude coordinate: Wrong tracking state
21:09:30.637 SlewToAltAzAsync (Bad H) ERROR Unexpected DriverAccessCOMException, slewing to bad Azimuth coordinate: Wrong tracking state
21:10:05.974 SyncToTarget OK Slewed to start position OK. RA: 07:35:20.00
21:10:05.993 SyncToTarget OK Slewed to start position OK. DEC: 26:55:00.00
21:10:06.721 SyncToTarget OK Synced to sync position OK. RA: 07:31:20.00
21:10:06.736 SyncToTarget OK Synced to sync position OK. DEC: 25:55:00.00
21:10:37.626 SyncToTarget OK Slewed back to start position OK. RA: 07:35:20.00
21:10:37.641 SyncToTarget OK Slewed back to start position OK. DEC: 26:55:00.00
21:10:38.363 SyncToTarget OK Synced to reversed sync position OK. RA: 07:39:20.00
21:10:38.381 SyncToTarget OK Synced to reversed sync position OK. DEC: 27:55:00.00
21:11:09.639 SyncToTarget OK Slewed back to start position OK. RA: 07:35:20.00
21:11:09.657 SyncToTarget OK Slewed back to start position OK. DEC: 26:55:00.00
21:11:09.697 SyncToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:11:09.741 SyncToTarget (Bad L) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:11:09.803 SyncToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad RA coordinate: Property TargetRightAscension The supplied value is out of range for this property.
21:11:09.847 SyncToTarget (Bad H) ERROR Unexpected DriverAccessCOMException, Exception setting bad Dec coordinate: Property TargetDeclination The supplied value is out of range for this property.
21:11:10.010 SyncToAltAz OK CanSyncAltAz is False and a MethodNotImplementedException exception was generated as expected
SideOfPier Model Tests
21:11:10.080 SideOfPier Model Tests INFO Tests skipped because this driver does Not support SideOfPier Read
Post-run Checks
21:11:10.180 Mount Safety INFO Tracking can't be turned off for this mount, please switch off manually.
Conformance test complete
Your driver had 53 errors, 0 warnings and 0 issues
+73
View File
@@ -0,0 +1,73 @@
// This implements a console application that can be used to test an ASCOM driver
//
// This is used to define code in the template that is specific to one class implementation
// unused code can be deleted and this definition removed.
#define Telescope
// remove this to bypass the code that uses the chooser to select the driver
#define UseChooser
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASCOM
{
class Program
{
static void Main(string[] args)
{
// Uncomment the code that's required
#if UseChooser
// choose the device
string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.MeadeAutostar497.Telescope");
if (string.IsNullOrEmpty(id))
return;
// create this device
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope(id);
#else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly.
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.MeadeAutostar497.Telescope");
#endif
// now run some tests, adding code to your driver so that the tests will pass.
// these first tests are common to all drivers.
Console.WriteLine("name " + device.Name);
Console.WriteLine("description " + device.Description);
Console.WriteLine("DriverInfo " + device.DriverInfo);
Console.WriteLine("driverVersion " + device.DriverVersion);
// TODO add more code to test the driver.
device.Connected = true;
//Console.WriteLine(device.Slewing);
//device.UTCDate = DateTime.UtcNow;
//Console.WriteLine(device.UTCDate.ToLocalTime());
//Console.WriteLine(device.AlignmentMode);
//double l = device.SiteLatitude;
//device.SiteLatitude = l;
//double l = device.SiteLongitude;
//device.SiteLongitude = l;
//Console.WriteLine(device.SiteLongitude);
//Console.WriteLine(device.RightAscension);
//device.SlewToAltAz(0,0);
Console.WriteLine(device.TrackingRate);
device.Connected = false;
Console.WriteLine("Press Enter to finish");
Console.ReadLine();
}
}
}
+36
View File
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("q Test Application")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ASCOM Initiative")]
[assembly: AssemblyProduct("q")]
[assembly: AssemblyCopyright("Copyright © ASCOM Initiative 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c7008f94-e3b9-4481-b720-3b56557860c6")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("6.4.0.0")]
[assembly: AssemblyFileVersion("6.4.0.0")]
+64
View File
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D5207217-61C7-4E94-8097-91DBACE57D2A}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TestConsole</RootNamespace>
<AssemblyName>TestConsole</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="ASCOM.DeviceInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.DriverAccess, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>