Développer des extensions pour Jedicut

Des extensions pour plus de compatibilité

Une extension (ou plugin) est un module additionnel s’intégrant dans l’écosystème d’un logiciel, permettant d’ajouter une ou plusieurs fonctionnalités à ce dernier. Les extensions offrent donc à tout le monde la possibilité de faire évoluer Jedicut.

Les extensions de Jedicut sont publiées en open source sous licence LGPL, et elles sont centralisées sur le dépôt GitHub de Jedicut. Tout contributeur est le bienvenue 😉

Il y a actuellement 2 types d’extension dans Jedicut :

  • Les extensions de fichier : ces extensions permettent à Jedicut de lire des fichiers dans différents formats (DXF, DAT, PRF…).
  • Les extensions de communication : ces extensions permettent à Jedicut de communiquer avec différents type de carte de contrôle CNC (carte de contrôle CNC sur port parallèle, Arduino sur port USB, Génération de GCode…)

L’objectif de cette page est de présenter la structure de ces extensions afin que tout le monde puisse participer au projet.

Pré requis

Des logiciels de programmation en Pascal gratuit (Delphi)

Jedicut est un logiciel développé avec Delphi 7 (édition personnelle gratuite), et la JVCL (bibliothèque open source de composants Delphi). Il est possible d’utiliser d’autres EDI tel que Lazarus (gratuit) et les nouvelles versions de Delphi éditées par Embarcadero (gratuit ou payant).

Autres langages de programmation : C++, Visual Basic…

Théoriquement, un plugin devrait pouvoir être développé dans n’importe quel langage de programmation. Les passionnés de C++ ou de Visual basic peuvent développer leur plugin pour Jedicut. Les types de données sont compatibles avec de nombreux langages de programmation.

Si des personnes souhaitent participer au développement des plugins avec un autre langage de programmation, qu’elles me contactent via le forum de Jedicut.

Informations communes aux 2 types d’extension

Les fonctions communes

Déterminer le type d’extension

Jedicut supporte actuellement 2 types d’extensions. Chaque type d’extension possède des sous-types permettant de qualifier plus précisément l’extension utilisée et ses capacités.

function GetDllFamily : byte; export

Les valeurs que doit renvoyer cette fonction pour les extensions de communication :

  • 0 : extension de communication envoyant des ordres de rotation pas à pas (exemple : communication sur port parallèle).
  • 7 : extension de communication envoyant des groupes de pas (exemple : génération de fichier GCode).

Les valeurs que doit renvoyer cette fonction pour les extensions de fichier :

  • 1 : extension permettant d’ouvrir et de sauvegarder des fichiers de profils.
  • 2 : extension permettant de uniquement ouvrir un fichier de profil.
  • 3 : extension permettant de uniquement sauvegarder un profil dans un format donné.
  • 4 : extension permettant d’ouvrir et de sauvegarder un fichier de découpe (profils, réglages et options de la découpe).
  • 5 : extension permettant uniquement de lire un fichier de découpe.
  • 6 : extension permettant uniquement d’écrire un fichier de découpe.

Par défaut : Si cette fonction n’est pas implémentée, Jedicut considèrera que le plugin est de type 0.

Afficher la description de l’extension

Jedicut utilise la description de l’extension dans 2 cas de figure :

  • Pour les extension de communication, Jedicut affiche la description de l’extension lorsqu’elle est sélectionnée dans les options de Jedicut.
  • Pour les extensions de fichier, Jedicut affiche la description de l’extension lorsque l’utilisateur.
procedure GetDescription(Cible : PChar; tailleCible: integer); export

Les extensions de communication

Les types de données

Jedicut et les extensions de communication doivent utiliser les mêmes types de données pour pouvoir se comprendre.

