Client ASCOM avec VS
Michel Llibre - Novembre 2024
Sites de téléchargement pour les outils utilisés :
•Visual Studio : https://visualstudio.microsoft.com/fr/vs/community/
•Plateforme ASCOM : https://ascom-standards.org/Downloads/Index.htm
•Développement ASCOM : https://ascom-standards.org/Downloads/PlatDevComponents.htm
La plateforme Ascom est installé dans :
C:\Program Files (x86)\ASCOM\Platform 6
Les outils de développement sont ici :
C:\Program Files (x86)\ASCOM\Platform 6 Developer Components
et la documentation est ici :
C:\Program Files (x86)\ASCOM\Platform 6 Developer Components\Developer Documentation
Pour pouvoir inclure les bibliothèques ASCOM dans le projet, on doit faire un projet C# pour Windows de type ".Net Framework", et non pas ".Net Core" qui ne permet pas d'inclure les Assemblys ASCOM.
On peut donc créer un projet "Windows Console" ou "Windows Forms" et ensuite dans l'Explorateur de Solution de VS, il faut aller dans les Properties du Projet, rubrique Références, faire un clic droit "Ajouter une référence..." et dans la fenêtre qui s'ouvre choisir Assemblys puis Extensions et sélectionner les extensions souhaitées ce qui permettra à l'auto-compléteur de proposer les éléments disponibles. Les 3 principales références à ajouter sont :
•ASCOM.Utilities pour les utilitaires,
•ASCOM.DriverACCES (désigné ASCOM Client Toolkit dans les Assemblys Visual Studio) pour les commandes des périphériques (Telescope c'est-à-dire monture, Camera...)
•ASCOM.DevicesInterfaces pour les classes génériques de divers paramètres comme les énumérations de mode de fonctionnement des périphériques...
Si dans Visual Studio on a installé l'extension "Plateforme ASCOM" par le biais du menu Extensions/Gérer les extensions/..., cette extension offre des patrons prédéfinis pour créer des applications C# Console ou WinForms avec les références aux bibliothèques ASCOM déja intégrées. Le menu créer un nouveau projet prose alors les 3 patrons suivants :
Le problème est que ces patrons sont prédéfinis pour tester un driver de périphérique, ce qui fait qu'il faut en choisir un : Camera, Focuser, Telescope... puis fournir son nom du genre ASCOM.nom.perif où perif = Camera ou Focuser ou Telescope... et où nom est le nom du périphérique. Si on ne connait pas le nom, on peut mettre n'importe quoi ou bien si on veut vraiment accéder à un périphérique existant : lancer l'application ASCOM Diagnostics, choisir l'onglet Choose Device puis Choose and Connect Device, sélectionner le type de périf (Telescope, Camera, Focuser...) puis appuyer sur le bouton Choose qui ouvre l'utilitaire Chooser d'ASCOM dans lequel il y a la liste des éléments accessibles. On en choisit un ce qui va provoquer l'affichage du nom recherché (du type ASCOM.lenom.perif) dans la fenêtre de l'appli Diagnostif sous le nom du périphérique, en face du bouton Connect. C'est ce nom qu'on fournira.
Pour essayer tester la mini-application suivante :
#define UseChooser //Pour utiliser l'ASCOM Chooser au lieu du nom rentré à la configuration
using System;
namespace ASCOM { class Program { static void Main(string[] args) {
// Appel du Chooser ASCOM
#if UseChooser
string idname = ASCOM.DriverAccess.Telescope.Choose("");
if (string.IsNullOrEmpty(idname)) return;
// Création de l'instance de pépriphérique
ASCOM.DriverAccess.Telescope perif = new ASCOM.DriverAccess.Telescope(id);
#else
ASCOM.DriverAccess.Telescope device = new ASCOM.DriverAccess.Telescope("ASCOM.ASCOM.toto.Telescop.Telescope");
#endif
device.Connected = true; //Connexion au périphérique
Console.WriteLine($"Name: {perif .Name}");
Console.WriteLine($"Description: {perif .Description}");
Console.WriteLine($"DriverInfo: {perif .DriverInfo}");
device.Connected = false; //Déconnexion du périphérique
Console.WriteLine("Press Enter to finish"); Console.ReadLine();
}}}
Une application un peu plus fournie, donne les infos suivantes sur la monture Zwo AM5 :
Connected to = ASCOM.ASIMount.Telescope
DRIVER
DriverInfo = ASCOM.ASIMount.Telescope, Version=6.5.8.0, Culture=neutral, PublicKeyToken=5a596dde3293c610
DriverVersion = 6.5.8.0
InterfaceVersion = 3
Description = ASI Mount
Name = AM5
TYPE
SupportedActions :
AlignmentMode = algGermanPolar
SiteLatitude = 43.5130555555556
SiteLongitude = 1.5575
CAPACITES
CanFindHome = True
CanPark = False
CanPulseGuide = True
CanSetDeclinationRate = False
CanSetGuideRates = True
CanSetPark = False
CanSetPierSide = False
CanSetRightAscensionRate = False
CanSetTracking = True
CanSlew = True
CanSlewAltAz = False
CanSlewAltAzAsync = False
CanSlewAsync = True
CanSync = True
CanSyncAltAz = False
CanUnpark = False
CanMoveAxis(premier) = True
CanMoveAxis(second) = True
CanMoveAxis(ter) = False
AxisRates
Il y a 1 rates en AD axe 0)
Max=6°/s, Min=0°/s
Il y a 1 rates en DEC (axe 1)
Max=6°/s, Min=0°/s
Il y a 0 rates sur axe tertiaire (2)
TrackingRates
DriveRate = driveSidereal
DriveRate = driveLunar
DriveRate = driveSolar
PARAMETRES DEPLACEMENTS
Current LST = 06:34:48
Current RA = 12:11:32
Current DEC = 90° 00' 00"
CanSetTracking = True
T.Tracking vaut : on.
On met T.Tracking sur off...
T.Tracking vaut : off.
Attente 5 secondes...
On met T.Tracking sur on...
T.Tracking vaut : on.
PARAMETRES SITE
Latitude = 43° 30' 47"
Longitude = 01° 33' 27"
DateTime date = DateJulianToLocal(double ju) // ju -> date en temps local
DateTime date = DateJulianToUTC(double ju) // ju -> date en temps UTC
double ju = DateLocalToJulian(DateTime localDate) // date locale -> ju
DateTime dateTU = DateLocalToUTC(DateTime LocalDate) // date locale -> dateTU
double ju = DateUTCToJulian(DateTime dateTU) // dateTU -> ju
public DateTime date = DateUTCToLocal(DateTime dateTU) // dateTU -> date locale
string DegreesToDM(double degdec)
string DegreesToDM( double degdec, string DegDelim)
string DegreesToDM( double degdec, string DegDelim, string MinDelim)
string DegreesToDM( double degdec, string DegDelim, string MinDelim, int MinDecimalDigits)
--
string DegreesToDMS(double degdec)
...
string DegreesToDMS(double Degrees, string DegDelim, string MinDelim, string SecDelim, int SecDecimalDigits)
IDEM avec DegeesToHM et HMS
string HoursToHM(double Hours)
string HoursToHM(double Hours, string HrsDelim)
string HoursToHM(double Hours, string HrsDelim, string MinDelim)
string HoursToHM(double Hours, string HrsDelim, string MinDelim, int MinDecimalDigits)
string HoursToHMS(double Hours)
...
string HoursToHMS(double Hours, string HrsDelim, string MinDelim, string SecDelim, int SecDecimalDigits)
double degdec = DMSToDegrees(string DMS)
double hourdec = HMSToDegrees(string HMS)
double hourdec = HMSToHours(string HMS)
void WaitForMilliseconds(int Milliseconds)