Merged in feature/LocalServer (pull request #5)

Feature/LocalServer

* Major refactor.  Switching over to a local server hub style driver allowing multiple programs to control the telescope at one time without the need for the POTH Hub

* Unified the setup dialog

* Implemented shared serial port, Both Telescope and Driver can connect at the same time.

* Ported the focuser implementation from the non server based version.

* Ported the telescope driver code.

* Fixed problem with # not being stripped from the returned string ends. Fixed issue with RA being returned as degress rather than hours.

* Telescope passes validation

* Added a lock around the focuser move.

* Reimplemented CommandBlind and CommandString

* Corrected version information

* Removed the Altitude support as there's a bug in the Autostar and Audiostar firmware
This commit is contained in:
2019-05-17 14:21:26 +00:00
parent b795634d70
commit 79a77d4e1d
75 changed files with 6043 additions and 4220 deletions
@@ -1,68 +0,0 @@
Conform Report Hash (V1): 55AB333E4394ADF3F35929567EAB46A092F3574DF38E1F00BF586967B7EE826AA2D92647409F699E62954B07AF3389CEA7DB7FAAFFE04E05BE358A744E95A624
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: 80040404
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.
00:21:34.375 Driver Access Checks OK
00:21:35.008 AccessChecks OK Successfully created driver using late binding
00:21:35.253 AccessChecks OK Successfully connected using late binding
00:21:35.257 AccessChecks INFO The driver is a .NET object
00:21:35.260 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.MeadeAutostar497.Telescope, ASCOM.MeadeAutostar497.Telescope, Version=
00:21:35.265 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.ITelescopeV3
00:21:35.269 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.IFocuserV3
00:21:35.992 AccessChecks INFO Device does not expose IFocuser interface
00:21:36.147 AccessChecks INFO Device does not expose IFocuserV2 interface
00:21:36.479 AccessChecks INFO Device exposes IFocuserV3 interface
00:21:36.692 AccessChecks OK Successfully created driver using driver access toolkit
00:21:36.895 AccessChecks OK Successfully connected using driver access toolkit
00:21:36.958 AccessChecks OK Successfully disconnected using driver access toolkit
Conform is using ASCOM.DriverAccess.Focuser to get a Focuser object
00:21:37.078 ConformanceCheck OK Driver instance created successfully
00:21:37.311 ConformanceCheck OK Connected OK
Common Driver Methods
00:21:37.348 InterfaceVersion OK 3
00:21:37.374 Connected OK True
00:21:37.401 Description OK Meade Autostar 497 .net
00:21:37.428 DriverInfo OK Information about the driver itself. Version: 0.2
00:21:37.457 DriverVersion OK 0.2
00:21:37.485 Name OK Meade Autostar 497 .net
00:21:37.511 CommandXXX INFO Tests skipped
00:21:37.515 Action INFO Conform cannot test the Action method
00:21:37.521 SupportedActions OK Driver returned an empty action list
Properties
00:21:37.626 Absolute OK False
00:21:37.631 IsMoving OK False
00:21:37.637 MaxStep OK 7000
00:21:37.642 MaxIncrement OK 7000
00:21:37.820 Position OK Position must not be implemented for a relative focuser and a PropertyNotImplementedException exception was generated as expected
00:21:37.988 StepSize OK Optional member threw a PropertyNotImplementedException exception.
00:21:37.993 TempCompAvailable OK False
00:21:37.999 TempComp Read OK False
00:21:38.167 TempComp Write OK Temperature compensation is not available and a PropertyNotImplementedException exception was generated as expected
00:21:38.504 Temperature OK Optional member threw a PropertyNotImplementedException exception.
Methods
00:21:38.544 Halt OK Focuser halted OK
00:21:38.552 Move - TempComp False Moving by: 700
00:21:39.264 Move - TempComp False Asynchronous move found
00:21:39.270 Move - TempComp False OK Relative move OK
00:21:39.278 Move - TempComp False INFO Returning to original position: 0
Conformance test complete
No errors, warnings or issues found: your driver passes ASCOM validation!!
Driver Hash Value: DBF36156F87DA91F130E0AABEFE80B250D62C2DB689AD8B44243AE0D9322245CF15AAE2E663962402E87B6B1A15440A6DDB46562EFB9527E3596096319C2AC85
@@ -1,268 +0,0 @@
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
+269
View File
@@ -0,0 +1,269 @@
Conform Report Hash (V1): D69EDCF187DF1AC5C724D181E8851014862252A6F96F5BD9DDE1C8AF96CB36F7E019D48BA6EF49E5B0990934E09B5898888AF1D957D11C05084347222405B5F1
ConformanceCheck ASCOM Device Conformance Checker Version 6.4.63.0, Build time: 18/12/2018 08:58:32
ConformanceCheck Running on: ASCOM Platform 6.4 SP1 6.4.1.2695
ConformanceCheck Driver ProgID: ASCOM.MeadeGeneric.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.
23:26:10.548 Driver Access Checks OK
23:26:11.194 AccessChecks OK Successfully created driver using late binding
23:26:11.406 AccessChecks OK Successfully connected using late binding
23:26:11.412 AccessChecks INFO The driver is a .NET object
23:26:11.417 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.Meade.net.Telescope, ASCOM.Meade.net.Telescope, Version=6.4.0.0, Cultu
23:26:11.422 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.ITelescopeV3
23:26:12.127 AccessChecks INFO Device does not expose interface ITelescopeV2
23:26:12.921 AccessChecks INFO Device exposes interface ITelescopeV3
23:26:14.237 AccessChecks OK Successfully created driver using driver access toolkit
23:26:14.396 AccessChecks OK Successfully connected using driver access toolkit
Conform is using ASCOM.DriverAccess.Telescope to get a Telescope object
23:26:15.721 ConformanceCheck OK Driver instance created successfully
23:26:15.918 ConformanceCheck OK Connected OK
Common Driver Methods
23:26:15.957 InterfaceVersion OK 3
23:26:15.986 Connected OK True
23:26:16.014 Description OK Meade Generic
23:26:16.042 DriverInfo OK Information about the driver itself. Version: 6.4
23:26:16.071 DriverVersion OK 6.4
23:26:16.099 Name OK Meade Generic
23:26:16.127 CommandString INFO Conform cannot test the CommandString method
23:26:16.133 CommandBlind INFO Conform cannot test the CommandBlind method
23:26:16.140 CommandBool INFO Conform cannot test the CommandBool method
23:26:16.146 Action INFO Conform cannot test the Action method
23:26:16.153 SupportedActions OK Driver returned an empty action list
Can Properties
23:26:16.220 CanFindHome OK False
23:26:16.227 CanPark OK True
23:26:16.235 CanPulseGuide OK True
23:26:16.242 CanSetDeclinationRate OK False
23:26:16.250 CanSetGuideRates OK False
23:26:16.259 CanSetPark OK False
23:26:16.268 CanSetPierSide OK False
23:26:16.315 CanSetRightAscensionRate OK False
23:26:16.323 CanSetTracking OK True
23:26:16.331 CanSlew OK True
23:26:16.338 CanSlewltAz OK True
23:26:16.347 CanSlewAltAzAsync OK True
23:26:16.355 CanSlewAsync OK True
23:26:16.364 CanSync OK True
23:26:16.372 CanSyncAltAz OK False
23:26:16.381 CanUnPark OK False
Pre-run Checks
23:26:16.430 Mount Safety INFO Scope is not parked, continuing testing
23:26:16.461 Mount Safety INFO Scope tracking has been enabled
23:26:16.493 TimeCheck INFO PC Time Zone: GMT Summer Time, offset -1 hours.
23:26:16.501 TimeCheck INFO PC UTCDate: 16-May-2019 22:26:16.501
23:26:20.497 TimeCheck INFO Mount UTCDate: 02-May-2019 20:48:03.000
Properties
23:26:20.700 AlignmentMode OK algPolar
23:26:21.594 Altitude WARNING Altitude is <0.0 degrees: -0.69166667
23:26:21.628 ApertureArea OK Optional member threw a PropertyNotImplementedException exception.
23:26:21.662 ApertureDiameter OK Optional member threw a PropertyNotImplementedException exception.
23:26:21.694 AtHome OK False
23:26:21.726 AtPark OK False
23:26:22.439 Azimuth OK 104.84
23:26:23.342 Declination OK 00:41:30.00
23:26:23.374 DeclinationRate Read OK 0.00
23:26:23.406 DeclinationRate Write OK CanSetDeclinationRate is False and a PropertyNotImplementedException exception was generated as expected
23:26:23.440 DoesRefraction Read OK Optional member threw a PropertyNotImplementedException exception.
23:26:23.474 DoesRefraction Write OK Optional member threw a PropertyNotImplementedException exception.
23:26:23.507 EquatorialSystem OK equLocalTopocentric
23:26:23.539 FocalLength OK Optional member threw a PropertyNotImplementedException exception.
23:26:23.590 GuideRateDeclination Read OK Optional member threw a PropertyNotImplementedException exception.
23:26:23.601 GuideRateDeclination Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
23:26:23.634 GuideRateRightAscension Read OK Optional member threw a PropertyNotImplementedException exception.
23:26:23.645 GuideRateRightAscension Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected
23:26:23.679 IsPulseGuiding OK False
23:26:24.386 RightAscension OK 09:40:57.00
23:26:24.420 RightAscensionRate Read OK 0.00
23:26:24.455 RightAscensionRate Write OK CanSetRightAscensionRate is False and a PropertyNotImplementedException exception was generated as expected
23:26:24.488 SiteElevation Read OK Optional member threw a PropertyNotImplementedException exception.
23:26:24.523 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
23:26:24.534 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
23:26:24.545 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception.
23:26:25.089 SiteLatitude Read OK 00:00:00.00
23:26:25.126 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude < -90 degrees
23:26:25.137 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude > 90 degrees
23:26:27.021 SiteLatitude Write OK Legal value 00:00:00.00 degrees written successfully
23:26:27.875 SiteLongitude Read OK -53:48:00.00
23:26:27.911 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude < -180 degrees
23:26:27.924 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude > 180 degrees
23:26:29.326 SiteLongitude Write OK Legal value -53:48:00.00 degrees written successfully
23:26:29.945 Slewing OK False
23:26:29.983 SlewSettleTime Read OK Optional member threw a PropertyNotImplementedException exception.
23:26:30.019 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception.
23:26:30.037 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception.
23:26:30.072 SideOfPier Read OK Optional member threw a PropertyNotImplementedException exception.
23:26:30.839 SiderealTime OK 10:27:03.72
23:26:30.851 SiderealTime OK Scope and ASCOM sidereal times agree to better than 5 minutes, Scope: 10:27:03.72, ASCOM: 10:28:41.54
23:26:30.888 TargetDeclination Read OK .NET Not InvalidOperationException generated on read before write
23:26:30.923 TargetDeclination Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
23:26:30.936 TargetRightAscension Read OK .NET Not InvalidOperationException generated on read before write
23:26:30.975 TargetRightAscension Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates.
23:26:30.988 Tracking Read OK True
23:26:32.051 Tracking Write OK False
23:26:33.116 TrackingRates Found drive rate: driveSidereal
23:26:33.129 TrackingRates Found drive rate: driveLunar
23:26:33.141 TrackingRates OK Drive rates read OK
23:26:33.154 TrackingRates OK Disposed tracking rates OK
23:26:33.189 TrackingRates OK Successfully obtained a TrackingRates object after the previous TrackingRates object was disposed
23:26:33.205 TrackingRate Read OK driveSidereal
23:26:33.244 TrackingRate Write OK Successfully set drive rate: driveSidereal
23:26:33.281 TrackingRate Write OK Successfully set drive rate: driveLunar
23:26:37.575 UTCDate Read OK 02-May-2019 20:48:20.000
23:26:43.750 UTCDate Write OK New UTCDate written successfully: 02/05/2019 21:48:20
Methods
23:26:50.522 CanMoveAxis:Primary OK CanMoveAxis:Primary True
23:26:50.560 CanMoveAxis:Secondary OK CanMoveAxis:Secondary True
23:26:50.597 CanMoveAxis:Tertiary OK CanMoveAxis:Tertiary False
23:26:50.634 Park/Unpark INFO Tests skipped
23:26:50.653 AbortSlew OK AbortSlew OK when not slewing
23:26:50.718 AxisRate:Primary OK Axis rate minimum: 1 Axis rate maximum: 1
23:26:50.731 AxisRate:Primary OK Axis rate minimum: 2 Axis rate maximum: 2
23:26:50.743 AxisRate:Primary OK Axis rate minimum: 3 Axis rate maximum: 3
23:26:50.755 AxisRate:Primary OK Axis rate minimum: 4 Axis rate maximum: 4
23:26:50.767 AxisRate:Primary OK No overlapping axis rates found
23:26:50.781 AxisRate:Primary OK No duplicate axis rates found
23:26:50.795 AxisRate:Primary OK Successfully disposed of rate 1 - 1
23:26:50.809 AxisRate:Primary OK Successfully disposed of rate 2 - 2
23:26:50.823 AxisRate:Primary OK Successfully disposed of rate 3 - 3
23:26:50.836 AxisRate:Primary OK Successfully disposed of rate 4 - 4
23:26:50.848 AxisRate:Primary OK Disposed axis rates OK
23:26:50.862 AxisRate:Secondary OK Axis rate minimum: 1 Axis rate maximum: 1
23:26:50.875 AxisRate:Secondary OK Axis rate minimum: 2 Axis rate maximum: 2
23:26:50.888 AxisRate:Secondary OK Axis rate minimum: 3 Axis rate maximum: 3
23:26:50.901 AxisRate:Secondary OK Axis rate minimum: 4 Axis rate maximum: 4
23:26:50.913 AxisRate:Secondary OK No overlapping axis rates found
23:26:50.926 AxisRate:Secondary OK No duplicate axis rates found
23:26:50.939 AxisRate:Secondary OK Successfully disposed of rate 1 - 1
23:26:50.951 AxisRate:Secondary OK Successfully disposed of rate 2 - 2
23:26:50.964 AxisRate:Secondary OK Successfully disposed of rate 3 - 3
23:26:50.977 AxisRate:Secondary OK Successfully disposed of rate 4 - 4
23:26:50.991 AxisRate:Secondary OK Disposed axis rates OK
23:26:51.006 AxisRate:Tertiary OK Empty axis rate returned
23:26:51.020 AxisRate:Tertiary OK Disposed axis rates OK
23:26:51.037 FindHome OK CanFindHome is False and a MethodNotImplementedException exception was generated as expected
23:26:51.087 MoveAxis Primary OK Can successfully set a movement rate of zero
23:26:51.104 MoveAxis Primary OK Exception correctly generated when move axis is set below lowest rate (0.5)
23:26:51.141 MoveAxis Primary OK Exception correctly generated when move axis is set above highest rate (5)
23:26:55.308 MoveAxis Primary OK Successfully moved axis at minimum rate: 1
23:27:01.632 MoveAxis Primary OK Successfully moved axis at maximum rate: 4
23:27:05.847 MoveAxis Primary OK Tracking state correctly retained for both tracking states
23:27:05.863 MoveAxis Primary OK AxisRates object successfully disposed
23:27:05.923 MoveAxis Secondary OK Can successfully set a movement rate of zero
23:27:05.939 MoveAxis Secondary OK Exception correctly generated when move axis is set below lowest rate (0.5)
23:27:05.976 MoveAxis Secondary OK Exception correctly generated when move axis is set above highest rate (5)
23:27:10.149 MoveAxis Secondary OK Successfully moved axis at minimum rate: 1
23:27:16.454 MoveAxis Secondary OK Successfully moved axis at maximum rate: 4
23:27:20.626 MoveAxis Secondary OK Tracking state correctly retained for both tracking states
23:27:20.641 MoveAxis Secondary OK AxisRates object successfully disposed
23:27:20.701 MoveAxis Tertiary OK CanMoveAxis Tertiary is False and a MethodNotImplementedException exception was generated as expected
23:27:22.740 PulseGuide OK Synchronous pulse guide found OK
23:27:53.262 SlewToCoordinates OK Slewed OK. RA: 09:27:56.59
23:27:53.280 SlewToCoordinates INFO Slewed within 7200.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: -01:00:00.00
23:27:53.295 SlewToCoordinates OK The TargetRightAscension property 09:27:56.59 matches the expected RA OK.
23:27:53.309 SlewToCoordinates OK The TargetDeclination property 01:00:00.00 matches the expected Declination OK.
23:27:53.356 SlewToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
23:27:57.509 SlewToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
23:27:57.569 SlewToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
23:28:01.565 SlewToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
23:28:33.449 SlewToCoordinatesAsync INFO Slewed within 52.6 arc seconds of expected RA: 08:28:35.51, actual RA: 08:28:32.00
23:28:33.463 SlewToCoordinatesAsync INFO Slewed within 14398.0 arc seconds of expected DEC: 02:00:00.00, actual DEC: -01:59:58.00
23:28:33.479 SlewToCoordinatesAsync OK The TargetRightAscension property 08:28:35.51 matches the expected RA OK.
23:28:33.496 SlewToCoordinatesAsync OK The TargetDeclination property 02:00:00.00 matches the expected Declination OK.
23:28:33.539 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
23:28:37.553 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
23:28:37.614 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
23:28:41.477 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
23:29:15.070 SyncToCoordinates INFO Slewed to start position within 18.3 arc seconds of expected RA: 07:29:17.22, actual RA: 07:29:16.00
23:29:15.084 SyncToCoordinates OK Slewed to start position OK. DEC: 00:00:00.00
23:29:22.898 SyncToCoordinates INFO Synced to sync position within 33.3 arc seconds of expected RA: 07:25:17.22, actual RA: 07:25:15.00
23:29:22.912 SyncToCoordinates INFO Synced to sync position within 3660.0 arc seconds of expected DEC: -01:00:00.00, actual DEC: 00:01:00.00
23:29:22.928 SyncToCoordinates OK The TargetRightAscension property 07:25:17.22 matches the expected RA OK.
23:29:22.942 SyncToCoordinates OK The TargetDeclination property -01:00:00.00 matches the expected Declination OK.
23:29:51.132 SyncToCoordinates INFO Slewed back to start position within 18.3 arc seconds of expected RA: 07:29:17.22, actual RA: 07:29:16.00
23:29:51.146 SyncToCoordinates OK Slewed back to start position OK. DEC: 00:00:00.00
23:30:01.039 SyncToCoordinates INFO Synced to reversed sync position within 18.3 arc seconds of expected RA: 07:33:17.22, actual RA: 07:33:16.00
23:30:01.052 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
23:30:31.303 SyncToCoordinates INFO Slewed back to start position within 18.3 arc seconds of expected RA: 07:29:17.22, actual RA: 07:29:16.00
23:30:31.317 SyncToCoordinates OK Slewed back to start position OK. DEC: 00:00:00.00
23:30:31.357 SyncToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00
23:30:35.078 SyncToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00
23:30:35.139 SyncToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00
23:30:39.202 SyncToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00
23:30:39.261 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension < 0 hours
23:30:39.277 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension > 24 hours
23:30:43.319 TargetRightAscension Write OK Legal value 06:31:13.60 HH:MM:SS written successfully
23:30:43.356 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees
23:30:43.372 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees
23:30:46.838 TargetDeclination Write OK Legal value 01:00:00.00 DD:MM:SS written successfully
23:31:17.315 SlewToTarget INFO Slewed within 18.1 arc seconds of expected RA: 07:31:21.21, actual RA: 07:31:20.00
23:31:17.331 SlewToTarget INFO Slewed within 21597.0 arc seconds of expected DEC: 03:00:00.00, actual DEC: -02:59:57.00
23:31:17.350 SlewToTarget OK The TargetRightAscension property 07:31:21.21 matches the expected RA OK.
23:31:17.379 SlewToTarget OK The TargetDeclination property 03:00:00.00 matches the expected Declination OK.
23:31:17.421 SlewToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
23:31:18.143 SlewToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
23:31:18.205 SlewToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
23:31:18.847 SlewToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
23:31:51.318 SlewToTargetAsync INFO Slewed within 19.9 arc seconds of expected RA: 06:31:53.33, actual RA: 06:31:52.00
23:31:51.332 SlewToTargetAsync INFO Slewed within 28799.0 arc seconds of expected DEC: 04:00:00.00, actual DEC: -03:59:59.00
23:31:51.347 SlewToTargetAsync OK The TargetRightAscension property 06:31:53.33 matches the expected RA OK.
23:31:51.361 SlewToTargetAsync OK The TargetDeclination property 04:00:00.00 matches the expected Declination OK.
23:31:51.402 SlewToTargetAsync (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
23:31:52.156 SlewToTargetAsync (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
23:31:52.221 SlewToTargetAsync (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
23:31:52.868 SlewToTargetAsync (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
23:31:52.927 DestinationSideOfPier Test skipped as AligmentMode is not German Polar
23:32:02.721 SlewToAltAz INFO Slewed to within 93:51:10.00 DD:MM:SS of expected Azimuth: 150:00:00.00
23:32:02.735 SlewToAltAz INFO Slewed to within 46:00:01.00 DD:MM:SS of expected Altitude: 50:00:00.00
23:32:02.775 SlewToAltAz (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00
23:32:06.306 SlewToAltAz (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00
23:32:06.368 SlewToAltAz (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00
23:32:09.947 SlewToAltAz (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00
23:32:24.096 SlewToAltAzAsync INFO Slewed to within 98:56:32.00 DD:MM:SS of expected Azimuth: 155:00:00.00
23:32:24.110 SlewToAltAzAsync INFO Slewed to within 51:00:01.00 DD:MM:SS of expected Altitude: 55:00:00.00
23:32:24.154 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00
23:32:27.733 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00
23:32:27.793 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00
23:32:31.369 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00
23:33:05.205 SyncToTarget INFO Slewed to start position within 56.0 arc seconds of expected RA: 07:33:07.73, actual RA: 07:33:04.00
23:33:05.220 SyncToTarget OK Slewed to start position OK. DEC: 00:00:00.00
23:33:15.238 SyncToTarget INFO Synced to sync position within 71.0 arc seconds of expected RA: 07:29:07.73, actual RA: 07:29:03.00
23:33:15.252 SyncToTarget INFO Synced to sync position within 3660.0 arc seconds of expected DEC: -01:00:00.00, actual DEC: 00:01:00.00
23:33:45.180 SyncToTarget INFO Slewed back to start position within 56.0 arc seconds of expected RA: 07:33:07.73, actual RA: 07:33:04.00
23:33:45.195 SyncToTarget OK Slewed back to start position OK. DEC: 00:00:00.00
23:33:55.078 SyncToTarget INFO Synced to reversed sync position within 71.0 arc seconds of expected RA: 07:37:07.73, actual RA: 07:37:03.00
23:33:55.093 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
23:34:25.167 SyncToTarget INFO Slewed back to start position within 56.0 arc seconds of expected RA: 07:33:07.73, actual RA: 07:33:04.00
23:34:25.192 SyncToTarget OK Slewed back to start position OK. DEC: 00:00:00.00
23:34:25.232 SyncToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00
23:34:25.975 SyncToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00
23:34:26.037 SyncToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00
23:34:26.840 SyncToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00
23:34:30.138 SyncToAltAz OK CanSyncAltAz is False and a MethodNotImplementedException exception was generated as expected
SideOfPier Model Tests
23:34:30.213 SideOfPier Model Tests INFO Tests skipped because this driver does Not support SideOfPier Read
Post-run Checks
23:34:30.305 Mount Safety OK Tracking stopped to protect your mount.
Conformance test complete
Your driver had 0 errors, 1 warning and 0 issue
Driver Hash Value: E1CEF5959BFC13BA7F63F73CE38558054C95A93AFE504B722E7EBCDB7DC403E36016216B81EE41CCFE368BC213DDAA8F952A53B3DC88D294D73445C25125D33D
+69
View File
@@ -0,0 +1,69 @@
Conform Report Hash (V1): 67092198F82F435D10580E3B3E3E460EC0B5E438532A7B5D83C09425222F097CA9A23C883D4238654F217FCA9801E46720811B7CDB982868C68843CCDA33E7FB
ConformanceCheck ASCOM Device Conformance Checker Version 6.4.63.0, Build time: 18/12/2018 08:58:32
ConformanceCheck Running on: ASCOM Platform 6.4 SP1 6.4.1.2695
ConformanceCheck Driver ProgID: ASCOM.MeadeGeneric.focuser
Error handling
Error number for "Not Implemented" is: 80040400
Error number for "Invalid Value 1" is: 80040404
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.
23:25:52.259 Driver Access Checks OK
23:25:52.911 AccessChecks OK Successfully created driver using late binding
23:25:53.126 AccessChecks OK Successfully connected using late binding
23:25:53.131 AccessChecks INFO The driver is a .NET object
23:25:53.137 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.Meade.net.Focuser, ASCOM.Meade.net.Focuser, Version=6.4.0.0, Culture=n
23:25:53.142 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.IFocuserV3
23:25:53.793 AccessChecks INFO Device does not expose IFocuser interface
23:25:53.855 AccessChecks INFO Device does not expose IFocuserV2 interface
23:25:54.068 AccessChecks INFO Device exposes IFocuserV3 interface
23:25:54.190 AccessChecks OK Successfully created driver using driver access toolkit
23:25:54.344 AccessChecks OK Successfully connected using driver access toolkit
23:25:54.407 AccessChecks OK Successfully disconnected using driver access toolkit
Conform is using ASCOM.DriverAccess.Focuser to get a Focuser object
23:25:54.480 ConformanceCheck OK Driver instance created successfully
23:25:54.679 ConformanceCheck OK Connected OK
Common Driver Methods
23:25:54.721 InterfaceVersion OK 3
23:25:54.750 Connected OK True
23:25:54.779 Description OK Meade Generic
23:25:54.808 DriverInfo OK Information about the driver itself. Version: 6.4
23:25:54.837 DriverVersion OK 6.4
23:25:54.866 Name OK Meade Generic
23:25:54.895 CommandString INFO Conform cannot test the CommandString method
23:25:54.901 CommandBlind INFO Conform cannot test the CommandBlind method
23:25:54.908 CommandBool INFO Conform cannot test the CommandBool method
23:25:54.916 Action INFO Conform cannot test the Action method
23:25:54.924 SupportedActions OK Driver returned an empty action list
Properties
23:25:55.035 Absolute OK False
23:25:55.043 IsMoving OK False
23:25:55.051 MaxStep OK 7000
23:25:55.059 MaxIncrement OK 7000
23:25:55.073 Position OK Position must not be implemented for a relative focuser and a PropertyNotImplementedException exception was generated as expected
23:25:55.084 StepSize OK Optional member threw a PropertyNotImplementedException exception.
23:25:55.091 TempCompAvailable OK False
23:25:55.100 TempComp Read OK False
23:25:55.108 TempComp Write OK Temperature compensation is not available and a PropertyNotImplementedException exception was generated as expected
23:25:55.120 Temperature OK Optional member threw a PropertyNotImplementedException exception.
Methods
23:25:55.170 Halt OK Focuser halted OK
23:25:55.183 Move - TempComp False Moving by: 700
23:25:55.895 Move - TempComp False Asynchronous move found
23:25:55.904 Move - TempComp False OK Relative move OK
23:25:55.915 Move - TempComp False INFO Returning to original position: 0
Conformance test complete
No errors, warnings or issues found: your driver passes ASCOM validation!!
Driver Hash Value: DE237CD97B3A95A514A5D7FD9B265F5F98174E67A28B44FF5CA2FC9A1CF355DA2C4DFB9416F3C40A8056334CC5339F0D8F8A39026A4BB5E3AE1FFC2BD8F55FBD
-272
View File
@@ -1,272 +0,0 @@
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,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>{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ASCOM.MeadeGeneric</RootNamespace>
<AssemblyName>ASCOM.MeadeGeneric.Test</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</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>
+55
View File
@@ -0,0 +1,55 @@
// 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;
using System.Threading;
using ASCOM.DriverAccess;
namespace ASCOM
{
class Program
{
static void Main(string[] args)
{
// Uncomment the code that's required
#if UseChooser
// choose the device
string id = ASCOM.DriverAccess.Focuser.Choose("ASCOM.MeadeGeneric.Focuser");
if (string.IsNullOrEmpty(id))
return;
// create this device
ASCOM.DriverAccess.Focuser device = new ASCOM.DriverAccess.Focuser(id);
#else
// this can be replaced by this code, it avoids the chooser and creates the driver class directly.
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.MeadeGeneric.Telescope");
#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;
device.Move(2000);
Thread.Sleep(2000);
device.Move(-2000);
device.Connected = false;
Console.WriteLine("Press Enter to finish");
Console.ReadLine();
}
}
}
@@ -5,12 +5,12 @@ 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: AssemblyTitle("MeadeGeneric Test Application")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MeadeAutostar497.UnitTests")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyCompany("ASCOM Initiative")]
[assembly: AssemblyProduct("MeadeGeneric")]
[assembly: AssemblyCopyright("Copyright © ASCOM Initiative 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
[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")]
[assembly: Guid("c7008f94-e3b9-4481-b720-3b56557860c6")]
// Version information for an assembly consists of the following four values:
//
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("6.4.0.0")]
[assembly: AssemblyFileVersion("6.4.0.0")]
@@ -1,3 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -8,14 +8,14 @@
<ProjectGuid>{64308775-BD4A-469C-BCAB-3ED830B811AF}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ASCOM.MeadeAutostar497</RootNamespace>
<AssemblyName>ASCOM.MeadeAutostar497.Telescope</AssemblyName>
<RootNamespace>ASCOM.Meade.net</RootNamespace>
<AssemblyName>ASCOM.Meade.net.Telescope</AssemblyName>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<ApplicationIcon>ASCOM.ico</ApplicationIcon>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>ASCOMDriverTemplate.snk</AssemblyOriginatorKeyFile>
@@ -41,18 +41,18 @@
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<OutputPath>..\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<RegisterForComInterop>true</RegisterForComInterop>
<PlatformTarget>AnyCPU</PlatformTarget>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<OutputPath>..\bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
@@ -69,7 +69,6 @@
<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.Video, Version=6.1.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Configuration.Install" />
@@ -78,23 +77,12 @@
</Reference>
<Reference Include="System.Data" />
<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.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="AscomClasses\Telescope.cs" />
<Compile Include="Controller\FirmwareVersion.cs" />
<Compile Include="Controller\ISerialProcessor.cs" />
<Compile Include="Controller\ITelescopeController.cs" />
<Compile Include="Controller\SerialProcessor.cs" />
<Compile Include="Controller\TelescopeController.cs" />
<Compile Include="StringExtensions.cs" />
<Compile Include="Telescope.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
@@ -106,13 +94,7 @@
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<Compile Include="AscomClasses\Rates.cs" />
<Compile Include="AscomClasses\SetupDialogForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AscomClasses\SetupDialogForm.designer.cs">
<DependentUpon>SetupDialogForm.cs</DependentUpon>
</Compile>
<Compile Include="Rates.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
@@ -120,10 +102,6 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="AscomClasses\SetupDialogForm.resx">
<DependentUpon>SetupDialogForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
@@ -154,7 +132,12 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<ProjectReference Include="..\Meade.net\Meade.net.csproj">
<Project>{3689a2cb-94c5-4012-a5cf-7e7d1dd27143}</Project>
<Name>Meade.net</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
@@ -7,11 +7,11 @@ using System.Runtime.InteropServices;
// associated with an assembly.
//
// TODO - Add your authorship information here
[assembly: AssemblyTitle("ASCOM.MeadeAutostar497.Telescope")]
[assembly: AssemblyDescription("ASCOM MeadeAutostar497 .net")]
[assembly: AssemblyTitle("ASCOM.Meade.net.Telescope")]
[assembly: AssemblyDescription("ASCOM Telescope driver for Meade.net")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Cjdawson.com")]
[assembly: AssemblyProduct("ASCOM Telescope driver for MeadeAutostar497")]
[assembly: AssemblyCompany("cjdawson.com")]
[assembly: AssemblyProduct("ASCOM Telescope driver for Meade.net")]
[assembly: AssemblyCopyright("Copyright © 2019 cjdawson.com")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -22,7 +22,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("55d0f255-cb49-4e6b-bc32-4f8fb874734d")]
[assembly: Guid("8b9fccb9-87ae-42f7-90af-079e13de6efb")]
// Version information for an assembly consists of the following four values:
//
@@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
//
// TODO - Set your driver's version here
[assembly: AssemblyVersion("0.2.0.0")]
[assembly: AssemblyFileVersion("0.2.0.0")]
[assembly: AssemblyVersion("0.4.0.0")]
[assembly: AssemblyFileVersion("0.4.0.0")]
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASCOM.MeadeAutostar497.Properties {
namespace ASCOM.Meade.net.Properties {
using System;
@@ -39,7 +39,7 @@ namespace ASCOM.MeadeAutostar497.Properties {
internal static global::System.Resources.ResourceManager ResourceManager {
get {
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.Meade.net.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASCOM.MeadeAutostar497.Properties {
namespace ASCOM.Meade.net.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -7,18 +7,18 @@ using ASCOM.DeviceInterface;
using System.Collections;
using System.Threading;
namespace ASCOM.MeadeAutostar497
namespace ASCOM.Meade.net
{
#region Rate class
//
// The Rate class implements IRate, and is used to hold values
// for AxisRates. You do not need to change this class.
//
// The Guid attribute sets the CLSID for ASCOM.MeadeAutostar497.Rate
// The Guid attribute sets the CLSID for ASCOM.Meade.net.Rate
// The ClassInterface/None addribute prevents an empty interface called
// _Rate from being created and used as the [default] interface
//
[Guid("20c14d35-a61b-4c6a-a6ab-cb9f27997c45")]
[Guid("288838d1-bbf9-4ce0-9ee1-86ecf38b45c9")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Rate : ASCOM.DeviceInterface.IRate
@@ -65,11 +65,11 @@ namespace ASCOM.MeadeAutostar497
// both COM and .NET. The IAxisRates and IEnumerable interfaces provide
// this polymorphism.
//
// The Guid attribute sets the CLSID for ASCOM.MeadeAutostar497.AxisRates
// The Guid attribute sets the CLSID for ASCOM.Meade.net.AxisRates
// The ClassInterface/None addribute prevents an empty interface called
// _AxisRates from being created and used as the [default] interface
//
[Guid("ac703603-bcfc-4d98-9de3-c2b9a165756f")]
[Guid("436de2dd-a77a-41ad-8a9e-14c3695f18f2")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class AxisRates : IAxisRates, IEnumerable
@@ -100,7 +100,7 @@ namespace ASCOM.MeadeAutostar497
// TODO Initialize this array with any Primary axis rates that your driver may provide
// Example: m_Rates = new Rate[] { new Rate(10.5, 30.2), new Rate(54.0, 43.6) }
//this.rates = new Rate[0];
this.rates = new Rate[] {new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4)};
this.rates = new Rate[] { new Rate(1, 1), new Rate(2, 2), new Rate(3, 3), new Rate(4, 4) };
break;
case TelescopeAxes.axisSecondary:
// TODO Initialize this array with any Secondary axis rates that your driver may provide
@@ -146,7 +146,7 @@ namespace ASCOM.MeadeAutostar497
// both COM and .NET. The ITrackingRates and IEnumerable interfaces provide
// this polymorphism.
//
// The Guid attribute sets the CLSID for ASCOM.MeadeAutostar497.TrackingRates
// The Guid attribute sets the CLSID for ASCOM.Meade.net.TrackingRates
// The ClassInterface/None addribute prevents an empty interface called
// _TrackingRates from being created and used as the [default] interface
//
@@ -154,7 +154,7 @@ namespace ASCOM.MeadeAutostar497
// will work with this .NET 4.0 object. Changes to this have proved to be challenging
// and it is strongly suggested that it isn't changed.
//
[Guid("cb732953-8e5a-4bf0-b3b7-451edb74b5d5")]
[Guid("8e9aa30e-ab24-4a20-8af3-4a057defb1ff")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class TrackingRates : ITrackingRates, IEnumerable, IEnumerator
@@ -176,7 +176,7 @@ namespace ASCOM.MeadeAutostar497
// the tracking rates supported by your telescope. The one value
// (tracking rate) that MUST be supported is driveSidereal!
//
this.trackingRates = new[] { DriveRates.driveSidereal };
this.trackingRates = new[] { DriveRates.driveSidereal, DriveRates.driveLunar };
// TODO Initialize this array with any additional tracking rates that your driver may provide
}

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ASCOM.MeadeAutostar497
namespace ASCOM.Meade.net
{
public static class StringExtensions
{
File diff suppressed because it is too large Load Diff
@@ -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"/>
</sectionGroup>
</configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup></configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>
Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.
+570
View File
@@ -0,0 +1,570 @@
//tabs=4
// --------------------------------------------------------------------------------
// TODO fill in this information for your driver, then remove this line!
//
// ASCOM Focuser driver for Meade.net
//
// Description: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
// nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
// erat, sed diam voluptua. At vero eos et accusam et justo duo
// dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
// sanctus est Lorem ipsum dolor sit amet.
//
// Implements: ASCOM Focuser interface version: <To be completed by driver developer>
// Author: (XXX) Your N. Here <your@email.here>
//
// Edit Log:
//
// Date Who Vers Description
// ----------- --- ----- -------------------------------------------------------
// dd-mmm-yyyy XXX 6.0.0 Initial edit, created from ASCOM driver template
// --------------------------------------------------------------------------------
//
// This is used to define code in the template that is specific to one class implementation
// unused code canbe deleted and this definition removed.
#define Focuser
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Runtime.InteropServices;
using ASCOM;
using ASCOM.Astrometry;
using ASCOM.Astrometry.AstroUtils;
using ASCOM.Utilities;
using ASCOM.DeviceInterface;
using System.Globalization;
using System.Collections;
using System.Reflection;
using ASCOM.Utilities.Interfaces;
namespace ASCOM.Meade.net
{
//
// Your driver's DeviceID is ASCOM.Meade.net.Focuser
//
// The Guid attribute sets the CLSID for ASCOM.Meade.net.Focuser
// The ClassInterface/None addribute prevents an empty interface called
// _Meade.net from being created and used as the [default] interface
//
// TODO Replace the not implemented exceptions with code to implement the function or
// throw the appropriate ASCOM exception.
//
/// <summary>
/// ASCOM Focuser Driver for Meade.net.
/// </summary>
[Guid("a32ac647-bf0f-42f9-8ab0-d166fa5884ad")]
[ProgId("ASCOM.MeadeGeneric.focuser")]
[ServedClassName("Meade.net Focuser")]
[ClassInterface(ClassInterfaceType.None)]
public class Focuser : ReferenceCountedObjectBase, IFocuserV3
{
/// <summary>
/// ASCOM DeviceID (COM ProgID) for this driver.
/// The DeviceID is used by ASCOM applications to load the driver at runtime.
/// </summary>
//internal static string driverID = "ASCOM.Meade.net.Focuser";
internal static string driverID = Marshal.GenerateProgIdForType(MethodBase.GetCurrentMethod().DeclaringType);
// TODO Change the descriptive string for your driver then remove this line
/// <summary>
/// Driver description that displays in the ASCOM Chooser.
/// </summary>
private static string driverDescription = "Meade Generic";
internal static string comPortProfileName = "COM Port"; // Constants used for Profile persistence
internal static string comPortDefault = "COM1";
internal static string traceStateProfileName = "Trace Level";
internal static string traceStateDefault = "false";
internal static string comPort; // Variables to hold the currrent device configuration
/// <summary>
/// Private variable to hold the connected state
/// </summary>
private bool connectedState;
/// <summary>
/// Private variable to hold an ASCOM Utilities object
/// </summary>
private Util utilities;
/// <summary>
/// Private variable to hold an ASCOM AstroUtilities object to provide the Range method
/// </summary>
private AstroUtils astroUtilities;
/// <summary>
/// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify)
/// </summary>
internal static TraceLogger tl;
/// <summary>
/// Initializes a new instance of the <see cref="Meade.net"/> class.
/// Must be public for COM registration.
/// </summary>
public Focuser()
{
tl = new TraceLogger("", "Meade.net");
ReadProfile(); // Read device configuration from the ASCOM Profile store
tl.LogMessage("Focuser", "Starting initialisation");
connectedState = false; // Initialise connected to false
utilities = new Util(); //Initialise util object
astroUtilities = new AstroUtils(); // Initialise astro utilities object
tl.LogMessage("Focuser", "Completed initialisation");
}
//
// PUBLIC COM INTERFACE IFocuserV3 IMPLEMENTATION
//
#region Common properties and methods.
/// <summary>
/// Displays the Setup Dialog form.
/// If the user clicks the OK button to dismiss the form, then
/// the new settings are saved, otherwise the old values are reloaded.
/// THIS IS THE ONLY PLACE WHERE SHOWING USER INTERFACE IS ALLOWED!
/// </summary>
public void SetupDialog()
{
SharedResources.SetupDialog();
ReadProfile();
}
public ArrayList SupportedActions
{
get
{
tl.LogMessage("SupportedActions Get", "Returning empty arraylist");
return new ArrayList();
}
}
public string Action(string actionName, string actionParameters)
{
LogMessage("", "Action {0}, parameters {1} not implemented", actionName, actionParameters);
throw new ASCOM.ActionNotImplementedException("Action " + actionName + " is not implemented by this driver");
}
public void CommandBlind(string command, bool raw)
{
CheckConnected("CommandBlind");
// Call CommandString and return as soon as it finishes
//this.CommandString(command, raw);
SharedResources.SendBlind(command);
// or
//throw new ASCOM.MethodNotImplementedException("CommandBlind");
// DO NOT have both these sections! One or the other
}
public bool CommandBool(string command, bool raw)
{
CheckConnected("CommandBool");
//string ret = CommandString(command, raw);
// TODO decode the return string and return true or false
// or
throw new ASCOM.MethodNotImplementedException("CommandBool");
// DO NOT have both these sections! One or the other
}
public string CommandString(string command, bool raw)
{
CheckConnected("CommandString");
// 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
return SharedResources.SendString(command);
throw new ASCOM.MethodNotImplementedException("CommandString");
}
public void Dispose()
{
// Clean up the tracelogger and util objects
tl.Enabled = false;
tl.Dispose();
tl = null;
utilities.Dispose();
utilities = null;
astroUtilities.Dispose();
astroUtilities = null;
}
public bool Connected
{
get
{
LogMessage("Connected", "Get {0}", IsConnected);
return IsConnected;
}
set
{
tl.LogMessage("Connected", "Set {0}", value);
if (value == IsConnected)
return;
if (value)
{
LogMessage("Connected Set", "Connecting to port {0}", comPort);
SharedResources.Connect("Serial");
connectedState = true;
}
else
{
LogMessage("Connected Set", "Disconnecting from port {0}", comPort);
SharedResources.Disconnect("Serial");
connectedState = false;
}
}
}
public string Description
{
// TODO customise this device description
get
{
tl.LogMessage("Description Get", driverDescription);
return driverDescription;
}
}
public string DriverInfo
{
get
{
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
// TODO customise this driver description
string driverInfo = "Information about the driver itself. Version: " + String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
tl.LogMessage("DriverInfo Get", driverInfo);
return driverInfo;
}
}
public string DriverVersion
{
get
{
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
string driverVersion = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", version.Major, version.Minor);
tl.LogMessage("DriverVersion Get", driverVersion);
return driverVersion;
}
}
public short InterfaceVersion
{
// set by the driver wizard
get
{
LogMessage("InterfaceVersion Get", "3");
return Convert.ToInt16("3");
}
}
public string Name
{
get
{
//string name = "Short driver name - please customise";
string name = driverDescription;
tl.LogMessage("Name Get", name);
return name;
}
}
#endregion
#region IFocuser Implementation
public bool Absolute
{
get
{
tl.LogMessage("Absolute Get", false.ToString());
return false; // This is a relative focuser
}
}
public void Halt()
{
tl.LogMessage("Halt", "Halting");
SharedResources.SendBlind(":FQ#");
//:FQ# Halt Focuser Motion
//Returns: Nothing
}
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
}
}
private readonly int _maxIncrement = 7000;
public int MaxIncrement
{
get
{
tl.LogMessage("MaxIncrement Get", _maxIncrement.ToString());
return _maxIncrement; // Maximum change in one move
}
}
private readonly int _maxStep = 7000;
public int MaxStep
{
get
{
tl.LogMessage("MaxStep Get", _maxStep.ToString());
return _maxStep;
}
}
public void Move(int Position)
{
tl.LogMessage("Move", Position.ToString());
//todo implement backlash compensation
//todo implement direction reverse
//todo implement dynamic braking
if (Position < -MaxIncrement || Position > MaxIncrement)
{
throw new ASCOM.InvalidValueException($"position out of range {-MaxIncrement} < {Position} < {MaxIncrement}");
}
if (Position == 0)
return;
if (Position > 0)
{
//desired move direction is out
MoveFocuser(true, Math.Abs(Position));
}
else
{
//desired move direction is in
MoveFocuser(false, Math.Abs(Position));
}
}
private void MoveFocuser(bool directionOut, int steps)
{
SharedResources.Lock(() =>
{
SharedResources.SendBlind(directionOut ? ":F+#" : ":F-#");
//:F+# Start Focuser moving inward (toward objective)
//Returns: None
//:F-# Start Focuser moving outward (away from objective)
//Returns: None
utilities.WaitForMilliseconds(steps);
Halt();
});
}
public int Position
{
get
{
throw new ASCOM.PropertyNotImplementedException("Position", false);
//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
// here are some useful properties and methods that can be used as required
// to help with driver development
#region ASCOM Registration
// Register or unregister driver for ASCOM. This is harmless if already
// registered or unregistered.
//
/// <summary>
/// Register or unregister the driver with the ASCOM Platform.
/// This is harmless if the driver is already registered/unregistered.
/// </summary>
/// <param name="bRegister">If <c>true</c>, registers the driver, otherwise unregisters it.</param>
private static void RegUnregASCOM(bool bRegister)
{
using (var P = new ASCOM.Utilities.Profile())
{
P.DeviceType = "Focuser";
if (bRegister)
{
P.Register(driverID, driverDescription);
}
else
{
P.Unregister(driverID);
}
}
}
/// <summary>
/// This function registers the driver with the ASCOM Chooser and
/// is called automatically whenever this class is registered for COM Interop.
/// </summary>
/// <param name="t">Type of the class being registered, not used.</param>
/// <remarks>
/// This method typically runs in two distinct situations:
/// <list type="numbered">
/// <item>
/// In Visual Studio, when the project is successfully built.
/// For this to work correctly, the option <c>Register for COM Interop</c>
/// must be enabled in the project settings.
/// </item>
/// <item>During setup, when the installer registers the assembly for COM Interop.</item>
/// </list>
/// This technique should mean that it is never necessary to manually register a driver with ASCOM.
/// </remarks>
[ComRegisterFunction]
public static void RegisterASCOM(Type t)
{
RegUnregASCOM(true);
}
/// <summary>
/// This function unregisters the driver from the ASCOM Chooser and
/// is called automatically whenever this class is unregistered from COM Interop.
/// </summary>
/// <param name="t">Type of the class being registered, not used.</param>
/// <remarks>
/// This method typically runs in two distinct situations:
/// <list type="numbered">
/// <item>
/// In Visual Studio, when the project is cleaned or prior to rebuilding.
/// For this to work correctly, the option <c>Register for COM Interop</c>
/// must be enabled in the project settings.
/// </item>
/// <item>During uninstall, when the installer unregisters the assembly from COM Interop.</item>
/// </list>
/// This technique should mean that it is never necessary to manually unregister a driver from ASCOM.
/// </remarks>
[ComUnregisterFunction]
public static void UnregisterASCOM(Type t)
{
RegUnregASCOM(false);
}
#endregion
/// <summary>
/// Returns true if there is a valid connection to the driver hardware
/// </summary>
private bool IsConnected
{
get
{
// TODO check that the driver hardware connection exists and is connected to the hardware
return connectedState;
}
}
/// <summary>
/// Use this function to throw an exception if we aren't connected to the hardware
/// </summary>
/// <param name="message"></param>
private void CheckConnected(string message)
{
if (!IsConnected)
{
throw new ASCOM.NotConnectedException(message);
}
}
/// <summary>
/// Read the device configuration from the ASCOM Profile store
/// </summary>
internal void ReadProfile()
{
var profileProperties = SharedResources.ReadProfile();
tl.Enabled = profileProperties.TraceLogger;
comPort = profileProperties.ComPort;
}
/// <summary>
/// Log helper function that takes formatted strings and arguments
/// </summary>
/// <param name="identifier"></param>
/// <param name="message"></param>
/// <param name="args"></param>
internal static void LogMessage(string identifier, string message, params object[] args)
{
var msg = string.Format(message, args);
tl.LogMessage(identifier, msg);
}
#endregion
}
}
+151
View File
@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{A97E3AEC-F11D-49DA-B259-DE99DA813A86}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ASCOM.Meade.net</RootNamespace>
<AssemblyName>ASCOM.Meade.net.Focuser</AssemblyName>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<ApplicationIcon>ASCOM.ico</ApplicationIcon>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>ASCOMDriverTemplate.snk</AssemblyOriginatorKeyFile>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile>
</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>
<RegisterForComInterop>true</RegisterForComInterop>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</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>
<PlatformTarget>AnyCPU</PlatformTarget>
<RegisterForComInterop>false</RegisterForComInterop>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="ASCOM.Astrometry, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.Attributes, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.Controls, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.DeviceInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.Exceptions, 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.Video, Version=6.1.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Focuser.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<SubType>Designer</SubType>
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="ASCOM.png" />
<None Include="ASCOMDriverTemplate.snk" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Content Include="ASCOM.ico" />
<Content Include="ReadMe.htm" />
<None Include="Resources\ASCOM.bmp" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Meade.net\Meade.net.csproj">
<Project>{3689a2cb-94c5-4012-a5cf-7e7d1dd27143}</Project>
<Name>Meade.net</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<!-- 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>
@@ -0,0 +1,39 @@
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.
//
// TODO - Add your authorship information here
[assembly: AssemblyTitle("ASCOM.Meade.net.Focuser")]
[assembly: AssemblyDescription("ASCOM Focuser driver for Meade.net")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("cjdawson.com")]
[assembly: AssemblyProduct("ASCOM Focuser driver for Meade.net")]
[assembly: AssemblyCopyright("Copyright © 2019 cjdawson.com")]
[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(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("4ad7a6d4-6d54-4a9a-bbf3-895353e318f8")]
// 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 Revision and Build Numbers
// by using the '*' as shown below:
//
// TODO - Set your driver's version here
[assembly: AssemblyVersion("0.4.0.0")]
[assembly: AssemblyFileVersion("0.4.0.0")]
+83
View File
@@ -0,0 +1,83 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASCOM.Meade.net.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ASCOM {
get {
object obj = ResourceManager.GetObject("ASCOM", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon DefaultIcon {
get {
object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}
+127
View File
@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ASCOM" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DefaultIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\ASCOM.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>
+26
View File
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASCOM.Meade.net.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
@@ -0,0 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles />
<Settings />
</SettingsFile>
+147
View File
@@ -0,0 +1,147 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
<TITLE>Untitled Document</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="0;0">
<META NAME="CHANGEDBY" CONTENT="Chris Rowland">
<META NAME="CHANGED" CONTENT="20110918;14150500">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { font-family: "Verdana", "Arial", "Helvetica", sans-serif; font-weight: normal }
TD P { font-family: "Verdana", "Arial", "Helvetica", sans-serif; font-weight: normal }
H3 { font-family: "Arial", "Helvetica", sans-serif }
H2 { font-family: "Arial", "Helvetica", sans-serif }
H4 { font-family: "Arial", "Helvetica", sans-serif }
TD P.note { background: #33ffff; font-family: "Verdana", "Arial", "Helvetica", sans-serif; font-weight: normal }
TD P.underline { font-family: "Verdana", "Arial", "Helvetica", sans-serif; font-weight: normal; text-decoration: underline }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=4 CELLSPACING=0>
<TR>
<TD>
<H2>ASCOM Focuser Driver (C#)</H2>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>You have just created the skeleton of an ASCOM
Focuser driver in C#. It produces an in-process
(assembly) based driver.</H4>
<HR>
<P CLASS="note">Prior to developing your first driver, please
familiarize yourself with the <A HREF="http://ascom-standards.org/developer.html">developer
information we've provided</A> at the ASCOM Initiative web site
(internet required).
</P>
<P CLASS="underline">You must do the following in order to complete
your implementation:</P>
<OL>
<LI><P STYLE="margin-bottom: 0cm">Switch to the Debug configuration
and build the template now. It should build without errors.
</P>
<LI><P STYLE="margin-bottom: 0cm">Add a test project to the
solution. There are templates that can be used to add either a
console or a Windows Forms application:</P>
</OL>
<UL>
<LI><P STYLE="margin-bottom: 0cm">Select the <FONT FACE="Consolas, monospace">ASCOM
Test Forms App (CS)</FONT> or <FONT FACE="Consolas, monospace">ASCOM
Test Console App (CS)</FONT> template.</P>
<LI><P STYLE="margin-bottom: 0cm">Set a name for the test
application and click on OK.</P>
<LI><P STYLE="margin-bottom: 0cm">In the Wizard: set the same device
type and model name as for the driver and select Create to build the
test project.</P>
<LI><P STYLE="margin-bottom: 0cm">Set the Test Application to Run at
Startup.</P>
<LI><P STYLE="margin-bottom: 0cm">Click on Debug and the test
application should run. You should be able to select your
application in the chooser. Selecting Properties should show the
default setup dialog for your driver.</P>
<LI><P STYLE="margin-bottom: 0cm">Trying to continue will generate
errors because the additional properties have not been implemented.</P>
</UL>
<OL START=4>
<LI><P STYLE="margin-bottom: 0cm">Go through the Driver.cs file and
replace the System.NotImplemented exceptions with code to implement
your driver's functionality. See the ASCOM IFocuserV3
spec. If a property or method is not implemented in your driver the
System.NotImplemented exception must be replaced by an
ASCOM.PropertyNotImplemented or ASCOM.MethodNotImplemented
exception.</P>
<LI><P>Customize the Setup Dialog (SetupDialogForm) to provide the
settings and other controls for your driver. You can bind settings
directly to controls on your dialog form, there's no need to manage
settings manually. A custom Settings class takes care of managing
your settings behind the scenes.
</P>
</OL>
<H3>Notes:</H3>
<UL>
<LI><P STYLE="margin-bottom: 0cm">Successfully building the driver,
as well as using <FONT FACE="Lucida Console, Courier New, Courier, monospace">regasm</FONT>
on the assembly, registers it for both COM and ASCOM (the Chooser).
See the code in the ASCOM Registration region of Driver.vb.
</P>
<LI><P STYLE="margin-bottom: 0cm">Doing a Clean for the project, as
well doing a <FONT FACE="Lucida Console, Courier New, Courier, monospace">regasm
-u</FONT> on the assembly, unregisters it for both COM and ASCOM
(the Chooser).
</P>
<LI><P>Place a breakpoint in your driver class constructor, then
start debugging (go, F5). Your breakpoint will be hit when the test
application creates an instance of your driver (after selecting it
in the Chooser). You can now single step, examine variables, etc.
Please review the test application and make changes and additions to
activate various parts of your driver during debugging.</P>
<LI><P>The project's Debug configuration is already configured (The
test application creates an instance of your driver (after selecting
it in the Chooser). You can now single step, examine variables, etc.
Please review the test application and feel free to make changes and
additions to activate various parts of your driver during debugging.
</P>
</UL>
<DIV ALIGN=RIGHT>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=4 CELLSPACING=0>
<TR>
<TD>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=4 CELLSPACING=0>
<TR>
<TD>
<H3>ASCOM Initiative</H3>
</TD>
<TD>
<IMG SRC="ASCOM.png" NAME="graphics1" ALIGN=RIGHT WIDTH=48 HEIGHT=56 BORDER=0></TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</TD>
</TR>
<TR>
<TD>
<P>The ASCOM Initiative consists of a group of astronomy software
developers and instrument vendors whose goals are to promote the
driver/client model and scripting automation.
</P>
<P>See the <A HREF="http://ascom-standards.org/" TARGET="browser">ASCOM
web site</A> for more information. Please participate in the
<A HREF="http://tech.groups.yahoo.com/group/ASCOM-Talk" TARGET="browser">ASCOM-Talk
Yahoo Group</A>.
</P>
</TD>
</TR>
</TABLE>
</DIV>
<P><BR><BR>
</P><P>
<BR><BR>
</P>
</BODY>
</HTML>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="ASCOM.DeviceName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>
+73
View File
@@ -0,0 +1,73 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.136
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net", "Meade.net\Meade.net.csproj", "{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.Telescope", "Meade.net.Telescope\Meade.net.Telescope.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.focuser", "Meade.net.focuser\Meade.net.focuser.csproj", "{A97E3AEC-F11D-49DA-B259-DE99DA813A86}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelescopeTestConsole", "TelescopeTestConsole\TelescopeTestConsole.csproj", "{D5207217-61C7-4E94-8097-91DBACE57D2A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FocuserTestConsole", "FocuserTestConsole\FocuserTestConsole.csproj", "{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestConsoles", "TestConsoles", "{BF650D97-AF98-4638-9C55-21311C6D88DA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|x86.ActiveCfg = Debug|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|x86.Build.0 = Debug|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|Any CPU.Build.0 = Release|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x86.ActiveCfg = Release|Any CPU
{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x86.Build.0 = Release|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|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.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
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|x86.ActiveCfg = Debug|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|x86.Build.0 = Debug|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|Any CPU.Build.0 = Release|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|x86.ActiveCfg = Release|Any CPU
{A97E3AEC-F11D-49DA-B259-DE99DA813A86}.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
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Debug|Any CPU.ActiveCfg = Debug|x86
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Debug|x86.ActiveCfg = Debug|x86
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Debug|x86.Build.0 = Debug|x86
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|Any CPU.ActiveCfg = Release|x86
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|x86.ActiveCfg = Release|x86
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{D5207217-61C7-4E94-8097-91DBACE57D2A} = {BF650D97-AF98-4638-9C55-21311C6D88DA}
{AABC96B8-C462-4B3A-9B5F-2929E3CB7A49} = {BF650D97-AF98-4638-9C55-21311C6D88DA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3C0509DC-C7F5-48DC-920D-DCFD9C879BD2}
EndGlobalSection
EndGlobal
Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

+244
View File
@@ -0,0 +1,244 @@
using System;
using System.Runtime.InteropServices;
using System.Collections;
namespace ASCOM.Meade.net
{
#region C# Definition of IClassFactory
//
// Provide a definition of theCOM IClassFactory interface.
//
[
ComImport, // This interface originated from COM.
ComVisible(false), // Must not be exposed to COM!!!
InterfaceType(ComInterfaceType.InterfaceIsIUnknown), // Indicate that this interface is not IDispatch-based.
Guid("00000001-0000-0000-C000-000000000046") // This GUID is the actual GUID of IClassFactory.
]
public interface IClassFactory
{
void CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject);
void LockServer(bool fLock);
}
#endregion
//
// Universal ClassFactory. Given a type as a parameter of the
// constructor, it implements IClassFactory for any interface
// that the class implements. Magic!!!
//
public class ClassFactory : IClassFactory
{
#region Access to ole32.dll functions for class factories
// Define two common GUID objects for public usage.
public static Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
public static Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
[Flags]
enum CLSCTX : uint
{
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
}
[Flags]
enum REGCLS : uint
{
REGCLS_SINGLEUSE = 0,
REGCLS_MULTIPLEUSE = 1,
REGCLS_MULTI_SEPARATE = 2,
REGCLS_SUSPENDED = 4,
REGCLS_SURROGATE = 8
}
//
// CoRegisterClassObject() is used to register a Class Factory
// into COM's internal table of Class Factories.
//
[DllImport("ole32.dll")]
static extern int CoRegisterClassObject(
[In] ref Guid rclsid,
[MarshalAs(UnmanagedType.IUnknown)] object pUnk,
uint dwClsContext,
uint flags,
out uint lpdwRegister);
//
// Called by a COM EXE Server that can register multiple class objects
// to inform COM about all registered classes, and permits activation
// requests for those class objects.
// This function causes OLE to inform the SCM about all the registered
// classes, and begins letting activation requests into the server process.
//
[DllImport("ole32.dll")]
static extern int CoResumeClassObjects();
//
// Prevents any new activation requests from the SCM on all class objects
// registered within the process. Even though a process may call this API,
// the process still must call CoRevokeClassObject for each CLSID it has
// registered, in the apartment it registered in.
//
[DllImport("ole32.dll")]
static extern int CoSuspendClassObjects();
//
// CoRevokeClassObject() is used to unregister a Class Factory
// from COM's internal table of Class Factories.
//
[DllImport("ole32.dll")]
static extern int CoRevokeClassObject(uint dwRegister);
#endregion
#region Constructor and Private ClassFactory Data
protected Type m_ClassType;
protected Guid m_ClassId;
protected ArrayList m_InterfaceTypes;
protected uint m_ClassContext;
protected uint m_Flags;
protected UInt32 m_locked = 0;
protected uint m_Cookie;
protected string m_progid;
public ClassFactory(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
m_ClassType = type;
//PWGS Get the ProgID from the MetaData
m_progid = Marshal.GenerateProgIdForType(type);
m_ClassId = Marshal.GenerateGuidForType(type); // Should be nailed down by [Guid(...)]
m_ClassContext = (uint)CLSCTX.CLSCTX_LOCAL_SERVER; // Default
m_Flags = (uint)REGCLS.REGCLS_MULTIPLEUSE | // Default
(uint)REGCLS.REGCLS_SUSPENDED;
m_InterfaceTypes = new ArrayList();
foreach (Type T in type.GetInterfaces()) // Save all of the implemented interfaces
m_InterfaceTypes.Add(T);
}
#endregion
#region Common ClassFactory Methods
public uint ClassContext
{
get { return m_ClassContext; }
set { m_ClassContext = value; }
}
public Guid ClassId
{
get { return m_ClassId; }
set { m_ClassId = value; }
}
public uint Flags
{
get { return m_Flags; }
set { m_Flags = value; }
}
public bool RegisterClassObject()
{
// Register the class factory
int i = CoRegisterClassObject
(
ref m_ClassId,
this,
m_ClassContext,
m_Flags,
out m_Cookie
);
return (i == 0);
}
public bool RevokeClassObject()
{
int i = CoRevokeClassObject(m_Cookie);
return (i == 0);
}
public static bool ResumeClassObjects()
{
int i = CoResumeClassObjects();
return (i == 0);
}
public static bool SuspendClassObjects()
{
int i = CoSuspendClassObjects();
return (i == 0);
}
#endregion
#region IClassFactory Implementations
//
// Implement creation of the type and interface.
//
void IClassFactory.CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject)
{
IntPtr nullPtr = new IntPtr(0);
ppvObject = nullPtr;
//
// Handle specific requests for implemented interfaces
//
foreach (Type iType in m_InterfaceTypes)
{
if (riid == Marshal.GenerateGuidForType(iType))
{
ppvObject = Marshal.GetComInterfaceForObject(Activator.CreateInstance(m_ClassType), iType);
return;
}
}
//
// Handle requests for IDispatch or IUnknown on the class
//
if (riid == IID_IDispatch)
{
ppvObject = Marshal.GetIDispatchForObject(Activator.CreateInstance(m_ClassType));
return;
}
else if (riid == IID_IUnknown)
{
ppvObject = Marshal.GetIUnknownForObject(Activator.CreateInstance(m_ClassType));
}
else
{
//
// Oops, some interface that the class doesn't implement
//
throw new COMException("No interface", unchecked((int)0x80004002));
}
}
void IClassFactory.LockServer(bool bLock)
{
if (bLock)
Server.CountLock();
else
Server.UncountLock();
// Always attempt to see if we need to shutdown this server application.
Server.ExitIf();
}
#endregion
}
}
+57
View File
@@ -0,0 +1,57 @@
using System;
using System.Threading;
namespace ASCOM.Meade.net
{
/// <summary>
/// Summary description for GarbageCollection.
/// </summary>
class GarbageCollection
{
protected bool m_bContinueThread;
protected bool m_GCWatchStopped;
protected int m_iInterval;
protected ManualResetEvent m_EventThreadEnded;
public GarbageCollection(int iInterval)
{
m_bContinueThread = true;
m_GCWatchStopped = false;
m_iInterval = iInterval;
m_EventThreadEnded = new ManualResetEvent(false);
}
public void GCWatch()
{
// Pause for a moment to provide a delay to make threads more apparent.
while (ContinueThread())
{
GC.Collect();
Thread.Sleep(m_iInterval);
}
m_EventThreadEnded.Set();
}
protected bool ContinueThread()
{
lock (this)
{
return m_bContinueThread;
}
}
public void StopThread()
{
lock (this)
{
m_bContinueThread = false;
}
}
public void WaitForThreadToStop()
{
m_EventThreadEnded.WaitOne();
m_EventThreadEnded.Reset();
}
}
}
+642
View File
@@ -0,0 +1,642 @@
//
// ASCOM.Meade.net Local COM Server
//
// This is the core of a managed COM Local Server, capable of serving
// multiple instances of multiple interfaces, within a single
// executable. This implementes the equivalent functionality of VB6
// which has been extensively used in ASCOM for drivers that provide
// multiple interfaces to multiple clients (e.g. Meade Telescope
// and Focuser) as well as hubs (e.g., POTH).
//
// Written by: Robert B. Denny (Version 1.0.1, 29-May-2007)
// Modified by Chris Rowland and Peter Simpson to allow use with multiple devices of the same type March 2011
//
//
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;
using System.Collections;
using System.Runtime.InteropServices;
using System.Reflection;
using ASCOM.Utilities;
using Microsoft.Win32;
using System.Text;
using System.Threading;
using System.Security.Principal;
using System.Diagnostics;
using ASCOM;
namespace ASCOM.Meade.net
{
public static class Server
{
#region Access to kernel32.dll, user32.dll, and ole32.dll functions
[Flags]
enum CLSCTX : uint
{
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
}
[Flags]
enum COINIT : uint
{
/// Initializes the thread for multi-threaded object concurrency.
COINIT_MULTITHREADED = 0x0,
/// Initializes the thread for apartment-threaded object concurrency.
COINIT_APARTMENTTHREADED = 0x2,
/// Disables DDE for Ole1 support.
COINIT_DISABLE_OLE1DDE = 0x4,
/// Trades memory for speed.
COINIT_SPEED_OVER_MEMORY = 0x8
}
[Flags]
enum REGCLS : uint
{
REGCLS_SINGLEUSE = 0,
REGCLS_MULTIPLEUSE = 1,
REGCLS_MULTI_SEPARATE = 2,
REGCLS_SUSPENDED = 4,
REGCLS_SURROGATE = 8
}
// CoInitializeEx() can be used to set the apartment model
// of individual threads.
[DllImport("ole32.dll")]
static extern int CoInitializeEx(IntPtr pvReserved, uint dwCoInit);
// CoUninitialize() is used to uninitialize a COM thread.
[DllImport("ole32.dll")]
static extern void CoUninitialize();
// PostThreadMessage() allows us to post a Windows Message to
// a specific thread (identified by its thread id).
// We will need this API to post a WM_QUIT message to the main
// thread in order to terminate this application.
[DllImport("user32.dll")]
static extern bool PostThreadMessage(uint idThread, uint Msg, UIntPtr wParam,
IntPtr lParam);
// GetCurrentThreadId() allows us to obtain the thread id of the
// calling thread. This allows us to post the WM_QUIT message to
// the main thread.
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
#endregion
#region Private Data
private static int objsInUse; // Keeps a count on the total number of objects alive.
private static int serverLocks; // Keeps a lock count on this application.
private static frmMain s_MainForm = null; // Reference to our main form
private static ArrayList s_ComObjectAssys; // Dynamically loaded assemblies containing served COM objects
private static ArrayList s_ComObjectTypes; // Served COM object types
private static ArrayList s_ClassFactories; // Served COM object class factories
private static string s_appId = "{4e68ec46-5ffc-49e7-b298-38a548df0bfd}"; // Our AppId
private static readonly Object lockObject = new object();
#endregion
// This property returns the main thread's id.
public static uint MainThreadId { get; private set; } // Stores the main thread's thread id.
// Used to tell if started by COM or manually
public static bool StartedByCOM { get; private set; } // True if server started by COM (-embedding)
#region Server Lock, Object Counting, and AutoQuit on COM startup
// Returns the total number of objects alive currently.
public static int ObjectsCount
{
get
{
lock (lockObject)
{
return objsInUse;
}
}
}
// This method performs a thread-safe incrementation of the objects count.
public static int CountObject()
{
// Increment the global count of objects.
return Interlocked.Increment(ref objsInUse);
}
// This method performs a thread-safe decrementation the objects count.
public static int UncountObject()
{
// Decrement the global count of objects.
return Interlocked.Decrement(ref objsInUse);
}
// Returns the current server lock count.
public static int ServerLockCount
{
get
{
lock (lockObject)
{
return serverLocks;
}
}
}
// This method performs a thread-safe incrementation the
// server lock count.
public static int CountLock()
{
// Increment the global lock count of this server.
return Interlocked.Increment(ref serverLocks);
}
// This method performs a thread-safe decrementation the
// server lock count.
public static int UncountLock()
{
// Decrement the global lock count of this server.
return Interlocked.Decrement(ref serverLocks);
}
// AttemptToTerminateServer() will check to see if the objects count and the server
// lock count have both dropped to zero.
//
// If so, and if we were started by COM, we post a WM_QUIT message to the main thread's
// message loop. This will cause the message loop to exit and hence the termination
// of this application. If hand-started, then just trace that it WOULD exit now.
//
public static void ExitIf()
{
lock (lockObject)
{
if ((ObjectsCount <= 0) && (ServerLockCount <= 0))
{
if (StartedByCOM)
{
UIntPtr wParam = new UIntPtr(0);
IntPtr lParam = new IntPtr(0);
PostThreadMessage(MainThreadId, 0x0012, wParam, lParam);
}
}
}
}
#endregion
// -----------------
// PRIVATE FUNCTIONS
// -----------------
#region Dynamic Driver Assembly Loader
//
// Load the assemblies that contain the classes that we will serve
// via COM. These will be located in the same folder as
// our executable.
//
private static bool LoadComObjectAssemblies()
{
s_ComObjectAssys = new ArrayList();
s_ComObjectTypes = new ArrayList();
// put everything into one folder, the same as the server.
string assyPath = Assembly.GetEntryAssembly().Location;
assyPath = Path.GetDirectoryName(assyPath);
DirectoryInfo d = new DirectoryInfo(assyPath);
foreach (FileInfo fi in d.GetFiles("*.dll"))
{
string aPath = fi.FullName;
//
// First try to load the assembly and get the types for
// the class and the class factory. If this doesn't work ????
//
try
{
Assembly so = Assembly.LoadFrom(aPath);
//PWGS Get the types in the assembly
Type[] types = so.GetTypes();
foreach (Type type in types)
{
// PWGS Now checks the type rather than the assembly
// Check to see if the type has the ServedClassName attribute, only use it if it does.
MemberInfo info = type;
object[] attrbutes = info.GetCustomAttributes(typeof(ServedClassNameAttribute), false);
if (attrbutes.Length > 0)
{
//MessageBox.Show("Adding Type: " + type.Name + " " + type.FullName);
s_ComObjectTypes.Add(type); //PWGS - much simpler
s_ComObjectAssys.Add(so);
}
}
}
catch (BadImageFormatException)
{
// Probably an attempt to load a Win32 DLL (i.e. not a .net assembly)
// Just swallow the exception and continue to the next item.
continue;
}
catch (Exception e)
{
MessageBox.Show("Failed to load served COM class assembly " + fi.Name + " - " + e.Message,
"Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return false;
}
}
return true;
}
#endregion
#region COM Registration and Unregistration
//
// Test if running elevated
//
private static bool IsAdministrator
{
get
{
WindowsIdentity i = WindowsIdentity.GetCurrent();
WindowsPrincipal p = new WindowsPrincipal(i);
return p.IsInRole(WindowsBuiltInRole.Administrator);
}
}
//
// Elevate by re-running ourselves with elevation dialog
//
private static void ElevateSelf(string arg)
{
ProcessStartInfo si = new ProcessStartInfo();
si.Arguments = arg;
si.WorkingDirectory = Environment.CurrentDirectory;
si.FileName = Application.ExecutablePath;
si.Verb = "runas";
try { Process.Start(si); }
catch (System.ComponentModel.Win32Exception)
{
MessageBox.Show("The Meade.net was not " + (arg == "/register" ? "registered" : "unregistered") +
" because you did not allow it.", "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
return;
}
//
// Do everything to register this for COM. Never use REGASM on
// this exe assembly! It would create InProcServer32 entries
// which would prevent proper activation!
//
// Using the list of COM object types generated during dynamic
// assembly loading, it registers each one for COM as served by our
// exe/local server, as well as registering it for ASCOM. It also
// adds DCOM info for the local server itself, so it can be activated
// via an outboiud connection from TheSky.
//
private static void RegisterObjects()
{
if (!IsAdministrator)
{
ElevateSelf("/register");
return;
}
//
// If reached here, we're running elevated
//
Assembly assy = Assembly.GetExecutingAssembly();
Attribute attr = Attribute.GetCustomAttribute(assy, typeof(AssemblyTitleAttribute));
string assyTitle = ((AssemblyTitleAttribute)attr).Title;
attr = Attribute.GetCustomAttribute(assy, typeof(AssemblyDescriptionAttribute));
string assyDescription = ((AssemblyDescriptionAttribute)attr).Description;
//
// Local server's DCOM/AppID information
//
try
{
//
// HKCR\APPID\appid
//
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey("APPID\\" + s_appId))
{
key.SetValue(null, assyDescription);
key.SetValue("AppID", s_appId);
key.SetValue("AuthenticationLevel", 1, RegistryValueKind.DWord);
}
//
// HKCR\APPID\exename.ext
//
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("APPID\\{0}",
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1))))
{
key.SetValue("AppID", s_appId);
}
}
catch (Exception ex)
{
MessageBox.Show("Error while registering the server:\n" + ex.ToString(),
"Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
finally
{
}
//
// For each of the driver assemblies
//
foreach (Type type in s_ComObjectTypes)
{
bool bFail = false;
try
{
//
// HKCR\CLSID\clsid
//
string clsid = Marshal.GenerateGuidForType(type).ToString("B");
string progid = Marshal.GenerateProgIdForType(type);
//PWGS Generate device type from the Class name
string deviceType = type.Name;
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(string.Format("CLSID\\{0}", clsid)))
{
key.SetValue(null, progid); // Could be assyTitle/Desc??, but .NET components show ProgId here
key.SetValue("AppId", s_appId);
using (RegistryKey key2 = key.CreateSubKey("Implemented Categories"))
{
key2.CreateSubKey("{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}");
}
using (RegistryKey key2 = key.CreateSubKey("ProgId"))
{
key2.SetValue(null, progid);
}
key.CreateSubKey("Programmable");
using (RegistryKey key2 = key.CreateSubKey("LocalServer32"))
{
key2.SetValue(null, Application.ExecutablePath);
}
}
//
// HKCR\CLSID\progid
//
using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(progid))
{
key.SetValue(null, assyTitle);
using (RegistryKey key2 = key.CreateSubKey("CLSID"))
{
key2.SetValue(null, clsid);
}
}
//
// ASCOM
//
assy = type.Assembly;
// Pull the display name from the ServedClassName attribute.
attr = Attribute.GetCustomAttribute(type, typeof(ServedClassNameAttribute)); //PWGS Changed to search type for attribute rather than assembly
string chooserName = ((ServedClassNameAttribute)attr).DisplayName ?? "MultiServer";
using (var P = new ASCOM.Utilities.Profile())
{
P.DeviceType = deviceType;
P.Register(progid, chooserName);
}
}
catch (Exception ex)
{
MessageBox.Show("Error while registering the server:\n" + ex.ToString(),
"Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
bFail = true;
}
finally
{
}
if (bFail) break;
}
}
//
// Remove all traces of this from the registry.
//
// **TODO** If the above does AppID/DCOM stuff, this would have
// to remove that stuff too.
//
private static void UnregisterObjects()
{
if (!IsAdministrator)
{
ElevateSelf("/unregister");
return;
}
//
// Local server's DCOM/AppID information
//
Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}", s_appId), false);
Registry.ClassesRoot.DeleteSubKey(string.Format("APPID\\{0}",
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1)), false);
//
// For each of the driver assemblies
//
foreach (Type type in s_ComObjectTypes)
{
string clsid = Marshal.GenerateGuidForType(type).ToString("B");
string progid = Marshal.GenerateProgIdForType(type);
string deviceType = type.Name;
//
// Best efforts
//
//
// HKCR\progid
//
Registry.ClassesRoot.DeleteSubKey(String.Format("{0}\\CLSID", progid), false);
Registry.ClassesRoot.DeleteSubKey(progid, false);
//
// HKCR\CLSID\clsid
//
Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Implemented Categories\\{{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}}", clsid), false);
Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Implemented Categories", clsid), false);
Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\ProgId", clsid), false);
Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\LocalServer32", clsid), false);
Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}\\Programmable", clsid), false);
Registry.ClassesRoot.DeleteSubKey(String.Format("CLSID\\{0}", clsid), false);
try
{
//
// ASCOM
//
using (var P = new ASCOM.Utilities.Profile())
{
P.DeviceType = deviceType;
P.Unregister(progid);
}
}
catch (Exception) { }
}
}
#endregion
#region Class Factory Support
//
// On startup, we register the class factories of the COM objects
// that we serve. This requires the class facgtory name to be
// equal to the served class name + "ClassFactory".
//
private static bool RegisterClassFactories()
{
s_ClassFactories = new ArrayList();
foreach (Type type in s_ComObjectTypes)
{
ClassFactory factory = new ClassFactory(type); // Use default context & flags
s_ClassFactories.Add(factory);
if (!factory.RegisterClassObject())
{
MessageBox.Show("Failed to register class factory for " + type.Name,
"Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return false;
}
}
ClassFactory.ResumeClassObjects(); // Served objects now go live
return true;
}
private static void RevokeClassFactories()
{
ClassFactory.SuspendClassObjects(); // Prevent race conditions
foreach (ClassFactory factory in s_ClassFactories)
factory.RevokeClassObject();
}
#endregion
#region Command Line Arguments
//
// ProcessArguments() will process the command-line arguments
// If the return value is true, we carry on and start this application.
// If the return value is false, we terminate this application immediately.
//
private static bool ProcessArguments(string[] args)
{
bool bRet = true;
//
//**TODO** -Embedding is "ActiveX start". Prohibit non_AX starting?
//
if (args.Length > 0)
{
switch (args[0].ToLower())
{
case "-embedding":
StartedByCOM = true; // Indicate COM started us
break;
case "-register":
case @"/register":
case "-regserver": // Emulate VB6
case @"/regserver":
RegisterObjects(); // Register each served object
bRet = false;
break;
case "-unregister":
case @"/unregister":
case "-unregserver": // Emulate VB6
case @"/unregserver":
UnregisterObjects(); //Unregister each served object
bRet = false;
break;
default:
MessageBox.Show("Unknown argument: " + args[0] + "\nValid are : -register, -unregister and -embedding",
"Meade.net", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
break;
}
}
else
StartedByCOM = false;
return bRet;
}
#endregion
#region SERVER ENTRY POINT (main)
//
// ==================
// SERVER ENTRY POINT
// ==================
//
[STAThread]
static void Main(string[] args)
{
if (!LoadComObjectAssemblies()) return; // Load served COM class assemblies, get types
if (!ProcessArguments(args)) return; // Register/Unregister
// Initialize critical member variables.
objsInUse = 0;
serverLocks = 0;
MainThreadId = GetCurrentThreadId();
Thread.CurrentThread.Name = "Main Thread";
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
s_MainForm = new frmMain();
if (StartedByCOM) s_MainForm.WindowState = FormWindowState.Minimized;
// Register the class factories of the served objects
RegisterClassFactories();
// Start up the garbage collection thread.
GarbageCollection GarbageCollector = new GarbageCollection(1000);
Thread GCThread = new Thread(new ThreadStart(GarbageCollector.GCWatch));
GCThread.Name = "Garbage Collection Thread";
GCThread.Start();
//
// Start the message loop. This serializes incoming calls to our
// served COM objects, making this act like the VB6 equivalent!
//
try
{
Application.Run(s_MainForm);
}
finally
{
// Revoke the class factories immediately.
// Don't wait until the thread has stopped before
// we perform revocation!!!
RevokeClassFactories();
// Now stop the Garbage Collector thread.
GarbageCollector.StopThread();
GarbageCollector.WaitForThreadToStop();
}
}
#endregion
}
}
Binary file not shown.
+153
View File
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3689A2CB-94C5-4012-A5CF-7E7D1DD27143}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ASCOM.Meade.net</RootNamespace>
<AssemblyName>ASCOM.Meade.net.Server</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>2.0</OldToolsVersion>
<UpgradeBackupLocation />
<TargetFrameworkProfile />
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</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>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
</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>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<AssemblyOriginatorKeyFile>LocalServer.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>ASCOM.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="ASCOM.Attributes, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.DeviceInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=565de7938946fba7, processorArchitecture=MSIL" />
<Reference Include="ASCOM.Exceptions, 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="System" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<Compile Include="ClassFactory.cs" />
<Compile Include="frmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmMain.Designer.cs">
<DependentUpon>frmMain.cs</DependentUpon>
</Compile>
<Compile Include="GarbageCollection.cs" />
<Compile Include="LocalServer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="frmMain.resx">
<SubType>Designer</SubType>
<DependentUpon>frmMain.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="ReferenceCountedObject.cs" />
<Compile Include="SetupDialogForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SetupDialogForm.designer.cs">
<DependentUpon>SetupDialogForm.cs</DependentUpon>
</Compile>
<Compile Include="SharedResources.cs" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="SetupDialogForm.resx">
<DependentUpon>SetupDialogForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="ASCOM.ico" />
<Content Include="ASCOM.png" />
<Content Include="ReadMe.htm" />
<None Include="Resources\ASCOM.bmp" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="LocalServer.snk" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\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>
-->
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>
+27
View File
@@ -0,0 +1,27 @@
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("ASCOM Meade.net server")]
[assembly: AssemblyDescription("ASCOM multi-interface server for Meade.net")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("cjdawson.com")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("Copyright © 2019 cjdawson.com")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.4.0.0")]
[assembly: AssemblyFileVersion("0.4.0.0")]
[assembly: ComVisibleAttribute(false)]
+73
View File
@@ -0,0 +1,73 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASCOM.Meade.net.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Meade.net.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ASCOM {
get {
object obj = ResourceManager.GetObject("ASCOM", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}
+124
View File
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ASCOM" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>
+666
View File
@@ -0,0 +1,666 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"/>
<TITLE>Untitled Document</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"/>
<META NAME="CREATED" CONTENT="0;0"/>
<META NAME="CHANGEDBY" CONTENT="Chris Rowland"/>
<META NAME="CHANGED" CONTENT="20110422;10442800"/>
<META NAME="CHANGEDBY" CONTENT="Chris Rowland"/>
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { font-family: "Verdana", "Arial", "Helvetica", sans-serif; font-weight: normal }
TD P { font-family: "Verdana", "Arial", "Helvetica", sans-serif; font-weight: normal }
H3 { font-family: "Arial", "Helvetica", sans-serif }
H2 { font-family: "Arial", "Helvetica", sans-serif }
H4 { font-family: "Arial", "Helvetica", sans-serif }
PRE { margin-left: 0.18cm; margin-right: 0.18cm; margin-top: 0.18cm; margin-bottom: 0.18cm; background: #ccffff }
PRE.western { font-weight: normal }
PRE.cjk { font-family: "NSimSun", monospace; font-weight: normal }
PRE.ctl { font-weight: normal }
EM.underline { text-decoration: underline }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" DIR="LTR">
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="4" CELLSPACING="0" STYLE="page-break-before: always">
<TR>
<TD>
<H2>
ASCOM LocalServer (singleton) Host
</H2>
</TD>
</TR>
</TABLE>
<P>
<BR/>
<BR/>
</P>
<H4>
You have just created a local server (singleton) host for one or
more ASCOM driver classes.
</H4>
<HR/>
<P>
This project implements an ASCOM host server for one or more
driver classes in a single-instance executable. It can be used to
serve multiple instances of a single driver class (hub), provide
driver services for multiple devices (e.g., Telescope and Focuser) to
multiple applications and allow multiple devices of the same type to
be connected. In the latter scenario, the multiple driver classes
will often share one or more resources such as the serial connection
and a microcontroller in the combined device. From the client's
perspective, using the drivers served by the local server is exactly
the same as if the drivers are loaded into the client's process space
(in-proc servers).
</P>
<P STYLE="margin-left: 0.42cm; margin-right: 0.42cm; border: 1px solid #000000; padding: 0.21cm">
<STRONG>
<SPAN STYLE="background: #ffee88">NOTE:</SPAN>
</STRONG>
<SPAN STYLE="background: #ffee88">
Unless you are prepared to handle all of the timing issues that arise
when multiple clients are accessing the properties and methods of
your driver(s), stop now. Just because the local server serializes
the calls to your driver(s)' properties and methods does not mean
that there will be no timing or concurrency issues.<BR/>
&nbsp;<BR/>For
example, suppose the hub serves instances of a Telescope driver. One
client sets the TargetRightAscension property, then another sets
TargetRightAscension to a different value, then the first client sets
TargetDeclination, then the first client calls SlewToTarget()
followed by the second client calling SlewToTarget(). Besides the
first client's slew command sending the scope to the wrong (and
possibly dangerous) coordinates, there is the problem of the second
client trying to slew a slewing scope. Local server drivers are
tricky to get right. There is no such thing as &quot;ignorance is
bliss&quot; here.
</SPAN>
</P>
<P STYLE="margin-left: 0.42cm; margin-right: 0.42cm; border: 1px solid #000000; padding: 0.21cm">
<SPAN STYLE="background: #ffee88">
This implementation has changed
from what was defined for Platform 5.5 as follows:
</SPAN>
</P>
<P STYLE="margin-left: 0.42cm; margin-right: 0.42cm; border: 1px solid #000000; padding: 0.21cm">
<SPAN STYLE="background: #ffee88">
The drivers are now installed in
the same folder as the local server executable. This makes deployment
cleaner because the whole driver can exist in a single folder
independently of other drivers.
</SPAN>
</P>
<P STYLE="margin-left: 0.42cm; margin-right: 0.42cm; border: 1px solid #000000; padding: 0.21cm">
<SPAN STYLE="background: #ffee88">
The ProgId and friendly name as
displayed by the Chooser are defined using attributes. This allows
driver dlls to be identified clearly and so avoids confusion with
other dlls that may be required such as interop dlls.
</SPAN>
</P>
<P STYLE="margin-left: 0.42cm; margin-right: 0.42cm; border: 1px solid #000000; padding: 0.21cm">
<SPAN STYLE="background: #ffee88">
Some changes have been made that
will facilitate generating multiple drivers of the same type.
</SPAN>
</P>
<P STYLE="margin-left: 0.42cm; margin-right: 0.42cm; border: 1px solid #000000; padding: 0.21cm">
<SPAN STYLE="background: #ffee88">
I've put some additional advice and
comments in the notes below <I>in italics.</I>
</SPAN>
</P>
<P>
You're probably anxious to get going, but you really should read
through the <A HREF="#theory">Theory of Operation</A> and <A HREF="#details">
Detailed
Use and Deployment
</A> below.
</P>
<P>You must do the following in order to complete your local server:</P>
<OL>
<LI>
<P STYLE="margin-bottom: 0cm">
In the local server's project
properties, Application tab, change BOTH the AssemblyName and the
default assembly name to ASCOM.xxx (e.g., ASCOM.SuperScope). <I>
This
may be done by default now.
</I>
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Add one or more driver skeleton
projects using the in-proc templates. You may use either the C# or
VB templates. Project name is not important (not used in ProgID)
choose something like TelescopeDriver. You will be changing the
substituted project name in these projects below. If you ensure that
the LocalServer and all the driver projects have the same NameSpace
e.g. ASCOM.SuperScope the renaming in section 6a will not be
required.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Develop and debug these driver
projects as normal in-process assemblies. This will be much simpler
because the driver and test code can be debugged in the same
process.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Build the LocalServer.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Set a reference to the local
server <STRONG>project</STRONG> in each of the driver skeleton
projects.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">In each skeleton driver project:</P>
<OL TYPE="a">
<LI>
<P STYLE="margin-bottom: 0cm">
Do a Find In Files for the
project name of the skeleton driver (e.g., TelescopeDriver) and
change it to match the project name of your local server (e.g.
SuperScope). You don't have to do this in the ReadMe.html file.
Everywhere else, however, is IMPORTANT. This sets the correct
namespace, progID, etc. If you're a bit more brave, you can use
Replace in Files. <I>
This may not be needed if the correct
namespace and naming conventions have been followed when the
drivers and local server were generated.
</I>
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
In project properties,
Application tab, change the assembly name to
ASCOM.<EM CLASS="underline">localserverprojectname</EM>.<EM>drivertype</EM>,
(e.g., ASCOM.SuperScope.Telescope).
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
In project properties,
Application tab, click Assembly Information...
</P>
<UL>
<LI>
<P STYLE="margin-bottom: 0cm">
Assure that Make assembly COM
visible is <STRONG>on</STRONG> (it should already be on).
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Edit the Product Name to be the
&quot;friendly name&quot; of your driver as will be shown in the
Chooser. <I>
Not used now, use the ServedClassName attribute
instead.
</I>
</P>
</LI>
</UL>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
In project properties, Build tab,
turn <STRONG>off</STRONG> Register for COM Interop.
</P>
</LI>
<LI>
<P>
Modify the driver class declaration to inherit from
ReferenceCountedObjectBase. Examples:<BR/>C#:
</P>
<PRE CLASS="western">
public class Telescope :
ReferenceCountedObjectBase,
ITelescope
</PRE>
<P>
VB:
</P>
<PRE CLASS="western">
Public Class Telescope
'==================================
Inherits ReferenceCountedObjectBase
Implements ITelescope
'==================================
</PRE>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
In driver.cs/driver.vb, remove
the entire ASCOM Registration region
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
In driver.cs/driver.vb, remove
the private strings for driver ID and driver description. <I>
They
may be needed internally, and if so should be set from the
associated attributes, ServedClassName for the description and
ProgId for the driver Id.
</I>
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Modify the class attributes by
adding the ServedClassName and ProgID attributes. The
ServedClassName attribute must be the friendly name shown as the
device name in the Chooser and the ProgId the progid of the driver
e.g. ASCOM.SuperScope.Telescope. The class header should look like
this:
</P>
<P STYLE="margin-bottom: 0cm">C#:</P>
<PRE CLASS="western" STYLE="margin-right: 0.16cm">
<FONT FACE="Consolas" SIZE="2" STYLE="font-size: 9pt">
[<FONT COLOR="#2b91af">Guid</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#a31515">&quot;0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B&quot;</FONT><FONT COLOR="#000000">)] // set by the template</FONT>
<FONT COLOR="#000000">[</FONT><FONT COLOR="#2b91af">ProgId</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#a31515">&quot;ASCOM.SuperScope.Telescope&quot;</FONT><FONT COLOR="#000000">)]</FONT>
<FONT COLOR="#000000">[</FONT><FONT COLOR="#2b91af">ServedClassName</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#a31515">&quot;Super Scope Telescope&quot;</FONT><FONT COLOR="#000000">)]</FONT>
<FONT COLOR="#000000">[</FONT><FONT COLOR="#2b91af">ClassInterface</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#2b91af">ClassInterfaceType</FONT><FONT COLOR="#000000">.None)]</FONT>
<FONT COLOR="#0000ff">public </FONT><FONT COLOR="#0000ff">class </FONT><FONT COLOR="#2b91af">Telescope </FONT><FONT COLOR="#000000">: </FONT><FONT COLOR="#2b91af">ReferenceCountedObjectBase</FONT><FONT COLOR="#000000"> , </FONT><FONT COLOR="#2b91af">ITelescope</FONT>
</FONT>
</PRE>
</LI>
</OL>
</LI>
</OL>
<P STYLE="margin-bottom: 0cm">
<BR/>
</P>
<OL>
<OL TYPE="a">
<P>VB:</P>
<PRE CLASS="western">
<FONT FACE="Consolas" SIZE="2" STYLE="font-size: 9pt">
&lt;Guid(&ldquo;<FONT COLOR="#a31515">0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B</FONT>&rdquo;)&gt;
&lt;ProgId(&ldquo;ASCOM.SuperScope.Telescope&rdquo;)&gt;
&lt;ServedClassName(&ldquo;Super Scope Telescope&rdquo;)&gt;
Public Class Telescope
'==================================
Inherits ReferenceCountedObjectBase
Implements ITelescope
'==================================
</FONT>
</PRE>
</OL>
</OL>
<P STYLE="margin-left: 2.5cm">
Add the following line to the driver
constructor, this sets the driver ID using the ProgId Attribute:
</P>
<OL>
<OL TYPE="a">
<P>C#</P>
<PRE CLASS="western">
<FONT FACE="Consolas" SIZE="2" STYLE="font-size: 9pt">
s_csDriverID = <FONT COLOR="#2b91af">Marshal</FONT><FONT COLOR="#000000">.GenerateProgIdForType(</FONT><FONT COLOR="#0000ff">this</FONT><FONT COLOR="#000000">.GetType());</FONT>
</FONT>
</PRE>
<P>VB:</P>
<PRE CLASS="western">
<FONT FACE="Consolas" SIZE="2" STYLE="font-size: 9pt">
s_csDriverID = <FONT COLOR="#2b91af">Marshal</FONT><FONT COLOR="#000000">.GenerateProgIdForType(</FONT><FONT COLOR="#0000ff">Me</FONT><FONT COLOR="#000000">.GetType())</FONT>
</FONT>
</PRE>
</OL>
<LI>
<P STYLE="margin-bottom: 0cm">
Unless you're writing a
single-driver hub, you will have two or more driver types (e.g.
Telescope and Focuser) and thus two or more driver assembly projects
added. Presumably, these drivers need to share some resources (e.g.
a single COM port via Helper.Serial). <U>
Put shared resources into
the SharedResources class provided
</U>. There are some examples that
should give a clue, modify and delete these as required.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
A shared serial port is already
provided (see SharedResources.cs) as <FONT FACE="Lucida Console, Courier New, Courier, monospace">SharedResources.SharedSerial</FONT>
and it is an ASCOM Helper Serial object. You may wish to define
additional shared resources in static member variables with public
static accessor properties as is already done for SharedSerial.
Unfortunately, if you are a Visual Basic programmer, you will have
to make these additions in C#.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
If you are writing a hub and don't
need the serial port, in SharedResources.cs you can remove the
public static SharedSerial property, the m_SharedSerial member in
the private data region, and the line in main that initializes it.
If you don't need any other shared resources for your hub, then you
can remove the SharedResources.cs file completely.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
If you modified the LocalServer,
build it again now. This will refresh the stuff that's visible to
the drivers.
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
Build the driver skeletons to
verify that you got all of the namespace and other variable changes.
</P>
</LI>
<LI>
<P>
The local server dynamically loads the driver assemblies from
the same folder as the local server executable. <BR/>
<BR/>During
development, you'll need to add a post-build task to each of your
driver assembly projects which puts a copy of the driver assembly
into the local server executable folder. Here is an example:
</P>
<PRE CLASS="western"> copy &quot;$(TargetPath)&quot; &quot;$(SolutionDir)\SuperScope\$(OutDir)\$(TargetFileName)&quot;</PRE>
<P STYLE="margin-bottom: 0cm">
This assumes that the server project is called &ldquo;SuperScope&rdquo;,
and handles using the debug or release build.<BR/>
Note the quotes for
possible path elements with spaces in them. <I>
An alternative is to
set the build path to the required destination instead of the
default path.
</I>
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
<I>
Make sure the drivers are
registered through the local server by running it with the /register
parameter, see below for details.
</I>
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
<SPAN STYLE="background: #ffff00">IMPORTANT:</SPAN>
With a local server based driver (or hub) it is possible for
multiple clients to control the device(s). It is up to you to
safeguard against abuse. <I>
The sort of thing that's needed is to
have a counter of the number of connections to a device, the
connection is only fully broken when the number of connections is
zero. You may also need code to prevent several drivers from talking
to the hardware at the same time, the lock pattern is useful for
that.
</I>
</P>
</LI>
<LI>
<P>
You may want to add controls and/or status information to the
main form frmMain of the local server. Please resist the temptation
to turn the local server's main form into a graphical device control
panel. Instead, make a separate application that uses the served
driver(s). <U>A driver is not a program!</U>
</P>
</LI>
</OL>
<H3>Notes</H3>
<UL>
<LI>
<P STYLE="margin-bottom: 0cm">
The local server handles all of
the registration and unregistration for each of its served driver
classes, including the ASCOM Chooser info and the DCOM/AppID info
needed for activation from TheSky. By running the server from a
command line and giving /register or /unregister as the command line
option, it will register or unregister all served classes
(respectively). <SPAN STYLE="background: #ffff00">
Never use REGASM
on the local server executable!
</SPAN> <I>
This can be done in the
Visual Studio IDE by setting the server project to run as startup
and setting the command line argument to /register in Debug &ndash;
Start Options.
</I>
</P>
</LI>
<LI>
<P STYLE="margin-bottom: 0cm">
When you make the installer for
your local server based driver/hub, do not let it register the
executable for COM. Instead, have it activate the installed local
server with the /register option.
</P>
</LI>
<LI>
<P>
The ASCOM registration uses the ServedClassName attribute as
the friendly name that will show in the chooser and the ProgId
attribute as the driver Id.
</P>
</LI>
<LI>
<P>
The best deployment way is to install all the files in a
folder that's a sub folder of the main driver, so the SuperScope
driver files will be in the folder ...\ASCOM\Telescope\SuperScope.
This can be done in the Inno script by changing the DefaultDirName
like this:<BR/>
DefaultDirName=&quot;{cf}\ASCOM\Telescope\SuperScope&quot;<BR/>then
the files can all be installed with DestDir: {app};
</P>
</LI>
</UL>
<H3>
<A NAME="theory"></A>Theory of Operation
</H3>
<P>
The local server is an executable which can provide multiple
instances of multiple drivers to multiple clients. This capability is
needed for two applications:
</P>
<UL>
<LI>
<P STYLE="margin-bottom: 0cm">
A hub, which allows multiple
clients to share a single device
</P>
</LI>
<LI>
<P>
A device which provides multiple services, such as a
telescope which has a focuser built-in where both the telescope and
focuser are controlled by the same serial connection and different
client programs need to control to the focuser and telescope.
</P>
</LI>
</UL>
<P>
By simply dropping suitably developed driver assemblies into the
same folder as the local server executable, the local server will
find them and register them for COM and ASCOM and serve any number of
instances of the drivers' interfaces to any number of client
programs. It does this by locating and loading the driver assemblies,
analysing them to detect their classes and interfaces, and
implementing a class factory that can create instances of them for
clients.
</P>
<P>
A driver is an assembly which contains a class that <EM>implements</EM>
one of the ASCOM standard driver interfaces and <EM>inherits</EM> the
ReferenceCountedObjectBase class of the local server. Apart from
that, driver assemblies are identical to those that are used
in-process (DLL-type). The instructions above detail the steps needed
to convert an in-process driver into one that can be served by the
local server.
</P>
<P>
The name of the local server is important, so we provide it as a
<EM>template</EM> from which you can create a local server for your
produce. To make this clear, let's assume that your company AlphaTech
produces a telescope system which contains a microcontroller that is
able to control not only the telescope mount, but also a focuser and
a camera rotator. The mount, focuser, and rotator are all controlled
via commands sent through a common serial line connecting the
computer to the microcontroller, so you need a local server. In
ASCOM, then, you probably want your system to appear as
AlphaTech.Telescope, AlphaTech.Focuser, and AlphaTech.Rotator. Then
you would name the local server AlphaTech. Be sure to give this due
consideration before creating the template, the project name is the
name of your local server. <I>
Is this still correct? I get the
impression that ASCOM.AlphaTech.Server would be OK.
</I>
</P>
<P>
The fact that driver classes inherit from the local server's
ReferenceCountedObjectBase class allows the local server to maintain
a reference count on the driver class. If a client creates an
instance of a served driver, the local server automatically starts up
and provides an instance of the class to the client. Once started the
local server can provide additional instances of any of its served
driver classes. If the reference count of all served classes drops to
zero as a result of clients releasing their instances, the local
server will automatically exit.
</P>
<P>
Registration services provided include not only the basic COM
class registration, but also DCOM/AppID info needed to use the served
classes from outbound connections from Software Bisque's TheSky. It
also registers the served classes for the ASCOM Chooser. The
&quot;friendly&quot; name of each served driver that appears in the
chooser comes from the driver's ServedClassName attribute. This also
used to identify a driver so that non driver dlls, such as Interop
dlls can be ignored. The COM ProgID for each served driver is
specified in the ProgId attribute - ASCOM.<EM>localservername</EM>.<EM>drivertype</EM>,
for example, ASCOM.AlphaTech.Telescope, where AlphaTech is the local
server name and Telescope is the type of the driver. Unregistering
removes all of this information from the system. Specifying the
ProgId as an attribute allows multiple driver assemblies to be
generated using the same source and namespace. This is used to
provide multiple instances of the same driver, each with a different
ProgId and so able to be registered separately.
</P>
<P>
Driver DLLs are identified for registering/unregistering because
they contain a type with the ServedClassName attribute. Only these
will be registered for Com and ASCOM. This has changed; in Platform
5 there was no attribute and the local server attempted to register
all dlls. The new behaviour allows support dlls such as interop dlls
to be included without them being registered incorrectly. There was
also an interim version where the ServedClassName attribute was on
the assembly, not the class. <I>
All these previous versions, and the
new drivers will operate together with Platform 6, the changes are
local to the individual drivers.
</I>
</P>
<H3>
<A NAME="details"></A>Detailed Use and Deployment
</H3>
<P>
Once you have built your local server and the served driver class
assemblies, here's how to use it. To register the served classes,
activate the local server from a shell command line with the option
/register (or /regserver, for VB6 compatibility):
</P>
<PRE CLASS="western">
C:\xxx&gt; <EM>localserver</EM>.exe /register
</PRE>
<P>
To unregister the local server and its drivers, activate the local
server from a shell command line with the option /unregister (or
/unregserver for VB6 compatibility):
</P>
<PRE CLASS="western">
C:\xxx&gt; <EM>localserver</EM>.exe /unregister
</PRE>
<P>
When the operating system starts the local server in response to a
client creating one of it's served driver classes, the command option
/embedding is included. The local server's code detects this and sets
a variable that you can use.
</P>
<P STYLE="margin-bottom: 0cm">
When deploying a hub or set of drivers
with the local server, you'll have to arrange for the local server
and the driver assemblies to be placed together in a folder in the
ASCOM driver folder. Any support files, such as Interop DLLs can be
put in the same fiolder. That's all you need to do, the local server
will find them in the same folder as it is located in.
</P>
<DIV ALIGN="RIGHT">
<TABLE WIDTH="100"% BORDER="0" CELLPADDING="4" CELLSPACING="0">
<TR>
<TD>
<TABLE WIDTH="100"% BORDER="0" CELLPADDING="4" CELLSPACING="0">
<TR>
<TD>
<H3>ASCOM Initiative</H3>
</TD>
<TD>
<IMG SRC="ASCOM.png" NAME="graphics1" ALIGN="RIGHT" WIDTH="48" HEIGHT="56" BORDER="0"/>
</TD>
</TR>
</TABLE>
<P>
<BR/>
<BR/>
</P>
</TD>
</TR>
<TR>
<TD>
<P>
The ASCOM Initiative consists of a group of astronomy software
developers and instrument vendors whose goals are to promote the
driver/client model and scripting automation.
</P>
<P>
See the <A HREF="http://ascom-standards.org/" TARGET="browser">
ASCOM
web site
</A> for more information. Please participate in the
<A HREF="http://tech.groups.yahoo.com/group/ASCOM-Talk" TARGET="browser">
ASCOM-Talk
Yahoo Group
</A>.
</P>
</TD>
</TR>
</TABLE>
</DIV>
<P>
<BR/>
<BR/>
</P>
<P>
<BR/>
<BR/>
</P>
</BODY>
</HTML>
+24
View File
@@ -0,0 +1,24 @@
using System;
using System.Runtime.InteropServices;
namespace ASCOM.Meade.net
{
[ComVisible(false)]
public class ReferenceCountedObjectBase
{
public ReferenceCountedObjectBase()
{
// We increment the global count of objects.
Server.CountObject();
}
~ReferenceCountedObjectBase()
{
// We decrement the global count of objects.
Server.UncountObject();
// We then immediately test to see if we the conditions
// are right to attempt to terminate this server application.
Server.ExitIf();
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

@@ -6,9 +6,9 @@ using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using ASCOM.Utilities;
using ASCOM.MeadeAutostar497;
using ASCOM.Meade.net;
namespace ASCOM.MeadeAutostar497
namespace ASCOM.Meade.net
{
[ComVisible(false)] // Form not registered for COM!
public partial class SetupDialogForm : Form
@@ -16,16 +16,6 @@ namespace ASCOM.MeadeAutostar497
public SetupDialogForm()
{
InitializeComponent();
// Initialise current values of user settings from the ASCOM Profile
InitUI();
}
private void cmdOK_Click(object sender, EventArgs e) // OK button event handler
{
// Place any validation constraint checks here
// Update the state variables with results from the dialogue
Telescope.comPort = (string)comboBoxComPort.SelectedItem;
Telescope.tl.Enabled = chkTrace.Checked;
}
private void cmdCancel_Click(object sender, EventArgs e) // Cancel button event handler
@@ -50,17 +40,28 @@ namespace ASCOM.MeadeAutostar497
}
}
private void InitUI()
public void SetProfile(ProfileProperties profileProperties)
{
chkTrace.Checked = Telescope.tl.Enabled;
chkTrace.Checked = profileProperties.TraceLogger;
// set the list of com ports to those that are currently available
comboBoxComPort.Items.Clear();
comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); // use System.IO because it's static
// select the current port if possible
if (comboBoxComPort.Items.Contains(Telescope.comPort))
if (comboBoxComPort.Items.Contains(profileProperties.ComPort))
{
comboBoxComPort.SelectedItem = Telescope.comPort;
comboBoxComPort.SelectedItem = profileProperties.ComPort;
}
}
public ProfileProperties GetProfile()
{
var profileProperties = new ProfileProperties
{
TraceLogger = chkTrace.Checked,
ComPort = comboBoxComPort.SelectedItem.ToString()
};
return profileProperties;
}
}
}
@@ -1,4 +1,4 @@
namespace ASCOM.MeadeAutostar497
namespace ASCOM.Meade.net
{
partial class SetupDialogForm
{
@@ -48,7 +48,6 @@ namespace ASCOM.MeadeAutostar497
this.cmdOK.TabIndex = 0;
this.cmdOK.Text = "OK";
this.cmdOK.UseVisualStyleBackColor = true;
this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
//
// cmdCancel
//
@@ -74,7 +73,7 @@ namespace ASCOM.MeadeAutostar497
//
this.picASCOM.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.picASCOM.Cursor = System.Windows.Forms.Cursors.Hand;
this.picASCOM.Image = global::ASCOM.MeadeAutostar497.Properties.Resources.ASCOM;
this.picASCOM.Image = global::ASCOM.Meade.net.Properties.Resources.ASCOM;
this.picASCOM.Location = new System.Drawing.Point(292, 9);
this.picASCOM.Name = "picASCOM";
this.picASCOM.Size = new System.Drawing.Size(48, 56);
@@ -129,7 +128,7 @@ namespace ASCOM.MeadeAutostar497
this.Name = "SetupDialogForm";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "MeadeAutostar497 Setup";
this.Text = "Meade.net Setup";
((System.ComponentModel.ISupportInitialize)(this.picASCOM)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
+382
View File
@@ -0,0 +1,382 @@
//
// ================
// Shared Resources
// ================
//
// This class is a container for all shared resources that may be needed
// by the drivers served by the Local Server.
//
// NOTES:
//
// * ALL DECLARATIONS MUST BE STATIC HERE!! INSTANCES OF THIS CLASS MUST NEVER BE CREATED!
//
// Written by: Bob Denny 29-May-2007
// Modified by Chris Rowland and Peter Simpson to hamdle multiple hardware devices March 2011
//
using System;
using System.Collections.Generic;
using System.Text;
using ASCOM;
using ASCOM.Utilities;
namespace ASCOM.Meade.net
{
public class ProfileProperties
{
// properies that are part of the profile
public string ComPort { get; set; }
public bool TraceLogger { get; set; }
}
/// <summary>
/// The resources shared by all drivers and devices, in this example it's a serial port with a shared SendMessage method
/// an idea for locking the message and handling connecting is given.
/// In reality extensive changes will probably be needed.
/// Multiple drivers means that several applications connect to the same hardware device, aka a hub.
/// Multiple devices means that there are more than one instance of the hardware, such as two focusers.
/// In this case there needs to be multiple instances of the hardware connector, each with it's own connection count.
/// </summary>
public static class SharedResources
{
// object used for locking to prevent multiple drivers accessing common code at the same time
private static readonly object lockObject = new object();
// Shared serial port. This will allow multiple drivers to use one single serial port.
private static ASCOM.Utilities.Serial s_sharedSerial = new ASCOM.Utilities.Serial(); // Shared serial port
private static int s_z = 0; // counter for the number of connections to the serial port
//
// Public access to shared resources
//
#region single serial port connector
//
// this region shows a way that a single serial port could be connected to by multiple
// drivers.
//
// Connected is used to handle the connections to the port.
//
// SendMessage is a way that messages could be sent to the hardware without
// conflicts between different drivers.
//
// All this is for a single connection, multiple connections would need multiple ports
// and a way to handle connecting and disconnection from them - see the
// multi driver handling section for ideas.
//
/// <summary>
/// Shared serial port
/// </summary>
public static ASCOM.Utilities.Serial SharedSerial
{
get { return s_sharedSerial; }
}
/// <summary>
/// number of connections to the shared serial port
/// </summary>
public static int connections
{
get { return s_z; }
set { s_z = value; }
}
public static void SendBlind(string message)
{
lock (lockObject)
{
SharedSerial.ClearBuffers();
SharedSerial.Transmit(message);
}
}
public static bool SendBool(string message)
{
SharedSerial.ClearBuffers();
return SendChar(message) == "1";
}
/// <summary>
/// Example of a shared SendMessage method, the lock
/// prevents different drivers tripping over one another.
/// It needs error handling and assumes that the message will be sent unchanged
/// and that the reply will always be terminated by a "#" character.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static string SendString(string message)
{
lock (lockObject)
{
SharedSerial.ClearBuffers();
SharedSerial.Transmit(message);
return SharedSerial.ReceiveTerminated("#").TrimEnd('#');
}
}
public static string SendChar(string message)
{
lock (lockObject)
{
SharedSerial.ClearBuffers();
SharedSerial.Transmit(message);
return SharedSerial.ReceiveCounted(1);
}
}
public static string ReadTerminated()
{
lock (lockObject)
{
return SharedSerial.ReceiveTerminated("#");
}
}
/// <summary>
/// Example of handling connecting to and disconnection from the
/// shared serial port.
/// Needs error handling
/// the port name etc. needs to be set up first, this could be done by the driver
/// checking Connected and if it's false setting up the port before setting connected to true.
/// It could also be put here.
/// </summary>
public static bool Connected
{
set
{
lock (lockObject)
{
if (value)
{
if (s_z == 0)
SharedSerial.Connected = true;
s_z++;
}
else
{
s_z--;
if (s_z <= 0)
{
SharedSerial.Connected = false;
}
}
}
}
get { return SharedSerial.Connected; }
}
#endregion
#region Profile
internal static string driverID = "ASCOM.MeadeGeneric.Telescope";
// Constants used for Profile persistence
internal static string comPortProfileName = "COM Port";
internal static string traceStateProfileName = "Trace Level";
public static void WriteProfile(ProfileProperties profileProperties)
{
using (Profile driverProfile = new Profile())
{
driverProfile.DeviceType = "Telescope";
driverProfile.WriteValue(driverID, traceStateProfileName, profileProperties.TraceLogger.ToString());
driverProfile.WriteValue(driverID, comPortProfileName, profileProperties.ComPort);
}
}
private static readonly string comPortDefault = "COM1";
internal static string traceStateDefault = "false";
public static ProfileProperties ReadProfile()
{
ProfileProperties profileProperties = new ProfileProperties();
using (Profile driverProfile = new Profile())
{
driverProfile.DeviceType = "Telescope";
profileProperties.ComPort =
driverProfile.GetValue(driverID, comPortProfileName, string.Empty, comPortDefault);
profileProperties.TraceLogger = Convert.ToBoolean(driverProfile.GetValue(driverID,
traceStateProfileName, string.Empty, traceStateDefault));
}
return profileProperties;
}
#endregion
#region SetupDialog
public static void SetupDialog()
{
// consider only showing the setup dialog if not connected
// or call a different dialog if connected
if (SharedSerial.Connected)
{
System.Windows.Forms.MessageBox.Show("Already connected, please disconnect before altering settings");
return;
}
var profileProperties = ReadProfile();
using (SetupDialogForm F = new SetupDialogForm())
{
F.SetProfile(profileProperties);
var result = F.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
{
profileProperties = F.GetProfile();
WriteProfile(profileProperties); // Persist device configuration values to the ASCOM Profile store
}
}
}
#endregion
#region Multi Driver handling
// this section illustrates how multiple drivers could be handled,
// it's for drivers where multiple connections to the hardware can be made and ensures that the
// hardware is only disconnected from when all the connected devices have disconnected.
// It is NOT a complete solution! This is to give ideas of what can - or should be done.
//
// An alternative would be to move the hardware control here, handle connecting and disconnecting,
// and provide the device with a suitable connection to the hardware.
//
/// <summary>
/// dictionary carrying device connections.
/// The Key is the connection number that identifies the device, it could be the COM port name,
/// USB ID or IP Address, the Value is the DeviceHardware class
/// </summary>
private static Dictionary<string, DeviceHardware> connectedDevices = new Dictionary<string, DeviceHardware>();
/// <summary>
/// This is called in the driver Connect(true) property,
/// it add the device id to the list of devices if it's not there and increments the device count.
/// </summary>
/// <param name="deviceId"></param>
public static void Connect(string deviceId)
{
lock (lockObject)
{
if (!connectedDevices.ContainsKey(deviceId))
connectedDevices.Add(deviceId, new DeviceHardware());
connectedDevices[deviceId].count++; // increment the value
if (deviceId == "Serial")
{
if (connectedDevices[deviceId].count == 1)
{
var profileProperties = ReadProfile();
SharedResources.SharedSerial.PortName = profileProperties.ComPort;
SharedResources.SharedSerial.DTREnable = false;
SharedResources.SharedSerial.RTSEnable = false;
SharedResources.SharedSerial.DataBits = 8;
SharedResources.SharedSerial.StopBits = SerialStopBits.One;
SharedResources.SharedSerial.Parity = SerialParity.None;
SharedResources.SharedSerial.Speed = SerialSpeed.ps9600;
SharedResources.SharedSerial.Handshake = SerialHandshake.None;
SharedResources.SharedSerial.Connected = true;
string firmware = SendString(":GVN#");
}
}
}
}
public static void Disconnect(string deviceId)
{
lock (lockObject)
{
if (connectedDevices.ContainsKey(deviceId))
{
connectedDevices[deviceId].count--;
if (connectedDevices[deviceId].count <= 0)
{
connectedDevices.Remove(deviceId);
if (deviceId == "Serial")
{
SharedResources.SharedSerial.Connected = false;
}
}
}
}
}
public static bool IsConnected(string deviceId)
{
if (connectedDevices.ContainsKey(deviceId))
return (connectedDevices[deviceId].count > 0);
else
return false;
}
#endregion
public static void Lock(Action action)
{
lock (lockObject)
{
action();
}
}
public static T Lock<T>(Func<T> func)
{
lock (lockObject)
{
return func();
}
}
/// <summary>
/// Skeleton of a hardware class, all this does is hold a count of the connections,
/// in reality extra code will be needed to handle the hardware in some way
/// </summary>
public class DeviceHardware
{
private int _count;
internal int count
{
set => _count = value;
get => _count;
}
internal DeviceHardware()
{
count = 0;
}
}
//#region ServedClassName attribute
///// <summary>
///// This is only needed if the driver is targeted at platform 5.5, it is included with Platform 6
///// </summary>
//[global::System.AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
//public sealed class ServedClassNameAttribute : Attribute
//{
// // See the attribute guidelines at
// // http://go.microsoft.com/fwlink/?LinkId=85236
// /// <summary>
// /// Gets or sets the 'friendly name' of the served class, as registered with the ASCOM Chooser.
// /// </summary>
// /// <value>The 'friendly name' of the served class.</value>
// public string DisplayName { get; private set; }
// /// <summary>
// /// Initializes a new instance of the <see cref="ServedClassNameAttribute"/> class.
// /// </summary>
// /// <param name="servedClassName">The 'friendly name' of the served class.</param>
// public ServedClassNameAttribute(string servedClassName)
// {
// DisplayName = servedClassName;
// }
//}
//#endregion
}
}
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>
+63
View File
@@ -0,0 +1,63 @@
using System;
namespace ASCOM.Meade.net
{
partial class frmMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.Location = new System.Drawing.Point(12, 10);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(199, 33);
this.label1.TabIndex = 0;
this.label1.Text = "This is an ASCOM driver, not a program for you to use.";
//
// frmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(233, 52);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "frmMain";
this.Text = "Meade.net Driver Server";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label label1;
}
}
+20
View File
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ASCOM.Meade.net
{
public partial class frmMain : Form
{
delegate void SetTextCallback(string text);
public frmMain()
{
InitializeComponent();
}
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -1,36 +0,0 @@
<#
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
@@ -1,126 +0,0 @@
<?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>AnyCPU</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>
@@ -1,556 +0,0 @@
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));
}
}
}
@@ -1,9 +0,0 @@
<?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>
-49
View File
@@ -1,49 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.136
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeadeAutostar497", "MeadeAutostar497\MeadeAutostar497.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}"
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
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{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|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.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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FD610065-5DB2-4D32-8760-4E0552901C28}
EndGlobalSection
EndGlobal
File diff suppressed because it is too large Load Diff
@@ -1,34 +0,0 @@
namespace ASCOM.MeadeAutostar497.Controller
{
enum FirmwareVersion
{
autostar497_30eb,
autostar497_30ed,
autostar497_30ee,
autostar497_31ee,
autostar497_32ea,
//PEC added for Polar mounted scopes
autostar497_32ee,
autostar497_32eh,
//Some serial strings fixed.
autostar497_32ei,
autostar497_33ef,
//Some serial strings fixed.
autostar497_33el,
autostar497_40eb,
autostar497_40ee,
autostar497_40ef,
autostar497_41ec,
autostar497_42ed,
//Get serial command for daylight savings (:GH# returns 0 for disabled 1 for enabled)
//Set serial command for daylight savings (:SH0# disables, :SH1# enables)
autostar497_43ea,
autostar497_43ed,
autostar497_43eg
//Added :GW#, :AL#, :AA#, & :AP#
}
}
@@ -1,28 +0,0 @@
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,42 +0,0 @@
using System;
using ASCOM.DeviceInterface;
namespace ASCOM.MeadeAutostar497.Controller
{
public interface ITelescopeController
{
string Port { get; set; }
bool Connected { get; set; }
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; set; }
int FocuserMaxIncrement { get; set; }
int FocuserMaxStep { get; set; }
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);
void FocuserHalt();
void FocuserMove(int position);
string CommandString(string command, bool raw);
void CommandBlind(string command, bool raw);
}
}
@@ -1,142 +0,0 @@
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,992 +0,0 @@
using System;
using System.IO.Ports;
using System.Linq;
using System.Threading;
using ASCOM.DeviceInterface;
using ASCOM.Utilities;
using ASCOM.Utilities.Interfaces;
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
{
private const double INVALID_PARAMETER = -1000;
private static readonly Lazy<TelescopeController> Lazy = new Lazy<TelescopeController>();
public static TelescopeController Instance => Lazy.Value;
//todo remove this as it can cause problems in production
private ISerialProcessor _serialPort;
public ISerialProcessor SerialPort
{
get => _serialPort ?? (_serialPort = new SerialProcessor());
set
{
if (_serialPort == value)
return;
if (_serialPort != null)
{
if (_serialPort.IsOpen)
throw new InvalidOperationException("Please disconnect before changing the serial engine.");
}
_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";
public string Port
{
get => _port;
set
{
if (_port == value) return;
if (Connected)
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;
}
}
private bool ValidPort(string value)
{
return SerialPort.GetPortNames().Contains(value);
}
public bool Connected
{
get => SerialPort.IsOpen;
set
{
if (value == Connected)
return;
if (value)
{
//Connecting
try
{
AtPark = false;
SerialPort.DtrEnable = false;
SerialPort.RtsEnable = false;
SerialPort.BaudRate = 9600;
SerialPort.DataBits = 8;
SerialPort.StopBits = StopBits.One;
SerialPort.Parity = Parity.None;
SerialPort.PortName = Port;
SerialPort.Open();
TestConnectionActive();
SetFocuserSpeedFastest();
}
catch (Exception)
{
if (SerialPort.IsOpen)
SerialPort.Close();
throw;
}
}
else
{
//Disconnecting
SerialPort.Close();
AtPark = false;
}
}
}
private void TestConnectionActive()
{
var firmwareVersionNumber = SerialPort.CommandTerminated(":GVN#", "#");
if (string.IsNullOrEmpty(firmwareVersionNumber))
{
throw new InvalidOperationException("Failed to communicate with telescope.");
}
}
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;
}
}
private DriveRates _trackingRate = DriveRates.driveSidereal;
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;
return _trackingRate;
}
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:
//:TM# Select custom tracking rate [ no-op in Autostar II]
//Returns: Nothing
break;
default:
throw new ArgumentOutOfRangeException(nameof(value), value, null);
}
_trackingRate = value;
}
}
public int FocuserMaxIncrement { get; set; } = 7000;
public int FocuserMaxStep { get; set; } = 7000;
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.Lock();
try
{
_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}#");
}
finally
{
SerialPort.Unlock();
}
}
}
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)
{
SerialPort.Lock();
try
{
TargetRightAscension = rightAscension;
TargetDeclination = declination;
DoSlewAsync(true);
}
finally
{
SerialPort.Unlock();
}
}
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)
{
SerialPort.Lock();
try
{
TargetAltitude = altitude;
TargetAzimuth = azimuth;
DoSlewAsync(false);
}
finally
{
SerialPort.Unlock();
}
}
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)
{
SerialPort.Lock();
try
{
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.");
}
}
finally
{
SerialPort.Unlock();
}
}
public void FocuserHalt()
{
SerialPort.Command(":FQ#");
//:FQ# Halt Focuser Motion
//Returns: Nothing
}
public void FocuserMove(int newPosition)
{
//todo implement backlash compensation
//todo implement direction reverse
//todo implement dynamic braking
if (newPosition < -FocuserMaxIncrement || newPosition > FocuserMaxIncrement)
{
throw new ASCOM.InvalidValueException($"position out of range {-FocuserMaxIncrement} < {newPosition} < {FocuserMaxIncrement}");
}
if (newPosition == 0)
return;
if (newPosition > 0)
{
//desired move direction is out
MoveFocuser(true, Math.Abs(newPosition));
}
else
{
//desired move direction is in
MoveFocuser(false, Math.Abs(newPosition));
}
}
public string CommandString(string command, bool raw)
{
return SerialPort.CommandTerminated(command, "#");
}
public void CommandBlind(string command, bool raw)
{
SerialPort.Command(command);
}
private void MoveFocuser(bool directionOut, int steps)
{
SerialPort.Command(directionOut ? ":F+#" : ":F-#");
//:F+# Start Focuser moving inward (toward objective)
//Returns: None
//:F-# Start Focuser moving outward (away from objective)
//Returns: None
Util.WaitForMilliseconds(steps);
FocuserHalt();
}
private void SetFocuserSpeedFastest()
{
SerialPort.Command(":FF#");
//:FF# Set Focus speed to fastest setting
//Returns: Nothing
}
private void SetFocuserSpeedSlowest()
{
SerialPort.Command(":FS#");
//:FS# Set Focus speed to slowest setting
//Returns: Nothing
}
private void SetFocuserSpeed( int speed)
{
if (speed < 1)
throw new ArgumentOutOfRangeException("speed is too low");
if (speed > 4)
throw new ArgumentOutOfRangeException("speed is too high");
SerialPort.Command($":F{speed}#");
//:F<n># Autostar, Autostar II set focuser speed to <n> where <n> is an ASCII digit 1..4
//Returns: Nothing
//All others Not Supported
}
//todo remove the polar parameter and split method into two.
private void DoSlewAsync( bool polar)
{
SerialPort.Lock();
try
{
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;
}
}
finally
{
SerialPort.Unlock();
}
}
public bool UserNewerPulseGuiding { get; set; } = true; //todo make this a device setting
}
}
-249
View File
@@ -1,249 +0,0 @@
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
@@ -22,17 +22,19 @@ namespace ASCOM
// Uncomment the code that's required
#if UseChooser
// choose the device
string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.MeadeAutostar497.Telescope");
string id = ASCOM.DriverAccess.Telescope.Choose("ASCOM.Meade.net.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");
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.Meade.net.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);
@@ -41,29 +43,11 @@ namespace ASCOM
// TODO add more code to test the driver.
device.Connected = true;
//Console.WriteLine(device.Slewing);
//Console.WriteLine($"Altitute {device.Altitude}");
//device.UTCDate = DateTime.UtcNow;
//Console.WriteLine(device.UTCDate.ToLocalTime());
//Console.WriteLine($"Dec {device.Declination}");
//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.SlewToAltAz(30, 45);
device.Connected = false;
Console.WriteLine("Press Enter to finish");
@@ -5,11 +5,11 @@ 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: AssemblyTitle("Meade.net Test Application")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ASCOM Initiative")]
[assembly: AssemblyProduct("q")]
[assembly: AssemblyProduct("Meade.net")]
[assembly: AssemblyCopyright("Copyright © ASCOM Initiative 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -8,15 +8,15 @@
<ProjectGuid>{D5207217-61C7-4E94-8097-91DBACE57D2A}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TestConsole</RootNamespace>
<AssemblyName>TestConsole</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<RootNamespace>ASCOM.Meade.net</RootNamespace>
<AssemblyName>ASCOM.Meade.net.Test</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>