/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E N T A T I V E   D ' E M U L A T I O N   D ' U N E   C O N S O L E  :                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xtKg/console.01$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1995??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CPP_____MODULE_NON_DERIVABLE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LIGNE_D_ACCES_A_LA_CONSOLE                                                                                                    \
                    "/dev/ttyd2"                                                                                                        \
                                        /* Definition de la ligne utile...                                                           */
#define   REINITIALISATION_DE_LA_LIGNE_D_ACCES_A_LA_CONSOLE                                                                             \
                    "stty sane < "                                                                                                      \
                                        /* Reinitialisation de la ligne physique d'acces au disque.                                  */
#define   PARAMETRAGE_DE_LA_LIGNE_D_ACCES_A_LA_CONSOLE                                                                                  \
                    "stty 9600 -cstopb -parity raw -echo < "                                                                            \
                                        /* Parametrage de la ligne physique d'acces au disque.                                       */

#define   LONGUEUR_DES_BUFFERS                                                                                                          \
                    UN                                                                                                                  \
                                        /* Afin de lire caractere par caractere...                                                   */

#define   RECEVOIR                                                                                                                      \
                    VRAI
#define   EMETTRE                                                                                                                       \
                    VRAI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E N T A T I V E   D ' E M U L A T I O N   D ' U N E   C O N S O L E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(processus,identificateur);
                                        /* Identificateur du processus fils.                                                         */
     DEFV(CHAR,INIC(POINTERc(ligne_d_acces_a_la_console),LIGNE_D_ACCES_A_LA_CONSOLE));
                                        /* Identite de la ligne d'acces a la console...                                              */
     DEFV(Int,INIT(descripteur_de_la_ligne_de_la_console,CANNOT_OPEN));
                                        /* Descripteur d'acces a la ligne de la console.                                             */
     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(Logical,INIT(recevoir,RECEVOIR));
     DEFV(Logical,INIT(emettre,EMETTRE));
                                        /* Afin de controler separemment la reception et l'emission...                               */
     DEFV(Logical,INIT(iterer,VRAI));
                                        /* Afin de boucler eternellement...                                                          */
     DEFV(CHAR,INIT(POINTERc(buffer_in),kMalo(LONGUEUR_DES_BUFFERS)));
     DEFV(CHAR,INIT(POINTERc(buffer_out),kMalo(LONGUEUR_DES_BUFFERS)));
                                        /* Reservation des buffers 'in' et 'out'...                                                  */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_C("ligne=",ligne_d_acces_a_la_console);
                         GET_ARGUMENT_L("recevoir=",recevoir);
                         GET_ARGUMENT_L("emettre=",emettre);
                         )
                    );

     EGAL(descripteur_de_la_ligne_de_la_console
         ,Open(ligne_d_acces_a_la_console,OPEN_READ_AND_WRITE)
          );
                                        /* Tentative d'ouverture de la ligne de la console.                                          */
     Test(IFNE(descripteur_de_la_ligne_de_la_console,CANNOT_OPEN))
          Bblock
          EGAL(commande_STTY,chain_Aconcaten2(REINITIALISATION_DE_LA_LIGNE_D_ACCES_A_LA_CONSOLE,ligne_d_acces_a_la_console));
          EGAL(compte_rendu,SYSTEM(commande_STTY));
          CALZ_FreCC(commande_STTY);
                                        /* Au prealable, on reinitialise la ligne d'acces au disque video PAL-Beta,                  */
          Test(PAS_D_ERREUR(compte_rendu))
               Bblock
               EGAL(commande_STTY,chain_Aconcaten2(PARAMETRAGE_DE_LA_LIGNE_D_ACCES_A_LA_CONSOLE,ligne_d_acces_a_la_console));
               EGAL(compte_rendu,SYSTEM(commande_STTY));
               CALZ_FreCC(commande_STTY);
                                        /* Puis, on la programme comme il convient...                                                */
               Test(PAS_D_ERREUR(compte_rendu))
                    Bblock
                    Test(IL_FAUT(recevoir))
                         Bblock
                         iPARALLELE(BLOC(Tant(IL_FAUT(iterer))
                                              Bblock
                                              DEFV(Int,INIT(longueur_recue
                                                           ,Read(descripteur_de_la_ligne_de_la_console
                                                                ,buffer_in
                                                                ,LONGUEUR_DES_BUFFERS
                                                                 )
                                                            )
                                                   );
                                              Test(IFNE(longueur_recue,FICHIER_VIDE))
                                                   Bblock
                                                   CAL2(Prin2("%.*s",longueur_recue,buffer_in));
                                        /* Envoi des messages :                                                                      */
                                        /*                                                                                           */
                                        /*                  console --> utilisateur.                                                 */
                                        /*                                                                                           */
                                                   Eblock
                                              ATes
                                                   Bblock
                                                   PRINT_ERREUR("la lecture de la ligne ne fonctionne pas");
                                                   DODO(UNITE);
                                                   Eblock
                                              ETes
                                              Eblock
                                         ETan
                                         )
                                   ,identificateur
                                    );
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IL_FAUT(emettre))
                         Bblock
                         Tant(IL_FAUT(iterer))
                              Bblock
                              DEFV(Int,INIT(longueur_a_emettre
                                           ,Read(STANDARD_IN,buffer_out,LONGUEUR_DES_BUFFERS)
                                            )
                                   );
                              Test(IFNE(longueur_a_emettre,FICHIER_VIDE))
                                   Bblock
                                   CALS(Writ(descripteur_de_la_ligne_de_la_console,buffer_out,longueur_a_emettre));
                                        /* Envoi des messages :                                                                      */
                                        /*                                                                                           */
                                        /*                   utilisateur--> console.                                                 */
                                        /*                                                                                           */
                                   Eblock
                              ATes
                                   Bblock
                                   PRINT_ERREUR("la lecture standard ne fonctionne pas");
                                   DODO(UNITE);
                                   Eblock
                              ETes
                              Eblock
                         ETan
                         Eblock
                    ATes
                         Bblock
                         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
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("impossible d'ouvrir la console");
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.