#include /*#include #include #include #define utilitaires_de_block_archeops */ #include "choix_acquisition.h" #include "archeops.h" #include "bit_block.h" #include "choix_param.h" #include "structure.h" #include "tm.h" #include "tache.h" #include "bolo.h" #include "carte_acqui.h" #include "carte_pci.h" #define cadence_taux 16 #define mode_acquisition 0x00 //0xff en mode inverse, 0x00 en mode normal unsigned long buffer; int llgg,somme,type_du_block,numero; int deb; /*deb vaut zero si aucun debut n'a encore ete trouve*/ int compteur; int cpt_cherche_debut; unsigned long taux; unsigned long Nvide, Nplein; def_long_block int lit_bit(block_type_modele *pbk) { int i,m,bit; // unsigned char bit; /*c'est le bit lu*/ bit=un_bit()^mode_acquisition; switch(bit) { case bit_vide : return(lit_bit_vide); case bit_un : buffer=(buffer>>1)|0x80000000; break; case bit_zero : buffer=0x7fffffff & (buffer>>1); break; default : ecrit_erreur_bit(erreur_bit_erreur); buffer=buffer>>1; break; } compteur++; i=compteur%32; switch(deb) { case(1) : /*signifie qu'un debut a ete trouve precedemment*/ if(i==31) { /*lecture du code 1*/ pbk->code1=buffer; deb=2; } break; case(2) : /*lecture du code 2*/ if(i==31) { pbk->code2=buffer; // type_du_block=((buffer>>24)&0xff); // numero=(buffer&0xffffff); deb=3; /*Quelques tests avant de continuer*/ llgg=longueur_block(pbk); somme=somme_block(pbk); type_du_block=type_block(pbk); numero=numero_block(pbk); if((type_du_block<0) || (type_du_block>nb_type_blocks)) { ecrit_erreur_bit(erreur_type); deb=0; /*on va rechercher un nouveau debut*/ } if(llgg!=long_block[type_du_block]) { ecrit_erreur_bit(erreur_longueur); deb=0; /*on va rechercher un nouveau debut*/ } // if(deb) ecrit_erreur_bit(bloc_correct); } break; case(3) : if(i==31) { m=(compteur+1)/32-4; if( (m>(taille_maxi_block_archeops)/4) ou (m<0) ) { ecrit_erreur_bit(erreur_longueur); deb=0; } else { pbk->mot[m]=buffer; if(m==llgg/4-4) /*en principe, c'est le mot fin*/ { if(pbk->mot[m] == fin_block_mesure) { /* if(calcul_somme_block(pbk,llgg)!=somme) { ecrit_erreur_bit(erreur_somme); } */ // else ecrit_erreur_bit(bloc_correct); deb=0; Nplein=compteur+1; compteur=0; //Calcul du taux de remplissage taux=taux+(((0xffff-taux)*Nplein)>>cadence_taux); tt->nb_lec_fofo_ext=((taux*1000)>>cadence_taux); return(lit_bit_un_block); } else { ecrit_erreur_bit(erreur_fin); /*ecrire ici une nouvelle recherche de debut dans pbk*/ deb=0; } } } } break; default : if(compteur>1000) { Nvide=compteur; compteur=0; taux=taux-((taux*Nvide)>>cadence_taux); tt->nb_lec_fofo_ext=((taux*1000)>>cadence_taux); } if(buffer==debut_block_mesure) { deb=1; Nvide=compteur-32; compteur=31; pbk->debut=buffer; } else { if( (cpt_cherche_debut++<0) ou (cpt_cherche_debut>10000) ) { cpt_cherche_debut=0; // ecrit_erreur_bit(cherche_debut); } } break; } return(lit_bit_OK); }