Programmes Clients pour

l'utilisation des Boitiers Alpha-Kilo

KAPS2C Conception 
Le Grand Chateau 
Route de la Chartreuse 
01150 SAINT SORLIN 
Tél: 04 74 35 74 84 
Ce document rassemble l'ensemble des informations pour la programmation des boitiers pour le Simulateur de Formation et d'Entrainement à la Radionavigation Aérienne Alpha-Kilo.
 

Préambule

Les boitiers sont créés à partir d'un module micro-module USB DLP-245PB. Celui-ci comprend le controleur USB "FT245BM" de FTDI et un microprocesseur "PIC 16F877" de MicroChip.

Sommaire

  1. Principe
  2. Outillage de test
  3. Fonctions des différents boitiers
  4. Séquences d'échange
  5. Exemple des programmes de test
Retour Sommaire Retour Accueil

Principe

L'accès aux données des boitiers Alpha-Kilo se fait donc par le bus USB. Le constructeur du controleur "FT245BM" fournit, pour Windows, une librairie de fonctions détaillées FTD2XX dans le document suivant.
Ce module est connecté au bus du micro-processeur PIC 16F877, et les échanges se font par un buffer fifo. La librairie exploite la fonction bit-bang pour lire et écrire des données dans le micro-processeur.
Le micro-module DLP-245PB, intégrant le controleur FT245BM et le micro-processeur 16F877, est fourni avec un ensemble de fonctions permettant les échanges entre le PC et le micro-processeur. Le protocole particulier TOKEN I/O ( document original à consulter ici ) pour ces échanges a été étendu pour les fonctions des boitiers Alpha-Kilo.

Protocol d'échange TOKEN I/O

Chaque séquence de commande contient les informations suivantes : Le micro-processeur retourne la réponse suivante :

Programme client en C++

Le squellete d'une application client sous Windows VisualC serait celle-ci
 

Initialisation et ouverture

.
.
LoadDLL();

 //attempt to open an attached FTDI device
 // ouverture du boitier Radio
 FT_STATUS status = OpenEx((PVOID)"K_Rad",FT_OPEN_BY_DESCRIPTION);

 if(status)//fail - no module
 {
  AfxMessageBox("Error: Could not open a device");
 }
 else//pass - module opened
 {
 }
 SetTimeouts(500, 500);
.
.
.
 

Envoi d'une commande au micro-processeur

SendCommandString(unsigned char *com_str, int num_bytes) {
//load Xmit buffer, add checksum, send and receive ACK (0x55)
 Purge(FT_PURGE_RX || FT_PURGE_TX);
 SetTimeouts(500, 500);

 tx[0] = num_bytes;

 int pos=1;
 for(int x=0; x<num_bytes; x++)
  tx[pos++] = com_str[x];

 //calculate checksum and append to command string
 checksum=0;
 for(x=0; x<pos; x++)
  checksum ^= tx[x];
 tx[pos++] = checksum;

 FT_STATUS status = Write(tx, pos, &ret_bytes);
 if(status != FT_OK)
 {
  //AfxMessageBox("Driver error writing to DLP module. ");
  return 0;//error
 }

 //just read in the one character we are expecting
 status = Read(rx, 1, &ret_bytes);
 if(status != FT_OK)
 {
  //AfxMessageBox("DLP module not responding to commands.");
  return 0;//error
 }

 if(ret_bytes < 1)
 {
  AfxMessageBox("Timeout occurred");
  return 0;//error
 }

 unsigned char ret = rx[0];
 if(ret == 0x55)
  return 1;//pass
 else
 {
  //AfxMessageBox("DLP module not responding to commands.");
  return 0;//error
 }
}
 

Séquence d'échange de données

 .
 .
 .
 unsigned char tx[100], rx[100];
 DWORD ret_bytes;

 UpdateData(TRUE);
 m_ID = "";
 UpdateData(FALSE);
 UpdateWindow();

 Purge(FT_PURGE_RX || FT_PURGE_TX);
 SetTimeouts(100, 100);

 //****** send command to read input pin
 int pos=0;
 tx[pos++] = 0xA7;//Return Board ID command
 int res = SendCommandString(tx, pos);//return: 0=fail, 1=pass
 if(res==0)//error
 {
  AfxMessageBox("DLP module not responding to commands.(1284)");
  return;
 }

 //read the data back in
 FT_STATUS status = Read(rx, 5, &ret_bytes);
 if(status != FT_OK)
 {
  AfxMessageBox("DLP module not responding to commands.");
  return;
 }
