_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   D E   G E S T I O N   D U   D I S Q U E - V I D E O   S E C A M  :                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base de gestion du disque-video SECAM.                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiidS/fonction$FON' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19890000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L ' A C C E S   A U   D I S Q U E   V I D E O   S E C A M  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LIGNE_D_ACCES_AU_DISQUE                                                                                                       \
                    "/dev/tty07"                                                                                                        \
                                        /* Definition de la ligne physique d'acces au disque ; celle-ci doit avoir ete               */ \
                                        /* parametree par une commande :                                                             */ \
                                        /*                                                                                           */ \
                                        /*                  stty 2400 -raw -echo -onlcr < /dev/tty07                                 */ \
                                        /*                                                                                           */ \
                                        /* la ligne correspondante de 'etc/inittab' etant "07:2:off:/etc/getty...".                  */ \
                                        /*                                                                                           */ \
                                        /* Mais ATTENTION : 'tty07' correspond au connecteur 'J08' du coupleur 'RS232'...            */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : je note le 20090905123851 que cette definition aurait du etre parametree      */ \
                                        /* et correspond certainement (et historiquement) a '$LACT11'...                             */

#define   REINITIALISATION_DE_LA_LIGNE_D_ACCES_AU_DISQUE                                                                                \
                    "stty sane < "                                                                                                      \
                                        /* Reinitialisation de la ligne physique d'acces au disque.                                  */
#define   PARAMETRAGE_DE_LA_LIGNE_D_ACCES_AU_DISQUE                                                                                     \
                    "stty 2400 -raw -echo -onlcr < "                                                                                    \
                                        /* Parametrage de la ligne physique d'acces au disque.                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E N V O I   D ' U N E   C O M M A N D E   A U   D I S Q U E   V I D E O   S E C A M  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#define   LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE                                                                                       \
                    UN                                                                                                                  \
                                        /* Longueur des messages elementaires envoyes au disque.                                     */
#define   LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE                                                                                          \
                    UN                                                                                                                  \
                                        /* Longueur de la reponse standard du disque lorsque tout s'est bien passe...                */
#define   LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE                                                                                      \
                    CENT                                                                                                                \
                                        /* Longueur maximale a priori des reponses envoyees par le disque...                         */
#define   FIN_DES_MESSAGES_AU_DISQUE                                                                                                    \
                    K_LF                                                                                                                \
                                        /* Fin des messages envoyes au disque.                                                       */
#define   MESSAGE_D_ERREUR_DU_DISQUE                                                                                                    \
                    K_INTERROGATION                                                                                                     \
                                        /* Message d'erreur unique renvoye par le disque lorsqu'un probleme quelconque est           */ \
                                        /* rencontre (et par exemple une erreur de syntaxe dans une commande...)                     */
#define   TEMPORISATION_INTER_CARACTERE                                                                                                 \
                    UN                                                                                                                  \
                                        /* Entre chaque caractere, il faut attendre un peu, car le disque ne supporte pas le         */ \
                                        /* debit reel de la ligne...                                                                 */

#define   ENVOI_D_UN_CARACTERE_AU_DISQUE(caractere)                                                                                     \
                    Bblock                                                                                                              \
                    EGAL(PREMIER_CARACTERE_ITb1(buffer_d_emission),caractere);                                                          \
                                        /* Mise du cacactere dans le buffer d'emission.                                              */ \
                    DODO(TEMPORISATION_INTER_CARACTERE);                                                                                \
                                        /* On attend un peu avant d'emettre...                                                       */ \
                    EGAL(descripteur_de_la_ligne_en_emission,Open(LIGNE_D_ACCES_AU_DISQUE,OPEN_WRITE));                                 \
                                        /* Ouverture de la ligne d'emission des messages en provenance du disque.                    */ \
                    Test(IFNE(descripteur_de_la_ligne_en_emission,CANNOT_OPEN))                                                         \
                         Bblock                                                                                                         \
                         CALS(Writ(descripteur_de_la_ligne_en_emission,buffer_d_emission,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE));     \
                                        /* Lorsque la ligne est ouverte, on emet le caractere courant,                               */ \
                         CALS(Clos(descripteur_de_la_ligne_en_emission));                                                               \
                                        /* Puis on ferme la ligne afin d'etre sur du rythme d'emission...                            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("la ligne d'acces au disque video Secam est indisponible en emission");                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure d'envoi d'un caractere (seul...) au disque.                                     */

