diff --git a/ASCOM.MeadeAutostar497.Focuser.Validation.txt b/ASCOM.MeadeAutostar497.Focuser.Validation.txt new file mode 100644 index 0000000..8dedf49 --- /dev/null +++ b/ASCOM.MeadeAutostar497.Focuser.Validation.txt @@ -0,0 +1,68 @@ +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/MeadeAutostar497/AscomClasses/Telescope.cs b/MeadeAutostar497/AscomClasses/Telescope.cs index 9892ea6..b9acd64 100644 --- a/MeadeAutostar497/AscomClasses/Telescope.cs +++ b/MeadeAutostar497/AscomClasses/Telescope.cs @@ -949,22 +949,22 @@ namespace ASCOM.MeadeAutostar497 #region IFocuser Implementation - private int focuserPosition = 0; // Class level variable to hold the current focuser position - private const int focuserSteps = 10000; + //private int focuserPosition = 0; // Class level variable to hold the current focuser position + //private const int focuserSteps = 10000; public bool Absolute { get { - tl.LogMessage("Absolute Get", true.ToString()); - return true; // This is an absolute focuser + tl.LogMessage("Absolute Get", false.ToString()); + return false; // This is an absolute focuser } } public void Halt() { - tl.LogMessage("Halt", "Not implemented"); - throw new ASCOM.MethodNotImplementedException("Halt"); + tl.LogMessage("Halt", "Halting"); + _telescopeController.FocuserHalt(); } public bool IsMoving @@ -994,8 +994,9 @@ namespace ASCOM.MeadeAutostar497 { get { - tl.LogMessage("MaxIncrement Get", focuserSteps.ToString()); - return focuserSteps; // Maximum change in one move + var maxIncrement = _telescopeController.FocuserMaxIncrement; + tl.LogMessage("MaxIncrement Get", maxIncrement.ToString()); + return maxIncrement; // Maximum change in one move } } @@ -1003,22 +1004,25 @@ namespace ASCOM.MeadeAutostar497 { get { - tl.LogMessage("MaxStep Get", focuserSteps.ToString()); - return focuserSteps; // Maximum extent of the focuser, so position range is 0 to 10,000 + var maxStep = _telescopeController.FocuserMaxStep; + tl.LogMessage("MaxStep Get", maxStep.ToString()); + return maxStep; } } public void Move(int Position) { tl.LogMessage("Move", Position.ToString()); - focuserPosition = Position; // Set the focuser position + _telescopeController.FocuserMove(Position); + //focuserPosition = Position; // Set the focuser position } public int Position { get { - return focuserPosition; // Return the focuser position + throw new ASCOM.PropertyNotImplementedException("Position", false); + //return focuserPosition; // Return the focuser position } } diff --git a/MeadeAutostar497/Controller/FirmwareVersion.cs b/MeadeAutostar497/Controller/FirmwareVersion.cs new file mode 100644 index 0000000..bdd0976 --- /dev/null +++ b/MeadeAutostar497/Controller/FirmwareVersion.cs @@ -0,0 +1,34 @@ +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/ITelescopeController.cs b/MeadeAutostar497/Controller/ITelescopeController.cs index 06698ea..a31d9d9 100644 --- a/MeadeAutostar497/Controller/ITelescopeController.cs +++ b/MeadeAutostar497/Controller/ITelescopeController.cs @@ -21,6 +21,8 @@ namespace ASCOM.MeadeAutostar497.Controller 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(); @@ -32,5 +34,7 @@ namespace ASCOM.MeadeAutostar497.Controller 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/TelescopeController.cs b/MeadeAutostar497/Controller/TelescopeController.cs index db3916d..209dd09 100644 --- a/MeadeAutostar497/Controller/TelescopeController.cs +++ b/MeadeAutostar497/Controller/TelescopeController.cs @@ -97,6 +97,7 @@ namespace ASCOM.MeadeAutostar497.Controller SerialPort.Open(); TestConnectionActive(); + SetFocuserSpeedFastest(); } catch (Exception) { @@ -520,6 +521,10 @@ namespace ASCOM.MeadeAutostar497.Controller } } + public int FocuserMaxIncrement { get; set; } = 7000; + + public int FocuserMaxStep { get; set; } = 7000; + public double Altitude { get { @@ -562,14 +567,22 @@ namespace ASCOM.MeadeAutostar497.Controller } else { - _serialPort.Command(":RG#"); //Make sure we are at guide rate - _serialPort.Command($":M{d}#"); - Thread.Sleep(duration); - _serialPort.Command($":Q{d}#"); + 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}#"); + //classic only !!!, this is needed since once in a while one is not enough + Thread.Sleep(200); + _serialPort.Command($":Q{d}#"); + } + finally + { + SerialPort.Unlock(); + } } } @@ -594,10 +607,18 @@ namespace ASCOM.MeadeAutostar497.Controller public void SlewToCoordinatesAsync(double rightAscension, double declination) { - TargetRightAscension = rightAscension; - TargetDeclination = declination; + SerialPort.Lock(); + try + { + TargetRightAscension = rightAscension; + TargetDeclination = declination; - DoSlewAsync(true); + DoSlewAsync(true); + } + finally + { + SerialPort.Unlock(); + } } public void SlewToAltAz(double azimuth, double altitude) @@ -663,10 +684,18 @@ namespace ASCOM.MeadeAutostar497.Controller public void SlewToAltAzAsync(double azimuth, double altitude) { - TargetAltitude = altitude; - TargetAzimuth = azimuth; + SerialPort.Lock(); + try + { + TargetAltitude = altitude; + TargetAzimuth = azimuth; - DoSlewAsync(false); + DoSlewAsync(false); + } + finally + { + SerialPort.Unlock(); + } } public void SyncToTarget() @@ -706,145 +735,240 @@ namespace ASCOM.MeadeAutostar497.Controller private bool _movingPrimary; private bool _movingSecondary; + public void MoveAxis(TelescopeAxes axis, double rate) { - var absrate = Math.Abs(rate); - - switch(absrate) + SerialPort.Lock(); + try { - 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"); - + 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}"); } - 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; - } + if (newPosition == 0) + return; - break; - default: - throw new ASCOM.MethodNotImplementedException("Can not move this axis."); + 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) { - switch (polar) + SerialPort.Lock(); + try { - 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 (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"); + 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; - } + 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/MeadeAutostar497/MeadeAutostar497.csproj b/MeadeAutostar497/MeadeAutostar497.csproj index 6de6351..5109500 100644 --- a/MeadeAutostar497/MeadeAutostar497.csproj +++ b/MeadeAutostar497/MeadeAutostar497.csproj @@ -89,6 +89,7 @@ + diff --git a/MeadeAutostar497/Properties/AssemblyInfo.cs b/MeadeAutostar497/Properties/AssemblyInfo.cs index 2a06abf..495f3d8 100644 --- a/MeadeAutostar497/Properties/AssemblyInfo.cs +++ b/MeadeAutostar497/Properties/AssemblyInfo.cs @@ -35,5 +35,5 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // // TODO - Set your driver's version here -[assembly: AssemblyVersion("0.0.0.0")] -[assembly: AssemblyFileVersion("0.0.0.0")] +[assembly: AssemblyVersion("0.2.0.0")] +[assembly: AssemblyFileVersion("0.2.0.0")]