using System;
using System.Reflection;
using System.Runtime.InteropServices;
using ASCOM.Meade.net.AstroMaths;
using ASCOM.Meade.net.Wrapper;
using ASCOM.Utilities;
namespace ASCOM.Meade.net
{
[ComVisible(false)]
public class MeadeTelescopeBase : ReferenceCountedObjectBase
{
///
/// Variable to hold the trace logger object (creates a diagnostic log file with information that you specify)
///
protected static TraceLogger Tl;
///
/// Driver description that displays in the ASCOM Chooser.
///
protected static readonly string DriverDescription = "Meade Generic";
protected static string _ComPort; // Variables to hold the currrent device configuration
protected static int _BacklashCompensation;
protected static bool _ReverseFocusDirection;
protected static bool _UseDynamicBreaking;
protected double _GuideRate;
protected string _Precision;
protected string _GuidingStyle;
protected double _SiteElevation;
protected short _ProfileSettleTime;
protected bool _SendDateTime;
protected ParkedBehaviour _ParkedBehaviour;
protected HorizonCoordinates _ParkedAltAz;
protected double _focalLength;
protected readonly ISharedResourcesWrapper SharedResourcesWrapper;
public MeadeTelescopeBase()
{
SharedResourcesWrapper = new SharedResourcesWrapper();
}
public MeadeTelescopeBase(ISharedResourcesWrapper sharedResourcesWrapper)
{
SharedResourcesWrapper = sharedResourcesWrapper;
}
protected void Initialise(string className)
{
Tl = new TraceLogger("", $"Meade.Generic.{className}");
ReadProfile(); // Read device configuration from the ASCOM Profile store
IsConnected = false; // Initialise connected to false
LogMessage(className, "Completed initialisation");
LogMessage(className, $"Driver version: {DriverVersion}");
}
///
/// Read the device configuration from the ASCOM Profile store
///
protected void ReadProfile()
{
var profileProperties = SharedResourcesWrapper.ReadProfile();
Tl.Enabled = profileProperties.TraceLogger;
_ComPort = profileProperties.ComPort;
_BacklashCompensation = profileProperties.BacklashCompensation;
_ReverseFocusDirection = profileProperties.ReverseFocusDirection;
_UseDynamicBreaking = profileProperties.DynamicBreaking;
_GuideRate = profileProperties.GuideRateArcSecondsPerSecond;
_Precision = profileProperties.Precision;
_GuidingStyle = profileProperties.GuidingStyle.ToLower();
_SiteElevation = profileProperties.SiteElevation;
_ProfileSettleTime = profileProperties.SettleTime;
_SendDateTime = profileProperties.SendDateTime;
_ParkedBehaviour = profileProperties.ParkedBehaviour;
_ParkedAltAz = new HorizonCoordinates
{
Altitude = profileProperties.ParkedAlt,
Azimuth = profileProperties.ParkedAz
};
_focalLength = profileProperties.FocalLength;
LogMessage("ReadProfile", $"Trace logger enabled: {Tl.Enabled}");
LogMessage("ReadProfile", $"Com Port: {_ComPort}");
LogMessage("ReadProfile", $"Backlash Steps: {_BacklashCompensation}");
LogMessage("ReadProfile", $"Dynamic breaking: {_UseDynamicBreaking}");
LogMessage("ReadProfile", $"Guide Rate: {_GuideRate}");
LogMessage("ReadProfile", $"Precision: {_Precision}");
LogMessage("ReadProfile", $"Guiding Style: {_GuidingStyle}");
LogMessage("ReadProfile", $"Site Elevation: {_SiteElevation}");
LogMessage("ReadProfile", $"Settle Time after slew: {_ProfileSettleTime}");
LogMessage("ReadProfile", $"Send date and time on connect: {_SendDateTime}");
LogMessage("ReadProfile", $"Parked Behaviour: {_ParkedBehaviour}");
LogMessage("ReadProfile", $"Parked Alt: {_ParkedAltAz.Altitude}");
LogMessage("ReadProfile", $"Parked Az: {_ParkedAltAz.Azimuth}");
LogMessage("ReadProfile", $"Focal Length: {_focalLength}");
}
///
/// Log helper function that takes formatted strings and arguments
///
///
///
///
public static void LogMessage(string identifier, string message, params object[] args)
{
var msg = string.Format(message, args);
Tl.LogMessage(identifier, msg);
}
///
/// Returns true if there is a valid connection to the driver hardware
///
protected bool IsConnected { get; set; }
public string Description
{
get
{
Tl.LogMessage("Description Get", DriverDescription);
return DriverDescription;
}
}
public string DriverInfo
{
get
{
string driverInfo = $"{Description} .net driver. Version: {DriverVersion}";
LogMessage("DriverInfo Get", driverInfo);
return driverInfo;
}
}
public string DriverVersion
{
get
{
Version version = Assembly.GetExecutingAssembly().GetName().Version;
string driverVersion = $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}";
LogMessage("DriverVersion Get", driverVersion);
return driverVersion;
}
}
#region ASCOM Registration
private static IProfileFactory _profileFactory;
public static IProfileFactory ProfileFactory
{
get => _profileFactory ?? (_profileFactory = new ProfileFactory());
set => _profileFactory = value;
}
#endregion
protected void UpdateSiteElevation()
{
var profileProperties = SharedResourcesWrapper.ReadProfile();
profileProperties.SiteElevation = _SiteElevation;
SharedResourcesWrapper.WriteProfile(profileProperties);
}
}
}