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