diff --git a/ASCOM.MeadeAutostar497.Focuser.Validation.txt b/ASCOM.MeadeAutostar497.Focuser.Validation.txt deleted file mode 100644 index 8dedf49..0000000 --- a/ASCOM.MeadeAutostar497.Focuser.Validation.txt +++ /dev/null @@ -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 diff --git a/ASCOM.MeadeAutostar497.Telescope.Validation.txt b/ASCOM.MeadeAutostar497.Telescope.Validation.txt deleted file mode 100644 index eff5811..0000000 --- a/ASCOM.MeadeAutostar497.Telescope.Validation.txt +++ /dev/null @@ -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 diff --git a/ASCOM.MeadeGeneric.Telescope.Validation.txt b/ASCOM.MeadeGeneric.Telescope.Validation.txt new file mode 100644 index 0000000..19ba7a7 --- /dev/null +++ b/ASCOM.MeadeGeneric.Telescope.Validation.txt @@ -0,0 +1,269 @@ +Conform Report Hash (V1): EE943505837FAD1E4F4998D567C304701AB845611D748A5A9517BF10842F951F5DD946834D8E59B5E7B84C7C067D24F52AC1C4F7E4A879A7CDAF4AB7BFEF8BB4 + + +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. + +19:18:57.428 Driver Access Checks OK +19:18:58.079 AccessChecks OK Successfully created driver using late binding +19:18:58.893 AccessChecks OK Successfully connected using late binding +19:18:58.898 AccessChecks INFO The driver is a .NET object +19:18:58.903 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.Meade.net.Telescope, ASCOM.Meade.net.Telescope, Version=0.4.0.0, Cultu +19:18:58.907 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.ITelescopeV3 +19:18:59.617 AccessChecks INFO Device does not expose interface ITelescopeV2 +19:19:00.617 AccessChecks INFO Device exposes interface ITelescopeV3 +19:19:01.929 AccessChecks OK Successfully created driver using driver access toolkit +19:19:02.635 AccessChecks OK Successfully connected using driver access toolkit + +Conform is using ASCOM.DriverAccess.Telescope to get a Telescope object +19:19:03.962 ConformanceCheck OK Driver instance created successfully +19:19:04.542 ConformanceCheck OK Connected OK + +Common Driver Methods +19:19:04.582 InterfaceVersion OK 3 +19:19:04.611 Connected OK True +19:19:04.640 Description OK Meade Generic +19:19:04.668 DriverInfo OK Information about the driver itself. Version: 0.4 +19:19:04.696 DriverVersion OK 0.4 +19:19:04.724 Name OK Meade Generic +19:19:04.753 CommandString INFO Conform cannot test the CommandString method +19:19:04.758 CommandBlind INFO Conform cannot test the CommandBlind method +19:19:04.765 CommandBool INFO Conform cannot test the CommandBool method +19:19:04.771 Action INFO Conform cannot test the Action method +19:19:04.778 SupportedActions OK Driver returned an empty action list + +Can Properties +19:19:04.843 CanFindHome OK False +19:19:04.850 CanPark OK True +19:19:04.858 CanPulseGuide OK True +19:19:04.866 CanSetDeclinationRate OK False +19:19:04.874 CanSetGuideRates OK False +19:19:04.881 CanSetPark OK False +19:19:04.889 CanSetPierSide OK False +19:19:04.923 CanSetRightAscensionRate OK False +19:19:04.932 CanSetTracking OK True +19:19:04.939 CanSlew OK True +19:19:04.947 CanSlewltAz OK True +19:19:04.954 CanSlewAltAzAsync OK True +19:19:04.962 CanSlewAsync OK True +19:19:04.971 CanSync OK True +19:19:04.979 CanSyncAltAz OK False +19:19:04.990 CanUnPark OK False + +Pre-run Checks +19:19:05.040 Mount Safety INFO Scope is not parked, continuing testing +19:19:05.070 Mount Safety INFO Scope tracking has been enabled +19:19:05.100 TimeCheck INFO PC Time Zone: GMT Summer Time, offset -1 hours. +19:19:05.108 TimeCheck INFO PC UTCDate: 19-May-2019 18:19:05.108 +19:19:05.604 TimeCheck INFO Mount UTCDate: 19-May-2019 18:18:16.000 + +Properties +19:19:05.689 AlignmentMode OK algPolar +19:19:06.820 Altitude OK 50.09 +19:19:06.854 ApertureArea OK Optional member threw a PropertyNotImplementedException exception. +19:19:06.886 ApertureDiameter OK Optional member threw a PropertyNotImplementedException exception. +19:19:06.920 AtHome OK False +19:19:06.952 AtPark OK False +19:19:07.636 Azimuth OK 150.49 +19:19:07.938 Declination OK 16:49:00.00 +19:19:07.971 DeclinationRate Read OK 0.00 +19:19:08.003 DeclinationRate Write OK CanSetDeclinationRate is False and a PropertyNotImplementedException exception was generated as expected +19:19:08.037 DoesRefraction Read OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.071 DoesRefraction Write OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.104 EquatorialSystem OK equLocalTopocentric +19:19:08.136 FocalLength OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.169 GuideRateDeclination Read OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.179 GuideRateDeclination Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected +19:19:08.212 GuideRateRightAscension Read OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.223 GuideRateRightAscension Write OK CanSetGuideRates is False and a PropertyNotImplementedException exception was generated as expected +19:19:08.257 IsPulseGuiding OK False +19:19:08.539 RightAscension OK 11:16:48.00 +19:19:08.572 RightAscensionRate Read OK 0.00 +19:19:08.605 RightAscensionRate Write OK CanSetRightAscensionRate is False and a PropertyNotImplementedException exception was generated as expected +19:19:08.639 SiteElevation Read OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.675 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.687 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.698 SiteElevation Write OK Optional member threw a PropertyNotImplementedException exception. +19:19:08.758 SiteLatitude Read OK 53:48:00.00 +19:19:08.793 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude < -90 degrees +19:19:08.808 SiteLatitude Write OK Invalid Value exception generated as expected on set site latitude > 90 degrees +19:19:08.973 SiteLatitude Write OK Legal value 53:48:00.00 degrees written successfully +19:19:09.052 SiteLongitude Read OK -01:47:00.00 +19:19:09.088 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude < -180 degrees +19:19:09.100 SiteLongitude Write OK Invalid Value exception generated as expected on set site longitude > 180 degrees +19:19:09.267 SiteLongitude Write OK Legal value -01:47:00.00 degrees written successfully +19:19:09.326 Slewing OK False +19:19:09.361 SlewSettleTime Read OK Optional member threw a PropertyNotImplementedException exception. +19:19:09.400 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception. +19:19:09.413 SlewSettleTime Write OK Optional member threw a PropertyNotImplementedException exception. +19:19:09.447 SideOfPier Read OK Optional member threw a PropertyNotImplementedException exception. +19:19:09.493 SiderealTime OK 10:00:32.13 +19:19:09.505 SiderealTime OK Scope and ASCOM sidereal times agree to better than 2 seconds, Scope: 10:00:32.13, ASCOM: 10:00:33.22 +19:19:09.540 TargetDeclination Read OK .NET Not InvalidOperationException generated on read before write +19:19:09.575 TargetDeclination Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates. +19:19:09.588 TargetRightAscension Read OK .NET Not InvalidOperationException generated on read before write +19:19:09.623 TargetRightAscension Write INFO Tests moved after the SlewToCoordinates tests so that Conform can check they properly set target coordinates. +19:19:09.635 Tracking Read OK True +19:19:10.697 Tracking Write OK False +19:19:11.759 TrackingRates Found drive rate: driveSidereal +19:19:11.772 TrackingRates Found drive rate: driveLunar +19:19:11.784 TrackingRates OK Drive rates read OK +19:19:11.797 TrackingRates OK Disposed tracking rates OK +19:19:11.832 TrackingRates OK Successfully obtained a TrackingRates object after the previous TrackingRates object was disposed +19:19:11.858 TrackingRate Read OK driveSidereal +19:19:11.893 TrackingRate Write OK Successfully set drive rate: driveSidereal +19:19:11.928 TrackingRate Write OK Successfully set drive rate: driveLunar +19:19:12.073 UTCDate Read OK 19-May-2019 18:18:23.000 +19:19:13.628 UTCDate Write OK New UTCDate written successfully: 19/05/2019 19:18:23 + +Methods +19:19:15.180 CanMoveAxis:Primary OK CanMoveAxis:Primary True +19:19:15.218 CanMoveAxis:Secondary OK CanMoveAxis:Secondary True +19:19:15.255 CanMoveAxis:Tertiary OK CanMoveAxis:Tertiary False +19:19:15.292 Park/Unpark INFO Tests skipped +19:19:15.311 AbortSlew OK AbortSlew OK when not slewing +19:19:15.376 AxisRate:Primary OK Axis rate minimum: 1 Axis rate maximum: 1 +19:19:15.390 AxisRate:Primary OK Axis rate minimum: 2 Axis rate maximum: 2 +19:19:15.404 AxisRate:Primary OK Axis rate minimum: 3 Axis rate maximum: 3 +19:19:15.417 AxisRate:Primary OK Axis rate minimum: 4 Axis rate maximum: 4 +19:19:15.430 AxisRate:Primary OK No overlapping axis rates found +19:19:15.442 AxisRate:Primary OK No duplicate axis rates found +19:19:15.454 AxisRate:Primary OK Successfully disposed of rate 1 - 1 +19:19:15.468 AxisRate:Primary OK Successfully disposed of rate 2 - 2 +19:19:15.480 AxisRate:Primary OK Successfully disposed of rate 3 - 3 +19:19:15.492 AxisRate:Primary OK Successfully disposed of rate 4 - 4 +19:19:15.505 AxisRate:Primary OK Disposed axis rates OK +19:19:15.518 AxisRate:Secondary OK Axis rate minimum: 1 Axis rate maximum: 1 +19:19:15.533 AxisRate:Secondary OK Axis rate minimum: 2 Axis rate maximum: 2 +19:19:15.546 AxisRate:Secondary OK Axis rate minimum: 3 Axis rate maximum: 3 +19:19:15.559 AxisRate:Secondary OK Axis rate minimum: 4 Axis rate maximum: 4 +19:19:15.571 AxisRate:Secondary OK No overlapping axis rates found +19:19:15.585 AxisRate:Secondary OK No duplicate axis rates found +19:19:15.599 AxisRate:Secondary OK Successfully disposed of rate 1 - 1 +19:19:15.612 AxisRate:Secondary OK Successfully disposed of rate 2 - 2 +19:19:15.625 AxisRate:Secondary OK Successfully disposed of rate 3 - 3 +19:19:15.638 AxisRate:Secondary OK Successfully disposed of rate 4 - 4 +19:19:15.652 AxisRate:Secondary OK Disposed axis rates OK +19:19:15.667 AxisRate:Tertiary OK Empty axis rate returned +19:19:15.680 AxisRate:Tertiary OK Disposed axis rates OK +19:19:15.697 FindHome OK CanFindHome is False and a MethodNotImplementedException exception was generated as expected +19:19:15.745 MoveAxis Primary OK Can successfully set a movement rate of zero +19:19:15.761 MoveAxis Primary OK Exception correctly generated when move axis is set below lowest rate (0.5) +19:19:15.800 MoveAxis Primary OK Exception correctly generated when move axis is set above highest rate (5) +19:19:19.972 MoveAxis Primary OK Successfully moved axis at minimum rate: 1 +19:19:24.750 MoveAxis Primary OK Successfully moved axis at maximum rate: 4 +19:19:28.925 MoveAxis Primary OK Tracking state correctly retained for both tracking states +19:19:28.941 MoveAxis Primary OK AxisRates object successfully disposed +19:19:29.002 MoveAxis Secondary OK Can successfully set a movement rate of zero +19:19:29.018 MoveAxis Secondary OK Exception correctly generated when move axis is set below lowest rate (0.5) +19:19:29.055 MoveAxis Secondary OK Exception correctly generated when move axis is set above highest rate (5) +19:19:33.266 MoveAxis Secondary OK Successfully moved axis at minimum rate: 1 +19:19:38.191 MoveAxis Secondary OK Successfully moved axis at maximum rate: 4 +19:19:42.366 MoveAxis Secondary OK Tracking state correctly retained for both tracking states +19:19:42.384 MoveAxis Secondary OK AxisRates object successfully disposed +19:19:42.447 MoveAxis Tertiary OK CanMoveAxis Tertiary is False and a MethodNotImplementedException exception was generated as expected +19:19:44.487 PulseGuide OK Synchronous pulse guide found OK +19:20:06.507 SlewToCoordinates INFO Slewed within 175.3 arc seconds of expected RA: 09:01:07.31, actual RA: 09:01:19.00 +19:20:06.522 SlewToCoordinates INFO Slewed within 82.0 arc seconds of expected DEC: 01:00:00.00, actual DEC: 01:01:22.00 +19:20:06.537 SlewToCoordinates OK The TargetRightAscension property 09:01:07.31 matches the expected RA OK. +19:20:06.550 SlewToCoordinates OK The TargetDeclination property 01:00:00.00 matches the expected Declination OK. +19:20:06.591 SlewToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00 +19:20:06.856 SlewToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00 +19:20:06.920 SlewToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00 +19:20:07.224 SlewToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00 +19:20:25.860 SlewToCoordinatesAsync INFO Slewed within 178.3 arc seconds of expected RA: 08:01:30.11, actual RA: 08:01:42.00 +19:20:25.876 SlewToCoordinatesAsync INFO Slewed within 64.0 arc seconds of expected DEC: 02:00:00.00, actual DEC: 01:58:56.00 +19:20:25.890 SlewToCoordinatesAsync OK The TargetRightAscension property 08:01:30.11 matches the expected RA OK. +19:20:25.904 SlewToCoordinatesAsync OK The TargetDeclination property 02:00:00.00 matches the expected Declination OK. +19:20:25.945 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00 +19:20:26.201 SlewToCoordinatesAsync (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00 +19:20:26.263 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00 +19:20:26.567 SlewToCoordinatesAsync (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00 +19:20:47.987 SyncToCoordinates INFO Slewed to start position within 25.3 arc seconds of expected RA: 07:01:49.69, actual RA: 07:01:48.00 +19:20:48.003 SyncToCoordinates OK Slewed to start position OK. DEC: 26:54:00.00 +19:20:49.265 SyncToCoordinates INFO Synced to sync position within 25.3 arc seconds of expected RA: 06:57:49.69, actual RA: 06:57:48.00 +19:20:49.282 SyncToCoordinates OK Synced to sync position OK. DEC: 25:54:00.00 +19:20:49.301 SyncToCoordinates OK The TargetRightAscension property 06:57:49.69 matches the expected RA OK. +19:20:49.316 SyncToCoordinates OK The TargetDeclination property 25:54:00.00 matches the expected Declination OK. +19:21:05.202 SyncToCoordinates INFO Slewed back to start position within 25.3 arc seconds of expected RA: 07:01:49.69, actual RA: 07:01:48.00 +19:21:05.217 SyncToCoordinates OK Slewed back to start position OK. DEC: 26:54:00.00 +19:21:06.337 SyncToCoordinates INFO Synced to reversed sync position within 40.3 arc seconds of expected RA: 07:05:49.69, actual RA: 07:05:47.00 +19:21:06.353 SyncToCoordinates OK Synced to reversed sync position OK. DEC: 27:54:00.00 +19:21:22.444 SyncToCoordinates INFO Slewed back to start position within 25.3 arc seconds of expected RA: 07:01:49.69, actual RA: 07:01:48.00 +19:21:22.459 SyncToCoordinates OK Slewed back to start position OK. DEC: 26:54:00.00 +19:21:22.502 SyncToCoordinates (Bad L) OK Correctly rejected bad RA coordinate: -01:00:00.00 +19:21:22.620 SyncToCoordinates (Bad L) OK Correctly rejected bad Dec coordinate: -100:00:00.00 +19:21:22.682 SyncToCoordinates (Bad H) OK Correctly rejected bad RA coordinate: 25:00:00.00 +19:21:23.379 SyncToCoordinates (Bad H) OK Correctly rejected bad Dec coordinate: 100:00:00.00 +19:21:23.439 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension < 0 hours +19:21:23.454 TargetRightAscension Write OK Invalid Value exception generated as expected on set TargetRightAscension > 24 hours +19:21:23.670 TargetRightAscension Write OK Legal value 06:02:46.50 HH:MM:SS written successfully +19:21:23.709 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees +19:21:23.724 TargetDeclination Write OK Invalid Value exception generated as expected on set TargetDeclination < -90 degrees +19:21:23.918 TargetDeclination Write OK Legal value 01:00:00.00 DD:MM:SS written successfully +19:21:44.377 SlewToTarget INFO Slewed within 44.9 arc seconds of expected RA: 07:02:46.99, actual RA: 07:02:44.00 +19:21:44.392 SlewToTarget OK Slewed OK. DEC: 03:00:00.00 +19:21:44.421 SlewToTarget OK The TargetRightAscension property 07:02:46.99 matches the expected RA OK. +19:21:44.435 SlewToTarget OK The TargetDeclination property 03:00:00.00 matches the expected Declination OK. +19:21:44.476 SlewToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00 +19:21:44.565 SlewToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00 +19:21:44.627 SlewToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00 +19:21:44.713 SlewToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00 +19:22:05.987 SlewToTargetAsync INFO Slewed within 58.0 arc seconds of expected RA: 06:03:07.87, actual RA: 06:03:04.00 +19:22:06.002 SlewToTargetAsync OK Slewed OK. DEC: 04:00:00.00 +19:22:06.016 SlewToTargetAsync OK The TargetRightAscension property 06:03:07.87 matches the expected RA OK. +19:22:06.030 SlewToTargetAsync OK The TargetDeclination property 04:00:00.00 matches the expected Declination OK. +19:22:06.071 SlewToTargetAsync (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00 +19:22:06.134 SlewToTargetAsync (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00 +19:22:06.200 SlewToTargetAsync (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00 +19:22:06.281 SlewToTargetAsync (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00 +19:22:06.341 DestinationSideOfPier Test skipped as AligmentMode is not German Polar +19:22:36.522 SlewToAltAz INFO Slewed to within 00:11:23.03 DD:MM:SS of expected Azimuth: 150:00:00.00 +19:22:36.539 SlewToAltAz INFO Slewed to within 00:02:05.06 DD:MM:SS of expected Altitude: 50:00:00.00 +19:22:36.581 SlewToAltAz (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00 +19:22:36.599 SlewToAltAz (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00 +19:22:36.662 SlewToAltAz (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00 +19:22:36.681 SlewToAltAz (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00 +19:22:57.713 SlewToAltAzAsync INFO Slewed to within 00:09:16.99 DD:MM:SS of expected Azimuth: 155:00:00.00 +19:22:57.728 SlewToAltAzAsync INFO Slewed to within 00:00:28.11 DD:MM:SS of expected Altitude: 55:00:00.00 +19:22:57.770 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Altitude coordinate: -100:00:00.00 +19:22:57.789 SlewToAltAzAsync (Bad L) OK Correctly rejected bad Azimuth coordinate: -10:00:00.00 +19:22:57.851 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Altitude coordinate: 100:00:00.00 +19:22:57.870 SlewToAltAzAsync (Bad H) OK Correctly rejected bad Azimuth coordinate: 370:00:00.00 +19:23:22.572 SyncToTarget OK Slewed to start position OK. RA: 07:04:21.38 +19:23:22.588 SyncToTarget OK Slewed to start position OK. DEC: 26:54:00.00 +19:23:24.332 SyncToTarget INFO Synced to sync position within 20.7 arc seconds of expected RA: 07:00:21.38, actual RA: 07:00:20.00 +19:23:24.347 SyncToTarget OK Synced to sync position OK. DEC: 25:54:00.00 +19:23:42.234 SyncToTarget INFO Slewed back to start position within 20.7 arc seconds of expected RA: 07:04:21.38, actual RA: 07:04:20.00 +19:23:42.250 SyncToTarget OK Slewed back to start position OK. DEC: 26:54:00.00 +19:23:43.530 SyncToTarget INFO Synced to reversed sync position within 35.7 arc seconds of expected RA: 07:08:21.38, actual RA: 07:08:19.00 +19:23:43.546 SyncToTarget OK Synced to reversed sync position OK. DEC: 27:54:00.00 +19:23:59.445 SyncToTarget INFO Slewed back to start position within 20.7 arc seconds of expected RA: 07:04:21.38, actual RA: 07:04:20.00 +19:23:59.460 SyncToTarget OK Slewed back to start position OK. DEC: 26:54:00.00 +19:23:59.500 SyncToTarget (Bad L) OK Telescope.TargetRA correctly rejected bad RA coordinate: -01:00:00.00 +19:23:59.656 SyncToTarget (Bad L) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: -100:00:00.00 +19:23:59.716 SyncToTarget (Bad H) OK Telescope.TargetRA correctly rejected bad RA coordinate: 25:00:00.00 +19:23:59.997 SyncToTarget (Bad H) OK Telescope.TargetDeclination correctly rejected bad Dec coordinate: 100:00:00.00 +19:24:02.242 SyncToAltAz OK CanSyncAltAz is False and a MethodNotImplementedException exception was generated as expected + +SideOfPier Model Tests +19:24:02.320 SideOfPier Model Tests INFO Tests skipped because this driver does Not support SideOfPier Read + +Post-run Checks +19:24:02.417 Mount Safety OK Tracking stopped to protect your mount. + +Conformance test complete + +No errors, warnings or issues found: your driver passes ASCOM validation!! + +Driver Hash Value: D41F95CA4DB76F4C2F9742455087821EB82915774F9D97EDF4DAB66B4D74932295DC665B8B90C3FC94AB1B5FA5BAC8009D715FF21C0620CB5F40D8DACFAE67D6 diff --git a/ASCOM.MeadeGeneric.focuser.Validation.txt b/ASCOM.MeadeGeneric.focuser.Validation.txt new file mode 100644 index 0000000..8942c01 --- /dev/null +++ b/ASCOM.MeadeGeneric.focuser.Validation.txt @@ -0,0 +1,68 @@ +Conform Report Hash (V1): B869A2DCAA7DACEB47895197B4418080943EDDCC3D1A49E9DDE97B9B22DF8F7B83DC95D595972C4345F53236103CE33045056F1A6BB068B32F72C080377A2FC1 + + +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 "Invalid Value 3" 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. + +19:18:30.690 Driver Access Checks OK +19:18:31.351 AccessChecks OK Successfully created driver using late binding +19:18:31.676 AccessChecks OK Successfully connected using late binding +19:18:31.682 AccessChecks INFO The driver is a .NET object +19:18:31.687 AccessChecks INFO The AssemblyQualifiedName is: ASCOM.Meade.net.Focuser, ASCOM.Meade.net.Focuser, Version=0.4.0.0, Culture=n +19:18:31.692 AccessChecks INFO The driver implements interface: ASCOM.DeviceInterface.IFocuserV3 +19:18:32.341 AccessChecks INFO Device does not expose IFocuser interface +19:18:32.405 AccessChecks INFO Device does not expose IFocuserV2 interface +19:18:32.675 AccessChecks INFO Device exposes IFocuserV3 interface +19:18:32.793 AccessChecks OK Successfully created driver using driver access toolkit +19:18:32.967 AccessChecks OK Successfully connected using driver access toolkit +19:18:33.031 AccessChecks OK Successfully disconnected using driver access toolkit + +Conform is using ASCOM.DriverAccess.Focuser to get a Focuser object +19:18:33.103 ConformanceCheck OK Driver instance created successfully +19:18:33.621 ConformanceCheck OK Connected OK + +Common Driver Methods +19:18:33.661 InterfaceVersion OK 3 +19:18:33.691 Connected OK True +19:18:33.719 Description OK Meade Generic +19:18:33.749 DriverInfo OK Information about the driver itself. Version: 0.4 +19:18:33.778 DriverVersion OK 0.4 +19:18:33.807 Name OK Meade Generic +19:18:33.836 CommandXXX INFO Tests skipped +19:18:33.842 Action INFO Conform cannot test the Action method +19:18:33.850 SupportedActions OK Driver returned an empty action list + +Properties +19:18:33.962 Absolute OK False +19:18:33.970 IsMoving OK False +19:18:33.977 MaxStep OK 7000 +19:18:33.985 MaxIncrement OK 7000 +19:18:33.994 Position OK Position must not be implemented for a relative focuser and a PropertyNotImplementedException exception was generated as expected +19:18:34.003 StepSize OK Optional member threw a PropertyNotImplementedException exception. +19:18:34.011 TempCompAvailable OK False +19:18:34.019 TempComp Read OK False +19:18:34.027 TempComp Write OK Temperature compensation is not available and a PropertyNotImplementedException exception was generated as expected +19:18:34.036 Temperature OK Optional member threw a PropertyNotImplementedException exception. + +Methods +19:18:34.085 Halt OK Focuser halted OK +19:18:34.096 Move - TempComp False Moving by: 700 +19:18:34.808 Move - TempComp False Asynchronous move found +19:18:34.818 Move - TempComp False OK Relative move OK +19:18:34.830 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: 1816E24C06CF16B84021B2B07D4629C3E46DCC5E738D9BACBD524BE5A969BCB07AB3704AB754BC5AA54F5A76F77721D6F7D756AC16DC0AC7DACDC9EA900FA3C8 diff --git a/AstroMath.UnitTests/AstroMath.UnitTests.csproj b/AstroMath.UnitTests/AstroMath.UnitTests.csproj new file mode 100644 index 0000000..cf9d11f --- /dev/null +++ b/AstroMath.UnitTests/AstroMath.UnitTests.csproj @@ -0,0 +1,101 @@ + + + + + + Debug + AnyCPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95} + Library + Properties + AstroMath.UnitTests + AstroMath.UnitTests + v4.7.2 + 512 + true + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + AnyCPU + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll + + + ..\packages\Moq.4.10.1\lib\net45\Moq.dll + + + ..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll + + + + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + + + + + {64308775-bd4a-469c-bcab-3ed830b811af} + Meade.net.Telescope + + + + + + + + + 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}. + + + + \ No newline at end of file diff --git a/AstroMath.UnitTests/AstroMathsUnitTests.cs b/AstroMath.UnitTests/AstroMathsUnitTests.cs new file mode 100644 index 0000000..cdbe4ad --- /dev/null +++ b/AstroMath.UnitTests/AstroMathsUnitTests.cs @@ -0,0 +1,172 @@ +using System; +using ASCOM.Meade.net; +using NUnit.Framework; + +namespace AstroMath.UnitTests +{ + [TestFixture] + public class AstroMathsUnitTests + { + private AstroMaths _astroMath; + + [SetUp] + public void Setup() + { + _astroMath = new AstroMaths(); + } + + [Test] + public void DegreesToRadians() + { + var radians = _astroMath.DegreesToRadians(90); + Assert.That(radians, Is.EqualTo(1.5707963267948966)); + } + + [Test] + public void RadiansToDegrees() + { + var degrees = _astroMath.RadiansToDegrees(1.5707963267948966); + Assert.That(degrees, Is.EqualTo(90)); + } + + + [Test] + public void DateTimeToDecimalHours_book() + { + DateTime dateTime = new DateTime(2019, 05, 18, 18, 31, 27, DateTimeKind.Utc); + var decimalHours = _astroMath.DateTimeToDecimalHours(dateTime); + + Assert.That(decimalHours, Is.EqualTo(18.524166666666666)); + } + + [Test] + public void DateTimeToDecimalHours() + { + DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc); + var decimalHours = _astroMath.DateTimeToDecimalHours(dateTime); + + Assert.That(decimalHours, Is.EqualTo(22.4375)); + } + + [Test] + public void UTtoGST_book() + { + DateTime dateTime = new DateTime(1980, 04, 22, 14, 36, 51, 670, DateTimeKind.Utc); + double gst = _astroMath.UTtoGST(dateTime); + + Assert.That(gst, Is.EqualTo(4.667932706211154)); + } + + [Test] + public void UTtoGST() + { + DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc); + double gst = _astroMath.UTtoGST(dateTime); + + Assert.That(gst, Is.EqualTo(14.191879687876451)); + } + + [Test] + public void GSTtoLST_book() + { + double gst = 4.668119; + var longitude = -64; + var lst = _astroMath.GSTtoLST(gst, longitude); + Assert.That(lst, Is.EqualTo(0.4014523333333333)); + } + + [Test] + public void GSTtoLST() + { + double gst = 14.257589512545053; + var longitude = -1.7833333333333332; + var lst = _astroMath.GSTtoLST(gst, longitude); + Assert.That(lst, Is.EqualTo(14.138700623656163)); + } + + [Test] + public void RightAscensionToHourAngle_book() + { + DateTime dateTime = new DateTime(1980, 04, 22, 18, 36, 51,670, DateTimeKind.Utc); + var longitude = -64; + var rightAscension = 18.539166666666667;//18:32'21" + + //var declination = 30.0019444444444 + var hourAngle = _astroMath.RightAscensionToHourAngle(dateTime, longitude, rightAscension); + Assert.That(hourAngle, Is.EqualTo(9.8730510088778161)); + } + + [Test] + public void RightAscensionToHourAngle() + { + DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc); + var longitude = -1.7833333333333332; + var rightAscension = 4.15361111111111; + + var hourAngle = _astroMath.RightAscensionToHourAngle(dateTime, longitude, rightAscension); + Assert.That(hourAngle, Is.EqualTo(9.9193796878764502)); + } + + + [Test] + public void ConvertEqToHoz_book() + { + var latitude = 52.0; + + EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates(); + equatorialCoordinates.RightAscension = 5.862222222222222;//5 51' 44" + equatorialCoordinates.Declination = 23.21944444444444;//23 13' 10" + + var hourAngle = 5.682222; + + var altAz = _astroMath.ConvertEqToHoz(hourAngle, latitude, equatorialCoordinates); + + Assert.That(altAz.Altitude, Is.EqualTo(20.958562421092779)); + Assert.That(altAz.Azimuth, Is.EqualTo(281.2728706962269)); + } + + [Test] + public void ConvertEqToHoz() + { + DateTime dateTime = new DateTime(2019, 05, 18, 22, 26, 15, DateTimeKind.Utc); + var longitude = -1.7833333333333332; + var latitude = 52.0; + EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates(); + equatorialCoordinates.RightAscension = 4.15361111111111; + equatorialCoordinates.Declination = 30.0019444444444; + + var hourAngle = _astroMath.RightAscensionToHourAngle(dateTime, longitude, equatorialCoordinates.RightAscension); + var altaz = _astroMath.ConvertEqToHoz(hourAngle, latitude, equatorialCoordinates); + + Assert.That(altaz.Altitude, Is.EqualTo(-3.5534402923925872)); + Assert.That(altaz.Azimuth, Is.EqualTo(333.2819484462679)); + } + + //[Test] + //public void ConvertHozToEq_book() + //{ + // HorizonCoordinates hc = new HorizonCoordinates(); + // hc.Altitude = 19.33434444; + // hc.Azimuth = 283.271028; + // var lat = 52; + // var raDec = _astroMath.ConvertHozToEq(lat, hc); + + // Assert.That(raDec.RightAscension, Is.EqualTo(5.8622222973512992)); + // Assert.That(raDec.Declination, Is.EqualTo(23.219444300552407)); + //} + + + //[Test] + //public void ConvertHozToEq() + //{ + // HorizonCoordinates hc = new HorizonCoordinates(); + // hc.Altitude = 50; + // hc.Azimuth = 150; + // var lat = 53.5; + // var raDec = _astroMath.ConvertHozToEq(lat, hc); + + // Assert.That(raDec.RightAscension, Is.EqualTo(22.69408899548845)); + // Assert.That(raDec.Declination, Is.EqualTo(16.539114529888948)); + //} + } +} diff --git a/MeadeAutostar497.UnitTests/Properties/AssemblyInfo.cs b/AstroMath.UnitTests/Properties/AssemblyInfo.cs similarity index 87% rename from MeadeAutostar497.UnitTests/Properties/AssemblyInfo.cs rename to AstroMath.UnitTests/Properties/AssemblyInfo.cs index ef108f2..11e0a8b 100644 --- a/MeadeAutostar497.UnitTests/Properties/AssemblyInfo.cs +++ b/AstroMath.UnitTests/Properties/AssemblyInfo.cs @@ -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("MeadeAutostar497.UnitTests")] +[assembly: AssemblyTitle("AstroMath.UnitTests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MeadeAutostar497.UnitTests")] +[assembly: AssemblyProduct("AstroMath.UnitTests")] [assembly: AssemblyCopyright("Copyright © 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -20,7 +20,7 @@ using System.Runtime.InteropServices; [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("9638da27-77c7-4b30-a730-6e7159a4a09f")] +[assembly: Guid("ad4959dd-33d7-4c3f-8db0-7361d8e74a95")] // Version information for an assembly consists of the following four values: // diff --git a/AstroMath.UnitTests/packages.config b/AstroMath.UnitTests/packages.config new file mode 100644 index 0000000..22d8680 --- /dev/null +++ b/AstroMath.UnitTests/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ConformanceResult.txt b/ConformanceResult.txt deleted file mode 100644 index beecf54..0000000 --- a/ConformanceResult.txt +++ /dev/null @@ -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 diff --git a/FocuserTestConsole/FocuserTestConsole.csproj b/FocuserTestConsole/FocuserTestConsole.csproj new file mode 100644 index 0000000..207d96f --- /dev/null +++ b/FocuserTestConsole/FocuserTestConsole.csproj @@ -0,0 +1,64 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49} + Exe + Properties + ASCOM.MeadeGeneric + ASCOM.MeadeGeneric.Test + v4.7.1 + + + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FocuserTestConsole/Program.cs b/FocuserTestConsole/Program.cs new file mode 100644 index 0000000..af644c8 --- /dev/null +++ b/FocuserTestConsole/Program.cs @@ -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(); + } + } +} diff --git a/FocuserTestConsole/Properties/AssemblyInfo.cs b/FocuserTestConsole/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5100d4b --- /dev/null +++ b/FocuserTestConsole/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MeadeGeneric Test Application")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[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 +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c7008f94-e3b9-4481-b720-3b56557860c6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("6.4.0.0")] +[assembly: AssemblyFileVersion("6.4.0.0")] diff --git a/TestConsole/app.config b/FocuserTestConsole/app.config similarity index 71% rename from TestConsole/app.config rename to FocuserTestConsole/app.config index 8935d57..70dcdba 100644 --- a/TestConsole/app.config +++ b/FocuserTestConsole/app.config @@ -1,3 +1,3 @@ - + diff --git a/Meade.net.Setup/AscomFocuserDriver.wxs b/Meade.net.Setup/AscomFocuserDriver.wxs new file mode 100644 index 0000000..67ae64a --- /dev/null +++ b/Meade.net.Setup/AscomFocuserDriver.wxs @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/AscomLocalServer.wxs b/Meade.net.Setup/AscomLocalServer.wxs new file mode 100644 index 0000000..ccfc9c4 --- /dev/null +++ b/Meade.net.Setup/AscomLocalServer.wxs @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/AscomTelescopeDriver.wxs b/Meade.net.Setup/AscomTelescopeDriver.wxs new file mode 100644 index 0000000..86379d8 --- /dev/null +++ b/Meade.net.Setup/AscomTelescopeDriver.wxs @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/Config.wxi b/Meade.net.Setup/Config.wxi new file mode 100644 index 0000000..ec90b40 --- /dev/null +++ b/Meade.net.Setup/Config.wxi @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/Directories.wxs b/Meade.net.Setup/Directories.wxs new file mode 100644 index 0000000..435128a --- /dev/null +++ b/Meade.net.Setup/Directories.wxs @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/FeatureTree.wxs b/Meade.net.Setup/FeatureTree.wxs new file mode 100644 index 0000000..245385e --- /dev/null +++ b/Meade.net.Setup/FeatureTree.wxs @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/InstallationUI.wxs b/Meade.net.Setup/InstallationUI.wxs new file mode 100644 index 0000000..a52ab86 --- /dev/null +++ b/Meade.net.Setup/InstallationUI.wxs @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + "1"]]> + + 1 + + NOT Installed + Installed AND PATCH + + 1 + LicenseAccepted = "1" + + 1 + 1 + NOT WIXUI_DONTVALIDATEPATH + "1"]]> + WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1" + 1 + 1 + + NOT Installed + Installed AND NOT PATCH + Installed AND PATCH + + 1 + + 1 + 1 + 1 + + + + + + + diff --git a/Meade.net.Setup/Meade.net.Setup.wixproj b/Meade.net.Setup/Meade.net.Setup.wixproj new file mode 100644 index 0000000..9f6c619 --- /dev/null +++ b/Meade.net.Setup/Meade.net.Setup.wixproj @@ -0,0 +1,91 @@ + + + + Debug + x86 + 3.10 + 8eeb5c25-8394-4257-8e57-cded47cb6f1b + 2.0 + Meade.net.Setup + Package + + + bin\$(Platform)\$(Configuration)\ + obj\$(Configuration)\ + Debug + + + bin\$(Configuration)\ + obj\$(Configuration)\ + + + Debug + bin\$(Configuration)\$(Platform)\ + obj\$(Platform)\$(Configuration)\ + + + bin\$(Platform)\$(Configuration)\ + obj\$(Platform)\$(Configuration)\ + + + + + + + + + + + + + $(WixExtDir)\WixUIExtension.dll + WixUIExtension + + + $(WixExtDir)\WixNetFxExtension.dll + WixNetFxExtension + + + + + + + + Meade.net.focuser + {a97e3aec-f11d-49da-b259-de99da813a86} + True + True + Binaries;Content;Satellites + INSTALLFOLDER + + + Meade.net.Telescope + {64308775-bd4a-469c-bcab-3ed830b811af} + True + True + Binaries;Content;Satellites + INSTALLFOLDER + + + Meade.net + {3689a2cb-94c5-4012-a5cf-7e7d1dd27143} + True + True + Binaries;Content;Satellites + INSTALLFOLDER + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.Setup/Product.wxs b/Meade.net.Setup/Product.wxs new file mode 100644 index 0000000..73b314e --- /dev/null +++ b/Meade.net.Setup/Product.wxs @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + ="#461308"]]> + + + + + + + + + + + + + + diff --git a/MeadeAutostar497/ASCOM.ico b/Meade.net.Telescope/ASCOM.ico similarity index 100% rename from MeadeAutostar497/ASCOM.ico rename to Meade.net.Telescope/ASCOM.ico diff --git a/MeadeAutostar497/ASCOM.png b/Meade.net.Telescope/ASCOM.png similarity index 100% rename from MeadeAutostar497/ASCOM.png rename to Meade.net.Telescope/ASCOM.png diff --git a/MeadeAutostar497/ASCOMDriverTemplate.snk b/Meade.net.Telescope/ASCOMDriverTemplate.snk similarity index 100% rename from MeadeAutostar497/ASCOMDriverTemplate.snk rename to Meade.net.Telescope/ASCOMDriverTemplate.snk diff --git a/Meade.net.Telescope/AstroMaths.cs b/Meade.net.Telescope/AstroMaths.cs new file mode 100644 index 0000000..7123eaa --- /dev/null +++ b/Meade.net.Telescope/AstroMaths.cs @@ -0,0 +1,212 @@ +using System; +using ASCOM.Utilities; + +namespace ASCOM.Meade.net +{ + public class EquatorialCoordinates + { + public double RightAscension { get; set; } + public double Declination { get; set; } + } + + public class HorizonCoordinates + { + public double Altitude { get; set; } + public double Azimuth { get; set; } + } + + + public class AltitudeData + { + public DateTime UtcDateTime { get; set; } + public double SiteLatitude { get; set; } + public double SiteLongitude { get; set; } + public EquatorialCoordinates equatorialCoordinates { get; set; } + } + + public class AstroMaths + { + + //returns the decimal hour angle for given right ascension on a given datetime for a given logitude. + public double RightAscensionToHourAngle(DateTime utcDateTime, double longitude, double rightAscension) + { + var ut = DateTimeToDecimalHours( utcDateTime); + var gst = UTtoGST( utcDateTime); + var lst = GSTtoLST( gst, longitude); + var raHours = rightAscension; + var h1 = lst - raHours; + var h = h1; + + if (h < 0) + h = h + 24; + + return h; + } + + public double HourAngleToRightAscension(DateTime utcDateTime, double longitude, double hourAngle ) + { + var gst = UTtoGST(utcDateTime); + var lst = GSTtoLST( gst, longitude); + var raHours = hourAngle; + var h1 = lst - raHours; + var h = h1; + if (h1 < 0) + { + h += 24; + } + + return h; + } + + public EquatorialCoordinates ConvertHozToEq( DateTime utcDateTime, double latitude, double longitude, HorizonCoordinates altAz) + { + var az = DegreesToRadians(altAz.Azimuth); + var alt = DegreesToRadians(altAz.Altitude); + var lat = DegreesToRadians(latitude); + + var sinDec = Math.Sin(alt) * Math.Sin(lat) + Math.Cos(alt) * Math.Cos(lat) * Math.Cos(az); + var dec = RadiansToDegrees(Math.Asin(sinDec)); + + var y = -Math.Cos(alt) * Math.Cos(lat) * Math.Sin(az); + var x = Math.Sin(alt) - Math.Sin(lat) * sinDec; + var upperA = Math.Atan2(y,x); + var upperB = RadiansToDegrees(upperA); + + var ha = upperB; + + if (upperB < 0) + { + ha += 360; + } + + ha = ha / 15; + + EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates + { + RightAscension = HourAngleToRightAscension( utcDateTime, longitude, ha ), + Declination = dec + }; + + return equatorialCoordinates; + } + + public HorizonCoordinates ConvertEqToHoz(double hourAngle, double latitude, EquatorialCoordinates raDec) + { + var h = hourAngle * 15; + var h1 = DegreesToRadians(h); + var d = DegreesToRadians(raDec.Declination); + var lat = DegreesToRadians(latitude); + var sinA = Math.Sin(d) * Math.Sin(lat) + Math.Cos(d) * Math.Cos(lat) * Math.Cos(h1); + + var y = -Math.Cos(d) * Math.Cos(lat) * Math.Sin(h1); + var x = Math.Sin(d) - Math.Sin(lat) * sinA; + var upperA = Math.Atan2(y, x); + var upperB = RadiansToDegrees(upperA); + + var horizonCoordinates = new HorizonCoordinates(); + horizonCoordinates.Altitude = RadiansToDegrees(Math.Asin(sinA)); + + horizonCoordinates.Azimuth = upperB; + + if (upperB < 0) + { + horizonCoordinates.Azimuth = 360 + horizonCoordinates.Azimuth; + } + + return horizonCoordinates; + } + + + //todo convert to extension method + public double DegreesToRadians(double degrees) + { + return (Math.PI / 180) * degrees; + } + + //todo convert to extension method + public double RadiansToDegrees(double radians) + { + double degrees = (180 / Math.PI) * radians; + return (degrees); + } + + //todo convert to extension method + public double DateTimeToDecimalHours( DateTime utcDateTime) + { + double sec = utcDateTime.Second; + double min = utcDateTime.Minute; + double hour = utcDateTime.Hour; + + var a = Math.Abs(sec) / 60; + var b = (Math.Abs(min) + a) / 60; + var c = Math.Abs(hour) + b; + + var d = c; + + if ((hour < 0) || (min < 0) || (sec < 0)) + d = -c; + + return d; + } + + //todo convert to extension method + public double UTtoGST(DateTime utcDateTime) + { + Util util = new Util(); + + var jd = util.DateUTCToJulian(utcDateTime) - 0.5; + if ((jd % 1) <= 0.5 ) + jd = Math.Floor( jd ); + else + jd = Math.Floor( jd ) + 0.5; + + var s = jd - 2451545.0; + var t = s / 36525.0; + var t0 = 6.697374558 + (2400.051336 * t ) +(0.000025862 * (t * t) ); + + while (t0 < 0) + { + t0 += 24; + } + + while (t0 >= 24) + { + t0 -= 24; + } + + var ut = DateTimeToDecimalHours(utcDateTime); + var a = ut * 1.002737909; + + var t1 = t0 + a; + + while (t1 < 0) + { + t1 += 24; + } + + while (t1 >= 24) + { + t1 -= 24; + } + + return t1; + } + + public double GSTtoLST(double gst, double longitude) + { + var l = longitude/ 15; + + var lst = gst + l; + while (lst < 0 ) + { + lst += 24; + } + while (lst >= 24) + { + lst -= 24; + } + + return lst; + } + } +} diff --git a/MeadeAutostar497/MeadeAutostar497.csproj b/Meade.net.Telescope/Meade.net.Telescope.csproj similarity index 81% rename from MeadeAutostar497/MeadeAutostar497.csproj rename to Meade.net.Telescope/Meade.net.Telescope.csproj index 5109500..3fa86d7 100644 --- a/MeadeAutostar497/MeadeAutostar497.csproj +++ b/Meade.net.Telescope/Meade.net.Telescope.csproj @@ -8,14 +8,14 @@ {64308775-BD4A-469C-BCAB-3ED830B811AF} Library Properties - ASCOM.MeadeAutostar497 - ASCOM.MeadeAutostar497.Telescope + ASCOM.Meade.net + ASCOM.Meade.net.Telescope 3.5 - v4.6.2 + v4.7.1 ASCOM.ico true ASCOMDriverTemplate.snk @@ -41,18 +41,18 @@ true full false - bin\Debug\ + ..\bin\Debug\ DEBUG;TRACE prompt 4 true - x64 + AnyCPU false pdbonly true - bin\Release\ + ..\bin\Release\ TRACE prompt 4 @@ -60,6 +60,9 @@ false false + + ..\bin\Release\ + @@ -69,7 +72,6 @@ - @@ -78,23 +80,13 @@ - - - - - - - - - - - - + + True @@ -106,13 +98,7 @@ True Settings.settings - - - Form - - - SetupDialogForm.cs - + @@ -120,10 +106,6 @@ ResXFileCodeGenerator Resources.Designer.cs - - SetupDialogForm.cs - Designer - @@ -154,7 +136,12 @@ true - + + + {3689a2cb-94c5-4012-a5cf-7e7d1dd27143} + Meade.net + + diff --git a/MeadeAutostar497/Properties/AssemblyInfo.cs b/Meade.net.Telescope/Properties/AssemblyInfo.cs similarity index 75% rename from MeadeAutostar497/Properties/AssemblyInfo.cs rename to Meade.net.Telescope/Properties/AssemblyInfo.cs index 495f3d8..8e8df09 100644 --- a/MeadeAutostar497/Properties/AssemblyInfo.cs +++ b/Meade.net.Telescope/Properties/AssemblyInfo.cs @@ -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.5.0.0")] +[assembly: AssemblyFileVersion("0.5.0.0")] diff --git a/MeadeAutostar497/Properties/Resources.Designer.cs b/Meade.net.Telescope/Properties/Resources.Designer.cs similarity index 95% rename from MeadeAutostar497/Properties/Resources.Designer.cs rename to Meade.net.Telescope/Properties/Resources.Designer.cs index 9d71803..67f90ec 100644 --- a/MeadeAutostar497/Properties/Resources.Designer.cs +++ b/Meade.net.Telescope/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -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; diff --git a/MeadeAutostar497/Properties/Resources.resx b/Meade.net.Telescope/Properties/Resources.resx similarity index 100% rename from MeadeAutostar497/Properties/Resources.resx rename to Meade.net.Telescope/Properties/Resources.resx diff --git a/MeadeAutostar497/Properties/Settings.Designer.cs b/Meade.net.Telescope/Properties/Settings.Designer.cs similarity index 95% rename from MeadeAutostar497/Properties/Settings.Designer.cs rename to Meade.net.Telescope/Properties/Settings.Designer.cs index a2bb372..f1cc444 100644 --- a/MeadeAutostar497/Properties/Settings.Designer.cs +++ b/Meade.net.Telescope/Properties/Settings.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace ASCOM.MeadeAutostar497.Properties { +namespace ASCOM.Meade.net.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] diff --git a/MeadeAutostar497/Properties/Settings.settings b/Meade.net.Telescope/Properties/Settings.settings similarity index 100% rename from MeadeAutostar497/Properties/Settings.settings rename to Meade.net.Telescope/Properties/Settings.settings diff --git a/MeadeAutostar497/AscomClasses/Rates.cs b/Meade.net.Telescope/Rates.cs similarity index 93% rename from MeadeAutostar497/AscomClasses/Rates.cs rename to Meade.net.Telescope/Rates.cs index bd29429..2230bf7 100644 --- a/MeadeAutostar497/AscomClasses/Rates.cs +++ b/Meade.net.Telescope/Rates.cs @@ -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 } diff --git a/MeadeAutostar497/ReadMe.htm b/Meade.net.Telescope/ReadMe.htm similarity index 100% rename from MeadeAutostar497/ReadMe.htm rename to Meade.net.Telescope/ReadMe.htm diff --git a/MeadeAutostar497/Resources/ASCOM.bmp b/Meade.net.Telescope/Resources/ASCOM.bmp similarity index 100% rename from MeadeAutostar497/Resources/ASCOM.bmp rename to Meade.net.Telescope/Resources/ASCOM.bmp diff --git a/MeadeAutostar497/StringExtensions.cs b/Meade.net.Telescope/StringExtensions.cs similarity index 51% rename from MeadeAutostar497/StringExtensions.cs rename to Meade.net.Telescope/StringExtensions.cs index e6a2cd1..85341c5 100644 --- a/MeadeAutostar497/StringExtensions.cs +++ b/Meade.net.Telescope/StringExtensions.cs @@ -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); } } -} +} \ No newline at end of file diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs new file mode 100644 index 0000000..275329a --- /dev/null +++ b/Meade.net.Telescope/Telescope.cs @@ -0,0 +1,1925 @@ +//tabs=4 +// -------------------------------------------------------------------------------- +// TODO fill in this information for your driver, then remove this line! +// +// ASCOM Telescope 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 Telescope interface version: +// Author: (XXX) Your N. 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 Telescope + +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; + +namespace ASCOM.Meade.net +{ + // + // Your driver's DeviceID is ASCOM.Meade.net.Telescope + // + // The Guid attribute sets the CLSID for ASCOM.Meade.net.Telescope + // 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. + // + + /// + /// ASCOM Telescope Driver for Meade.net. + /// + [Guid("d9fd4b3e-c4f1-48ac-a16f-d02eef30d86f")] + [ProgId("ASCOM.MeadeGeneric.Telescope")] + [ServedClassName("Meade.net Telescope")] + [ClassInterface(ClassInterfaceType.None)] + public class Telescope : ReferenceCountedObjectBase, ITelescopeV3 + { + /// + /// ASCOM DeviceID (COM ProgID) for this driver. + /// The DeviceID is used by ASCOM applications to load the driver at runtime. + /// + //internal static string driverID = "ASCOM.Meade.net.Telescope"; + internal static string driverID = Marshal.GenerateProgIdForType(MethodBase.GetCurrentMethod().DeclaringType); + + // TODO Change the descriptive string for your driver then remove this line + /// + /// Driver description that displays in the ASCOM Chooser. + /// + 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 + + /// + /// Private variable to hold the connected state + /// + private bool _connectedState; + + /// + /// Private variable to hold an ASCOM Utilities object + /// + private Util utilities; + + /// + /// Private variable to hold an ASCOM AstroUtilities object to provide the Range method + /// + private AstroUtils astroUtilities; + + private readonly AstroMaths _astroMaths; + + /// + /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify) + /// + internal static TraceLogger tl; + + /// + /// Initializes a new instance of the class. + /// Must be public for COM registration. + /// + public Telescope() + { + tl = new TraceLogger("", "Meade.net.Telescope"); + ReadProfile(); // Read device configuration from the ASCOM Profile store + + tl.LogMessage("Telescope", "Starting initialisation"); + + _connectedState = false; // Initialise connected to false + utilities = new Util(); //Initialise util object + astroUtilities = new AstroUtils(); // Initialise astro utilities object + + //TODO: Implement your additional construction here + _astroMaths = new AstroMaths(); + + tl.LogMessage("Telescope", "Completed initialisation"); + } + + + // + // PUBLIC COM INTERFACE ITelescopeV3 IMPLEMENTATION + // + + #region Common properties and methods. + + /// + /// 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! + /// + public void SetupDialog() + { + tl.LogMessage("SetupDialog", "Opening setup dialog"); + SharedResources.SetupDialog(); + ReadProfile(); + tl.LogMessage("SetupDialog", "complete"); + //// consider only showing the setup dialog if not connected + //// or call a different dialog if connected + //if (IsConnected) + // System.Windows.Forms.MessageBox.Show("Already connected, just press OK"); + + //using (SetupDialogForm F = new SetupDialogForm()) + //{ + // var result = F.ShowDialog(); + // if (result == System.Windows.Forms.DialogResult.OK) + // { + // WriteProfile(); // Persist device configuration values to the ASCOM Profile store + // } + //} + } + + 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); + try + { + SharedResources.Connect("Serial"); + try + { + SelectSite(1); + SetLongFormat(true); + + _connectedState = true; + } + catch (Exception) + { + SharedResources.Disconnect("Serial"); + throw; + } + } + catch (Exception ex) + { + LogMessage("Connected Set", "Error connecting to port {0} - {1}", comPort, ex.Message); + } + } + else + { + LogMessage("Connected Set", "Disconnecting from port {0}", comPort); + SharedResources.Disconnect("Serial"); + _connectedState = false; + } + } + } + + private void SetLongFormat(bool setLongFormat) + { + SharedResources.Lock(() => + { + var result = SharedResources.SendString(":GZ#"); + //:GZ# Get telescope azimuth + //Returns: DDD*MM#T or DDD*MMSS# + //The current telescope Azimuth depending on the selected precision. + + bool isLongFormat = result.Length > 6; + + if (isLongFormat != setLongFormat) + { + utilities.WaitForMilliseconds(500); + SharedResources.SendBlind(":U#"); + //:U# Toggle between low/hi precision positions + //Low - RA displays and messages HH:MM.T sDD*MM + //High - Dec / Az / El displays and messages HH:MM: SS sDD*MM:SS + // Returns Nothing + } + }); + } + + private void SelectSite(int site) + { + SharedResources.SendBlind($":W{site}#"); + //:W# + //Set current site to, an ASCII digit in the range 1..4 + //Returns: Nothing + } + + 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"; + + //var telescopeProduceName = SharedResources.SendString(":GVP#"); + ////:GVP# Get Telescope Product Name + ////Returns: # + + //var firmwareVersion = SharedResources.SendString(":GVN#"); + ////:GVN# Get Telescope Firmware Number + ////Returns: dd.d# + + //string name = $"{telescopeProduceName} - {firmwareVersion}"; + string name = driverDescription; + tl.LogMessage("Name Get", name); + return name; + } + } + + #endregion + + #region ITelescope Implementation + + public void AbortSlew() + { + CheckConnected("AbortSlew"); + + tl.LogMessage("AbortSlew", "Aborting slew"); + SharedResources.SendBlind(":Q#"); + //:Q# Halt all current slewing + //Returns:Nothing + } + + public AlignmentModes AlignmentMode + { + get + { + tl.LogMessage("AlignmentMode Get", "Getting alignmode"); + + CheckConnected("AlignmentMode Get"); + + const char ack = (char) 6; + + var alignmentString = SharedResources.SendChar(ack.ToString()); + //ACK <0x06> Query of alignment mounting mode. + //Returns: + //A If scope in AltAz Mode + //D If scope is currently in the Downloader[Autostar II & Autostar] + //L If scope in Land Mode + //P If scope in Polar Mode + + //todo implement GW Command + //var alignmentString = SerialPort.CommandTerminated(":GW#", "#"); + //:GW# Get Scope Alignment Status + //Returns: # + // where: + //mount: A - AzEl mounted, P - Equatorially mounted, G - german mounted equatorial + //tracking: T - tracking, N - not tracking + //alignment: 0 - needs alignment, 1 - one star aligned, 2 - two star aligned, 3 - three star aligned. + + AlignmentModes alignmentMode; + switch (alignmentString) + { + case "A": + alignmentMode = AlignmentModes.algAltAz; + break; + case "P": + alignmentMode = AlignmentModes.algPolar; + break; + case "G": + alignmentMode = AlignmentModes.algGermanPolar; + break; + default: + throw new InvalidValueException( + $"unknown alignment returned from telescope: {alignmentString}"); + } + + tl.LogMessage("AlignmentMode Get", $"alignmode = {alignmentMode}"); + return alignmentMode; + } + set + { + CheckConnected("AlignmentMode Set"); + + switch (value) + { + case AlignmentModes.algAltAz: + SharedResources.SendBlind(":AA#"); + //:AA# Sets telescope the AltAz alignment mode + //Returns: nothing + break; + case AlignmentModes.algPolar: + case AlignmentModes.algGermanPolar: + SharedResources.SendBlind(":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 double Altitude + { + get + { + CheckConnected("Altitude get"); + + var altAz = CalcAltAzFromTelescopeEqData(); + tl.LogMessage("Altitude", $"{altAz.Altitude}"); + return altAz.Altitude; + + ////todo firmware bug in 44Eg, :GA# is returning the dec, not the altitude! + //var result = SharedResources.SendString(":GA#"); + ////:GA# Get Telescope Altitude + ////Returns: sDD* MM# or sDD*MMSS# + ////The current scope altitude. The returned format depending on the current precision setting. + + //var alt = utilities.DMSToDegrees(result); + //tl.LogMessage("Altitude", $"{alt}"); + //return alt; + + //tl.LogMessage("Altitude Get", "Not implemented"); + //throw new ASCOM.PropertyNotImplementedException("Altitude", false); + } + } + + private HorizonCoordinates CalcAltAzFromTelescopeEqData() + { + var altitudeData = SharedResources.Lock(() => new AltitudeData + { + UtcDateTime = this.UTCDate, + SiteLongitude = this.SiteLongitude, + SiteLatitude = this.SiteLatitude, + equatorialCoordinates = new EquatorialCoordinates() + { + RightAscension = this.RightAscension, + Declination = this.Declination + } + }); + + double hourAngle = _astroMaths.RightAscensionToHourAngle(altitudeData.UtcDateTime, altitudeData.SiteLongitude, + altitudeData.equatorialCoordinates.RightAscension); + var altAz = _astroMaths.ConvertEqToHoz(hourAngle, altitudeData.SiteLatitude, altitudeData.equatorialCoordinates); + return altAz; + } + + public double ApertureArea + { + get + { + tl.LogMessage("ApertureArea Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("ApertureArea", false); + } + } + + public double ApertureDiameter + { + get + { + tl.LogMessage("ApertureDiameter Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("ApertureDiameter", false); + } + } + + public bool AtHome + { + get + { + tl.LogMessage("AtHome", "Get - " + false.ToString()); + return false; + } + } + + private bool _atPark = false; + + public bool AtPark + { + get + { + tl.LogMessage("AtPark", "Get - " + _atPark); + return _atPark; + } + private set { _atPark = value; } + } + + public IAxisRates AxisRates(TelescopeAxes Axis) + { + tl.LogMessage("AxisRates", "Get - " + Axis.ToString()); + return new AxisRates(Axis); + } + + public double Azimuth + { + get + { + CheckConnected("Azimuth get"); + + //var result = SharedResources.SendString(":GZ#"); + //:GZ# Get telescope azimuth + //Returns: DDD*MM#T or DDD*MMSS# + //The current telescope Azimuth depending on the selected precision. + + //double az = utilities.DMSToDegrees(result); + + //tl.LogMessage("Azimuth Get", $"{az}"); + //return az; + + var altAz = CalcAltAzFromTelescopeEqData(); + tl.LogMessage("Azimuth Get", $"{altAz.Azimuth}"); + return altAz.Azimuth; + } + } + + public bool CanFindHome + { + get + { + tl.LogMessage("CanFindHome", "Get - " + false.ToString()); + return false; + } + } + + public bool CanMoveAxis(TelescopeAxes Axis) + { + tl.LogMessage("CanMoveAxis", "Get - " + Axis.ToString()); + switch (Axis) + { + case TelescopeAxes.axisPrimary: return true; //RA or AZ + case TelescopeAxes.axisSecondary: return true; //Dev or Alt + case TelescopeAxes.axisTertiary: return false; //rotator / derotator + default: throw new InvalidValueException("CanMoveAxis", Axis.ToString(), "0 to 2"); + } + } + + public bool CanPark + { + get + { + tl.LogMessage("CanPark", "Get - " + true.ToString()); + return true; + } + } + + public bool CanPulseGuide + { + get + { + tl.LogMessage("CanPulseGuide", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSetDeclinationRate + { + get + { + tl.LogMessage("CanSetDeclinationRate", "Get - " + false.ToString()); + return false; + } + } + + public bool CanSetGuideRates + { + get + { + tl.LogMessage("CanSetGuideRates", "Get - " + false.ToString()); + return false; + } + } + + public bool CanSetPark + { + get + { + tl.LogMessage("CanSetPark", "Get - " + false.ToString()); + return false; + } + } + + public bool CanSetPierSide + { + get + { + tl.LogMessage("CanSetPierSide", "Get - " + false.ToString()); + return false; + } + } + + public bool CanSetRightAscensionRate + { + get + { + tl.LogMessage("CanSetRightAscensionRate", "Get - " + false.ToString()); + return false; + } + } + + public bool CanSetTracking + { + get + { + tl.LogMessage("CanSetTracking", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSlew + { + get + { + tl.LogMessage("CanSlew", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSlewAltAz + { + get + { + tl.LogMessage("CanSlewAltAz", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSlewAltAzAsync + { + get + { + tl.LogMessage("CanSlewAltAzAsync", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSlewAsync + { + get + { + tl.LogMessage("CanSlewAsync", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSync + { + get + { + tl.LogMessage("CanSync", "Get - " + true.ToString()); + return true; + } + } + + public bool CanSyncAltAz + { + get + { + tl.LogMessage("CanSyncAltAz", "Get - " + false.ToString()); + return false; + } + } + + public bool CanUnpark + { + get + { + tl.LogMessage("CanUnpark", "Get - " + false.ToString()); + return false; + } + } + + public double Declination + { + get + { + CheckConnected("Declination Get"); + + var result = SharedResources.SendString(":GD#"); + //:GD# Get Telescope Declination. + //Returns: sDD* MM# or sDD*MMSS# + //Depending upon the current precision setting for the telescope. + + double declination = utilities.DMSToDegrees(result); + + tl.LogMessage("Declination", "Get - " + utilities.DegreesToDMS(declination, ":", ":")); + return declination; + } + } + + public double DeclinationRate + { + get + { + double declination = 0.0; + tl.LogMessage("DeclinationRate", "Get - " + declination.ToString()); + return declination; + } + set + { + tl.LogMessage("DeclinationRate Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("DeclinationRate", true); + } + } + + public PierSide DestinationSideOfPier(double rightAscension, double declination) + { + tl.LogMessage("DestinationSideOfPier Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("DestinationSideOfPier", false); + } + + public bool DoesRefraction + { + get + { + tl.LogMessage("DoesRefraction Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("DoesRefraction", false); + } + set + { + tl.LogMessage("DoesRefraction Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("DoesRefraction", true); + } + } + + public EquatorialCoordinateType EquatorialSystem + { + get + { + EquatorialCoordinateType equatorialSystem = EquatorialCoordinateType.equTopocentric; + tl.LogMessage("DeclinationRate", "Get - " + equatorialSystem.ToString()); + return equatorialSystem; + } + } + + public void FindHome() + { + tl.LogMessage("FindHome", "Not implemented"); + throw new ASCOM.MethodNotImplementedException("FindHome"); + } + + public double FocalLength + { + get + { + tl.LogMessage("FocalLength Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("FocalLength", false); + } + } + + public double GuideRateDeclination + { + get + { + tl.LogMessage("GuideRateDeclination Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("GuideRateDeclination", false); + } + set + { + tl.LogMessage("GuideRateDeclination Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("GuideRateDeclination", true); + } + } + + public double GuideRateRightAscension + { + get + { + tl.LogMessage("GuideRateRightAscension Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("GuideRateRightAscension", false); + } + set + { + tl.LogMessage("GuideRateRightAscension Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("GuideRateRightAscension", true); + } + } + + public bool IsPulseGuiding + { + get + { + tl.LogMessage("IsPulseGuiding Get", "pulse guiding is synchronous for this driver"); + //throw new ASCOM.PropertyNotImplementedException("IsPulseGuiding", false); + return false; + } + } + + private bool _movingPrimary; + private bool _movingSecondary; + + public void MoveAxis(TelescopeAxes axis, double rate) + { + tl.LogMessage("MoveAxis", $"Axis={axis} rate={rate}"); + CheckConnected("MoveAxis"); + + 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: + SharedResources.SendBlind(":RG#"); + //:RG# Set Slew rate to Guiding Rate (slowest) + //Returns: Nothing + break; + case 2: + SharedResources.SendBlind(":RC#"); + //:RC# Set Slew rate to Centering rate (2nd slowest) + //Returns: Nothing + break; + case 3: + SharedResources.SendBlind(":RM#"); + //:RM# Set Slew rate to Find Rate (2nd Fastest) + //Returns: Nothing + break; + case 4: + SharedResources.SendBlind(":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; + SharedResources.SendBlind(":Qe#"); + //:Qe# Halt eastward Slews + //Returns: Nothing + SharedResources.SendBlind(":Qw#"); + //:Qw# Halt westward Slews + //Returns: Nothing + } + else if (rate > 0) + { + SharedResources.SendBlind(":Me#"); + //:Me# Move Telescope East at current slew rate + //Returns: Nothing + _movingPrimary = true; + } + else + { + SharedResources.SendBlind(":Mw#"); + //:Mw# Move Telescope West at current slew rate + //Returns: Nothing + _movingPrimary = true; + } + + break; + case TelescopeAxes.axisSecondary: + if (rate == 0) + { + _movingSecondary = false; + SharedResources.SendBlind(":Qn#"); + //:Qn# Halt northward Slews + //Returns: Nothing + SharedResources.SendBlind(":Qs#"); + //:Qs# Halt southward Slews + //Returns: Nothing + } + else if (rate > 0) + { + SharedResources.SendBlind(":Mn#"); + //:Mn# Move Telescope North at current slew rate + //Returns: Nothing + _movingSecondary = true; + } + else + { + SharedResources.SendBlind(":Ms#"); + //:Ms# Move Telescope South at current slew rate + //Returns: Nothing + _movingSecondary = true; + } + + break; + default: + throw new ASCOM.MethodNotImplementedException("Can not move this axis."); + } + } + + public void Park() + { + tl.LogMessage("Park", "Parking telescope"); + CheckConnected("Park"); + + if (AtPark) + return; + + SharedResources.SendBlind(":hP#"); + //:hP# Autostar, Autostar II and LX 16Slew to Park Position + //Returns: Nothing + AtPark = true; + } + + private readonly bool + _userNewerPulseGuiding = true; //todo make this a device setting based on firmware revision + + public void PulseGuide(GuideDirections direction, int duration) + { + tl.LogMessage("PulseGuide", $"pulse guide direction {direction} duration {duration}"); + CheckConnected("PulseGuide"); + + 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) + { + SharedResources.SendBlind($":Mg{d}{duration:0000}#"); + //:MgnDDDD# + //:MgsDDDD# + //:MgeDDDD# + //:MgwDDDD# + //Guide telescope in the commanded direction(nsew) for the number of milliseconds indicated by the unsigned number + //passed in the command.These commands support serial port driven guiding. + //Returns Nothing + //LX200 Not Supported + + utilities.WaitForMilliseconds(duration); //todo figure out if this is really needed + } + else + { + SharedResources.Lock(() => + { + SharedResources.SendBlind(":RG#"); //Make sure we are at guide rate + //:RG# Set Slew rate to Guiding Rate (slowest) + //Returns: Nothing + SharedResources.SendBlind($":M{d}#"); + //:Me# Move Telescope East at current slew rate + //Returns: Nothing + //:Mn# Move Telescope North at current slew rate + //Returns: Nothing + //:Ms# Move Telescope South at current slew rate + //Returns: Nothing + //:Mw# Move Telescope West at current slew rate + //Returns: Nothing + utilities.WaitForMilliseconds(duration); + SharedResources.SendBlind($":Q{d}#"); + //:Qe# Halt eastward Slews + //Returns: Nothing + //:Qn# Halt northward Slews + //Returns: Nothing + //:Qs# Halt southward Slews + //Returns: Nothing + //:Qw# Halt westward Slews + //Returns: Nothing + }); + } + } + + public double RightAscension + { + get + { + CheckConnected("RightAscension Get"); + var result = SharedResources.SendString(":GR#"); + //:GR# Get Telescope RA + //Returns: HH: MM.T# or HH:MM:SS# + //Depending which precision is set for the telescope + + double rightAscension = utilities.HMSToHours(result); + + tl.LogMessage("RightAscension", "Get - " + utilities.HoursToHMS(rightAscension)); + return rightAscension; + } + } + + public double RightAscensionRate + { + get + { + double rightAscensionRate = 0.0; + tl.LogMessage("RightAscensionRate", "Get - " + rightAscensionRate.ToString()); + return rightAscensionRate; + } + set + { + tl.LogMessage("RightAscensionRate Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("RightAscensionRate", true); + } + } + + public void SetPark() + { + tl.LogMessage("SetPark", "Not implemented"); + throw new ASCOM.MethodNotImplementedException("SetPark"); + } + + public PierSide SideOfPier + { + get + { + tl.LogMessage("SideOfPier Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("SideOfPier", false); + } + set + { + tl.LogMessage("SideOfPier Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("SideOfPier", true); + } + } + + public double SiderealTime + { + get + { + // Now using NOVAS 3.1 + double siderealTime = 0.0; + using (var novas = new ASCOM.Astrometry.NOVAS.NOVAS31()) + { + var jd = utilities.DateUTCToJulian(DateTime.UtcNow); + novas.SiderealTime(jd, 0, novas.DeltaT(jd), + ASCOM.Astrometry.GstType.GreenwichApparentSiderealTime, + ASCOM.Astrometry.Method.EquinoxBased, + ASCOM.Astrometry.Accuracy.Reduced, ref siderealTime); + } + + // Allow for the longitude + siderealTime += SiteLongitude / 360.0 * 24.0; + + // Reduce to the range 0 to 24 hours + siderealTime = astroUtilities.ConditionRA(siderealTime); + + tl.LogMessage("SiderealTime", "Get - " + siderealTime.ToString()); + return siderealTime; + } + } + + public double SiteElevation + { + get + { + tl.LogMessage("SiteElevation Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("SiteElevation", false); + } + set + { + tl.LogMessage("SiteElevation Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("SiteElevation", true); + } + } + + public double SiteLatitude + { + get + { + CheckConnected("SiteLatitude Get"); + + var latitude = SharedResources.SendString(":Gt#"); + //:Gt# Get Current Site Latitude + //Returns: sDD* MM# + //The latitude of the current site. Positive inplies North latitude. + + var siteLatitude = utilities.DMSToDegrees(latitude); + tl.LogMessage("SiteLatitude Get", $"{utilities.DegreesToDMS(siteLatitude)}"); + return siteLatitude; + } + set + { + tl.LogMessage("SiteLatitude Set", $"{utilities.DegreesToDMS(value)}"); + + CheckConnected("SiteLatitude 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."); + + string sign = value > 0 ? "+" : "-"; + int d = Convert.ToInt32(Math.Floor(value)); + int m = Convert.ToInt32(60 * (value - d)); + + var result = SharedResources.SendChar($":St{sign}{d:00}*{m:00}#"); + //:StsDD*MM# + //Sets the current site latitude to sDD* MM# + //Returns: + //0 Invalid + //1 - Valid + if (result != "1") + throw new InvalidOperationException("Failed to set site latitude."); + } + } + + public double SiteLongitude + { + get + { + CheckConnected("SiteLongitude Get"); + + var longitude = SharedResources.SendString(":Gg#"); + //:Gg# Get Current Site Longitude + //Returns: sDDD* MM# + //The current site Longitude. East Longitudes are expressed as negative + double siteLongitude = utilities.DMSToDegrees(longitude); + + if (siteLongitude > 180) + siteLongitude = siteLongitude - 360; + + siteLongitude = -siteLongitude; + + tl.LogMessage("SiteLongitude Get", $"{utilities.DegreesToDMS(siteLongitude)}"); + return siteLongitude; + } + set + { + var newLongitude = value; + + tl.LogMessage("SiteLongitude Set", $"{utilities.DegreesToDMS(newLongitude)}"); + + CheckConnected("SiteLongitude Set"); + + if (newLongitude > 180) + throw new InvalidValueException("Longitude cannot be greater than 180 degrees."); + + if (newLongitude < -180) + throw new InvalidValueException("Longitude cannot be lower than -180 degrees."); + + if (newLongitude > 0) + newLongitude = 360 - newLongitude; + + newLongitude = Math.Abs(newLongitude); + + int d = Convert.ToInt32(Math.Floor(newLongitude)); + int m = Convert.ToInt32(60 * (newLongitude - d)); + + var result = SharedResources.SendChar($":Sg{d:000}*{m:00}#"); + //:SgDDD*MM# + //Set current sites longitude to DDD*MM an ASCII position string + //Returns: + //0 Invalid + //1 - Valid + if (result != "1") + throw new InvalidOperationException("Failed to set site longitude."); + } + } + + public short SlewSettleTime + { + get + { + tl.LogMessage("SlewSettleTime Get", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("SlewSettleTime", false); + } + set + { + tl.LogMessage("SlewSettleTime Set", "Not implemented"); + throw new ASCOM.PropertyNotImplementedException("SlewSettleTime", true); + } + } + + public void SlewToAltAz(double azimuth, double altitude) + { + tl.LogMessage("SlewToAltAz", $"Az=~{azimuth} Alt={altitude}"); + CheckConnected("SlewToAltAz"); + + SlewToAltAzAsync(azimuth, altitude); + + while (Slewing) //wait for slew to complete + { + utilities.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."); + + CheckConnected("TargetAltitude Set"); + + //todo this serial string does not work. Calculate the EQ version instead. + + var dms = utilities.DegreesToDMS(value, "*", "'", "",0); + var s = value < 0 ? "-" : "+"; + + var result = SharedResources.SendChar($":Sa{s}{dms}#"); + //:SasDD*MM# + //Set target object altitude to sDD*MM# or sDD*MMSS# [LX 16, Autostar, Autostar II] + //Returns: + //1 Object within slew range + //0 Object out of slew range + + if (result == "0") + throw new ASCOM.InvalidOperationException("Target altitude out of slew range"); + } + } + + private double TargetAzimuth + { + set + { + if (value >= 360) + throw new ASCOM.InvalidValueException("Azimuth cannot be 360 or higher."); + + if (value < 0) + throw new ASCOM.InvalidValueException("Azimuth cannot be less than 0."); + + CheckConnected("TargetAzimuth Set"); + + //todo this serial string does not work. Calculate the EQ version instead. + + var dms = utilities.DegreesToDM(value, "*" ); + + var result = SharedResources.SendChar($":Sz{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) + { + if (altitude > 90) + throw new ASCOM.InvalidValueException("Altitude cannot be greater than 90."); + + if (altitude < 0) + throw new ASCOM.InvalidValueException("Altitide cannot be less than 0."); + + if (azimuth >= 360) + throw new ASCOM.InvalidValueException("Azimuth cannot be 360 or higher."); + + if (azimuth < 0) + throw new ASCOM.InvalidValueException("Azimuth cannot be less than 0."); + + tl.LogMessage("SlewToAltAzAsync", $"Az={azimuth} Alt={altitude}"); + CheckConnected("SlewToAltAzAsync"); + + HorizonCoordinates altAz = new HorizonCoordinates(); + altAz.Azimuth = azimuth; + altAz.Altitude = altitude; + + var utcDateTime = UTCDate; + var latitude = SiteLatitude; + var longitude = SiteLongitude; + + SharedResources.Lock(() => + { + var raDec = _astroMaths.ConvertHozToEq(utcDateTime, latitude, longitude, altAz); + + TargetRightAscension = raDec.RightAscension; + TargetDeclination = raDec.Declination; + + DoSlewAsync(true); + + //TargetAltitude = altitude; + //TargetAzimuth = azimuth; + + //DoSlewAsync(false); + }); + } + + private void DoSlewAsync(bool polar) + { + CheckConnected("DoSlewAsync"); + + SharedResources.Lock(() => + { + switch (polar) + { + case true: + var response = SharedResources.SendChar(":MS#"); + //:MS# Slew to Target Object + //Returns: + //0 Slew is Possible + //1# Object Below Horizon w/string message + //2# Object Below Higher w/string message + + switch (response) + { + case "0": + //We're slewing everything should be working just fine. + break; + case "1": + //Below Horizon + string belowHorizonMessage = SharedResources.ReadTerminated(); + throw new ASCOM.InvalidOperationException(belowHorizonMessage); + case "2": + //Below Horizon + string belowMinimumElevationMessage = SharedResources.ReadTerminated(); + throw new ASCOM.InvalidOperationException(belowMinimumElevationMessage); + default: + throw new ASCOM.DriverException("This error should not happen"); + + } + + break; + case false: + var maResponse = SharedResources.SendChar(":MA#"); + //:MA# Autostar, LX 16, Autostar II Slew to target Alt and Az + //Returns: + //0 - No fault + //1 Fault + // LX200 Not supported + + if (maResponse == "1") + { + throw new ASCOM.InvalidOperationException("fault"); + } + + break; + } + }); + } + + public void SlewToCoordinates(double rightAscension, double declination) + { + tl.LogMessage("SlewToCoordinates", $"Ra={rightAscension}, Dec={declination}"); + CheckConnected("SlewToCoordinates"); + + SlewToCoordinatesAsync(rightAscension, declination); + + while (Slewing) //wait for slew to complete + { + utilities.WaitForMilliseconds(200); //be responsive to AbortSlew(); + } + } + + public void SlewToCoordinatesAsync(double rightAscension, double declination) + { + tl.LogMessage("SlewToCoordinatesAsync", $"Ra={rightAscension}, Dec={declination}"); + CheckConnected("SlewToCoordinatesAsync"); + + SharedResources.Lock(() => + { + TargetRightAscension = rightAscension; + TargetDeclination = declination; + + DoSlewAsync(true); + } + ); + } + + public void SlewToTarget() + { + tl.LogMessage("SlewToTarget", "Executing"); + CheckConnected("SlewToTarget"); + SlewToTargetAsync(); + + while (Slewing) + { + utilities.WaitForMilliseconds(200); + } + } + + private const double INVALID_PARAMETER = -1000; + + public void SlewToTargetAsync() + { + CheckConnected("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; + } + + public bool Slewing + { + get + { + if (!Connected) return false; + + + if (movingAxis()) + return true; + + CheckConnected("Slewing Get"); + + var result = SharedResources.SendString(":D#"); + //:D# Requests a string of bars indicating the distance to the current target location. + //Returns: + //LX200's a string of bar characters indicating the distance. + //Autostars and Autostar II a string containing one bar until a slew is complete, then a null string is returned. + bool isSlewing = result != string.Empty; + + tl.LogMessage("Slewing Get", $"Result = {isSlewing}"); + return isSlewing; + } + } + + public void SyncToAltAz(double azimuth, double altitude) + { + tl.LogMessage("SyncToAltAz", "Not implemented"); + throw new ASCOM.MethodNotImplementedException("SyncToAltAz"); + } + + public void SyncToCoordinates(double rightAscension, double declination) + { + tl.LogMessage("SyncToCoordinates", $"RA={rightAscension} Dec={declination}"); + CheckConnected("SyncToCoordinates"); + + SharedResources.Lock(() => + { + TargetRightAscension = rightAscension; + TargetDeclination = declination; + + SyncToTarget(); + }); + } + + public void SyncToTarget() + { + tl.LogMessage("SyncToTarget", "Executing"); + CheckConnected("SyncToTarget"); + + var result = SharedResources.SendString(":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"); + } + + private double _targetDeclination = INVALID_PARAMETER; + public double TargetDeclination + { + get + { + if (_targetDeclination == INVALID_PARAMETER) + throw new ASCOM.InvalidOperationException("Target not set"); + + //var result = SerialPort.CommandTerminated(":Gd#", "#"); + ////:Gd# Get Currently Selected Object/Target Declination + ////Returns: sDD* MM# or sDD*MMSS# + ////Depending upon the current precision setting for the telescope. + + //double targetDec = DmsToDouble(result); + + //return targetDec; + + tl.LogMessage("TargetDeclination Get", $"{_targetDeclination}"); + return _targetDeclination; + } + set + { + tl.LogMessage("TargetDeclination Set", $"{value}"); + + //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."); + + CheckConnected("TargetDeclination Set"); + + var dms = utilities.DegreesToDMS(value, "*", ":", ":", 2); + var s = value < 0 ? '-' : '+'; + + var result = SharedResources.SendChar($":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 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; + + tl.LogMessage("TargetRightAscension Get", $"{_targetRightAscension}"); + return _targetRightAscension; + } + set + { + tl.LogMessage("TargetRightAscension Set", $"{value}"); + + 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"); + + CheckConnected("TargetRightAscension Set"); + //todo implement the low precision version + + var hms = utilities.HoursToHMS(value, ":", ":", ":", 2); + var response = SharedResources.SendChar($":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 bool _tracking = true; + public bool Tracking + { + get + { + tl.LogMessage("Tracking", $"Get - {_tracking}"); + return _tracking; + } + set + { + tl.LogMessage($"Tracking Set", $"{value}"); + _tracking = value; + } + } + + private DriveRates _trackingRate = DriveRates.driveSidereal; + + public DriveRates TrackingRate + { + get + { + //todo implement this with the GW command + //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; + tl.LogMessage("TrackingRate Get", $"{_trackingRate}"); + return _trackingRate; + } + set + { + tl.LogMessage("TrackingRate Set", $"{value}"); + CheckConnected("TrackingRate Set"); + + switch (value) + { + case DriveRates.driveSidereal: + SharedResources.SendBlind(":TQ#"); + //:TQ# Selects sidereal tracking rate + //Returns: Nothing + break; + case DriveRates.driveLunar: + SharedResources.SendBlind(":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 ITrackingRates TrackingRates + { + get + { + ITrackingRates trackingRates = new TrackingRates(); + tl.LogMessage("TrackingRates", "Get - "); + foreach (DriveRates driveRate in trackingRates) + { + tl.LogMessage("TrackingRates", "Get - " + driveRate.ToString()); + } + return trackingRates; + } + } + + private TimeSpan GetUtcCorrection() + { + CheckConnected("GetUtcCorrection"); + + string utcOffSet = SharedResources.SendString(":GG#"); + //:GG# Get UTC offset time + //Returns: sHH# or sHH.H# + //The number of decimal hours to add to local time to convert it to UTC. If the number is a whole number the + //sHH# form is returned, otherwise the longer form is returned. + double utcOffsetHours = double.Parse(utcOffSet); + TimeSpan utcCorrection = TimeSpan.FromHours(utcOffsetHours); + return utcCorrection; + } + + private class TelescopeDateDetails + { + public string telescopeDate { get; set; } + public string telescopeTime { get; set; } + public TimeSpan utcCorrection { get; set; } + } + + public DateTime UTCDate + { + get + { + CheckConnected("UTCDate Get"); + + tl.LogMessage("UTCDate", "Get started"); + + TelescopeDateDetails telescopeDateDetails = SharedResources.Lock(() => + { + TelescopeDateDetails tdd = new TelescopeDateDetails(); + tdd.telescopeDate = SharedResources.SendString(":GC#"); + //:GC# Get current date. + //Returns: MM / DD / YY# + //The current local calendar date for the telescope. + tdd.telescopeTime = SharedResources.SendString(":GL#"); + //:GL# Get Local Time in 24 hour format + //Returns: HH: MM: SS# + //The Local Time in 24 - hour Format + tdd.utcCorrection = GetUtcCorrection(); + + return tdd; + }); + + int month = telescopeDateDetails.telescopeDate.Substring(0, 2).ToInteger(); + int day = telescopeDateDetails.telescopeDate.Substring(3, 2).ToInteger(); + int year = telescopeDateDetails.telescopeDate.Substring(6, 2).ToInteger(); + + if (year < 2000) //todo fix this hack that will create a Y2K100 bug + { + year = year + 2000; + } + + int hour = telescopeDateDetails.telescopeTime.Substring(0, 2).ToInteger(); + int minute = telescopeDateDetails.telescopeTime.Substring(3, 2).ToInteger(); + int second = telescopeDateDetails.telescopeTime.Substring(6, 2).ToInteger(); + + var utcDate = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc) + + telescopeDateDetails.utcCorrection; + + tl.LogMessage("UTCDate", "Get - " + utcDate.ToString("MM/dd/yy HH:mm:ss")); + + return utcDate; + } + set + { + tl.LogMessage("UTCDate", "Set - " + value.ToString("MM/dd/yy HH:mm:ss")); + + CheckConnected("UTCDate Set"); + + SharedResources.Lock(() => + { + var utcCorrection = GetUtcCorrection(); + var localDateTime = value - utcCorrection; + + var timeResult = SharedResources.SendChar($":SL{localDateTime:HH:mm:ss}#"); + //:SLHH:MM:SS# + //Set the local Time + //Returns: + //0 Invalid + //1 - Valid + if (timeResult != "1") + { + throw new InvalidOperationException("Failed to set local time"); + } + + var dateResult = SharedResources.SendChar($":SC{localDateTime:MM/dd/yy}#"); + //:SCMM/DD/YY# + //Change Handbox Date to MM/DD/YY + //Returns: + //D = 0 if the date is invalid.The string is the null string. + //D = 1 for valid dates and the string is Updating Planetary Data# # + //Note: For Autostar II this is the UTC data! + if (dateResult != "1") + { + throw new InvalidOperationException("Failed to set local date"); + } + + //throwing away these two strings which represent + SharedResources.ReadTerminated(); //Updating Planetary Data# + SharedResources.ReadTerminated(); // # + }); + } + } + + public void Unpark() + { + tl.LogMessage("Unpark", "Not implemented"); + throw new ASCOM.MethodNotImplementedException("Unpark"); + } + + #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. + // + /// + /// Register or unregister the driver with the ASCOM Platform. + /// This is harmless if the driver is already registered/unregistered. + /// + /// If true, registers the driver, otherwise unregisters it. + private static void RegUnregASCOM(bool bRegister) + { + using (var P = new ASCOM.Utilities.Profile()) + { + P.DeviceType = "Telescope"; + if (bRegister) + { + P.Register(driverID, driverDescription); + } + else + { + P.Unregister(driverID); + } + } + } + + /// + /// This function registers the driver with the ASCOM Chooser and + /// is called automatically whenever this class is registered for COM Interop. + /// + /// Type of the class being registered, not used. + /// + /// This method typically runs in two distinct situations: + /// + /// + /// In Visual Studio, when the project is successfully built. + /// For this to work correctly, the option Register for COM Interop + /// must be enabled in the project settings. + /// + /// During setup, when the installer registers the assembly for COM Interop. + /// + /// This technique should mean that it is never necessary to manually register a driver with ASCOM. + /// + [ComRegisterFunction] + public static void RegisterASCOM(Type t) + { + RegUnregASCOM(true); + } + + /// + /// This function unregisters the driver from the ASCOM Chooser and + /// is called automatically whenever this class is unregistered from COM Interop. + /// + /// Type of the class being registered, not used. + /// + /// This method typically runs in two distinct situations: + /// + /// + /// In Visual Studio, when the project is cleaned or prior to rebuilding. + /// For this to work correctly, the option Register for COM Interop + /// must be enabled in the project settings. + /// + /// During uninstall, when the installer unregisters the assembly from COM Interop. + /// + /// This technique should mean that it is never necessary to manually unregister a driver from ASCOM. + /// + [ComUnregisterFunction] + public static void UnregisterASCOM(Type t) + { + RegUnregASCOM(false); + } + + #endregion + + /// + /// Returns true if there is a valid connection to the driver hardware + /// + private bool IsConnected + { + get + { + // TODO check that the driver hardware connection exists and is connected to the hardware + return _connectedState; + } + } + + /// + /// Use this function to throw an exception if we aren't connected to the hardware + /// + /// + private void CheckConnected(string message) + { + if (!IsConnected) + { + throw new ASCOM.NotConnectedException(message); + } + } + + /// + /// Read the device configuration from the ASCOM Profile store + /// + internal void ReadProfile() + { + var profileProperties = SharedResources.ReadProfile(); + tl.Enabled = profileProperties.TraceLogger; + comPort = profileProperties.ComPort; + } + + /// + /// Log helper function that takes formatted strings and arguments + /// + /// + /// + /// + internal static void LogMessage(string identifier, string message, params object[] args) + { + var msg = string.Format(message, args); + tl.LogMessage(identifier, msg); + } + #endregion + } +} diff --git a/MeadeAutostar497/app.config b/Meade.net.Telescope/app.config similarity index 93% rename from MeadeAutostar497/app.config rename to Meade.net.Telescope/app.config index dd30df1..56895a9 100644 --- a/MeadeAutostar497/app.config +++ b/Meade.net.Telescope/app.config @@ -5,4 +5,4 @@
- + diff --git a/Meade.net.focuser/ASCOM.ico b/Meade.net.focuser/ASCOM.ico new file mode 100644 index 0000000..9bf8f41 Binary files /dev/null and b/Meade.net.focuser/ASCOM.ico differ diff --git a/Meade.net.focuser/ASCOM.png b/Meade.net.focuser/ASCOM.png new file mode 100644 index 0000000..a83b77b Binary files /dev/null and b/Meade.net.focuser/ASCOM.png differ diff --git a/Meade.net.focuser/ASCOMDriverTemplate.snk b/Meade.net.focuser/ASCOMDriverTemplate.snk new file mode 100644 index 0000000..5ab2945 Binary files /dev/null and b/Meade.net.focuser/ASCOMDriverTemplate.snk differ diff --git a/Meade.net.focuser/Focuser.cs b/Meade.net.focuser/Focuser.cs new file mode 100644 index 0000000..14e8b26 --- /dev/null +++ b/Meade.net.focuser/Focuser.cs @@ -0,0 +1,638 @@ +//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: +// Author: (XXX) Your N. 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. + // + + /// + /// ASCOM Focuser Driver for Meade.net. + /// + [Guid("a32ac647-bf0f-42f9-8ab0-d166fa5884ad")] + [ProgId("ASCOM.MeadeGeneric.focuser")] + [ServedClassName("Meade.net Focuser")] + [ClassInterface(ClassInterfaceType.None)] + public class Focuser : ReferenceCountedObjectBase, IFocuserV3 + { + /// + /// ASCOM DeviceID (COM ProgID) for this driver. + /// The DeviceID is used by ASCOM applications to load the driver at runtime. + /// + //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 + /// + /// Driver description that displays in the ASCOM Chooser. + /// + 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 + + /// + /// Private variable to hold the connected state + /// + private bool connectedState; + + /// + /// Private variable to hold an ASCOM Utilities object + /// + private Util utilities; + + /// + /// Private variable to hold an ASCOM AstroUtilities object to provide the Range method + /// + private AstroUtils astroUtilities; + + /// + /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify) + /// + internal static TraceLogger tl; + + /// + /// Initializes a new instance of the class. + /// Must be public for COM registration. + /// + public Focuser() + { + tl = new TraceLogger("", "Meade.net.focusser"); + 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. + + /// + /// 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! + /// + public void SetupDialog() + { + tl.LogMessage("SetupDialog", "Opening setup dialog"); + SharedResources.SetupDialog(); + ReadProfile(); + tl.LogMessage("SetupDialog", "complete"); + } + + 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) + { + try + { + SharedResources.Connect("Serial"); + try + { + SelectSite(1); + SetLongFormat(true); + + connectedState = true; + } + catch (Exception) + { + SharedResources.Disconnect("Serial"); + throw; + } + } + catch (Exception ex) + { + LogMessage("Connected Set", "Error connecting to port {0} - {1}", comPort, ex.Message); + } + } + else + { + LogMessage("Connected Set", "Disconnecting from port {0}", comPort); + SharedResources.Disconnect("Serial"); + connectedState = false; + } + } + } + + private void SetLongFormat(bool setLongFormat) + { + SharedResources.Lock(() => + { + var result = SharedResources.SendString(":GZ#"); + //:GZ# Get telescope azimuth + //Returns: DDD*MM#T or DDD*MMSS# + //The current telescope Azimuth depending on the selected precision. + + bool isLongFormat = result.Length > 6; + + if (isLongFormat != setLongFormat) + { + utilities.WaitForMilliseconds(500); + SharedResources.SendBlind(":U#"); + //:U# Toggle between low/hi precision positions + //Low - RA displays and messages HH:MM.T sDD*MM + //High - Dec / Az / El displays and messages HH:MM: SS sDD*MM:SS + // Returns Nothing + } + }); + } + + private void SelectSite(int site) + { + SharedResources.SendBlind($":W{site}#"); + //:W# + //Set current site to, an ASCII digit in the range 1..4 + //Returns: Nothing + } + + 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"); + + CheckConnected("Halt"); + + 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()); + CheckConnected("Move"); + + //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(":FF#"); + //:FF# Set Focus speed to fastest setting + //Returns: Nothing + + //:FS# Set Focus speed to slowest setting + //Returns: Nothing + + //:F# Autostar, Autostar II set focuser speed to where is an ASCII digit 1..4 + //Returns: Nothing + //All others Not Supported + utilities.WaitForMilliseconds(100); + + 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(); + + utilities.WaitForMilliseconds(1000); + }); + } + + 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. + // + /// + /// Register or unregister the driver with the ASCOM Platform. + /// This is harmless if the driver is already registered/unregistered. + /// + /// If true, registers the driver, otherwise unregisters it. + 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); + } + } + } + + /// + /// This function registers the driver with the ASCOM Chooser and + /// is called automatically whenever this class is registered for COM Interop. + /// + /// Type of the class being registered, not used. + /// + /// This method typically runs in two distinct situations: + /// + /// + /// In Visual Studio, when the project is successfully built. + /// For this to work correctly, the option Register for COM Interop + /// must be enabled in the project settings. + /// + /// During setup, when the installer registers the assembly for COM Interop. + /// + /// This technique should mean that it is never necessary to manually register a driver with ASCOM. + /// + [ComRegisterFunction] + public static void RegisterASCOM(Type t) + { + RegUnregASCOM(true); + } + + /// + /// This function unregisters the driver from the ASCOM Chooser and + /// is called automatically whenever this class is unregistered from COM Interop. + /// + /// Type of the class being registered, not used. + /// + /// This method typically runs in two distinct situations: + /// + /// + /// In Visual Studio, when the project is cleaned or prior to rebuilding. + /// For this to work correctly, the option Register for COM Interop + /// must be enabled in the project settings. + /// + /// During uninstall, when the installer unregisters the assembly from COM Interop. + /// + /// This technique should mean that it is never necessary to manually unregister a driver from ASCOM. + /// + [ComUnregisterFunction] + public static void UnregisterASCOM(Type t) + { + RegUnregASCOM(false); + } + + #endregion + + /// + /// Returns true if there is a valid connection to the driver hardware + /// + private bool IsConnected + { + get + { + // TODO check that the driver hardware connection exists and is connected to the hardware + return connectedState; + } + } + + /// + /// Use this function to throw an exception if we aren't connected to the hardware + /// + /// + private void CheckConnected(string message) + { + if (!IsConnected) + { + throw new ASCOM.NotConnectedException(message); + } + } + + /// + /// Read the device configuration from the ASCOM Profile store + /// + internal void ReadProfile() + { + var profileProperties = SharedResources.ReadProfile(); + tl.Enabled = profileProperties.TraceLogger; + comPort = profileProperties.ComPort; + } + + /// + /// Log helper function that takes formatted strings and arguments + /// + /// + /// + /// + internal static void LogMessage(string identifier, string message, params object[] args) + { + var msg = string.Format(message, args); + tl.LogMessage(identifier, msg); + } + #endregion + } +} diff --git a/Meade.net.focuser/Meade.net.focuser.csproj b/Meade.net.focuser/Meade.net.focuser.csproj new file mode 100644 index 0000000..a1fd243 --- /dev/null +++ b/Meade.net.focuser/Meade.net.focuser.csproj @@ -0,0 +1,170 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {A97E3AEC-F11D-49DA-B259-DE99DA813A86} + Library + Properties + ASCOM.Meade.net + ASCOM.Meade.net.Focuser + + + + + 3.5 + v4.7.1 + ASCOM.ico + true + ASCOMDriverTemplate.snk + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + AnyCPU + false + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + AnyCPU + false + false + + + true + bin\x86\Debug\ + DEBUG;TRACE + true + full + x86 + prompt + MinimumRecommendedRules.ruleset + + + ..\bin\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + 3.5 + + + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + Designer + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {3689a2cb-94c5-4012-a5cf-7e7d1dd27143} + Meade.net + + + + + + + + + \ No newline at end of file diff --git a/Meade.net.focuser/Properties/AssemblyInfo.cs b/Meade.net.focuser/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a02a8e6 --- /dev/null +++ b/Meade.net.focuser/Properties/AssemblyInfo.cs @@ -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.5.0.0")] +[assembly: AssemblyFileVersion("0.5.0.0")] diff --git a/Meade.net.focuser/Properties/Resources.Designer.cs b/Meade.net.focuser/Properties/Resources.Designer.cs new file mode 100644 index 0000000..67f90ec --- /dev/null +++ b/Meade.net.focuser/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace ASCOM.Meade.net.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // 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() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ASCOM { + get { + object obj = ResourceManager.GetObject("ASCOM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon DefaultIcon { + get { + object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/Meade.net.focuser/Properties/Resources.resx b/Meade.net.focuser/Properties/Resources.resx new file mode 100644 index 0000000..e522d9e --- /dev/null +++ b/Meade.net.focuser/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\ASCOM.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Meade.net.focuser/Properties/Settings.Designer.cs b/Meade.net.focuser/Properties/Settings.Designer.cs new file mode 100644 index 0000000..f1cc444 --- /dev/null +++ b/Meade.net.focuser/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +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; + } + } + } +} diff --git a/Meade.net.focuser/Properties/Settings.settings b/Meade.net.focuser/Properties/Settings.settings new file mode 100644 index 0000000..8e615f2 --- /dev/null +++ b/Meade.net.focuser/Properties/Settings.settings @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Meade.net.focuser/ReadMe.htm b/Meade.net.focuser/ReadMe.htm new file mode 100644 index 0000000..d0e812e --- /dev/null +++ b/Meade.net.focuser/ReadMe.htm @@ -0,0 +1,147 @@ + + + + + Untitled Document + + + + + + + + + + + +
+

ASCOM Focuser Driver (C#)

+
+



+

+

You have just created the skeleton of an ASCOM +Focuser driver in C#. It produces an in-process +(assembly) based driver.

+
+

Prior to developing your first driver, please +familiarize yourself with the developer +information we've provided at the ASCOM Initiative web site +(internet required). +

+

You must do the following in order to complete +your implementation:

+
    +
  1. Switch to the Debug configuration + and build the template now. It should build without errors. +

    +
  2. Add a test project to the + solution. There are templates that can be used to add either a + console or a Windows Forms application:

    +
+
    +
  • Select the ASCOM + Test Forms App (CS) or ASCOM + Test Console App (CS) template.

    +
  • Set a name for the test + application and click on OK.

    +
  • In the Wizard: set the same device + type and model name as for the driver and select Create to build the + test project.

    +
  • Set the Test Application to Run at + Startup.

    +
  • 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.

    +
  • Trying to continue will generate + errors because the additional properties have not been implemented.

    +
+
    +
  1. 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.

    +
  2. 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. +

    +
+

Notes:

+
    +
  • Successfully building the driver, + as well as using regasm + on the assembly, registers it for both COM and ASCOM (the Chooser). + See the code in the ASCOM Registration region of Driver.vb. +

    +
  • Doing a Clean for the project, as + well doing a regasm + -u on the assembly, unregisters it for both COM and ASCOM + (the Chooser). +

    +
  • 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.

    +
  • 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. +

    +
+
+ + + + + + + +
+ + + + + +
+

ASCOM Initiative

+
+
+



+

+
+

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. +

+

See the ASCOM + web site for more information. Please participate in the + ASCOM-Talk + Yahoo Group. +

+
+
+



+

+

+

+ + \ No newline at end of file diff --git a/Meade.net.focuser/Resources/ASCOM.bmp b/Meade.net.focuser/Resources/ASCOM.bmp new file mode 100644 index 0000000..55516c7 Binary files /dev/null and b/Meade.net.focuser/Resources/ASCOM.bmp differ diff --git a/Meade.net.focuser/app.config b/Meade.net.focuser/app.config new file mode 100644 index 0000000..56895a9 --- /dev/null +++ b/Meade.net.focuser/app.config @@ -0,0 +1,8 @@ + + + + +
+ + + diff --git a/Meade.net.sln b/Meade.net.sln new file mode 100644 index 0000000..d8f177e --- /dev/null +++ b/Meade.net.sln @@ -0,0 +1,120 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.452 +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 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{0958D817-269C-44BE-BEFB-F3E6A409DE91}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AstroMath.UnitTests", "AstroMath.UnitTests\AstroMath.UnitTests.csproj", "{AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}" +EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Meade.net.Setup", "Meade.net.Setup\Meade.net.Setup.wixproj", "{8EEB5C25-8394-4257-8E57-CDED47CB6F1B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + 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|x64.ActiveCfg = Debug|Any CPU + {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Debug|x64.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|x64.ActiveCfg = Release|Any CPU + {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x64.Build.0 = Release|Any CPU + {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x86.ActiveCfg = Release|x86 + {3689A2CB-94C5-4012-A5CF-7E7D1DD27143}.Release|x86.Build.0 = Release|x86 + {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|x64.ActiveCfg = Debug|Any CPU + {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x64.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|x64.ActiveCfg = Release|Any CPU + {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x64.Build.0 = Release|Any CPU + {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.ActiveCfg = Release|x86 + {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.Build.0 = Release|x86 + {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|x64.ActiveCfg = Debug|Any CPU + {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Debug|x64.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|x64.ActiveCfg = Release|Any CPU + {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|x64.Build.0 = Release|Any CPU + {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|x86.ActiveCfg = Release|x86 + {A97E3AEC-F11D-49DA-B259-DE99DA813A86}.Release|x86.Build.0 = Release|x86 + {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D5207217-61C7-4E94-8097-91DBACE57D2A}.Debug|x64.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|x64.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|x64.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|x64.ActiveCfg = Release|x86 + {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|x86.ActiveCfg = Release|x86 + {AABC96B8-C462-4B3A-9B5F-2929E3CB7A49}.Release|x86.Build.0 = Release|x86 + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Debug|x64.Build.0 = Debug|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Debug|x86.Build.0 = Debug|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Release|Any CPU.Build.0 = Release|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Release|x64.ActiveCfg = Release|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Release|x64.Build.0 = Release|Any CPU + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Release|x86.ActiveCfg = Release|x86 + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95}.Release|x86.Build.0 = Release|x86 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Debug|Any CPU.Build.0 = Debug|x64 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Debug|x64.ActiveCfg = Debug|x64 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Debug|x64.Build.0 = Debug|x64 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Debug|x86.ActiveCfg = Debug|x86 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Debug|x86.Build.0 = Debug|x86 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Release|Any CPU.ActiveCfg = Release|x86 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Release|x64.ActiveCfg = Release|x86 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.Release|x86.ActiveCfg = Release|x86 + {8EEB5C25-8394-4257-8E57-CDED47CB6F1B}.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} + {AD4959DD-33D7-4C3F-8DB0-7361D8E74A95} = {0958D817-269C-44BE-BEFB-F3E6A409DE91} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3C0509DC-C7F5-48DC-920D-DCFD9C879BD2} + EndGlobalSection +EndGlobal diff --git a/Meade.net/ASCOM.ico b/Meade.net/ASCOM.ico new file mode 100644 index 0000000..9bf8f41 Binary files /dev/null and b/Meade.net/ASCOM.ico differ diff --git a/Meade.net/ASCOM.png b/Meade.net/ASCOM.png new file mode 100644 index 0000000..a83b77b Binary files /dev/null and b/Meade.net/ASCOM.png differ diff --git a/Meade.net/ClassFactory.cs b/Meade.net/ClassFactory.cs new file mode 100644 index 0000000..1626f5c --- /dev/null +++ b/Meade.net/ClassFactory.cs @@ -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 + } +} diff --git a/Meade.net/GarbageCollection.cs b/Meade.net/GarbageCollection.cs new file mode 100644 index 0000000..99aba52 --- /dev/null +++ b/Meade.net/GarbageCollection.cs @@ -0,0 +1,57 @@ +using System; +using System.Threading; + +namespace ASCOM.Meade.net +{ + /// + /// Summary description for GarbageCollection. + /// + 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(); + } + } +} diff --git a/Meade.net/LocalServer.cs b/Meade.net/LocalServer.cs new file mode 100644 index 0000000..a4fc2c2 --- /dev/null +++ b/Meade.net/LocalServer.cs @@ -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 + } +} diff --git a/Meade.net/LocalServer.snk b/Meade.net/LocalServer.snk new file mode 100644 index 0000000..97e4406 Binary files /dev/null and b/Meade.net/LocalServer.snk differ diff --git a/Meade.net/Localization/LocalisationHelper.cs b/Meade.net/Localization/LocalisationHelper.cs new file mode 100644 index 0000000..a8ac3a7 --- /dev/null +++ b/Meade.net/Localization/LocalisationHelper.cs @@ -0,0 +1,36 @@ +using System.Globalization; +using System.Threading; +using System.Resources; +using System.Reflection; + +namespace ASCOM.Meade.net.Localization +{ + internal class LocalisationHelper + { + private const string LocalizationNamespace = "LocalisationTest.Localization.Resources.Localization"; + ResourceManager _resourceManager; + + public LocalisationHelper() + { + _resourceManager = new ResourceManager(LocalizationNamespace, Assembly.GetExecutingAssembly()); + + SetLocalisation(CultureInfo.CurrentCulture.Name); + } + + internal void SetLocalisation(string name) + { + var cultureInfo = new CultureInfo(name); + + CultureInfo.DefaultThreadCurrentCulture = cultureInfo; + CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; + + Thread.CurrentThread.CurrentCulture = cultureInfo; + Thread.CurrentThread.CurrentUICulture = cultureInfo; + } + + internal string GetString(string key) + { + return _resourceManager.GetString(key); + } + } +} diff --git a/Meade.net/Meade.net.csproj b/Meade.net/Meade.net.csproj new file mode 100644 index 0000000..6be15b8 --- /dev/null +++ b/Meade.net/Meade.net.csproj @@ -0,0 +1,174 @@ + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {3689A2CB-94C5-4012-A5CF-7E7D1DD27143} + WinExe + Properties + ASCOM.Meade.net + ASCOM.Meade.net.Server + v4.7.1 + + + 2.0 + + + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + AnyCPU + MinimumRecommendedRules.ruleset + true + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + x86 + false + + + true + + + LocalServer.snk + + + ASCOM.ico + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + ..\bin\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + Form + + + frmMain.cs + + + + + + + Designer + frmMain.cs + + + True + True + Resources.resx + + + + Form + + + SetupDialogForm.cs + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + SetupDialogForm.cs + Designer + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + + + + \ No newline at end of file diff --git a/Meade.net/Properties/AssemblyInfo.cs b/Meade.net/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9570023 --- /dev/null +++ b/Meade.net/Properties/AssemblyInfo.cs @@ -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.5.0.0")] +[assembly: AssemblyFileVersion("0.5.0.0")] + +[assembly: ComVisibleAttribute(false)] diff --git a/Meade.net/Properties/Resources.Designer.cs b/Meade.net/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0255290 --- /dev/null +++ b/Meade.net/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace ASCOM.Meade.net.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // 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() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ASCOM { + get { + object obj = ResourceManager.GetObject("ASCOM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Meade.net/Properties/Resources.resx b/Meade.net/Properties/Resources.resx new file mode 100644 index 0000000..f4cef88 --- /dev/null +++ b/Meade.net/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Meade.net/ReadMe.htm b/Meade.net/ReadMe.htm new file mode 100644 index 0000000..0a8dc80 --- /dev/null +++ b/Meade.net/ReadMe.htm @@ -0,0 +1,666 @@ + + + + + Untitled Document + + + + + + + + + + + + +
+

+ ASCOM LocalServer (singleton) Host +

+
+

+
+
+ +

+

+ You have just created a local server (singleton) host for one or + more ASCOM driver classes. +

+
+

+ 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). +

+

+ + NOTE: + + + 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.
+  
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. + +
+

+

+ + This implementation has changed + from what was defined for Platform 5.5 as follows: + +

+

+ + 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. + +

+

+ + 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. + +

+

+ + Some changes have been made that + will facilitate generating multiple drivers of the same type. + +

+

+ + I've put some additional advice and + comments in the notes below in italics. + +

+

+ You're probably anxious to get going, but you really should read + through the Theory of Operation and + Detailed + Use and Deployment + below. +

+

You must do the following in order to complete your local server:

+
    +
  1. +

    + 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). + This + may be done by default now. + +

    +
  2. +
  3. +

    + 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. +

    +
  4. +
  5. +

    + 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. +

    +
  6. +
  7. +

    + Build the LocalServer. +

    +
  8. +
  9. +

    + Set a reference to the local + server project in each of the driver skeleton + projects. +

    +
  10. +
  11. +

    In each skeleton driver project:

    +
      +
    1. +

      + 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. + This may not be needed if the correct + namespace and naming conventions have been followed when the + drivers and local server were generated. + +

      +
    2. +
    3. +

      + In project properties, + Application tab, change the assembly name to + ASCOM.localserverprojectname.drivertype, + (e.g., ASCOM.SuperScope.Telescope). +

      +
    4. +
    5. +

      + In project properties, + Application tab, click Assembly Information... +

      +
        +
      • +

        + Assure that Make assembly COM + visible is on (it should already be on). +

        +
      • +
      • +

        + Edit the Product Name to be the + "friendly name" of your driver as will be shown in the + Chooser. + Not used now, use the ServedClassName attribute + instead. + +

        +
      • +
      +
    6. +
    7. +

      + In project properties, Build tab, + turn off Register for COM Interop. +

      +
    8. +
    9. +

      + Modify the driver class declaration to inherit from + ReferenceCountedObjectBase. Examples:
      C#: +

      +
      +              public class Telescope :
      +              ReferenceCountedObjectBase,
      +              ITelescope
      +            
      +

      + VB: +

      +
      +              Public Class Telescope
      +              '==================================
      +              Inherits ReferenceCountedObjectBase
      +              Implements ITelescope
      +              '==================================
      +            
      +
    10. +
    11. +

      + In driver.cs/driver.vb, remove + the entire ASCOM Registration region +

      +
    12. +
    13. +

      + In driver.cs/driver.vb, remove + the private strings for driver ID and driver description. + 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. + +

      +
    14. +
    15. +

      + 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: +

      +

      C#:

      +
      +              
      +                [Guid("0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B")]  // set by the template
      +                [ProgId("ASCOM.SuperScope.Telescope")]
      +                [ServedClassName ("Super Scope Telescope")]
      +                [ClassInterface(ClassInterfaceType.None)]
      +                public class Telescope : ReferenceCountedObjectBase , ITelescope
      +              
      +            
      +
    16. +
    +
  12. +
+

+
+

+
    +
      +

      VB:

      +
      +          
      +            <Guid(“0AE8B38D-10A1-4A8D-A5B7-1B050F74B48B”)>
      +            <ProgId(“ASCOM.SuperScope.Telescope”)>
      +            <ServedClassName(“Super Scope Telescope”)>
      +            Public Class Telescope
      +            '==================================
      +            Inherits ReferenceCountedObjectBase
      +            Implements ITelescope
      +            '==================================
      +          
      +        
      +
    +
+

+ Add the following line to the driver + constructor, this sets the driver ID using the ProgId Attribute: +

+
    +
      +

      C#

      +
      +          
      +            s_csDriverID = Marshal.GenerateProgIdForType(this.GetType());
      +          
      +        
      +

      VB:

      +
      +          
      +            s_csDriverID = Marshal.GenerateProgIdForType(Me.GetType())
      +          
      +        
      +
    +
  1. +

    + 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). + Put shared resources into + the SharedResources class provided + . There are some examples that + should give a clue, modify and delete these as required. +

    +
  2. +
  3. +

    + A shared serial port is already + provided (see SharedResources.cs) as SharedResources.SharedSerial + 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#. +

    +
  4. +
  5. +

    + 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. +

    +
  6. +
  7. +

    + If you modified the LocalServer, + build it again now. This will refresh the stuff that's visible to + the drivers. +

    +
  8. +
  9. +

    + Build the driver skeletons to + verify that you got all of the namespace and other variable changes. +

    +
  10. +
  11. +

    + The local server dynamically loads the driver assemblies from + the same folder as the local server executable.
    +
    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: +

    +
        copy "$(TargetPath)" "$(SolutionDir)\SuperScope\$(OutDir)\$(TargetFileName)"
    +

    + This assumes that the server project is called “SuperScope”, + and handles using the debug or release build.
    + Note the quotes for + possible path elements with spaces in them. + An alternative is to + set the build path to the required destination instead of the + default path. + +

    +
  12. +
  13. +

    + + Make sure the drivers are + registered through the local server by running it with the /register + parameter, see below for details. + +

    +
  14. +
  15. +

    + IMPORTANT: + 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. + 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. + +

    +
  16. +
  17. +

    + 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). A driver is not a program! +

    +
  18. +
+

Notes

+
    +
  • +

    + 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). + Never use REGASM + on the local server executable! + + 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. + +

    +
  • +
  • +

    + 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. +

    +
  • +
  • +

    + 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. +

    +
  • +
  • +

    + 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:
    + DefaultDirName="{cf}\ASCOM\Telescope\SuperScope"
    then + the files can all be installed with DestDir: {app}; +

    +
  • +
+

+ Theory of Operation +

+

+ The local server is an executable which can provide multiple + instances of multiple drivers to multiple clients. This capability is + needed for two applications: +

+
    +
  • +

    + A hub, which allows multiple + clients to share a single device +

    +
  • +
  • +

    + 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. +

    +
  • +
+

+ 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. +

+

+ A driver is an assembly which contains a class that implements + one of the ASCOM standard driver interfaces and inherits 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. +

+

+ The name of the local server is important, so we provide it as a + template 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. + Is this still correct? I get the + impression that ASCOM.AlphaTech.Server would be OK. + +

+

+ 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. +

+

+ 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.localservername.drivertype, + 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. +

+

+ 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. + All these previous versions, and the + new drivers will operate together with Platform 6, the changes are + local to the individual drivers. + +

+

+ Detailed Use and Deployment +

+

+ 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): +

+
+      C:\xxx> localserver.exe /register
+    
+

+ 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): +

+
+      C:\xxx> localserver.exe /unregister
+    
+

+ 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. +

+

+ 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. +

+
+ + + + + + + +
+ + + + + +
+

ASCOM Initiative

+
+ +
+

+
+
+ +

+
+

+ 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. +

+

+ See the + ASCOM + web site + for more information. Please participate in the + + ASCOM-Talk + Yahoo Group + . +

+
+
+

+
+
+ +

+

+
+
+ +

+ + \ No newline at end of file diff --git a/Meade.net/ReferenceCountedObject.cs b/Meade.net/ReferenceCountedObject.cs new file mode 100644 index 0000000..7c7b7f2 --- /dev/null +++ b/Meade.net/ReferenceCountedObject.cs @@ -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(); + } + } +} diff --git a/Meade.net/Resources/ASCOM.bmp b/Meade.net/Resources/ASCOM.bmp new file mode 100644 index 0000000..55516c7 Binary files /dev/null and b/Meade.net/Resources/ASCOM.bmp differ diff --git a/MeadeAutostar497/AscomClasses/SetupDialogForm.cs b/Meade.net/SetupDialogForm.cs similarity index 67% rename from MeadeAutostar497/AscomClasses/SetupDialogForm.cs rename to Meade.net/SetupDialogForm.cs index 5091c9a..2a1dac3 100644 --- a/MeadeAutostar497/AscomClasses/SetupDialogForm.cs +++ b/Meade.net/SetupDialogForm.cs @@ -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,35 @@ 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; + } + + private void SetupDialogForm_Shown(object sender, EventArgs e) + { + Activate(); + } } } \ No newline at end of file diff --git a/MeadeAutostar497/AscomClasses/SetupDialogForm.designer.cs b/Meade.net/SetupDialogForm.designer.cs similarity index 61% rename from MeadeAutostar497/AscomClasses/SetupDialogForm.designer.cs rename to Meade.net/SetupDialogForm.designer.cs index 913fdc4..11f868f 100644 --- a/MeadeAutostar497/AscomClasses/SetupDialogForm.designer.cs +++ b/Meade.net/SetupDialogForm.designer.cs @@ -1,4 +1,4 @@ -namespace ASCOM.MeadeAutostar497 +namespace ASCOM.Meade.net { partial class SetupDialogForm { @@ -28,6 +28,7 @@ namespace ASCOM.MeadeAutostar497 /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetupDialogForm)); this.cmdOK = new System.Windows.Forms.Button(); this.cmdCancel = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); @@ -40,82 +41,55 @@ namespace ASCOM.MeadeAutostar497 // // cmdOK // - this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + resources.ApplyResources(this.cmdOK, "cmdOK"); this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.cmdOK.Location = new System.Drawing.Point(281, 112); this.cmdOK.Name = "cmdOK"; - this.cmdOK.Size = new System.Drawing.Size(59, 24); - this.cmdOK.TabIndex = 0; - this.cmdOK.Text = "OK"; this.cmdOK.UseVisualStyleBackColor = true; - this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); // // cmdCancel // - this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + resources.ApplyResources(this.cmdCancel, "cmdCancel"); this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.cmdCancel.Location = new System.Drawing.Point(281, 142); this.cmdCancel.Name = "cmdCancel"; - this.cmdCancel.Size = new System.Drawing.Size(59, 25); - this.cmdCancel.TabIndex = 1; - this.cmdCancel.Text = "Cancel"; this.cmdCancel.UseVisualStyleBackColor = true; this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); // // label1 // - this.label1.Location = new System.Drawing.Point(12, 9); + resources.ApplyResources(this.label1, "label1"); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(123, 31); - this.label1.TabIndex = 2; - this.label1.Text = "Construct your driver\'s setup dialog here."; // // picASCOM // - this.picASCOM.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + resources.ApplyResources(this.picASCOM, "picASCOM"); this.picASCOM.Cursor = System.Windows.Forms.Cursors.Hand; - this.picASCOM.Image = global::ASCOM.MeadeAutostar497.Properties.Resources.ASCOM; - this.picASCOM.Location = new System.Drawing.Point(292, 9); + this.picASCOM.Image = global::ASCOM.Meade.net.Properties.Resources.ASCOM; this.picASCOM.Name = "picASCOM"; - this.picASCOM.Size = new System.Drawing.Size(48, 56); - this.picASCOM.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.picASCOM.TabIndex = 3; this.picASCOM.TabStop = false; this.picASCOM.Click += new System.EventHandler(this.BrowseToAscom); this.picASCOM.DoubleClick += new System.EventHandler(this.BrowseToAscom); // // label2 // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(13, 90); + resources.ApplyResources(this.label2, "label2"); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(58, 13); - this.label2.TabIndex = 5; - this.label2.Text = "Comm Port"; // // chkTrace // - this.chkTrace.AutoSize = true; - this.chkTrace.Location = new System.Drawing.Point(77, 118); + resources.ApplyResources(this.chkTrace, "chkTrace"); this.chkTrace.Name = "chkTrace"; - this.chkTrace.Size = new System.Drawing.Size(69, 17); - this.chkTrace.TabIndex = 6; - this.chkTrace.Text = "Trace on"; this.chkTrace.UseVisualStyleBackColor = true; // // comboBoxComPort // this.comboBoxComPort.FormattingEnabled = true; - this.comboBoxComPort.Location = new System.Drawing.Point(77, 87); + resources.ApplyResources(this.comboBoxComPort, "comboBoxComPort"); this.comboBoxComPort.Name = "comboBoxComPort"; - this.comboBoxComPort.Size = new System.Drawing.Size(90, 21); - this.comboBoxComPort.TabIndex = 7; // // SetupDialogForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(350, 175); this.Controls.Add(this.comboBoxComPort); this.Controls.Add(this.chkTrace); this.Controls.Add(this.label2); @@ -128,8 +102,7 @@ namespace ASCOM.MeadeAutostar497 this.MinimizeBox = false; this.Name = "SetupDialogForm"; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "MeadeAutostar497 Setup"; + this.Shown += new System.EventHandler(this.SetupDialogForm_Shown); ((System.ComponentModel.ISupportInitialize)(this.picASCOM)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); diff --git a/Meade.net/SetupDialogForm.resx b/Meade.net/SetupDialogForm.resx new file mode 100644 index 0000000..b050dfb --- /dev/null +++ b/Meade.net/SetupDialogForm.resx @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom, Right + + + + 281, 112 + + + 59, 24 + + + + 0 + + + OK + + + cmdOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + Bottom, Right + + + 281, 142 + + + 59, 25 + + + 1 + + + Cancel + + + cmdCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 12, 9 + + + 123, 31 + + + 2 + + + Meade AutoStar and AudioStar generic driver + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Top, Right + + + 292, 9 + + + 48, 56 + + + AutoSize + + + 3 + + + picASCOM + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 13, 90 + + + 58, 13 + + + 5 + + + Comm Port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + 77, 118 + + + 69, 17 + + + 6 + + + Trace on + + + chkTrace + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 77, 87 + + + 90, 21 + + + 7 + + + comboBoxComPort + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 350, 175 + + + CenterScreen + + + Meade.net Setup + + + SetupDialogForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs new file mode 100644 index 0000000..733506b --- /dev/null +++ b/Meade.net/SharedResources.cs @@ -0,0 +1,380 @@ +// +// ================ +// 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; } + } + + /// + /// 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. + /// + 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; // Shared 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. + // + + /// + /// Shared serial port + /// + public static ASCOM.Utilities.Serial SharedSerial => s_sharedSerial ?? (s_sharedSerial = new ASCOM.Utilities.Serial()); + + /// + /// number of connections to the shared serial port + /// + public static int Connections { get; set; } = 0; + + 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"; + } + + /// + /// 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. + /// + /// + /// + 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("#"); + } + } + + /// + /// 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. + /// + public static bool Connected + { + set + { + lock (lockObject) + { + if (value) + { + if (Connections == 0) + SharedSerial.Connected = true; + Connections++; + } + else + { + Connections--; + if (Connections <= 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) + { + lock (lockObject) + { + 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() + { + lock (lockObject) + { + 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 (Connections > 0) + { + 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. + // + /// + /// 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 + /// + private static Dictionary connectedDevices = new Dictionary(); + + /// + /// 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. + /// + /// + 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(Func func) + { + lock (lockObject) + { + return func(); + } + } + + /// + /// 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 + /// + public class DeviceHardware + { + private int _count; + + internal int count + { + set => _count = value; + get => _count; + } + + internal DeviceHardware() + { + count = 0; + } + } + + //#region ServedClassName attribute + ///// + ///// This is only needed if the driver is targeted at platform 5.5, it is included with Platform 6 + ///// + //[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 + + // /// + // /// Gets or sets the 'friendly name' of the served class, as registered with the ASCOM Chooser. + // /// + // /// The 'friendly name' of the served class. + // public string DisplayName { get; private set; } + // /// + // /// Initializes a new instance of the class. + // /// + // /// The 'friendly name' of the served class. + // public ServedClassNameAttribute(string servedClassName) + // { + // DisplayName = servedClassName; + // } + //} + //#endregion + } +} \ No newline at end of file diff --git a/Meade.net/app.config b/Meade.net/app.config new file mode 100644 index 0000000..70dcdba --- /dev/null +++ b/Meade.net/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Meade.net/frmMain.Designer.cs b/Meade.net/frmMain.Designer.cs new file mode 100644 index 0000000..83c8dd1 --- /dev/null +++ b/Meade.net/frmMain.Designer.cs @@ -0,0 +1,63 @@ +using System; + +namespace ASCOM.Meade.net +{ + partial class frmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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; + + } +} + diff --git a/Meade.net/frmMain.cs b/Meade.net/frmMain.cs new file mode 100644 index 0000000..92b3be7 --- /dev/null +++ b/Meade.net/frmMain.cs @@ -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(); + } + + } +} \ No newline at end of file diff --git a/MeadeAutostar497/AscomClasses/SetupDialogForm.resx b/Meade.net/frmMain.resx similarity index 97% rename from MeadeAutostar497/AscomClasses/SetupDialogForm.resx rename to Meade.net/frmMain.resx index d58980a..19dc0dd 100644 --- a/MeadeAutostar497/AscomClasses/SetupDialogForm.resx +++ b/Meade.net/frmMain.resx @@ -112,9 +112,9 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/MeadeAutostar497.UnitTests/BootstrapAscomProfileStore.ps1 b/MeadeAutostar497.UnitTests/BootstrapAscomProfileStore.ps1 deleted file mode 100644 index 213c64d..0000000 --- a/MeadeAutostar497.UnitTests/BootstrapAscomProfileStore.ps1 +++ /dev/null @@ -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 diff --git a/MeadeAutostar497.UnitTests/MeadeAutostar497.UnitTests.csproj b/MeadeAutostar497.UnitTests/MeadeAutostar497.UnitTests.csproj deleted file mode 100644 index a7a4fae..0000000 --- a/MeadeAutostar497.UnitTests/MeadeAutostar497.UnitTests.csproj +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - Debug - AnyCPU - {9638DA27-77C7-4B30-A730-6E7159A4A09F} - Library - Properties - MeadeAutostar497.UnitTests - MeadeAutostar497.UnitTests - v4.6.2 - 512 - true - - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - x64 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Astrometry.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Attributes.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Cache.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Controls.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DeviceInterfaces.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DriverAccess.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Exceptions.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Internal.Extensions.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.SettingsProvider.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.dll - - - ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.Video.dll - - - ..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll - - - ..\packages\Moq.4.10.1\lib\net45\Moq.dll - - - ..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll - - - - - - - ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll - - - - - ..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll - - - - - - - - - - - - - - - - - - {64308775-bd4a-469c-bcab-3ed830b811af} - MeadeAutostar497 - - - - - - - - - - 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}. - - - - \ No newline at end of file diff --git a/MeadeAutostar497.UnitTests/TelescopeControllerUnitTests.cs b/MeadeAutostar497.UnitTests/TelescopeControllerUnitTests.cs deleted file mode 100644 index 97f4fcf..0000000 --- a/MeadeAutostar497.UnitTests/TelescopeControllerUnitTests.cs +++ /dev/null @@ -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 serialMock; - - private readonly List _availableComPorts = new List { "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(); - serialMock.SetupAllProperties(); - serialMock.Setup(x => x.GetPortNames()).Returns(() => _availableComPorts.ToArray()); - serialMock.Setup(x => x.CommandTerminated(It.IsAny(), It.IsAny())) - .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()); - } - - [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(() => { _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 newSerialMock = new Mock(); - - var exception = Assert.Throws( () => { _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( () => _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(() => _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( () => {_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(() => { _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( () => { _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(() => { _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(() => { _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(() => { _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(() => { _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(() => { _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)); - } - } -} diff --git a/MeadeAutostar497.UnitTests/packages.config b/MeadeAutostar497.UnitTests/packages.config deleted file mode 100644 index e7172db..0000000 --- a/MeadeAutostar497.UnitTests/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/MeadeAutostar497.sln b/MeadeAutostar497.sln deleted file mode 100644 index 69570e9..0000000 --- a/MeadeAutostar497.sln +++ /dev/null @@ -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 diff --git a/MeadeAutostar497/AscomClasses/Telescope.cs b/MeadeAutostar497/AscomClasses/Telescope.cs deleted file mode 100644 index b9acd64..0000000 --- a/MeadeAutostar497/AscomClasses/Telescope.cs +++ /dev/null @@ -1,1219 +0,0 @@ -//tabs=4 -// -------------------------------------------------------------------------------- -// TODO fill in this information for your driver, then remove this line! -// -// ASCOM Telescope driver for MeadeAutostar497 -// -// 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 Telescope interface version: -// Author: (XXX) Your N. 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 Telescope - -using System; -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 ASCOM.MeadeAutostar497.Controller; -using static System.String; - -namespace ASCOM.MeadeAutostar497 -{ - // - // Your driver's DeviceID is ASCOM.MeadeAutostar497.Telescope - // - // The Guid attribute sets the CLSID for ASCOM.MeadeAutostar497.Telescope - // The ClassInterface/None addribute prevents an empty interface called - // _MeadeAutostar497 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. - // - - /// - /// ASCOM Telescope Driver for MeadeAutostar497. - /// - [Guid("58e4fe97-1760-4e22-8ecd-2225876aeefc")] - [ClassInterface(ClassInterfaceType.None)] - public class Telescope : ITelescopeV3, IFocuserV3 - { - private ITelescopeController _telescopeController; - - /// - /// ASCOM DeviceID (COM ProgID) for this driver. - /// The DeviceID is used by ASCOM applications to load the driver at runtime. - /// - internal static string driverID = "ASCOM.MeadeAutostar497.Telescope"; - // TODO Change the descriptive string for your driver then remove this line - /// - /// Driver description that displays in the ASCOM Chooser. - /// - private static string driverDescription = "Meade Autostar 497 .net"; - - 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 - - /// - /// Private variable to hold an ASCOM Utilities object - /// - private Util utilities; - - /// - /// Private variable to hold an ASCOM AstroUtilities object to provide the Range method - /// - private AstroUtils astroUtilities; - - /// - /// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify) - /// - internal static TraceLogger tl; - - /// - /// Initializes a new instance of the class. - /// Must be public for COM registration. - /// - public Telescope() - { - tl = new TraceLogger("", "MeadeAutostar497"); - ReadProfile(); // Read device configuration from the ASCOM Profile store - - tl.LogMessage("Telescope", "Starting initialisation"); - - utilities = new Util(); //Initialise util object - astroUtilities = new AstroUtils(); // Initialise astro utilities object - - //TODO: Implement your additional construction here - _telescopeController = TelescopeController.Instance; - - tl.LogMessage("Telescope", "Completed initialisation"); - } - - - // - // PUBLIC COM INTERFACE ITelescopeV3 IMPLEMENTATION - // - - #region Common properties and methods. - - /// - /// 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! - /// - public void SetupDialog() - { - // consider only showing the setup dialog if not connected - // or call a different dialog if connected - if (IsConnected) - { - System.Windows.Forms.MessageBox.Show("Already connected, just press OK"); - return; - } - - using (SetupDialogForm F = new SetupDialogForm()) - { - var result = F.ShowDialog(); - if (result == System.Windows.Forms.DialogResult.OK) - { - WriteProfile(); // Persist device configuration values to the ASCOM Profile store - } - } - } - - 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); - // 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) - { - // it's a good idea to put all the low level communication with the device here, - // then all communication calls this function - // you need something to ensure that only one command is in progress at a time - CheckConnected("CommandString"); - throw new ASCOM.MethodNotImplementedException("CommandString"); - } - - public void Dispose() - { - _telescopeController.Connected = false; - - // 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); - _telescopeController.Port = comPort; - _telescopeController.Connected = true; - } - else - { - LogMessage("Connected Set", "Disconnecting from port {0}", comPort); - _telescopeController.Connected = 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 = Format(CultureInfo.InvariantCulture, "Information about the driver itself. Version: {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 = 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 = "Meade Autostar 497 .net"; - tl.LogMessage("Name Get", name); - return name; - } - } - - #endregion - - #region ITelescope Implementation - public void AbortSlew() - { - tl.LogMessage("AbortSlew", "Aborting slew"); - _telescopeController.AbortSlew(); - } - - public AlignmentModes AlignmentMode - { - get - { - tl.LogMessage("AlignmentMode Get", "Getting alignmode"); - var alignmode = _telescopeController.AlignmentMode; - tl.LogMessage("AlignmentMode Get", $"alignmode = {alignmode}"); - return alignmode; - } - } - - public double Altitude - { - get - { - var alt = _telescopeController.Altitude; - tl.LogMessage("Altitude", $"{alt}"); - return alt; - } - } - - public double ApertureArea - { - get - { - tl.LogMessage("ApertureArea Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("ApertureArea", false); - } - } - - public double ApertureDiameter - { - get - { - tl.LogMessage("ApertureDiameter Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("ApertureDiameter", false); - } - } - - public bool AtHome - { - get - { - tl.LogMessage("AtHome", "Get - " + false.ToString()); - return false; - } - } - - public bool AtPark - { - get - { - var atPatk = _telescopeController.AtPark; - tl.LogMessage("AtPark", "Get - " + atPatk.ToString()); - return atPatk; - } - } - - public IAxisRates AxisRates(TelescopeAxes Axis) - { - tl.LogMessage("AxisRates", "Get - " + Axis.ToString()); - return new AxisRates(Axis); - } - - public double Azimuth - { - get - { - var az = _telescopeController.Azimuth; - tl.LogMessage("Azimuth Get", $"{az}"); - return az; - } - } - - public bool CanFindHome - { - get - { - tl.LogMessage("CanFindHome", "Get - " + false.ToString()); - return false; - } - } - - public bool CanMoveAxis(TelescopeAxes Axis) - { - tl.LogMessage("CanMoveAxis", "Get - " + Axis.ToString()); - switch (Axis) - { - case TelescopeAxes.axisPrimary: return true; //RA or AZ - case TelescopeAxes.axisSecondary: return true; //Dev or Alt - case TelescopeAxes.axisTertiary: return false; //rotator / derotator - default: throw new InvalidValueException("CanMoveAxis", Axis.ToString(), "0 to 2"); - } - } - - public bool CanPark - { - get - { - tl.LogMessage("CanPark", "Get - " + true.ToString()); - return true; - } - } - - public bool CanPulseGuide - { - get - { - tl.LogMessage("CanPulseGuide", "Get - " + true.ToString()); - return true; - } - } - - public bool CanSetDeclinationRate - { - get - { - tl.LogMessage("CanSetDeclinationRate", "Get - " + false.ToString()); - return false; - } - } - - public bool CanSetGuideRates - { - get - { - tl.LogMessage("CanSetGuideRates", "Get - " + false.ToString()); - return false; - } - } - - public bool CanSetPark - { - get - { - tl.LogMessage("CanSetPark", "Get - " + false.ToString()); - return false; - } - } - - public bool CanSetPierSide - { - get - { - tl.LogMessage("CanSetPierSide", "Get - " + false.ToString()); - return false; - } - } - - public bool CanSetRightAscensionRate - { - get - { - tl.LogMessage("CanSetRightAscensionRate", "Get - " + false.ToString()); - return false; - } - } - - public bool CanSetTracking - { - get - { - tl.LogMessage("CanSetTracking", "Get - " + false.ToString()); - return false; - } - } - - public bool CanSlew - { - get - { - tl.LogMessage("CanSlew", "Get - " + true.ToString()); - return true; - } - } - - public bool CanSlewAltAz - { - get - { - tl.LogMessage("CanSlewAltAz", "Get - " + true.ToString()); - return true; - } - } - - public bool CanSlewAltAzAsync - { - get - { - tl.LogMessage("CanSlewAltAzAsync", "Get - " + true.ToString()); - return true; - } - } - - public bool CanSlewAsync - { - get - { - tl.LogMessage("CanSlewAsync", "Get - " + true.ToString()); - return true; - } - } - - public bool CanSync - { - get - { - tl.LogMessage("CanSync", "Get - " + true.ToString()); - return true; - } - } - - public bool CanSyncAltAz - { - get - { - tl.LogMessage("CanSyncAltAz", "Get - " + false.ToString()); - return false; - } - } - - public bool CanUnpark - { - get - { - tl.LogMessage("CanUnpark", "Get - " + false.ToString()); - return false; - } - } - - public double Declination - { - get - { - double declination = _telescopeController.Declination; - tl.LogMessage("Declination", "Get - " + utilities.DegreesToDMS(declination, ":", ":")); - return declination; - } - } - - public double DeclinationRate - { - get - { - double declination = 0.0; - tl.LogMessage("DeclinationRate", "Get - " + declination.ToString()); - return declination; - } - set - { - tl.LogMessage("DeclinationRate Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("DeclinationRate", true); - } - } - - public PierSide DestinationSideOfPier(double RightAscension, double Declination) - { - tl.LogMessage("DestinationSideOfPier Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("DestinationSideOfPier", false); - } - - public bool DoesRefraction - { - get - { - tl.LogMessage("DoesRefraction Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("DoesRefraction", false); - } - set - { - tl.LogMessage("DoesRefraction Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("DoesRefraction", true); - } - } - - public EquatorialCoordinateType EquatorialSystem - { - get - { - EquatorialCoordinateType equatorialSystem = EquatorialCoordinateType.equTopocentric; - tl.LogMessage("DeclinationRate", "Get - " + equatorialSystem.ToString()); - return equatorialSystem; - } - } - - public void FindHome() - { - tl.LogMessage("FindHome", "Not implemented"); - throw new ASCOM.MethodNotImplementedException("FindHome"); - } - - public double FocalLength - { - get - { - tl.LogMessage("FocalLength Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("FocalLength", false); - } - } - - public double GuideRateDeclination - { - get - { - tl.LogMessage("GuideRateDeclination Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("GuideRateDeclination", false); - } - set - { - tl.LogMessage("GuideRateDeclination Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("GuideRateDeclination", true); - } - } - - public double GuideRateRightAscension - { - get - { - tl.LogMessage("GuideRateRightAscension Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("GuideRateRightAscension", false); - } - set - { - tl.LogMessage("GuideRateRightAscension Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("GuideRateRightAscension", true); - } - } - - public bool IsPulseGuiding - { - get - { - tl.LogMessage("IsPulseGuiding Get", "pulse guiding is synchronous for this driver"); - //throw new ASCOM.PropertyNotImplementedException("IsPulseGuiding", false); - return false; - } - } - - public void MoveAxis(TelescopeAxes Axis, double Rate) - { - tl.LogMessage("MoveAxis", $"Axis={Axis} rate={Rate}"); - _telescopeController.MoveAxis(Axis, Rate); - } - - public void Park() - { - tl.LogMessage("Park", "Parking telescope"); - _telescopeController.Park(); - } - - public void PulseGuide(GuideDirections Direction, int Duration) - { - tl.LogMessage("PulseGuide", $"pulse guide direction {Direction} duration {Duration}"); - _telescopeController.PulseGuide(Direction, Duration); - } - - public double RightAscension - { - get - { - double rightAscension = _telescopeController.RightAscension; - tl.LogMessage("RightAscension", "Get - " + utilities.HoursToHMS(rightAscension)); - return rightAscension; - } - } - - public double RightAscensionRate - { - get - { - double rightAscensionRate = 0.0; - tl.LogMessage("RightAscensionRate", "Get - " + rightAscensionRate.ToString()); - return rightAscensionRate; - } - set - { - tl.LogMessage("RightAscensionRate Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("RightAscensionRate", true); - } - } - - public void SetPark() - { - tl.LogMessage("SetPark", "Not implemented"); - throw new ASCOM.MethodNotImplementedException("SetPark"); - } - - public PierSide SideOfPier - { - get - { - tl.LogMessage("SideOfPier Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("SideOfPier", false); - } - set - { - tl.LogMessage("SideOfPier Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("SideOfPier", true); - } - } - - public double SiderealTime - { - get - { - // Now using NOVAS 3.1 - double siderealTime = 0.0; - using (var novas = new ASCOM.Astrometry.NOVAS.NOVAS31()) - { - var jd = utilities.DateUTCToJulian(DateTime.UtcNow); - novas.SiderealTime(jd, 0, novas.DeltaT(jd), - ASCOM.Astrometry.GstType.GreenwichApparentSiderealTime, - ASCOM.Astrometry.Method.EquinoxBased, - ASCOM.Astrometry.Accuracy.Reduced, ref siderealTime); - } - - // Allow for the longitude - siderealTime += SiteLongitude / 360.0 * 24.0; - - // Reduce to the range 0 to 24 hours - siderealTime = astroUtilities.ConditionRA(siderealTime); - - tl.LogMessage("SiderealTime", "Get - " + siderealTime.ToString()); - return siderealTime; - } - } - - public double SiteElevation - { - get - { - tl.LogMessage("SiteElevation Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("SiteElevation", false); - } - set - { - tl.LogMessage("SiteElevation Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("SiteElevation", true); - } - } - - public double SiteLatitude - { - get - { - var siteLatitude = _telescopeController.SiteLatitude; - tl.LogMessage("SiteLatitude Get", $"{utilities.DegreesToDMS(siteLatitude)}"); - return siteLatitude; - } - set - { - tl.LogMessage("SiteLatitude Set", $"{utilities.DegreesToDMS(value)}"); - _telescopeController.SiteLatitude = value; - } - } - - public double SiteLongitude - { - get - { - var siteLongitude = _telescopeController.SiteLongitude; - tl.LogMessage("SiteLongitude Get", $"{utilities.DegreesToDMS(siteLongitude)}"); - return siteLongitude; - } - set - { - tl.LogMessage("SiteLongitude Set", $"{utilities.DegreesToDMS(value)}"); - _telescopeController.SiteLongitude = value; - } - } - - public short SlewSettleTime - { - get - { - tl.LogMessage("SlewSettleTime Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("SlewSettleTime", false); - } - set - { - tl.LogMessage("SlewSettleTime Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("SlewSettleTime", true); - } - } - - public void SlewToAltAz(double Azimuth, double Altitude) - { - tl.LogMessage("SlewToAltAz", $"Az=~{Azimuth} Alt={Altitude}"); - _telescopeController.SlewToAltAz(Azimuth, Altitude); - } - - public void SlewToAltAzAsync(double Azimuth, double Altitude) - { - tl.LogMessage("SlewToAltAzAsync", $"Az=~{Azimuth} Alt={Altitude}"); - _telescopeController.SlewToAltAzAsync(Azimuth, Altitude); - } - - public void SlewToCoordinates(double RightAscension, double Declination) - { - tl.LogMessage("SlewToCoordinates", $"Ra={RightAscension}, Dec={Declination}"); - _telescopeController.SlewToCoordinates(RightAscension, Declination); - } - - public void SlewToCoordinatesAsync(double RightAscension, double Declination) - { - tl.LogMessage("SlewToCoordinatesAsync", $"Ra={RightAscension}, Dec={Declination}"); - _telescopeController.SlewToCoordinatesAsync(RightAscension, Declination); - } - - public void SlewToTarget() - { - tl.LogMessage("SlewToTarget", "Executing"); - _telescopeController.SlewToTarget(); - } - - public void SlewToTargetAsync() - { - tl.LogMessage("SlewToTargetAsync", "Executing"); - _telescopeController.SlewToTargetAsync(); - } - - public bool Slewing - { - get - { - tl.LogMessage("Slewing Get", "Started"); - var result = _telescopeController.Slewing; - tl.LogMessage("Slewing Get", $"Result = {result}"); - return result; - } - } - - public void SyncToAltAz(double Azimuth, double Altitude) - { - tl.LogMessage("SyncToAltAz", "Not implemented"); - throw new ASCOM.MethodNotImplementedException("SyncToAltAz"); - } - - public void SyncToCoordinates(double RightAscension, double Declination) - { - tl.LogMessage("SyncToCoordinates", $"RA={RightAscension} Dec={Declination}"); - _telescopeController.TargetRightAscension = RightAscension; - _telescopeController.TargetDeclination = Declination; - - SyncToTarget(); - } - - public void SyncToTarget() - { - tl.LogMessage("SyncToTarget", "Executing"); - _telescopeController.SyncToTarget(); - } - - public double TargetDeclination - { - get - { - var targetDec = _telescopeController.TargetDeclination; - tl.LogMessage("TargetDeclination Get", $"{targetDec}"); - return targetDec; - } - set - { - tl.LogMessage("TargetDeclination Set", $"{value}"); - _telescopeController.TargetDeclination = value; - } - } - - public double TargetRightAscension - { - get - { - var targetRa = _telescopeController.TargetRightAscension; - tl.LogMessage("TargetRightAscension Get", $"{targetRa}"); - return targetRa; - } - set - { - tl.LogMessage("TargetRightAscension Set", $"{value}"); - _telescopeController.TargetRightAscension = value; - } - } - - public bool Tracking - { - get - { - //todo implementing this, it exists. - bool tracking = true; - tl.LogMessage("Tracking", "Get - " + tracking.ToString()); - return tracking; - } - set - { - tl.LogMessage("Tracking Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("Tracking", true); - } - } - - public DriveRates TrackingRate - { - get - { - var tr = _telescopeController.TrackingRate; - tl.LogMessage("TrackingRate Get", $"{tr}"); - return tr; - } - set - { - tl.LogMessage("TrackingRate Set", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("TrackingRate", true); - } - } - - public ITrackingRates TrackingRates - { - get - { - ITrackingRates trackingRates = new TrackingRates(); - tl.LogMessage("TrackingRates", "Get - "); - foreach (DriveRates driveRate in trackingRates) - { - tl.LogMessage("TrackingRates", "Get - " + driveRate.ToString()); - } - return trackingRates; - } - } - - public DateTime UTCDate - { - get - { - tl.LogMessage("UTCDate", "Get started"); - - var utcDate = _telescopeController.utcDate; - tl.LogMessage("UTCDate", "Get - " + Format("MM/dd/yy HH:mm:ss", utcDate)); - return utcDate; - } - set - { - tl.LogMessage("UTCDate", "Set - " + Format("MM/dd/yy HH:mm:ss", value)); - _telescopeController.utcDate = value; - - } - } - - public void Unpark() - { - tl.LogMessage("Unpark", "Not implemented"); - throw new ASCOM.MethodNotImplementedException("Unpark"); - } - - #endregion - - #region IFocuser Implementation - - //private int focuserPosition = 0; // Class level variable to hold the current focuser position - //private const int focuserSteps = 10000; - - public bool Absolute - { - get - { - tl.LogMessage("Absolute Get", false.ToString()); - return false; // This is an absolute focuser - } - } - - public void Halt() - { - tl.LogMessage("Halt", "Halting"); - _telescopeController.FocuserHalt(); - } - - public bool IsMoving - { - get - { - tl.LogMessage("IsMoving Get", false.ToString()); - return false; // This focuser always moves instantaneously so no need for IsMoving ever to be True - } - } - - public bool Link - { - get - { - tl.LogMessage("Link Get", this.Connected.ToString()); - return this.Connected; // Direct function to the connected method, the Link method is just here for backwards compatibility - } - set - { - tl.LogMessage("Link Set", value.ToString()); - this.Connected = value; // Direct function to the connected method, the Link method is just here for backwards compatibility - } - } - - public int MaxIncrement - { - get - { - var maxIncrement = _telescopeController.FocuserMaxIncrement; - tl.LogMessage("MaxIncrement Get", maxIncrement.ToString()); - return maxIncrement; // Maximum change in one move - } - } - - public int MaxStep - { - get - { - var maxStep = _telescopeController.FocuserMaxStep; - tl.LogMessage("MaxStep Get", maxStep.ToString()); - return maxStep; - } - } - - public void Move(int Position) - { - tl.LogMessage("Move", Position.ToString()); - _telescopeController.FocuserMove(Position); - //focuserPosition = Position; // Set the focuser position - } - - 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. - // - /// - /// Register or unregister the driver with the ASCOM Platform. - /// This is harmless if the driver is already registered/unregistered. - /// - /// If true, registers the driver, otherwise unregisters it. - private static void RegUnregASCOM(bool bRegister) - { - using (var p = new ASCOM.Utilities.Profile()) - { - p.DeviceType = "Telescope"; - if (bRegister) - { - p.Register(driverID, driverDescription); - } - else - { - p.Unregister(driverID); - } - } - - using (var p = new ASCOM.Utilities.Profile()) - { - p.DeviceType = "Focuser"; - if (bRegister) - { - p.Register(driverID, driverDescription); - } - else - { - p.Unregister(driverID); - } - } - } - - /// - /// This function registers the driver with the ASCOM Chooser and - /// is called automatically whenever this class is registered for COM Interop. - /// - /// Type of the class being registered, not used. - /// - /// This method typically runs in two distinct situations: - /// - /// - /// In Visual Studio, when the project is successfully built. - /// For this to work correctly, the option Register for COM Interop - /// must be enabled in the project settings. - /// - /// During setup, when the installer registers the assembly for COM Interop. - /// - /// This technique should mean that it is never necessary to manually register a driver with ASCOM. - /// - [ComRegisterFunction] - public static void RegisterASCOM(Type t) - { - RegUnregASCOM(true); - } - - /// - /// This function unregisters the driver from the ASCOM Chooser and - /// is called automatically whenever this class is unregistered from COM Interop. - /// - /// Type of the class being registered, not used. - /// - /// This method typically runs in two distinct situations: - /// - /// - /// In Visual Studio, when the project is cleaned or prior to rebuilding. - /// For this to work correctly, the option Register for COM Interop - /// must be enabled in the project settings. - /// - /// During uninstall, when the installer unregisters the assembly from COM Interop. - /// - /// This technique should mean that it is never necessary to manually unregister a driver from ASCOM. - /// - [ComUnregisterFunction] - public static void UnregisterASCOM(Type t) - { - RegUnregASCOM(false); - } - - #endregion - - /// - /// Returns true if there is a valid connection to the driver hardware - /// - private bool IsConnected => _telescopeController.Connected; - - /// - /// Use this function to throw an exception if we aren't connected to the hardware - /// - /// - private void CheckConnected(string message) - { - if (!IsConnected) - { - throw new ASCOM.NotConnectedException(message); - } - } - - /// - /// Read the device configuration from the ASCOM Profile store - /// - internal void ReadProfile() - { - using (Profile driverProfile = new Profile()) - { - driverProfile.DeviceType = "Telescope"; - tl.Enabled = Convert.ToBoolean(driverProfile.GetValue(driverID, traceStateProfileName, Empty, traceStateDefault)); - comPort = driverProfile.GetValue(driverID, comPortProfileName, Empty, comPortDefault); - } - } - - /// - /// Write the device configuration to the ASCOM Profile store - /// - internal void WriteProfile() - { - using (Profile driverProfile = new Profile()) - { - driverProfile.DeviceType = "Telescope"; - driverProfile.WriteValue(driverID, traceStateProfileName, tl.Enabled.ToString()); - driverProfile.WriteValue(driverID, comPortProfileName, comPort.ToString()); - } - } - - /// - /// Log helper function that takes formatted strings and arguments - /// - /// - /// - /// - internal static void LogMessage(string identifier, string message, params object[] args) - { - var msg = Format(message, args); - tl.LogMessage(identifier, msg); - } - #endregion - } -} diff --git a/MeadeAutostar497/Controller/FirmwareVersion.cs b/MeadeAutostar497/Controller/FirmwareVersion.cs deleted file mode 100644 index bdd0976..0000000 --- a/MeadeAutostar497/Controller/FirmwareVersion.cs +++ /dev/null @@ -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# - } -} \ No newline at end of file diff --git a/MeadeAutostar497/Controller/ISerialProcessor.cs b/MeadeAutostar497/Controller/ISerialProcessor.cs deleted file mode 100644 index 5578bf3..0000000 --- a/MeadeAutostar497/Controller/ISerialProcessor.cs +++ /dev/null @@ -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(); - } -} \ No newline at end of file diff --git a/MeadeAutostar497/Controller/ITelescopeController.cs b/MeadeAutostar497/Controller/ITelescopeController.cs deleted file mode 100644 index a31d9d9..0000000 --- a/MeadeAutostar497/Controller/ITelescopeController.cs +++ /dev/null @@ -1,40 +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; } - 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); - } -} \ No newline at end of file diff --git a/MeadeAutostar497/Controller/SerialProcessor.cs b/MeadeAutostar497/Controller/SerialProcessor.cs deleted file mode 100644 index 1c77556..0000000 --- a/MeadeAutostar497/Controller/SerialProcessor.cs +++ /dev/null @@ -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(); - } - } -} diff --git a/MeadeAutostar497/Controller/TelescopeController.cs b/MeadeAutostar497/Controller/TelescopeController.cs deleted file mode 100644 index 209dd09..0000000 --- a/MeadeAutostar497/Controller/TelescopeController.cs +++ /dev/null @@ -1,976 +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 Lazy = new Lazy(); - - 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: # - // 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; - } - } - - public DriveRates TrackingRate - { - get - { - var result = SerialPort.CommandTerminated(":GT#", "#"); - - double rate = double.Parse(result); - - - if (rate == 60.1) - return DriveRates.driveLunar; - else if (rate == 60.1) - return DriveRates.driveSidereal; - - return DriveRates.driveKing; - } - set - { - switch (value) - { - case DriveRates.driveSidereal: - SerialPort.Command(":TQ#"); - //:TQ# Selects sidereal tracking rate - //Returns: Nothing - break; - case DriveRates.driveLunar: - SerialPort.Command(":TL#"); - //:TL# Set Lunar Tracking Rage - //Returns: Nothing - break; - case DriveRates.driveSolar: - SerialPort.Command(":TS#"); - //:TS# Select Solar tracking rate. [LS Only] - //Returns: Nothing - break; - case DriveRates.driveKing: - break; - default: - throw new ArgumentOutOfRangeException(nameof(value), value, null); - } - } - } - - public 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)); - } - } - - 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# Autostar, Autostar II – set focuser speed to where 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# Object Below Horizon w/string message - //2# Object Below Higher w/string message - - switch (response) - { - case '0': - //We're slewing everything should be working just fine. - 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 - } -} diff --git a/TargetToBeat.txt b/TargetToBeat.txt deleted file mode 100644 index 8255bd9..0000000 --- a/TargetToBeat.txt +++ /dev/null @@ -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 \ No newline at end of file diff --git a/TestConsole/Program.cs b/TelescopeTestConsole/Program.cs similarity index 71% rename from TestConsole/Program.cs rename to TelescopeTestConsole/Program.cs index 6c8fa71..420046a 100644 --- a/TestConsole/Program.cs +++ b/TelescopeTestConsole/Program.cs @@ -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,30 +43,18 @@ namespace ASCOM // TODO add more code to test the driver. device.Connected = true; - //Console.WriteLine(device.Slewing); - //device.UTCDate = DateTime.UtcNow; - //Console.WriteLine(device.UTCDate.ToLocalTime()); + device.SlewToAltAz(150, 50); + //device.CommandBlind(":Sa+30*00'00#", true); + //device.CommandBlind(":Sz50*00#", true); + //device.CommandBlind(":MA#", true); + //Console.WriteLine($"Ra {device.RightAscension}"); + //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); - + Console.WriteLine($"Altitude {device.Altitude}"); + Console.WriteLine($"Azimuth {device.Azimuth}"); + device.Connected = false; Console.WriteLine("Press Enter to finish"); Console.ReadLine(); diff --git a/TestConsole/Properties/AssemblyInfo.cs b/TelescopeTestConsole/Properties/AssemblyInfo.cs similarity index 93% rename from TestConsole/Properties/AssemblyInfo.cs rename to TelescopeTestConsole/Properties/AssemblyInfo.cs index 86599a1..2b89b32 100644 --- a/TestConsole/Properties/AssemblyInfo.cs +++ b/TelescopeTestConsole/Properties/AssemblyInfo.cs @@ -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("")] diff --git a/TestConsole/TestConsole.csproj b/TelescopeTestConsole/TelescopeTestConsole.csproj similarity index 92% rename from TestConsole/TestConsole.csproj rename to TelescopeTestConsole/TelescopeTestConsole.csproj index 4392996..61210c5 100644 --- a/TestConsole/TestConsole.csproj +++ b/TelescopeTestConsole/TelescopeTestConsole.csproj @@ -8,15 +8,15 @@ {D5207217-61C7-4E94-8097-91DBACE57D2A} Exe Properties - TestConsole - TestConsole - v4.6 + ASCOM.Meade.net + ASCOM.Meade.net.Test + v4.7.1 512 - x64 + AnyCPU true full false diff --git a/TelescopeTestConsole/app.config b/TelescopeTestConsole/app.config new file mode 100644 index 0000000..70dcdba --- /dev/null +++ b/TelescopeTestConsole/app.config @@ -0,0 +1,3 @@ + + +