/*************************************************************************************************************************************/ /* */ /* 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