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