.
.
.

Retour Sommaire Retour Accueil

Outillage de test

Le programmeur dispose de deux types d'outillage pour simuler l'échange d'information avec les boitiers Alpha-Kilo. Le premier outil consiste à utiliser le programme DLPtest fournit par le constructeur du micro-module (version 1 gratuite, version 2 licence payante ). Le second, les programmes de test spécifique à chaque boitier AlphaKilo-Test.

Programmes DLPtest

Ils présentent l'interface suivante

Ils permettent de sélectionner un boitier avec le bouton Search suivant le mode Il suffit alors d'ouvrir le port avec le bouton Open ( attention la méthode d'accès installée pour les boitiers Alpha-Kilo est méthode DLL ), et ensuite d'inscrire les commandes à lancer en direction du boitier
L'exemple Send 1 A7 A6 ( Xmit=3) va retourné dans la boite Receive Data les octets retournés par le boitier.

La version 2.0 est plus complète et permet de reconfigurer les paramêtre USB du controleur FT245BM, à utiliser avec précaution !!!
 

Programme de test Alpha-Kilo

Les interfaces sont adaptées à chaque type de boitier, mais présentent dans tous les cas que les données brutes.

Les boutons ne représentent que les fonctions disponibles que vous trouverez décrite dans le chapître suivant.

Retour Sommaire Retour Accueil

Fonctions des différents boitiers

Pour les boitiers Alpha-Kilo, nous avons gardé la compatibilité avec le firmware d'origine. Nous avons ajouté de nouvelles fonctions et invalidé la plupart de celles décrites dans la documentation du firmware.

Les boitiers répondent donc à :

La fonction d'identification retourne le nom du type de boitier. ATTENTION: Ce nom est spécifique à l'application contenue dans le micro-processeur, à ne pas confonde avec l'identifiant USB qui appartient à la configuration du module USB "FT245BM". Elles sont généralement identiques, mais leur valeurs sont initialisées par des procédures différentes comme le décrit la notice de conception.

Les données échangées par les fonctions d'accès aux registres diffèrent suivant le type du boitier. Nous détaillons ceux-ci dans les chapitres suivants.

La fonction d'initialisation est bien-sûr adaptée au type du boitier. Elle entrainent un changement du comportement du boitier.

Le chapitre Commandes ci-après détaille le contenu des séquences échangées.
 

Boitier Console

Fonction Identification

A la requête identification le boitier répond la chaine de caractère "K_Con"

Fonction lecture des registres

