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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,35 +2,35 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// 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("")]
|
||||
|
||||
// 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
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("9638da27-77c7-4b30-a730-6e7159a4a09f")]
|
||||
[assembly: Guid("c7008f94-e3b9-4481-b720-3b56557860c6")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// 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
|
||||
{
|
||||
@@ -13,4 +7,4 @@ namespace ASCOM.MeadeAutostar497
|
||||
return int.Parse(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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")]
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -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>
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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)]
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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/>
|
||||
<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 "ignorance is
|
||||
bliss" 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
|
||||
"friendly name" 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">"0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B"</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">"ASCOM.SuperScope.Telescope"</FONT><FONT COLOR="#000000">)]</FONT>
|
||||
<FONT COLOR="#000000">[</FONT><FONT COLOR="#2b91af">ServedClassName</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#a31515">"Super Scope Telescope"</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">
|
||||
<Guid(“<FONT COLOR="#a31515">0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B</FONT>”)>
|
||||
<ProgId(“ASCOM.SuperScope.Telescope”)>
|
||||
<ServedClassName(“Super Scope Telescope”)>
|
||||
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 "$(TargetPath)" "$(SolutionDir)\SuperScope\$(OutDir)\$(TargetFileName)"</PRE>
|
||||
<P STYLE="margin-bottom: 0cm">
|
||||
This assumes that the server project is called “SuperScope”,
|
||||
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 –
|
||||
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="{cf}\ASCOM\Telescope\SuperScope"<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
|
||||
"friendly" name of each served driver that appears in the
|
||||
chooser comes from the driver's ServedClassName attribute. This also
|
||||
used to identify a driver so that non driver dlls, such as Interop
|
||||
dlls can be ignored. The COM ProgID for each served driver is
|
||||
specified in the ProgId attribute - ASCOM.<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> <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> <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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
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
|
||||
@@ -48,19 +38,30 @@ namespace ASCOM.MeadeAutostar497
|
||||
{
|
||||
MessageBox.Show(other.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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*MM’SS#
|
||||
//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*MM’SS#
|
||||
//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*MM’SS#
|
||||
////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*MM’SS#
|
||||
//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*MM’SS# [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
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>
|
||||