Cette page vous explique comment programmer sous Delphi un plugin qui
vous permettra de piloter votre moteur de mis au point (focuser) à
partir de TeleAuto Version 4 et supérieures. Pour l'instant ce
plugin à toutes les fonctions nécessaires pour écrire
des plugins pour les caméra déjà pilotées par
TeleAuto.
Si les fonctions disponibles ne sont pas suffisantes pour piloter votre
caméra ou si vous avez besoin de renseignements, n'hésistez
pas à contacter Philippe.
Quel est l'interêt d'avoir un plugin focuser dans TeleAuto ?
La programmation des interfaces avec le matériel en général
et avec les caméras CCD en particulier et extrèmement délicat
et nécéssite presque obligatoirement de posséder le
focuser en question. Les auteurs de TeleAuto n'étant pas
assez fortunés pour acheter tous les focusers que les utilisateurs
voudraient voir intégrer dans TeleAuto, le plugin a été
adopté.
Cette méthode permettra de simplifier les choses puisque les
utilisateurs programmeurs pourront intégrer eux même leur
caméra. Les auteurs n'auront plus a s'occuper d'écrire et
maintenir les drivers pour d'autres focusers. Ceci est un avantage
car l'écriture d'un tel driver est très aléatoire
sans avoir le focuser branchée au PC. De plus il est nésessaire,
de tester chaque focuser chaque mises à jour de la partie focuser de TeleAuto.
Au prix d'un petit travail de programmation, les utilisateurs auront l'assurance
de voir leur caméra correctement fonctionner et mise à jour dans
TeleAuto, chose impossible à garantir pour les auteurs.
Comment se présente le plugin Focuser ?
C'est une librairie dynamique (.dll) écrite dans le language
de votre choix et ayant le nom de votre choix. Essayez tout de même
de choisir un nom personnalisé permettant d'avoir une dll différente
par type de Focuser. Par exemple préférez 'LX200.dll'
à 'Plugin.dll'.
Cette librairie doit mettre à disposition de TeleAuto toutes
les procédures et fonctions listées dans la suite de cette
page.
Cette librairie doit être placée dans le même répertoire
que l'exécutable TeleAuto.exe et doit être déclarée
dans l'onglet 'Caméra' de la fenêtre de configuration de TeleAuto.
Pour se faire, cliquez sur le type de focuser 'Plugin' et indiquez
le nom de la librairie.
Quelles sont les procédures et fonctions qui doivent être
présents dans la librairie plugin ?
Voici la liste des procédures et fonctions à coder dans
la libraire. Chaque déclaration de procédure et de fonction
dans ce chapitre est suivie d'une explication sur ce que vous devez y programmer.
La forme est ici celle de Delphi. Veillez voir plus loin dans cette page
pour avoir des informations sur l'écriture dans d'autres languages.
function PluginSetComPort(ComPort:PChar):Boolean; cdecl; Cette procédure est utilisée par TeleAuto pour passer au plugin
le choix du port série fait par l'utilisateur dans la configuration.
function PluginSetComPort(ComPort:PChar):Boolean; cdecl;
begin
// Sauver le réglage du port série
NomCom:=ComPort;
Result:=True;
end;
function PluginSetSerialPortTimeOut(_ReadIntervalTimeout:DWord;_ReadTotalTimeoutMultiplier:DWord;
_ReadTotalTimeoutConstant:DWord;_WriteTotalTimeoutMultiplier:DWord;_WriteTotalTimeoutConstant:DWord):Boolean; cdecl; Cette procédure est utilisée par TeleAuto pour passer au plugin
le réglage des times-outs du port série fait par l'utilisateur dans la configuration.
function PluginSetSerialPortTimeOut(_ReadIntervalTimeout:DWord;_ReadTotalTimeoutMultiplier:DWord;
_ReadTotalTimeoutConstant:DWord;_WriteTotalTimeoutMultiplier:DWord;_WriteTotalTimeoutConstant:DWord):Boolean; cdecl;
begin
// Sauver les valeurs des times-outs
ReadIntervalTimeout :=_ReadIntervalTimeout;
ReadTotalTimeoutConstant :=_ReadTotalTimeoutMultiplier;
ReadTotalTimeoutConstant :=_ReadTotalTimeoutConstant;
WriteTotalTimeoutMultiplier :=_WriteTotalTimeoutMultiplier;
WriteTotalTimeoutConstant :=_WriteTotalTimeoutConstant;
Result:=True;
end;
function PluginOpen:Boolean; cdecl; Cette procédure doit contenir le code d'initialisation du
focuser éventuellement nécessaire. Elle peut rester
vide.
Elle est appelée par TeleAuto à chaque connection du
Focuser. et retourne True si tout c'est bien passé
procedure PluginOpen; cdecl;
begin
Result:=True;
end;
procedure PluginClose; cdecl; Cette procédure doit contenir le code de fermeture du Focuser
éventuellement nécessaire. Elle peut rester vide.
Elle est appelée par TeleAuto à chaque déconnexion du Focuser
procedure PluginClose; cdecl;
begin
end;
function PluginSetHandleCom(_hCom:Integer):Boolean; cdecl; Cette fonction est appelée quand le focuser est dépendant du téléscope
Elle est appelée par TeleAuto pour donner le handle du port série du
téléscope au plugin
function PluginSetHandleCom(_hCom:Integer):Boolean; cdecl;
begin
hCom:=_hCom;
Result:=True;
end;
function PluginIsConnectedAndOK:Boolean; cdecl; Cette fonction doit tester si le Focuser est branché et est en état de fonctionnement.
Elle doit retourner la valeur True si cela est le cas.
Elle est appellée par TeleAuto à chaque connexion du focuser.
function PluginIsConnectedAndOK:Boolean; cdecl;
begin
// Allways true for this virtual focuser
Result:=True;
end;
function PluginPasAPas:Boolean; cdecl; TeleAuto utilise cette fonctions pour savoir si le focuser utilise un moteur pas à pas
comme le RoboFocus. Si c'est le cas des fonctions suplémentaires indiquées plus bas sont
utilisées.
function PluginPasAPas:Boolean; cdecl;
begin
Result:=False;
end;
function PluginHas2Vitesses:Boolean; cdecl; TeleAuto utilise cette fonction pur savoir si le Focuser possède 2 vitesses.
function PluginHas2Vitesses:Boolean; cdecl;
begin
Result:=True;
end;
function PluginUseComPort:Boolean; cdecl; TeleAuto utilise cette fonctions pour avoir si le Focuser utilise un port série.
function PluginUseComPort:Boolean; cdecl;
begin
Result:=True;
end;
function PluginIsDependantOfTheScope:Boolean; cdecl; TeleAuto utilise cette fonction pour savoir si le Focuser fait partie du télescope comme
pour le LX200. TeleAuto connectera alors le télecope en premier.
function PluginIsDependantOfTheScope:Boolean; cdecl;
begin
Result:=False;
end;
function PluginMustSetMaxPosition:Boolean; cdecl; TeleAuto utlise cette fonction pour savoir si le focuser à besoin de connaitre la
valeur de position maximum réglée par l'utilisateur dans la configuration.
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginMustSetMaxPosition:Boolean; cdecl;
begin
Result:=False;
end;
function PluginGetMinPosition:Integer; cdecl; TeleAuto utilise cette fonction pour obtenir la valeur de position minimum du focuser.
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginGetMinPosition:Integer; cdecl;
begin
Result:=0;
end;
function PluginGetMaxPosition:Integer; cdecl; TeleAuto utilise cette fonction pour obtenir la valeur de position maximum du focuser.
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginGetMaxPosition:Integer; cdecl;
var
MaxPosition:Integer;
begin
// Get max position from the focuser here
Result:=MaxPosition;
end;
function PluginDeplaceMapTime(DirectionFocuser:Integer;SpeedFocuser:Integer):Boolean; cdecl; TeleAuto utilise cette fonction pour demander le début du déplacement du Focuser dans la direction
DirectionFocuser avec la vitesse SpeedFocuser
Les valeurs à utiliser pour la direction sont :
Marche avant : DirectionFocuser = 0
Marceh arrière : DirectionFocuser = 1
Les valeurs à utiliser pour la vitesse sont :
Rapide : SpeedFocuser = 2
Lente : SpeedFocuser = 3
function PluginDeplaceMapTime(DirectionFocuser:Integer;SpeedFocuser:Integer):Boolean; cdecl;
begin
Result:=True;
end;
function PluginArreteMapTime:Boolean; cdecl; TeleAuto utilise cette fonction arrêter tout mouvement.
function PluginArreteMapTime:Boolean; cdecl;
begin
Result:=True;
end;
function PluginDeplaceMapSteps(DirectionFocuser:Integer;StepsFocuser:Integer):Boolean; cdecl; TeleAuto utilise cette fonction pour demander le déplacement du Focuser dans la direction
DirectionFocuser d'un nombre de pas égal à StepsFocuser
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginDeplaceMapSteps(DirectionFocuser:Integer;StepsFocuser:Integer):Boolean; cdecl;
begin
Result:=True;
end;
function PluginGetPosition(var _Position:Integer):Boolean; cdecl; TeleAuto utilise cette fonction pour connaître la position courante du Focuser.
Utilisez la pour lire la position du focuser et la retourner à TeleAuto.
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginGetPosition(var _Position:Integer):Boolean; cdecl;
begin
Result:=True;
end;
function PluginSetPosition(_Position:Integer):Boolean; cdecl; TeleAuto utilise cette fonction pour régler la position courante du Focuser.
Utilisez la pour lire recevoir la position de TeleAuto puis l'envoyer au Focuser.
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginSetPosition(_Position:Integer):Boolean; cdecl;
begin
Result:=True;
end;
function PluginGotoPosition(_Position:Integer):Boolean; cdecl; TeleAuto utilise ette fonction pour demander le déplacement du Focuser sur la
position _Position
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginGotoPosition(_Position:Integer):Boolean; cdecl;
begin
Result:=True;
end;
function PluginSetMaxPosition(_MaxPosition:Integer):Boolean; cdecl; TeleAuto utilise cette fonction pour régler la position maximum du Focuser
Cette fonction n'est valide que si PluginPasAPas retourne True.
function PluginSetMaxPosition(_MaxPosition:Integer):Boolean; cdecl;
begin
//Send _MaxPosition to focuser here
Result:=True;
end;
function PluginSetBacklash(_BackLash:Integer):Boolean; cdecl; Cette fonction n'est pas encore utilisée par TeleAuto
function PluginSetBacklash(_BackLash:Integer):Boolean; cdecl;
begin
Result:=True;
end;
function PluginGetFirmware(_FirmWare:string):Boolean; cdecl; Cette fonction n'est pas encore utilisée par TeleAuto
function PluginGetFirmware(_FirmWare:string):Boolean; cdecl;
begin
Result:=True;
end;
function PluginGetErrorNumber:Integer; cdecl; Cette fonction est utilisée par TeleAuto quand une erreur est arrivée pour en
récuperer son numéro
function PluginGetErrorNumber:Integer; cdecl;
begin
Result:=InternalError;
end;
La correspondance numéro/message d'erreur est la suivante
1 : Impossible d'ouvrir le port série
2 : Le télescope n'accepte pas le réglage rapide du focuseur
3 : Le télescope n'accepte pas le réglage lent du focuseur
4 : Le télescope n'accepte pas le réglage haut du focuseur
5 : Le télescope n'accepte pas le réglage bas du focuseur
6 : Le télescope n'accepte pas l'arrêt du focuseur
7 : Nombre de pas invalide
8 : Le focuseur n'accepte pas d'aller vers l'avant
9 : Le focuseur n'accepte pas d'aller vers l'arrière
10 : Direction invalide
11 : Le focuseur n'accepte pas la commande
12 : Le focuseur n'accepte la demande de position
13 : Le focuseur ne réponds pas à la demande de position
14 : Le focuseur n'accepte pas la mise à jour de position
15 : Le focuseur ne réponds pas à la mise à jour de position
16 : Le focuseur n'accepte pas la mise à jour de la position maximum
17 : Le focuseur ne réponds pas à la mise à jour de la position maximum
18 : Le focuseur n'accepte pas la mise à jour de l'hystéresis
19 : Le focuseur ne réponds pas à la mise à jour de l'hystéresis
20 : Le focuseur n'accepte pas la demande de déplacement
21 : Le focuseur n'accepte pas la demande du Firmware
22 : Le focuseur ne réponds pas à la demande du Firmware
Voici quelques informations qui je l'espère vous seront utiles
:
Tout d'abord les conventions d'appel des fonctions est celui du C pour
faciliter l'écriture de plugins dans ce language.
Les chaînes de caratères utilisées sont à
zéro terminal toujours pour faciliter l'écriture de plugins
en C.
Concernant les types de données delphi, voici quelques informations
qui devraient vous permettre de faire la correspondance avec votre langage
:
Nom du type
Etendue
Format
Smallint
–32768..32767
Entier 16 bits signé
Integer
–2147483648..2147483647
Entier 32 bits signé
Word
0..65535
Entier 16 bits non signé
Double
5.0 x 10^–324 .. 1.7 x 10^308
Flottant 8 octets
Le type Boolean occupe un octet en mémoire. Il prends la valeur
False quand sa valeur numérique équivalente est 0 et la valeur
True pour toutes les autres valeurs numériques équivalentes.