Le boitier retourne le contenu de 12  registres + checksum
Les 12 registres correspondent à :
  • Reg0  : position trim
  • Reg1  : non instrumenté
  • Reg2  : non instrumenté
  • Reg3  : non instrumenté
  • Reg4  : non instrumenté
  • Reg5  : pas de l'hélice
  • Reg6  : réchaufage carburateur
  • Reg7  : position palonnier
  • Reg8  : puissance GAZ
  • Reg9  : position inclinaison
  • Reg10 : position profondeur
  • Reg11 : 16 capteurs TOR
      • bit15 : frein ON=0 OFF=1
      • bit14 : volet capot Ouvert=0 fermé=1
      • bit13 : réchauffage carbu ON=0 OFF=1
      • bit12 : démarreur ON=0 OFF=1
      • bit11 : non instrumenté
      • bit10 : non instrumenté
      • bit 9 : contact magnéto 2
      • bit 8 : contact magnéto 1
      • bit 7 : baisser volet OUI=0 NON=1
      • bit 6 : lever volet OUI=0 NON=1
      • bit 5 : rentrer train OUI=0 NON=1
      • bit 4 : sortir train OUI=0 NON=1
      • bit 3 : non instrumenté
      • bit 2 : non instrumenté
      • bit 1 : non instrumenté
      • bit 0 : non instrumenté
    La lecture se fait par l'appel de la fonction Lecture des registres, appelée dans le cas de l'interface de test par l'appui du bouton "Rcpt"

    Fonction Preload Registre

      Le boitier modifie la valeur actuelle de ses registres. Un seul registre peut être modifié dans le cas du boitier Console
      • Reg0  : position trim
      • Reg1  : non instrumenté
      • Reg2  : non instrumenté
      • Reg3  : non instrumenté
      • Reg4  : non instrumenté
      • Reg5  : non modifiable
      • Reg6  : non modifiable
      • Reg7  : non modifiable


      Il suffit d'introduire la nouvelle valeur souhaitée dans les paramêtres et exécuter la fonction Preload, ce qui se fait dans l'interface de test par l'appui du bouton "Preload"

    Fonction Initialisation

    Cette opération consiste à modifier les paramêtres de fonctionnement des Registres. Dans le cas du boitier console seuls les 5 premiers registres peuvent voir leurs caractéristiques modifiées.
    Cependant l'effet n'aura de résultat que pour le seul registre instrumenté ( Reg0 ).
    Les registres se rapportent à des compteurs incrémentaux. Le capteur de comptage est un capteur rotatif numérique ( genre potentiomêtre ).

    Le programme du boitier permet de modifier le fonctionnement par défaut de ce compteur.

    D'une part sur l'amplitude du comptage, d'autre part pour le traitement des butées. Le compteur peut compter/décompter :

  • circulairement ( cyclique ), c'est à dire lorsque la valeur atteint le maximun de l'amplitude, celui revient au départ ( à la fin lors d'un décomptage )
  • avec butée, dans ce cas le compteur ne peut dépasser ses butée ( 0 et amplitude maxi ) même lorsque l'opérateur continue à actionner le capteur rotatif.
  • Il suffit donc d'introduire la nouvelle valeur d'amplitude souhaitée, et de positionner dans l'octet d'état le bit du mode de fonctionnement du compteur ( 1 pour butée, 0 pour circulaire ) et d'exécuter la fonction Initialisation, faite dans l'interface de test par l'appui du bouton "Init".

    Boitier Instruments

    Fonction Identification

    A la requête identification le boitier répond la chaine de caractère "K_Ins"

    Fonction lecture des registres

    Le boitier retourne le contenu de 12  registres + checksum
    Les 12 registres correspondent à :
    • Reg0  : Altitude niveau
    • Reg1  : Pression Alti 2
    • Reg2  : Pression Alti 1
    • Reg3  : W index
    • Reg4  : R index
    • Reg5  : Heading
    • Reg6  : HSI
    • Reg7  : VOR
    • Reg8  : non instrumenté
    • Reg9  : non instrumenté
    • Reg10 : non intrumenté
    • Reg11 : 16 capteurs TOR
       
      modèle design amiga modèle design PC
    1. bit15 : non instrumenté
    2. bit14 : non instrumenté
    3. bit13 : chrono Hour/Sec ON=0 OFF=1
    4. bit12 : Sélecteur RMI nav1=1 nav2=0
    5. bit11 : Sélecteur HSI nav1=1 nav2=0
    6. bit10 : Sélecteur VOR nav1=1 nav2=0
    7. bit 9 : chrono reset ON=0 OFF=1
    8. bit 8 : chrono star/stop ON=0 OFF=1
    9. bit 7 : non instrumenté
    10. bit 6 : non instrumenté
    11. bit 5 : Sélecteur Altitude HOLD=0 nonHOLD=1
    12. bit 4 : Sélecteur Altitude OFF=0 nonOFF=1
    13. bit 3 : Sélecteur Heading OFF=0 nonOFF=1
    14. bit 2 : Sélecteur Heading HDG=0 nonHDG=1
    15. bit 1 : Sélecteur Mark OFF=0 nonOFF=1
    16. bit 0 : Sélecteur Mark High=0 nonHigh=1

    17.  
    18. bit15 : Sélecteur VOR nav1=1 nav2=0
    19. bit14 : Sélecteur RMI nav1=1 nav2=0
    20. bit13 : non instrumenté
    21. bit12 : non instrumenté
    22. bit11 : non instrumenté
    23. bit10 : chrono Hour/Sec ON=0 OFF=1
    24. bit 9 : chrono reset ON=0 OFF=1
    25. bit 8 : chrono star/stop ON=0 OFF=1
    26. bit 7 : Sélecteur HSI nav1=0
    27. bit 6 : Sélecteur HSI nav2=0
    28. bit 5 : Sélecteur Mark High=0 nonHigh=1
    29. bit 4 : Sélecteur Mark OFF=0 nonOFF=1
    30. bit 3 : Sélecteur Heading HDG=0 nonHDG=1
    31. bit 2 : Sélecteur Heading OFF=0 nonOFF=1
    32. bit 1 : Sélecteur Altitude HOLD=0 nonHOLD=1
    33. bit 0 : Sélecteur Altitude OFF=0 nonOFF=1
    La lecture se fait par l'appel de la fonction Lecture des registres, appelée dans le cas de l'interface de test par l'appui du bouton "Rcpt"

    Fonction Preload Registre

    Le boitier modifie la valeur actuelle de ses registres. Un seul registre peut être modifié dans le cas du boitier Console
    • Reg0  : Altitude niveau
    • Reg1  : Pression Alti 2
    • Reg2  : Pression Alti 1
    • Reg3  : W index
    • Reg4  : R index
    • Reg5  : Heading
    • Reg6  : HSI
    • Reg7  : VOR
    Il suffit d'introduire la nouvelle valeur souhaitée dans les paramêtres et exécuter la fonction Preload, ce qui se fait dans l'interface de test par l'appui du bouton "Preload"

    Fonction Initialisation

    Cette opération consiste à modifier les paramêtres de fonctionnement des Registres. Dans le cas du boitier Instrument seuls les 8 premiers registres peuvent voir leurs caractéristiques modifiées.

    Les registres se rapportent à des compteurs incrémentaux. Le capteur de comptage est un capteur rotatif numérique ( genre potentiomêtre ).

    Le programme du boitier permet de modifier le fonctionnement par défaut de ce compteur.

    D'une part sur l'amplitude du comptage, d'autre part pour le traitement des butées. Le compteur peut compter/décompter :

  • circulairement ( cyclique ), c'est à dire lorsque la valeur atteint le maximun de l'amplitude, celui revient au départ ( à la fin lors d'un décomptage )
  • avec butée, dans ce cas le compteur ne peut dépasser ses butée ( 0 et amplitude maxi ) même lorsque l'opérateur continue à actionner le capteur rotatif.
  • Il suffit donc d'introduire la nouvelle valeur d'amplitude souhaitée, et de positionner dans l'octet d'état le bit du mode de fonctionnement du compteur ( 1 pour butée, 0 pour circulaire ) et d'exécuter la fonction Initialisation, faite dans l'interface de test par l'appui du bouton "Init".
     

    Boitier Radios

    Fonction Identification

    A la requête identification le boitier répond la chaine de caractère "K_Rad"

    Fonction lecture des registres

    Le boitier retourne le contenu de 14  registres + checksum
    Les 14 registres correspondent à :
  • Reg0  : V0 Com1 Fréquence active
  • Reg1  : V1 Com2 Fréquence active
  • Reg2  : V2 Nav1 Fréquence active
  • Reg3  : V3 Nav2 Fréquence active
  • Reg4  : V4 ADF Fréquence active
  • Reg5  : V5 DME Fréquence active
  • Reg6  : V6 TRP Fréquence active
  • Reg7  : V0 Com1 Fréquence attente
  • Reg8  : V1 Com2 Fréquence attente
  • Reg9  : V2 Nav1 Fréquence attente
  • Reg10 : V3 Nav2 Fréquence attente
  • Reg11 : V4 ADF Fréquence attente
  • Reg12 : V5 DME Fréquence attente
  • Reg13 : Autres informations
        • bit15 : \
        • bit14 :  \
        • bit13 :   \
        • bit12 :    ) numéro de voie selectionnée
        • bit11 :    ) octet de 0 à 6 correspondant numero de voie
        • bit10 :   /
        • bit 9 :  /
        • bit 8 : /
        • bit 7 : non instrumenté
        • bit 6 : BP Ident on=1 off=0BP on  on=0 non on=1
        • bit 5 : SE off-stdy-on Off=0 nonOff=1
        • bit 4 : SE off-stdy_on  On=0 nonOn=1
        • bit 3 : BP Test on=1 off=0
        • bit 2 : BP Commut on=1 off=0
        • bit 1 : BP Escape on=1 off=0
        • bit 0 : BP Valid on=1 off=0
      La lecture se fait par l'appel de la fonction Lecture des registres, appelée dans le cas de l'interface de test par l'appui du bouton "Rcpt"

    Fonction Preload Registre

    Fonction Initialisation

    Cette fonction n'est pas implémentée pour le boitier Radio.
    Retour Sommaire Retour Accueil

    Séquences d'échanges

    Ce paragraphe précise l'organisation des buffers d'émission de de réception.

    Identification

    Demande
     
    Nb Byte byte 0 byte 1 byte 2
    3 0x01 0xA7 0xA6

    Réponse
     
    Byte 0 byte 1  byte 2 byte 3 byte 4 byte 5
    acquit (0x55) "K" "_" "C" "o" "n"

        suivant le boitier retour des chaines suivantes

    Lecture registre

    Demande
     
    Nb Byte Byte 1 Byte 2 Byte 3
    3 0x01 0xA4 0xA3

    Réponse

    Byte 0 = Code retour 0x55 (échange correcte)
    boitier Console, et Instrument
    Byte 1 = 8 bits de poids faible du 1er registre
    Byte 2 = 8 bits de poids fort du 1er registre
    Byte 3 = 8 bits de poids faible du 2eme registre
    Byte 4 = 8 bits de poids fort du 2eme registre
    .
    .
    Byte 23 = 8 bits de poids faible du 12eme registre
    Byte 24 = 8 bits de poids fort du 12eme registre
    Byte 25 = octet checksum
    boitier Radio

    Préchargement

    Demande
    boitier Console, et Instrument
     
    Nb Byte byte 0 byte 1 suite
    19 0x11 0xA3 ci-après
    Byte 2 = 8 bits de poids faible du 1er registre (Reg0)
    Byte 3 = 8 bits de poids fort du 1er registre
    Byte 4 = 8 bits de poids faible du 2eme registre
    Byte 5 = 8 bits de poids fort du 2eme registre
    .
    .
    Byte 16 = 8 bits de poids faible du 8eme registre (Reg7)
    Byte 17 = 8 bits de poids fort du 8eme registre
    Byte 18 = octet checksum
    boitier Radio
     
    Nb Byte Byte 0 Byte 1 suite
    31 0x1D 0xA3 ci-dessous

    Byte 2 = 8 bits de poids faible du 1er registre (Reg0)
    Byte 3 = 8 bits de poids fort du 1er registre
    Byte 4 = 8 bits de poids faible du 2eme registre
    Byte 5 = 8 bits de poids fort du 2eme registre
    .
    .
    Byte 28 = 8 bits de poids faible du 8eme registre (Reg13)
    Byte 29 = 8 bits de poids fort du 8eme registre
    Byte 30 = octet checksum


    Réponse

    Code retour 0x55 (échange correcte)

    Initialisation

    Demande
    boitier Console, et Instrument
     
    Nb Byte byte 0 byte 1 suite
    20 0x12 0xA2 ci-après
    Byte 2 = 8 bits de poids faible du 1er registre (Reg0)
    Byte 3 = 8 bits de poids fort du 1er registre
    Byte 4 = 8 bits de poids faible du 2eme registre
    Byte 5 = 8 bits de poids fort du 2eme registre
    .
    .
    Byte 16 = 8 bits de poids faible du 8eme registre (Reg7)
    Byte 17 = 8 bits de poids fort du 8eme registre
    Byte 18 = 8 bits de poids faible du registre mode de fonctionnement (1 octet)
    Byte 19 = octet checksum
    boitier Radio
    pas d'initialisation pour ce boitier
    Réponse
    Code retour 0x55 (échange correcte)
    Retour Sommaire Retour Accueil

    Exemple des programmes de test

    Retour Sommaire Retour Accueil