_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* 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 ' B E T A - P A L ' ( S O N Y 'LVS6000P-LVR6000' O U 'LVR4000P' ) */ /* E T D U M A G N E T O S C O P E ' B E T A - P A L ' ( S O N Y 'UVW1400P' ) : ) */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les fonctions */ /* de base de gestion du disque-video PAL-Beta. */ /* */ /* */ /* Author of '$xiidP/fonct$vv$FON' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19890000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P P O R T U N I T E D E C O M P I L E R C E M O D U L E : */ /* */ /*************************************************************************************************************************************/ #ifdef __VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA /* Common,DEFV(Fonction,) : indicateur de VERSION. */ DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA)); #Aifdef __VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA /* Common,DEFV(Fonction,) : indicateur de VERSION. */ #Eifdef __VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA /* Common,DEFV(Fonction,) : indicateur de VERSION. */ #ifdef __VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA /* Common,DEFV(Fonction,) : compiler la gestion du disque PAL-Beta. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S " B U G S " P R E S E N T S : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_PAL_BETA_Read /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_PAL_BETA_Read)); # Aifdef BUG_SYSTEME_PAL_BETA_Read /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_PAL_BETA_Read /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS)); # Aifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS_99 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS_99)); # Aifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS_99 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_REPETITIONS_99 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_F_SCAN /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_PAL_BETA_PAL_BETA_F_SCAN)); # Aifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_F_SCAN /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_PAL_BETA_PAL_BETA_F_SCAN /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_PAL_BETA_LECTURE_D_UN_BLOC_DE_DONNEES_PAL_BETA /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_PAL_BETA_LECTURE_D_UN_BLOC_DE_DONNEES_PAL_BETA)); # Aifdef BUG_SYSTEME_PAL_BETA_LECTURE_D_UN_BLOC_DE_DONNEES_PAL_BETA /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_PAL_BETA_LECTURE_D_UN_BLOC_DE_DONNEES_PAL_BETA /* Common,DEFV(Fonction,) : bug... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 P A L - B E T A : */ /* */ /*************************************************************************************************************************************/ # define LIGNE_D_ACCES_AU_DISQUE \ Gvar("disqueP") \ /* Definition de la ligne physique d'acces au disque ; celle-ci doit avoir ete */ \ /* parametree par une commande : */ \ /* */ \ /* 1 - cas 'SYSTEME_DPX5000_SPIX' : */ \ /* */ \ /* stty 1200 -cstopb -parity raw -echo < /dev/tty06 */ \ /* */ \ /* la ligne correspondante de 'etc/inittab' etant "06:2:off:/etc/getty...". */ \ /* */ \ /* mais ATTENTION : 'tty06' correspond au connecteur 'J07' du coupleur 'RS232'... */ \ /* */ \ /* */ \ /* 2 - cas 'SYSTEME_SG..._IRIX' : */ \ /* */ \ /* stty 1200 -cstopb -parity raw -echo < /dev/ttyd2 */ \ /* */ \ /* la ligne correspondante de 'etc/inittab' etant "t2:23:off:/etc/getty ttyd2 co_9600...". */ \ /* */ \ /* mais ATTENTION : 'ttyd2' correspond au connecteur 'SERIAL PORT 2'. On notera que */ \ /* L'utilisation de 'ttyd2' est obligatoire car, en effet, 'ttyd1' est reserve a un */ \ /* usage de type "console" sur les machines non graphiques (voir '$LACT28') et meme */ \ /* sur les machines graphiques en cas de problemes graves... */ # define COMMANDE_D_ACCES_A_LA_LIGNE_D_ACCES_AU_DISQUE \ "stty" \ /* Commande d'acces a la ligne physique d'acces au disque. */ # define REINITIALISATION_DE_LA_LIGNE_D_ACCES_AU_DISQUE \ EGAs(chain_Aconcaten2(COMMANDE_D_ACCES_A_LA_LIGNE_D_ACCES_AU_DISQUE," sane < ")) \ /* Reinitialisation de la ligne physique d'acces au disque. */ # define VITESSE_DE_LA_LIGNE_D_ACCES_AU_DISQUE \ GvarDefaut("Nspeed_DKVP","9600") \ /* Vitesse courante et vitesse par defaut de la ligne physique d'acces au disque. */ \ /* Le passage de 1200 bauds a 9600 bauds a ete effectue le 19980218090413. */ # define PARAMETRAGE_DE_LA_LIGNE_D_ACCES_AU_DISQUE \ EGAs(chain_Aconcaten4(COMMANDE_D_ACCES_A_LA_LIGNE_D_ACCES_AU_DISQUE \ ,C_BLANC \ ,VITESSE_DE_LA_LIGNE_D_ACCES_AU_DISQUE \ ," -cstopb -parity raw -echo < " \ ) \ ) \ /* Parametrage de la ligne physique d'acces au disque. */ \ /* */ \ /* Le reglage de la vitesse du cote du disque se fait a l'aide de deux petits switchs tels */ \ /* que : */ \ /* */ \ /* Down-Down = 1200 bauds, */ \ /* Down-Up = 2400 bauds, */ \ /* Up -Down = 4800 bauds, */ \ /* Up -Up = 9600 bauds. */ \ /* */ \ /* Ils se trouvent dans 'BAUD RATE' sur un disque 'LVS6000-LVR6000' et sont appeles */ \ /* '[SW1,SW2]' dans 'SETUP' sur un disque 'LVR4000P' ('Up' et 'Down' ayant la meme */ \ /* signification que ci-dessus, et sont situes a l'extreme gauche de l'ensemble des */ \ /* 8 switchs de 'SETUP'). */ \ /* */ \ /* ATTENTION, pour une raisons mysterieuse, le 1993022300 j'ai decouvert que le disque */ \ /* etait cable en 1200 bauds, alors que la programmation ci-dessus etait en 9600 bauds... */ \ /* Alors comment cela pouvait-il marcher ??? */ \ /* */ \ /* Mais en fait, je suis revenu a 1200 bauds le 1993022600 car, en effet, dans la position */ \ /* 9600 bauds, apres l'introduction d'un disque, et lorsque celui-ci est pret, le voyant */ \ /* "STILL/STEP" se met a clignoter tres rapidement, ce phenomene disparaissant si le disque */ \ /* est cable en 1200 bauds. En fait, le 19980218090413 j'ai compris que cela etait lie a */ \ /* l'etat "courant" de la liaison cote ordinateur ; des que celle-ci passe a 9600 bauds, le */ \ /* probleme disparait... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U D I S Q U E U T I L I S E : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Les trois symboles qui sont definis (par */ /* '#define') ou non definis (par '#nodefine') */ /* dans '$xiidP/fonct$vv$DEF' si necessaire, et */ /* dans les commandes 'v $xci/disk_video_P$K' et */ /* 'v $xci/magneto_P$K' systematiquement sont */ /* detruits ci-apres, car, en effet, il est */ /* essentiel que '$xci/disk_video_P$K' n'en */ /* depende pas, afin qu'il suffise de modifier */ /* '$xci/disk_video_P$K' ou '$xci/magneto_P$K' */ /* pour changer de machine utilisee... */ /* */ /*************************************************************************************************************************************/ /* Le 20030314093931, les symboles 'GESTION_D_UN_*' ont ete changes en */ /* '__VERSION__GESTION_D_UN_*' afin de permettre leur recuperation dans */ /* 'v $xcc/cpp$Z _VERSION_'. */ # ifdef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVR4000P # undef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVR4000P # Aifdef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVR4000P # Eifdef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVR4000P # ifdef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVS6000P_LVR6000 # undef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVS6000P_LVR6000 # Aifdef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVS6000P_LVR6000 # Eifdef __VERSION__GESTION_D_UN_DISQUE_PAL_BETA_LVS6000P_LVR6000 # ifdef __VERSION__GESTION_D_UN_MAGNETOSCOPE_PAL_BETA_UVW1400P # undef __VERSION__GESTION_D_UN_MAGNETOSCOPE_PAL_BETA_UVW1400P # Aifdef __VERSION__GESTION_D_UN_MAGNETOSCOPE_PAL_BETA_UVW1400P # Eifdef __VERSION__GESTION_D_UN_MAGNETOSCOPE_PAL_BETA_UVW1400P /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E U R D E L A L I G N E D E C O M M A N D E D U D I S Q U E V I D E O P A L - B E T A : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(IKP_____utiliser_le_mode_PAL_BETA_FRAME_NUMBER_MODE,VRAI))); /* Cet indicateur permet de controler le mode d'affichage soit "numero d'image" (par */ /* defaut) ou "time code" (introduit le 20020710101513). */ DEFV(Common,DEFV(Logical,ZINT(IKP_____editer_le_message_des_caracteres_en_attente,FAUX))); /* Cet indicateur permet de controler la sortie du message : */ /* */ /* PRINT_ERREUR("il y avait des caracteres en attente en provenance du disque"); */ /* */ /* Il est mis en 'Common', et non pas comme Argument de 'IKPopen_disque_video(...)' afin */ /* de simplifier les choses. En effet, l'acces a 'IKPopen_disque_video(...)' se fait via */ /* la procedure 'OUVERTURE_DE_LA_LIGNE_PAL_BETA(...)' ; de plus, il ne faut pas oublier */ /* qu'il existe deux versions du logiciel... */ DEFV(Local,DEFV(Int,INIT(descripteur_de_la_ligne,CANNOT_OPEN))); /* Descripteur du fichier correspondant aux emissions DPX5000 --> disque video PAL-Beta, */ /* et aux receptions disque video PAL-Beta --> DPX5000. Ce descripteur est "Local", et */ /* commun a toutes les fonctions relatives au disque 'PAL-Beta', afin de savoir en */ /* permanence si la ligne est ouverte ou pas (auquel cas, il vaut 'CANNOT_OPEN'). */ DEFV(Local,DEFV(Logical,INIT(il_y_a_eu_une_erreur_de_transmission,FAUX))); /* Afin de savoir si en fin de compte, tout s'est bien passe ; son etat initial est 'FAUX', */ /* qui est force a chaque ouverture de la ligne... */ DEFV(Common,DEFV(CHAR,DTb1(IKP_____buffer_de_reception,LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE_PAL_BETA))); /* Buffer de reception des messages en provenance du disque. Il est place en 'Common', */ /* afin que les procedures de commandes du disque puissent recuperer son contenu... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N N A I R E D E S M E S S A G E S C O M P L E T S : */ /* */ /*************************************************************************************************************************************/ # define LONGUEUR_MAXIMALE_DES_MESSAGES_COMPLETS_ENVOYES_AU_DISQUE \ MILLE DEFV(Local,DEFV(Int,INIT(index_du_buffer_des_messages_complets_envoyes_au_disque,PREMIER_CARACTERE))); DEFV(Local,DEFV(CHAR,DTb1(buffer_des_messages_complets_envoyes_au_disque,LONGUEUR_MAXIMALE_DES_MESSAGES_COMPLETS_ENVOYES_AU_DISQUE))); /* Buffer (d'une longueur arbitraire) dans lequel seront stockes tous les caracteres */ /* envoyes au disque entre 'IKPopen_disque_video(...)' et 'IKPclose_disque_video(...)'. */ /* Ce dispositif a ete introduit le 20030205142434. */ # define MEMORISATION_D_UN_CARACTERE_ENVOYE_AU_DISQUE(caractere) \ Bblock \ Test(IFLE(index_du_buffer_des_messages_complets_envoyes_au_disque \ ,LSTX(PREMIER_CARACTERE,LONGUEUR_MAXIMALE_DES_MESSAGES_COMPLETS_ENVOYES_AU_DISQUE) \ ) \ ) \ Bblock \ EGAL(ITb1(buffer_des_messages_complets_envoyes_au_disque \ ,INDX(index_du_buffer_des_messages_complets_envoyes_au_disque,PREMIER_CARACTERE) \ ) \ ,caractere \ ); \ /* Memorisation du caractere courant, */ \ INCR(index_du_buffer_des_messages_complets_envoyes_au_disque,I); \ /* Et progression de son index... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la buffer des caracteres envoyes au disque deborde"); \ Eblock \ ETes \ Eblock \ /* Memorisation d'un caractere envoye au disque... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D E L A L I G N E D E C O M M A N D E D U D I S Q U E V I D E O P A L - B E T A : */ /* */ /*************************************************************************************************************************************/ # define LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE \ UN \ /* Longueur des messages elementaires envoyes au disque. */ # define FERMETURE_DE_LA_LIGNE_DU_DISQUE \ Bblock \ CALS(Clos(descripteur_de_la_ligne)); \ /* Lorsque la ligne etait ouverte, on la ferme physiquement, */ \ Eblock \ /* Procedure de fermeture de la ligne... */ BFonctionI # define OUVERTURE_DE_LA_LIGNE_DU_DISQUE(mode_d_ouverture) \ Bblock \ EGAL(descripteur_de_la_ligne,Open(LIGNE_D_ACCES_AU_DISQUE,mode_d_ouverture)); \ /* Ouverture de la ligne d'emission et de reception des messages en provenance du disque. */ \ Test(IFNE(descripteur_de_la_ligne,CANNOT_OPEN)) \ Bblock \ /* Ca y est, la ligne est ouverte... */ \ EGAL(il_y_a_eu_une_erreur_de_transmission,FAUX); \ /* Il n'y a pas encore eu de problemes... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la ligne d'acces au disque video PAL-Beta est indisponible"); \ Eblock \ ETes \ Eblock \ /* Procedure d'ouverture de la ligne... */ DEFV(Common,DEFV(FonctionI,IKPopen_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. */ /*..............................................................................................................................*/ Test(IFNE(descripteur_de_la_ligne,CANNOT_OPEN)) Bblock /* Cas ou la ligne est deja ouverte... */ PRINT_ERREUR("la ligne d'acces au disque video PAL-Beta est deja ouverte"); Eblock ATes Bblock /* Cas normal, ou la ligne est fermee... */ 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 PAL-Beta, */ 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 DEFV(CHAR,DTb1(caracteres_en_attente,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE)); /* Buffer de reception mono-caractere des caracteres en attente... */ OUVERTURE_DE_LA_LIGNE_DU_DISQUE(OPEN_READ_AND_WRITE_SANS_ATTENTE_EN_LECTURE_SI_LE_FICHIER_EST_VIDE); /* Ouverture de la ligne d'emission et de reception des messages en provenance du disque, */ /* en vue de tester la presence de caracteres en attente... */ # ifndef BUG_SYSTEME_PAL_BETA_IMPOSSIBLE_DE_PURGER_LE_BUFFER_DES_CARACTERES_EN_ATTENTE_DANS_IKPopen_disque_video Tant(IFNE(Read(descripteur_de_la_ligne,caracteres_en_attente,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE) ,FICHIER_VIDE ) ) # Aifndef BUG_SYSTEME_PAL_BETA_IMPOSSIBLE_DE_PURGER_LE_BUFFER_DES_CARACTERES_EN_ATTENTE_DANS_IKPopen_disque_video Tant(IFGT(Read(descripteur_de_la_ligne,caracteres_en_attente,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE) ,FICHIER_VIDE ) ) # Eifndef BUG_SYSTEME_PAL_BETA_IMPOSSIBLE_DE_PURGER_LE_BUFFER_DES_CARACTERES_EN_ATTENTE_DANS_IKPopen_disque_video /* On purge le buffer des caracteres en attente et venant du disque. ATTENTION : il est */ /* evidemment impossible de permuter le 'Tant(...)' qui precede et le 'Test(...)' qui suit, */ /* car en effet, le 'Tant(...)' a un effet sur le buffer (puisqu'il le purge...). */ Bblock Test(IL_FAUT(IKP_____editer_le_message_des_caracteres_en_attente)) Bblock PRINT_ERREUR("il y avait des caracteres en attente en provenance du disque"); Eblock ATes Bblock Eblock ETes Eblock ETan FERMETURE_DE_LA_LIGNE_DU_DISQUE; /* Lorsqu'il n'y a plus de caracteres en attente, on referme la ligne, puis : */ OUVERTURE_DE_LA_LIGNE_DU_DISQUE(OPEN_READ_AND_WRITE); /* Ouverture de la ligne d'emission et de reception des messages en provenance du disque, */ /* pour le dialogue "normal" cette fois-ci... */ /* */ /* Aux environs du 20090907161922, j'ai tente d'utiliser '$disqueP' sur '$LACT18' (en plus */ /* de '$LACT16'). En fait, cela ne marche pas (ou de facon tres "erratique"). Les tests */ /* ont montre qu'a partir de l'ouverture de la ligne en mode 'OPEN_READ_AND_WRITE' */ /* ci-dessus, les 'Read(...)'s sont bloques. Mais si l'ouverture est faite, comme un peu */ /* avant, en mode 'OPEN_READ_AND_WRITE_SANS_ATTENTE_EN_LECTURE_SI_LE_FICHIER_EST_VIDE', */ /* alors les 'Read(...)'s reviennent immediatement en erreur avec 'errno' donnant le code */ /* erreur 'EAGAIN' (=11) qui signifie qu'il n'y a rien en entree. Il y a peu de raisons */ /* pour que '$disqueP' ne renvoie rien puisqu'en basculant de nouveau sur '$LACT16' tout */ /* marche normalement. On notera que sur '$LACT18' la commande : */ /* */ /* stty -a -F $disqueP */ /* */ /* renvoie la meme chose que sur '$LACT16', avec juste en plus : */ /* */ /* swtch = <undef>; */ /* -iutf8 */ /* */ /* Mais cela ne suffit pas, semble-t-il, a expliquer le probleme puisqu'utiliser : */ /* */ /* stty iutf8 -F $disqueP */ /* */ /* ne change rien. Malgre tout, il convient de rappeler que '-iutf8' signifie la chose */ /* suivante : "assume input characters are UTF-8 encoded", c'est-a-dire implique l'usage */ /* de "Unicode" 32 bits ; "iutf8" quant a lui devrait impliquer l'usage de codes caractere */ /* 8 bits, mais cela marche-t-il correctement ? */ /* */ /* Le 20090911145138, des tests ont ete fait sur 'monotone.polytechnique.fr' qui est une */ /* MACHINE possedant elle-aussi l'option '-iutf8' et le test 'v $xtc/disk_vi_P.21$c' s'est */ /* termine normalement (contrairement a '$LACT18'). On notera malgre tout une difference */ /* importante : '$LACT18' est du type 'SYSTEME_APC_LinuxUbuntu_GCC', alors que la MACHINE */ /* 'monotone.polytechnique.fr' est du type 'SYSTEME_APC_LinuxRedHat_GCC'... */ EGAL(index_du_buffer_des_messages_complets_envoyes_au_disque,PREMIER_CARACTERE); /* Initialisation du buffer dans lequel seront stockes tous les caracteres envoyes au */ /* disque (introduit le 20030205142434). */ 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 ETes RETU_ERROR; Eblock # undef OUVERTURE_DE_LA_LIGNE_DU_DISQUE EFonctionI # undef PARAMETRAGE_DE_LA_LIGNE_D_ACCES_AU_DISQUE # undef VITESSE_DE_LA_LIGNE_D_ACCES_AU_DISQUE # undef REINITIALISATION_DE_LA_LIGNE_D_ACCES_AU_DISQUE # undef COMMANDE_D_ACCES_A_LA_LIGNE_D_ACCES_AU_DISQUE # undef LIGNE_D_ACCES_AU_DISQUE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F E R M E T U R E D E L A L I G N E D E C O M M A N D E D U D I S Q U E V I D E O P A L - B E T A : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(Logical,SINT(IKPclose_disque_video_____editer_les_caracteres_envoyes_au_disque,FAUX))); /* Pour editer les messages envoyes au disque (introduit le 20030205142434). */ DEFV(Common,DEFV(FonctionI,IKPclose_disque_video())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(IFNE(descripteur_de_la_ligne,CANNOT_OPEN)) Bblock MEMORISATION_D_UN_CARACTERE_ENVOYE_AU_DISQUE(END_OF_CHAIN); /* "Fermeture" de la chaine contenant les caracteres qui ont ete transmis au disque */ /* (introduit le 20030205142434). */ FERMETURE_DE_LA_LIGNE_DU_DISQUE; /* Lorsque la ligne etait ouverte, on la ferme physiquement, */ EGAL(descripteur_de_la_ligne,CANNOT_OPEN); /* Puis logiquement... */ EGAL(il_y_a_eu_une_erreur_de_transmission,FAUX); /* Enfin, on reinitialise l'indicateur d'erreurs de transmission... */ Test(IL_FAUT(IKPclose_disque_video_____editer_les_caracteres_envoyes_au_disque)) Bblock DEFV(Logical,INIT(editer_un_caractere,VRAI)); DEFV(Int,INIT(index_d_edition,PREMIER_CARACTERE)); CAL2(Prin0("\n")); CAL2(Prin1(" Caracteres envoyes au disque : '%s'\n",buffer_des_messages_complets_envoyes_au_disque)); /* Edition alphanumerique... */ CAL2(Prin0(" soit en hexa-decimal........ : ")); Tant(IL_FAUT(editer_un_caractere)) Bblock DEFV(CHAR,INIT(caractere_courant_a_editer ,ITb1(buffer_des_messages_complets_envoyes_au_disque,INDX(index_d_edition,PREMIER_CARACTERE)) ) ); Test(IFNE(caractere_courant_a_editer,END_OF_CHAIN)) Bblock CAL2(Prin1("'%02x'",caractere_courant_a_editer)); /* Edition hexa-decimale... */ INCR(index_d_edition,I); /* Passage au caractere suivant... */ Eblock ATes Bblock EGAL(editer_un_caractere,FAUX); /* L'edition s'arrete sur le premier 'END_OF_CHAIN' rencontre... */ Eblock ETes Eblock ETan CAL2(Prin0("\n")); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ERREUR("la ligne d'acces au disque video PAL-Beta n'etait pas ouverte, on ne peut donc la fermer"); Eblock ETes RETU_ERROR; Eblock EFonctionI # undef FERMETURE_DE_LA_LIGNE_DU_DISQUE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E S D ' 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 P A L - B E T A : */ /* */ /*************************************************************************************************************************************/ # define LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE \ UN \ /* Longueur de la reponse standard du disque lorsque tout s'est bien passe... */ # define ACQUITTEMENT_DU_DISQUE \ K_LF \ /* Reponse standard du disque lorsque tout s'est bien passe... */ # define NON_ACQUITTEMENT_DU_DISQUE \ SUCC(K_LF) \ /* Reponse standard du disque lorsque cela s'est mal passe... */ # define CODE_DE_COMPLETION \ SUCC(K_NULL) \ /* Reponse standard asynchrone du disque pour les commandes : */ \ /* */ \ /* 'PAL_BETA_SEARCH', 'PAL_BETA_REC_STANDBY', 'PAL_BETA_REC' et */ \ /* 'PAL_BETA_BLANK_AREA_SEARCH'. */ \ /* */ # define ERREUR_DE_COMMUNICATION_DU_DISQUE \ SUCC(CODE_DE_COMPLETION) \ /* Message d'erreur de communication entre le disque et le systeme... */ # define LE_DISQUE_A_ETE_EJECTE \ SUCC(ERREUR_DE_COMMUNICATION_DU_DISQUE) \ /* Message 'LID OPEN' envoye apres l'ejection du disque... */ # define ENVOI_D_UN_CARACTERE_AU_DISQUE(caractere_courant) \ Bblock \ Test(EST_FAUX(il_y_a_eu_une_erreur_de_transmission)) \ Bblock \ EGAL(PREMIER_CARACTERE_ITb1(buffer_d_emission),caractere_courant); \ /* Mise du cacactere dans le buffer d'emission. */ \ DODO(IKP_____temporisation_inter_caractere); \ /* On attend un peu avant d'emettre... */ \ CALS(Writ(descripteur_de_la_ligne,buffer_d_emission,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE)); \ /* Lorsque la ligne est ouverte, on emet le caractere courant, */ \ \ MEMORISATION_D_UN_CARACTERE_ENVOYE_AU_DISQUE(caractere_courant); \ /* "Empilement" du caractere courant... */ \ \ Test(IL_FAUT(un_acquittement_par_caractere)) \ Bblock \ \ LECTURE_DE_LA_REPONSE_DU_DISQUE(caractere_courant \ ,ACQUITTEMENT_DU_DISQUE \ ,LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE \ ); \ /* Lecture de l'acquittement synchrone du disque, en general... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("erreur de transmission en cours, rien n'est echange ('ENVOI D'UN CARACTERE AU DISQUE')"); \ PRINT_ERREUR("verifier que la machine correspondante :"); \ PRINT_ERREUR("1-est bien sous-tension,"); \ PRINT_ERREUR("2-est bien en mode 'remote' (et non pas 'local'),"); \ PRINT_ERREUR("3-possede bien un disque charge,"); \ PRINT_ERREUR("sinon, faire 'saneP'"); \ CAL1(Prer1("CODE ERREUR = %d\n",CODE_ERREUR)); \ Eblock \ ETes \ Eblock \ /* Procedure d'envoi d'un caractere (seul...) au disque. */ # ifdef BUG_SYSTEME_PAL_BETA_Read # define LONGUEUR_DU_BUFFER_INTERMEDIAIRE \ LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE \ /* Longueur du buffer de reception intermediaire mono-caractere. Ce buffer a ete introduit */ \ /* car sinon, la tentative de lecture en un seul 'Read()' des blocs de donnees numeriques */ \ /* se soldait par un echec... */ # define SIMULATION_DU_Read_POUR_LE_DISQUE_PAL_BETA(nombre_de_caracteres_attendus) \ Bblock \ DEFV(CHAR,DTb1(buffer_intermediaire,LONGUEUR_DU_BUFFER_INTERMEDIAIRE)); \ /* Buffer de reception mono-caractere... */ \ DEFV(Int,INIT(index,PREMIER_CARACTERE)); \ /* Index du buffer de reception. */ \ CLIR(longueur_de_la_reponse_du_disque); \ /* Initialisation du compteur des caracteres recus du disque... */ \ Komp(numero_du_caractere_courant,nombre_de_caracteres_attendus) \ Bblock \ Test(IFEQ(Read(descripteur_de_la_ligne,buffer_intermediaire,LONGUEUR_DU_BUFFER_INTERMEDIAIRE) \ ,LONGUEUR_DU_BUFFER_INTERMEDIAIRE \ ) \ ) \ Bblock \ EGAL(ITb1(IKP_____buffer_de_reception,INDX(index,PREMIER_CARACTERE)) \ ,PREMIER_CARACTERE_ITb1(buffer_intermediaire) \ ); \ INCR(index,I); \ /* Progression de l'index pour le caractere suivant eventuel... */ \ INCR(longueur_de_la_reponse_du_disque,I); \ /* Comptage des caracteres recus du disque. */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("aucun caractere n'a ete lu"); \ Eblock \ ETes \ Eblock \ EKom \ Eblock \ /* Cette procedure simule la lecture de 'N' caracteres a l'aide de 'N' lectures d'un seul */ \ /* caractere. */ # Aifdef BUG_SYSTEME_PAL_BETA_Read # define SIMULATION_DU_Read_POUR_LE_DISQUE_PAL_BETA(nombre_de_caracteres_attendus) \ Bblock \ EGAL(longueur_de_la_reponse_du_disque \ ,Read(descripteur_de_la_ligne \ ,IKP_____buffer_de_reception \ ,nombre_de_caracteres_attendus \ ) \ ); \ /* Lecture de la reponse du disque... */ \ Eblock \ /* Cette procedure effectue la lecture de 'N' caracteres un une seule operation... */ \ /* caractere. */ # Eifdef BUG_SYSTEME_PAL_BETA_Read # define LECTURE_DE_LA_REPONSE_DU_DISQUE(caractere_courant,caractere_attendu,nombre_de_caracteres_attendus) \ Bblock \ Test(EST_FAUX(il_y_a_eu_une_erreur_de_transmission)) \ Bblock \ SIMULATION_DU_Read_POUR_LE_DISQUE_PAL_BETA(nombre_de_caracteres_attendus); \ /* Lecture de la reponse du disque... */ \ Test(IFEQ(nombre_de_caracteres_attendus,LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE)) \ Bblock \ Test(IFEQ(PREMIER_CARACTERE_ITb1(IKP_____buffer_de_reception) \ ,caractere_attendu \ ) \ ) \ Bblock \ /* Cas ou tout s'est bien passe... */ \ Eblock \ ATes \ Bblock \ /* Cas ou l'on a recu une reponse autre chose qu'un acquittement... */ \ EGAL(il_y_a_eu_une_erreur_de_transmission,VRAI); \ /* Ainsi, on sait qu'il y a eu au moins un probleme... */ \ CODE_ERROR(COND(IFNE(PREMIER_CARACTERE_ITb1(IKP_____buffer_de_reception),OK) \ ,PREMIER_CARACTERE_ITb1(IKP_____buffer_de_reception) \ ,ERREUR21 \ ) \ ); \ /* Enfin, on renvoie le code en temps que code d'erreur (sauf s'il vaut 'OK'...). */ \ Test(IMEQ(PREMIER_CARACTERE_ITb1(IKP_____buffer_de_reception) \ ,NON_ACQUITTEMENT_DU_DISQUE \ ,ERREUR_DE_COMMUNICATION_DU_DISQUE \ ) \ ) \ Bblock \ /* Cas des erreurs "prevues" ou "previsibles"... */ \ PRINT_ERREUR("la commande courante au disque PAL-Beta n'a pas ete reconnue"); \ CAL1(Prer1("commande = %02x\n",caractere_courant)); \ /* Et on edite "betement" (c'est-a-dire sans fioritures) le caractere en cause... */ \ Eblock \ ATes \ Bblock \ /* Autres cas... */ \ PRINT_ERREUR("anomalie de fonctionnement (bloc deja -ou pas encore- enregistre,..."); \ CAL1(Prer1("code attendu = %02x\n",caractere_attendu)); \ Test(IFNE(caractere_courant,K_UNDEF)) \ Bblock \ CAL1(Prer1("caractere courant = %02x\n",caractere_courant)); \ /* Et on edite "betement" (c'est-a-dire sans fioritures) le caractere courant s'il ne */ \ /* s'agit pas de 'K_UNDEF'... */ \ /* */ \ /* Voici au passage la liste des codes renvoyes : */ \ /* */ \ /* 0x0a : tout va bien, la commande est acceptee ("ACK"), */ \ /* */ \ /* 0x01 : la commande demandee est terminee ("COMPLETION"), */ \ /* 0x02 : une erreur de communication RS232 (parite,...) est apparue ("ERROR"), */ \ /* 0x03 : le moteur est arrete, et le disque a ete ejecte ("LID OPEN"), */ \ /* 0x05 : la zone recherchee (image ou donnee) est en erreur ("NOT TARGET"), */ \ /* 0x06 : la zone recherchee (image ou donnee) n'existe pas ("NO FRAME NUMBER"), */ \ /* 0x07 : un marquage a ete lu ("MARK RETURN"), */ \ /* 0x0b : la commande demandee ne peut etre executee ("NAK"). */ \ /* */ \ Eblock \ ATes \ Bblock \ CAL1(Prer0("caractere courant indefini\n")); \ Eblock \ ETes \ Eblock \ ETes \ CAL1(Prer1("code recu = %02x\n" \ ,PREMIER_CARACTERE_ITb1(IKP_____buffer_de_reception) \ ) \ ); \ /* Et on edite systematiquement le code renvoye par le disque... */ \ CAL1(Prer1("nombre de caracteres attendus = %d\n",nombre_de_caracteres_attendus)); \ /* Ainsi que le nombre de caracteres attendus... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IFEQ(longueur_de_la_reponse_du_disque,nombre_de_caracteres_attendus)) \ Bblock \ /* Cas ou l'on a recu exactement ce que l'on a demande... */ \ Eblock \ ATes \ Bblock \ EGAL(il_y_a_eu_une_erreur_de_transmission,VRAI); \ /* Ainsi, on sait qu'il y a eu au moins un probleme... */ \ CODE_ERROR(ERREUR21); \ /* Enfin, on renvoie un code d'erreur... */ \ PRINT_ERREUR("il a ete recu moins de caracteres que demande"); \ CAL1(Prer1("attendus = %d\n",nombre_de_caracteres_attendus)); \ CAL1(Prer1("recus = %d\n",longueur_de_la_reponse_du_disque)); \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("erreur de transmission en cours, rien n'est echange ('LECTURE DE LA REPONSE DU DISQUE')"); \ PRINT_ERREUR("verifier que la machine correspondante est bien en mode 'remote' (et non pas 'local')"); \ PRINT_ERREUR("sinon, faire 'saneP'"); \ CAL1(Prer1("CODE ERREUR = %d\n",CODE_ERREUR)); \ Eblock \ ETes \ Eblock \ /* Procedure de lecture de la reponse du disque. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E S T E M P O R I S A T I O N S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Positive,ZINT(IKP_____temporisation_inter_caractere,ZERO))); /* Temporisation effectuee entre chaque caractere envoye au disque. Contrairement au disque */ /* Secam, il ne faut pas attendre... */ DEFV(Common,DEFV(Positive,ZINT(IKP_____temporisation_apres_ENTER,UN))); /* Temporisation effectuee apres chaque entree de parametres par 'ENTER_PAL_BETA(...)'. */ /* Et oui, a cause de l'envoi des differents parametres des commandes d'enregistrement */ /* (du type 'ENREGISTREMENT_D_UNE_SEQUENCE_PAL_BETA'), il faut entre chacun de ses appels */ /* a 'ENTER_PAL_BETA(valeur_numerique)', faire un petit dodo... */ # ifdef SYSTEME_SG4D20G_IRIX # if ( (defined(LACT21))) # define TEMPORISATION_INTER_COMMANDE \ DEUX \ /* Entre chaque commande, il faut attendre un peu (en fait l'ideal serait 1/25eme de */ \ /* seconde), ce qui est du au fait que l'execution des commandes demarre sur les */ \ /* synchronisation trame. De plus, on se met une petite marge de securite afin d'etre */ \ /* sur que tout est bien termine lorsque l'on rend la main. */ \ /* */ \ /* ATTENTION, cette valeur de 'DEUX' est conservee afin d'assurer la compatibilite... */ # Aif ( (defined(LACT21))) # Eif ( (defined(LACT21))) # Aifdef SYSTEME_SG4D20G_IRIX # Eifdef SYSTEME_SG4D20G_IRIX # TestADef TEMPORISATION_INTER_COMMANDE \ UN \ /* Entre chaque commande, il faut attendre un peu (en fait l'ideal serait 1/25eme de */ \ /* seconde), ce qui est du au fait que l'execution des commandes demarre sur les */ \ /* synchronisation trame. De plus, on se met une petite marge de securite afin d'etre */ \ /* sur que tout est bien termine lorsque l'on rend la main. */ \ /* */ \ /* ATTENTION, cette valeur de 'UN' a ete introduite apres que fut verifie a l'aide du */ \ /* programme 'v $xtc/minute$c' que l'attente 'DODO(TEMPORISATION_INTER_COMMANDE)' avait */ \ /* bien la bonne duree (ce que l'on a vu en verifiant que 60 attentes d'une seconde */ \ /* duraient bien au total une minute, soit 60 secondes...). */ DEFV(Common,DEFV(Positive,ZINT(IKP_____temporisation_inter_commande,TEMPORISATION_INTER_COMMANDE))); /* Temporisation effectuee entre chaque commande envoyee au disque... */ # undef TEMPORISATION_INTER_COMMANDE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E S L E C T U R E S D E S B L O C S D E D O N N E E S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(IKP_____lecture_des_blocs_de_donnees,LECTURE_DES_BLOCS_DE_DONNEES))); /* Afin de savoir si la lecture des blocs de donnees est AUTORISEe ou INTERDITe. On notera */ /* que ce dispositif a ete introduit afin d'une part de lutter contre le fameux "bug" */ /* 'BUG_SYSTEME_PAL_BETA_LECTURE_D_UN_BLOC_DE_DONNEES_PAL_BETA' en permettant ainsi de */ /* ne pas faire les lectures de blocs numeriques, mais d'autre part de permettre, malgre */ /* tout, quand ce "bug" est actif de lire les blocs de donnees, ce qui peut etre utile, par */ /* exemple, lorsqu'apres avoir initialise un disque par 'v $xci/disk_vIdeo_P$Z', on souhaite */ /* verifier ce qui a ete fait grace a 'v $xci/disk_vidEo_P$Z'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 P A L - B E T A : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IKPenvoi_d_une_commande_au_disque_video(commande ,longueur_de_la_commande ,un_acquittement_par_caractere ,attendre_une_reponse_multiple ,lire_des_donnees_numeriques ,longueur_des_donnees_numeriques ) ) ) DEFV(Argument,DEFV(CHAR,DTb0(commande))); /* Chaine argument correspondant a une commande a envoyer au disque video. */ DEFV(Argument,DEFV(Positive,longueur_de_la_commande)); /* Longueur de la chaine argument ; en effet, on ne peut utiliser le 'END_OF_CHAIN', */ /* puisque des caracteres 'NULL's peuvent apparaitre dedans... */ DEFV(Argument,DEFV(Logical,un_acquittement_par_caractere)); /* En general, on attend un caractere d'acquittement ('ACQUITTEMENT_DU_DISQUE') par */ /* caractere ecrit, sauf lorsqu'on ecrit des donnees numeriques, auquel cas, ils sont */ /* ecrits a la volee... */ DEFV(Argument,DEFV(Logical,attendre_une_reponse_multiple)); /* En general, on attend uniquement un caractere d'acquittement ('ACQUITTEMENT_DU_DISQUE') */ /* par caractere transmis ; malgre cela, pour certaines commandes, un acquittement */ /* asynchrone doit etre attendu : c'est le cas entre autre des commandes : */ /* 'PAL_BETA_SEARCH', 'PAL_BETA_REC_STANDBY', 'PAL_BETA_REC' et */ /* 'PAL_BETA_BLANK_AREA_SEARCH'. Mais ATTENTION, la logique de tout cela est assez */ /* complexe : par exemple, le 'CODE_DE_COMPLETION' renvoye par 'PAL_BETA_REC_STANDBY' */ /* n'apparait qu'apres la derniere fonction 'PAL_BETA_ENTER' qui doit suivre... Il est */ /* donc pratiquement impossible de provoquer cette attente automatiquement, d'ou cet */ /* argument "supplementaire". Enfin, dans le cas de 'PAL_BETA_EJECT', c'est le code */ /* 'LE_DISQUE_A_ETE_EJECTE' qui est recu... */ DEFV(Argument,DEFV(Logical,lire_des_donnees_numeriques)); /* Indique si un bloc de donnees numeriques est a lire ; on notera que l'on a alors de */ /* plus pour 'LECTURE_D_UN_BLOC_DE_DONNEES_PAL_BETA(...)' : */ /* */ /* un_acquittement_par_caractere = VRAI, et */ /* attendre_une_reponse_multiple = VRAI. */ /* */ /* et pour 'ETAT_PAL_BETA' : */ /* */ /* un_acquittement_par_caractere = FAUX, et */ /* attendre_une_reponse_multiple = FAUX. */ /* */ DEFV(Argument,DEFV(Positive,longueur_des_donnees_numeriques)); /* Indique la longueur des reponses numeriques (lorsqu'il faut les lire...). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; DEFV(CHAR,INIT(commande_courante,PREMIER_CARACTERE_ITb0(commande))); /* Le premier caractere de la chaine 'commande' est le code de la commande... */ DEFV(Int,INIT(index,PREMIER_CARACTERE)); /* Index de la chaine argument de commande. */ DEFV(CHAR,DTb1(buffer_d_emission,LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE)); /* Buffer d'emission du caractere courant d'une commande, */ 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. */ /*..............................................................................................................................*/ Test(IFNE(descripteur_de_la_ligne,CANNOT_OPEN)) Bblock Test(EST_VRAI(il_y_a_eu_une_erreur_de_transmission)) Bblock CODE_ERROR(ERREUR21); /* Dans le cas ou il y a deja en entrant dans 'IKPenvoi_d_une_commande_au_disque_video(...)' */ /* une erreur de transmission, il faut forcer le code d'erreur (qui de toute evidence avait */ /* du etre positionne par une appel de 'IKPenvoi_d_une_commande_au_disque_video(...)' ayant */ /* precede celui-ci) afin de pouvoir le tester au retour... En effet, cette fonction est */ /* relayee par la procedure : */ /* */ /* COMMANDE_QUELCONQUE_PAL_BETA(...) */ /* */ /* qui peut etre appelee plusieurs fois par certaines commandes, et en particulier par : */ /* */ /* INITIALISATION_MINIMALE_PAL_BETA */ /* INITIALISATION_MAXIMALE_PAL_BETA */ /* ENREGISTREMENT_D_UNE_SEQUENCE_PAL_BETA */ /* ENREGISTREMENT_D_UN_BLOC_DE_DONNEES_PAL_BETA */ /* */ /* Il est donc imperatif de pieger les defauts, ou qu'ils arrivent... */ Eblock ATes Bblock Eblock ETes Tant(IFLE(index,LSTX(PREMIER_CARACTERE,longueur_de_la_commande))) Bblock ENVOI_D_UN_CARACTERE_AU_DISQUE(ITb0(commande,INDX(index,PREMIER_CARACTERE))); /* Envoi du caractere courant au disque et attente d'acquittement... */ INCR(index,I); /* Puis passage au caractere suivant... */ Eblock ETan Test(IL_FAUT(attendre_une_reponse_multiple)) Bblock LECTURE_DE_LA_REPONSE_DU_DISQUE(PREMIER_CARACTERE_ITb0(commande) ,COND(IFEQ(commande_courante,PAL_BETA_EJECT) ,LE_DISQUE_A_ETE_EJECTE ,CODE_DE_COMPLETION ) ,LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE ); /* Lecture d'un acquittement supplementaire sous forme d'un code asynchrone. */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(lire_des_donnees_numeriques)) Bblock Test(IFGT(longueur_des_donnees_numeriques,LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE_PAL_BETA)) Bblock PRINT_ERREUR("la reponse numerique attendue est trop volumineuse"); Eblock ATes Bblock Eblock ETes LECTURE_DE_LA_REPONSE_DU_DISQUE(K_UNDEF ,K_UNDEF ,MIN2(longueur_des_donnees_numeriques ,LONGUEUR_MAXIMALE_DES_REPONSES_DU_DISQUE_PAL_BETA ) ); /* Lecture d'un bloc de donnees numeriques, mais ATTENTION : avec le "check-sum"... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ERREUR("la ligne d'acces au disque video PAL-Beta n'est pas ouverte, la communication est donc impossible"); Eblock ETes RETU_ERROR; Eblock EFonctionI # undef LECTURE_DE_LA_REPONSE_DU_DISQUE # ifdef BUG_SYSTEME_PAL_BETA_Read # undef LONGUEUR_DU_BUFFER_INTERMEDIAIRE # undef SIMULATION_DU_Read_POUR_LE_DISQUE_PAL_BETA # Aifdef BUG_SYSTEME_PAL_BETA_Read # undef SIMULATION_DU_Read_POUR_LE_DISQUE_PAL_BETA # Eifdef BUG_SYSTEME_PAL_BETA_Read # undef ENVOI_D_UN_CARACTERE_AU_DISQUE # undef LE_DISQUE_A_ETE_EJECTE # undef ERREUR_DE_COMMUNICATION_DU_DISQUE # undef CODE_DE_COMPLETION # undef NON_ACQUITTEMENT_DU_DISQUE # undef ACQUITTEMENT_DU_DISQUE # undef LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE # undef LONGUEUR_DES_MESSAGES_ENVOYES_AU_DISQUE # undef MEMORISATION_D_UN_CARACTERE_ENVOYE_AU_DISQUE # undef LONGUEUR_MAXIMALE_DES_MESSAGES_COMPLETS_ENVOYES_AU_DISQUE #Aifdef __VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA /* Common,DEFV(Fonction,) : compiler la gestion du disque PAL-Beta. */ #Eifdef __VERSION__COMPILER_LA_GESTION_DU_DISQUE_PAL_BETA /* Common,DEFV(Fonction,) : compiler la gestion du disque PAL-Beta. */ _______________________________________________________________________________________________________________________________________