{ Caractéristique d'un matériaux }
{ }
type
  PMateriau = ^TMateriau;
  TMateriau = packed record
    vitesse1 : double;
    pourcentage1 : double;
    vitesse2 : double;
    pourcentage2 : double;
  end;

{ Type d'identification d'un registre du port parallèle }
{ - 0 : registre de données
  - 1 : registre de statut /!\ LECTURE SEULE /!\
  - 2 : registre de commande }
{ }
type
  TBitPort = packed record
    adresseBase, iRegistre, iBit : integer;
  end;

{ Caractéristique de la communication }
{ }
type
  TParametreCommunication = packed record
    BitModeChauffe, BitHorlogeExterne, BitEmissionChauffe, BitReceptionChauffe, BitAlimMoteur : TBitPort;
    synchroniserMoteurAvecTimerExterne : boolean; // true si un timer externe est utilisé pour gérer le mouvement des moteurs
	frequenceTimer : double; // Fréquence en kHz
  end;

{ Caractéristique de la chauffe }
{ }
type
  TParametreChauffe = packed record
    chauffeActive, chauffeMode, chauffeDynamique : boolean;
    chauffeUtilisateur : boolean; // parametre utile lors du pilotage manuel de la machine pour activer/désactiver la chauffe
  end;


{ Informations nécessaires pour UNE rotation moteur }
{ }
type
  TOrdreMoteur = packed record
    bitRotation : Byte; // Bit de rotation moteur
    bitSens : Byte;     // Bit de sens moteur
    vitesse : integer;  // Durées d'impulsion (vitesse)
    chauffe : double;   // Pourcentage de chauffe
    keyPoint : boolean;
  end;

{ Tableau d'ordres moteurs }
{ }
type
  TArrayOrdresMoteur = packed record
    ArrayOrdres : array of TOrdreMoteur;
  end;

{ Définition des constantes communes aux dll }
const DLL_FAMILY_COM = 0; // Jedicut calculate and send steps
const DLL_FAMILY_COM_SEGMENT = 7; // Jedicut calculate segment (cutting wizard needed). Another software have to interpolate this
const DLL_FAMILY_FILE_PROFIL = 1;
const DLL_FAMILY_FILE_PROFIL_READ_ONLY = 2;
const DLL_FAMILY_FILE_PROFIL_WRITE_ONLY = 3;
const DLL_FAMILY_FILE_CUT = 4;
const DLL_FAMILY_FILE_CUT_READ_ONLY = 5;
const DLL_FAMILY_FILE_CUT_WRITE_ONLY = 6;

{ Définition des constantes spécifiques aux dll de communication}
const NO_ERROR = 0;
const ERROR_TIME_OUT = -1;
const ERROR_ON_SENDING = -2;

Les fonctions

Activer la carte de contrôle CNC

Certaines cartes CNC nécessitent d’être « activée ». Généralement ça déclenche la mise sous tension des moteurs (la carte de contrôle CNC doit être mise sous tension au préalable).

procedure MoteurOnOff(moteurOn : boolean); export;

Initialiser les paramètres de communication du plugin

Cette fonction permet à Jedicut de configurer l’extension de communication en fonction des réglages fait dans Jedicut.

Elle prend en paramètre :

  • L’adresse de base du port parallèle,
  • La configuration de la chauffe du fil,
  • La configuration des moteurs,
  • Les paramètres du matériau sélectionné pour cette découpe.
procedure InitialiserChauffeEtCommunication(portBase : word ;
                                              ParamChauffe : TParametreChauffe ;
                                              ParamCommunication : TParametreCommunication ;
                                              Materiau : TMateriau); export;

Envoyer un ordre de rotation à la machine

Cette fonction permet d’envoyer un ordre à la carte de contrôle CNC.

Elle prend en paramètre :

  • Numéro du ou des bits de rotation,
  • Valeur de la vitesse de déplacement (temps de pause),
  • Valeur de la chauffe.
function EmettreBit(bitRotation, bitSens : byte ; vitesse : integer ; chauffe : double) : integer; export;

Libérer la mémoire en fin de déplacement

Après avoir mis la machine à « Off », il faut appeler cette méthode pour libérer la mémoire de l’ordinateur en fin de découpe.

procedure LibererRessources; export;

Les extensions de fichier

Les types de données

Jedicut et les extensions de fichier doivent utiliser les mêmes types de données pour pouvoir se comprendre.

{ Définition des constantes communes aux dll }
const DLL_FAMILY_COM = 0;
const DLL_FAMILY_FILE_PROFIL = 1;
const DLL_FAMILY_FILE_PROFIL_READ_ONLY = 2;
const DLL_FAMILY_FILE_PROFIL_WRITE_ONLY = 3;
const DLL_FAMILY_FILE_CUT = 4;
const DLL_FAMILY_FILE_CUT_READ_ONLY = 5;
const DLL_FAMILY_FILE_CUT_WRITE_ONLY = 6;

{--- Définition des constantes spécifiques aux dll de fichier ---}

{ Définition d'un point d'un profil }
type
  TPointProfil = record
    X : double;
    Y : double;
    keyPoint : boolean;
    valChauffe : double;
  end;

{ Définition des coordonnées d'un profil }
type
  TCoordonneesProfil = record
    coordonneesExDecoupe : array of TPointProfil;
    coordonneesInDecoupe : array of TPointProfil;
  end;

Les fonctions

Indiquer quel extension de fichier est gérée par l’extension

Jedicut utilise cette fonction lorsqu’un utilisateur souhaite ouvrir ou enregistrer un fichier (dans la boîte de dialogue).

procedure GetFileExtension(Format : PChar; tailleCible: integer); export

Ouvrir un fichier

Jedicut utilise cette fonction pour ouvrir et lire un fichier. Attention, l’objectif ici est de charger en mémoire toutes les informations contenu dans le profil et qui pourrait intéresser Jedicut. Ces données seront récupérées ensuite.

function OpenFileDll(Src : PChar ; var nbEx, nbIn : integer) : smallInt; export

Récupérer le nom du profil

Après avoir ouvert et lu un fichier, Jedicut appelle cette fonction pour récupérer le nom du profil

procedure GetProfileName(Cible : PChar; tailleCible: integer); export

Récupérer les points du profils dans Jedicut

Après avoir ouvert et lu le fichier vient la fonction précédente, Jedicut appelle cette fonction pour récupérer tous les points qui ont été lus.

function LoadFileDll(var Profil : TCoordonneesProfil) : smallInt; export

Récupérer la description du profil

Après avoir ouvert et lu le fichier, Jedicut appelle cette fonction pour récupérer une éventuelle description du profil. Certains formats de fichier permettent d’associer un commentaire ou un descriptif, c’est toujours pratique.

procedure GetProfileDescription(Cible : PChar; tailleCible: integer); export

Sauvegarder un profil

Jedicut utilise cette fonction pour enregistrer le profil modifié dans Jedicut

function SaveFileDll(Dest : PChar) : smallInt; export

 

Cette documentation n’est pas parfaite, mais elle donnera les bases pour les plus curieux qui se repèreront plus facilement dans le code des extensions.

Je complèterai cette documentation en fonction des retours que j’aurai. J’ai également prévu de développer des Starter Kit pour proposer des squelettes de programme et ainsi faciliter le développement de nouvelles extensions.

Si vous avez des questions, utilisez le forum 😉