DEFV(Common,DEFV(FonctionI,IKSenvoi_d_une_commande_au_disque_video(commande)))
DEFV(Argument,DEFV(CHAR,DTb0(commande)));
                                        /* Chaine argument correspondant a une commande a envoyer au disque video.                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(Int,INIT(compte_rendu,UNDEF));
                                        /* Compte_rendu des fonctions "stty"...                                                      */
     DEFV(CHAR,INIT(POINTERc(commande_STTY),COMMANDE_UNDEF));
                                        /* Afin d'envoyer une commande fixant les parametres de la ligne d'acces au disque.          */
     DEFV(Int,INIT(index,PREMIER_CARACTERE));
                                        /* Index de la chaine argument de commande.                                                  */
     DEFV(Int,INIT(descripteur_de_la_ligne_en_emission,CANNOT_OPEN));
                                        /* Descripteur du fichier correspondant aux emissions DPX5000 --> disque video Secam,        */
     DEFV(Int,INIT(descripteur_de_la_ligne_en_reception,CANNOT_OPEN));
                                        /* Descripteur du fichier correspondant aux receptions disque video Secam --> DPX5000.       */
     DEFV(CHAR,DTb1(buffer_d_emission,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE));
                                        /* Buffer d'emission du caractere courant d'une commande,                                    */
     DEFV(CHAR,DTb1(buffer_de_reception,LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE));
                                        /* Buffer de reception des messages en provenance du disque.                                 */
     DEFV(Positive,INIT(longueur_de_la_reponse_du_disque,UNDEF));
                                        /* Nombre de caracteres renvoyes par le disque video ; en general, il n'y en a qu'un         */
                                        /* lorsque tout c'est bien passe. Sinon, il s'agit soit du message d'erreur ("?"), soit      */
                                        /* du renvoi de l'adresse courante...                                                        */
     /*..............................................................................................................................*/
     EGAp(commande_STTY,chain_Aconcaten2(REINITIALISATION_DE_LA_LIGNE_D_ACCES_AU_DISQUE,LIGNE_D_ACCES_AU_DISQUE));
     EGAL(compte_rendu,SYSTEM(commande_STTY));
     CALZ_FreCC(commande_STTY);
                                        /* Au prealable, on reinitialise la ligne d'acces au disque video Secam,                     */

     Test(PAS_D_ERREUR(compte_rendu))
          Bblock
          EGAp(commande_STTY,chain_Aconcaten2(PARAMETRAGE_DE_LA_LIGNE_D_ACCES_AU_DISQUE,LIGNE_D_ACCES_AU_DISQUE));
          EGAL(compte_rendu,SYSTEM(commande_STTY));
          CALZ_FreCC(commande_STTY);
                                        /* Puis, on la programme comme il convient...                                                */

          Test(PAS_D_ERREUR(compte_rendu))
               Bblock
               EGAL(descripteur_de_la_ligne_en_reception,Open(LIGNE_D_ACCES_AU_DISQUE,OPEN_READ));
                                        /* Ouverture de la ligne de reception des messages en provenance du disque.                  */
               Test(IFNE(descripteur_de_la_ligne_en_reception,CANNOT_OPEN))
                    Bblock
                    Tant(IFNE(ITb0(commande,INDX(index,PREMIER_CARACTERE)),END_OF_CHAIN))
                         Bblock
                         ENVOI_D_UN_CARACTERE_AU_DISQUE(ITb0(commande,INDX(index,PREMIER_CARACTERE)));
                                        /* Envoi du caractere courant au disque (mais lentement...).                                 */
                         INCR(index,I);
                                        /* Puis passage au caractere suivant...                                                      */
                         Eblock
                    ETan

                    ENVOI_D_UN_CARACTERE_AU_DISQUE(FIN_DES_MESSAGES_AU_DISQUE);
                                        /* Et on "ferme" le message...                                                               */
                    EGAL(longueur_de_la_reponse_du_disque
                        ,Read(descripteur_de_la_ligne_en_reception
                             ,buffer_de_reception
                             ,LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE
                              )
                         );
                                        /* Lecture de la reponse du disque...                                                        */

                    Test(IFLT(longueur_de_la_reponse_du_disque,LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE))
                         Bblock
                                        /* On fait un 'IFLT' car on a lu au plus 'LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE'          */
                                        /* caracteres dans le 'Read' precedent' ; un 'IFLE' serait alors toujours 'VRAI'...          */
                         Test(IFEQ(longueur_de_la_reponse_du_disque,LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE))
                              Bblock
                                        /* Cas ou tout s'est bien passe...                                                           */
                              Eblock
                         ATes
                              Bblock
                              Test(IFEQ(PREMIER_CARACTERE_ITb1(buffer_de_reception)
                                       ,MESSAGE_D_ERREUR_DU_DISQUE
                                        )
                                   )
                                   Bblock
                                        /* Cas ou l'on a recu le message d'erreur standard...                                        */
                                   PRINT_ERREUR("la commande envoyee au disque video Secam n'a pas ete reconnue");
                                   Eblock
                              ATes
                                   Bblock
                                        /* Cas ou l'on a recu une reponse autre qu'un message d'erreur (par exemple                  */
                                        /* une adresse courante).                                                                    */
                                   CAL2(Prin1("%s",buffer_de_reception));
                                        /* Et on edite "betement" (c'est-a-dire sans fioritures) la reponse du disque...             */
                                   Eblock
                              ETes
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         PRINT_ERREUR("la reponse du disque video Secam est trop longue");
                         Eblock
                    ETes

                    CALS(Clos(descripteur_de_la_ligne_en_reception));
                                        /* Lorsque tout est termine, on ferme la ligne...                                            */
                    Eblock
               ATes
                    Bblock
                    PRINT_ERREUR("la ligne d'acces au disque video Secam est indisponible en reception");
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               PRINT_ERREUR("la programmation de la ligne d'acces s'est mal passee");
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("l'initialisation de la ligne d'acces s'est mal passee");
          Eblock
     ETes

     RETU_ERROR;
     Eblock

#undef    ENVOI_D_UN_CARACTERE_AU_DISQUE
#undef    TEMPORISATION_INTER_CARACTERE
#undef    MESSAGE_D_ERREUR_DU_DISQUE
#undef    FIN_DES_MESSAGES_AU_DISQUE
#undef    LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE
#undef    LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE
#undef    LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE

EFonctionI

#undef    PARAMETRAGE_DE_LA_LIGNE_D_ACCES_AU_DISQUE
#undef    REINITIALISATION_DE_LA_LIGNE_D_ACCES_AU_DISQUE
#undef    LIGNE_D_ACCES_AU_DISQUE

_______________________________________________________________________________________________________________________________________



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.