| [637] | 1 | #include "diabolo.h"
 | 
|---|
 | 2 | #include "synchro.h"
 | 
|---|
 | 3 | #include "carte.h"
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | 
 | 
|---|
 | 6 | 
 | 
|---|
 | 7 | #define indicemax       1000
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | double taille_carte,pas,vitesse;
 | 
|---|
 | 10 | int bolo_carte,indice,ind_moy,debut_ligne,moy,sens_ligne;
 | 
|---|
 | 11 | double dynamique;
 | 
|---|
 | 12 | double seuil;
 | 
|---|
 | 13 | 
 | 
|---|
 | 14 | double carte[nb_max_bolo][indicemax];
 | 
|---|
 | 15 | double  xx[indicemax];
 | 
|---|
 | 16 | double  yy[indicemax];
 | 
|---|
 | 17 | int     flag_fin[indicemax],flag_sens[indicemax];
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | double xx0,yy0;
 | 
|---|
 | 20 | 
 | 
|---|
 | 21 | 
 | 
|---|
 | 22 | //--------------------  fonction  exec  de  la  fenetre : trace_carte  -------------------------------
 | 
|---|
 | 23 | void    echelles(void);
 | 
|---|
 | 24 | void    retrace_carte(void);
 | 
|---|
 | 25 | 
 | 
|---|
 | 26 | void exec_carte(int fen,int item,double valeur,...) 
 | 
|---|
 | 27 | {
 | 
|---|
 | 28 | if(item>1000) item-=1000;               // pour appeler le case pour tous les cara d'un edit texte
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 | switch(item)
 | 
|---|
 | 31 |         {
 | 
|---|
 | 32 |         case ouverture     :    gg->trace_ouvert=gg->trace_ouvert | 16 ;        
 | 
|---|
 | 33 |                                 selectgra(fen);
 | 
|---|
 | 34 |                                 graph->taille_graduations=7;
 | 
|---|
 | 35 | 
 | 
|---|
 | 36 |         case cart_debut :       echelles();
 | 
|---|
 | 37 |                                 indice=0;ind_moy=0;sens_ligne=1;debut_ligne=1;  // premier point a venir
 | 
|---|
 | 38 |                                 xx0=-0.5*(taille_carte-0.5*pas);yy0=-0.5*taille_carte;
 | 
|---|
 | 39 |                                 break;
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | 
 | 
|---|
 | 43 |         case fermeture     :    gg->trace_ouvert=gg->trace_ouvert & (255-16);           // enleve le 16
 | 
|---|
 | 44 |                                                 break;
 | 
|---|
 | 45 |    
 | 
|---|
 | 46 |         case cart_taille_carte :                        
 | 
|---|
 | 47 |         case cart_pas :                 
 | 
|---|
 | 48 |         case cart_dynamique :                   
 | 
|---|
 | 49 |         case cart_bolo :                        
 | 
|---|
 | 50 |         case cart_vitesse :     echelles();             
 | 
|---|
 | 51 |                                 
 | 
|---|
 | 52 |                                 break;
 | 
|---|
 | 53 |         
 | 
|---|
 | 54 |         case cart_retrace :     retrace_carte();
 | 
|---|
 | 55 |                                 break;                  
 | 
|---|
 | 56 |                                         
 | 
|---|
 | 57 |         default  :              break;
 | 
|---|
 | 58 |         }
 | 
|---|
 | 59 | }
 | 
|---|
 | 60 | 
 | 
|---|
 | 61 | 
 | 
|---|
 | 62 | void echelles(void)
 | 
|---|
 | 63 | {
 | 
|---|
 | 64 | double moyenne_double;
 | 
|---|
 | 65 | taille_carte=litD(fenetre_annexe,cart_taille_carte,0);
 | 
|---|
 | 66 | pas=litD(fenetre_annexe,cart_pas,0);
 | 
|---|
 | 67 | vitesse=litD(fenetre_annexe,cart_vitesse,0);
 | 
|---|
 | 68 | dynamique=litD(fenetre_annexe,cart_dynamique,0);
 | 
|---|
 | 69 | bolo_carte=litD(fenetre_annexe,cart_bolo,0);
 | 
|---|
 | 70 | selectgra(fenetre_annexe);
 | 
|---|
 | 71 | graph->ymin=-0.5*(taille_carte+2*pas);
 | 
|---|
 | 72 | graph->ymax=0.5*(taille_carte+2*pas);
 | 
|---|
 | 73 | graph->ypas=pas;
 | 
|---|
 | 74 | graph->xmin=-0.5*(taille_carte+2*pas);
 | 
|---|
 | 75 | graph->xmax=0.5*(taille_carte+2*pas);
 | 
|---|
 | 76 | graph->xpas=pas;
 | 
|---|
 | 77 | graph->graduations=0;
 | 
|---|
 | 78 | graph->grille=1;
 | 
|---|
 | 79 | graph->aspect=-1;
 | 
|---|
 | 80 | efface(fenetre_annexe);
 | 
|---|
 | 81 | // moyennes par demi pas en x
 | 
|---|
 | 82 | moyenne_double= pas * 0.5 /( gg->periode_echantillonage * vitesse );
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 | if(gg->trace_ouvert&32)         moyenne_double/=(double)synchro_periode;        // pour mesure avec Detection synchrone
 | 
|---|
 | 85 | moy=(int)(moyenne_double+0.5);
 | 
|---|
 | 86 | if(moy<1) moy=1;
 | 
|---|
 | 87 | printf("moyennes calculee sur %6.2f points  soit m=%d \n",moyenne_double,moy);
 | 
|---|
 | 88 | }
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 | void trace_carte(double * y)
 | 
|---|
 | 91 | {
 | 
|---|
 | 92 | int j;
 | 
|---|
 | 93 | // calculer le nombre de points de mesure dans un pas a la vitesse 
 | 
|---|
 | 94 | //      gg->periode_echantillonage      contient la duree entre deux points de mesure (pour diabolo)
 | 
|---|
 | 95 | 
 | 
|---|
 | 96 | if( (!(gg->don.sync[sync_scan]&&gg->don.sync[sync_subscan])) && (indice==0) ) return;   
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 | if( (!gg->don.sync[sync_subscan]) && (indice>2) && (debut_ligne<3) ) debut_ligne=2;     // entre deux subscan
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 | if(ind_moy==0)  for(j=0;j<nb_max_bolo;j++)      carte[j][indice]=0;
 | 
|---|
 | 101 | if(ind_moy<moy) for(j=0;j<nb_max_bolo;j++)      carte[j][indice]+=y[j];
 | 
|---|
 | 102 | if(ind_moy<moy+10) ind_moy++;   // pour ne pas continuer a l'infini
 | 
|---|
 | 103 | 
 | 
|---|
 | 104 | if( (ind_moy>=moy) && (indice<indicemax) )
 | 
|---|
 | 105 |         {
 | 
|---|
 | 106 |         if(ind_moy==moy)
 | 
|---|
 | 107 |                 {
 | 
|---|
 | 108 |                 int couleur_degrade;
 | 
|---|
 | 109 |                 xx[indice]=xx0;
 | 
|---|
 | 110 |                 yy[indice]=yy0;
 | 
|---|
 | 111 |                 flag_fin[indice]=debut_ligne;
 | 
|---|
 | 112 |                 flag_sens[indice]=sens_ligne;
 | 
|---|
 | 113 |                 for(j=0;j<nb_max_bolo;j++)      carte[j][indice]/=(double)moy;
 | 
|---|
 | 114 | 
 | 
|---|
 | 115 | //              if(debut_ligne==1)      seuil=carte[bolo-1][indice];    // premier point d'une ligne : seuil pour la suite 
 | 
|---|
 | 116 |                 seuil=0;        // pas de seuil: utiliser le filtrage en mode puissance totale
 | 
|---|
 | 117 |                                 //  et raz parasite  en mode detection synchrone
 | 
|---|
 | 118 |                 couleur_degrade=1050+(50.*(carte[bolo_carte-1][indice]-seuil)/dynamique);
 | 
|---|
 | 119 |                 if(sens_ligne>0)rectangle(fenetre_annexe,xx0-0.25*pas,yy0-0.5*pas,xx0+0.25*pas,yy0,couleur_degrade);
 | 
|---|
 | 120 |                         else    rectangle(fenetre_annexe,xx0-0.25*pas,yy0,xx0+0.25*pas,yy0+0.5*pas,couleur_degrade);
 | 
|---|
 | 121 |                 if(debut_ligne==1)      
 | 
|---|
 | 122 |                         {
 | 
|---|
 | 123 |                         debut_ligne=0;  // premier point 
 | 
|---|
 | 124 |                         printf(" debut_ligne indice=%d :  x=%g  y=%g   valeur=%g  couleur=%d \n",indice,xx0,yy0,carte[8][indice],couleur_degrade);
 | 
|---|
 | 125 |                         }
 | 
|---|
 | 126 |                 indice++;
 | 
|---|
 | 127 |                 }
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 | 
 | 
|---|
 | 130 |         if( (debut_ligne==2) && (!gg->don.sync[sync_scan]) )    
 | 
|---|
 | 131 |                 {
 | 
|---|
 | 132 |                 debut_ligne=3;  // fin de carte
 | 
|---|
 | 133 |                 son(133);
 | 
|---|
 | 134 |                 printf("fin de carte \n\n");
 | 
|---|
 | 135 |                 }
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 |         if(gg->don.sync[sync_subscan])  
 | 
|---|
 | 138 |                 {
 | 
|---|
 | 139 |                 if(debut_ligne==2)      // prepare pour mesure premier point
 | 
|---|
 | 140 |                         {
 | 
|---|
 | 141 |                         sens_ligne=-sens_ligne;
 | 
|---|
 | 142 |                         if(sens_ligne>0) yy0+=pas;
 | 
|---|
 | 143 |                         xx0=-0.5*sens_ligne*(taille_carte-0.5*pas);
 | 
|---|
 | 144 |                         debut_ligne=1;   ind_moy=0;     // premier point 
 | 
|---|
 | 145 |                         }
 | 
|---|
 | 146 |                 if(!debut_ligne)        // prepare pour mesure point suivant
 | 
|---|
 | 147 |                         {
 | 
|---|
 | 148 |                         xx0+=sens_ligne*0.5*pas;
 | 
|---|
 | 149 |                         if( (xx0<0.5*taille_carte) && (xx0>-0.5*taille_carte) ) ind_moy=0;
 | 
|---|
 | 150 |                         }
 | 
|---|
 | 151 |                 }
 | 
|---|
 | 152 |         }
 | 
|---|
 | 153 | 
 | 
|---|
 | 154 | }
 | 
|---|
 | 155 | 
 | 
|---|
 | 156 | 
 | 
|---|
 | 157 | void    retrace_carte(void)
 | 
|---|
 | 158 | {
 | 
|---|
 | 159 | int i,k,kk,couleur_degrade;
 | 
|---|
 | 160 | double sx,sy,sx2,sxy,n,a,b;             // pour le fit lineaire
 | 
|---|
 | 161 | efface(fenetre_annexe);
 | 
|---|
 | 162 | //  calcul dynamique automatique 
 | 
|---|
 | 163 | dynamique=0.000000001;
 | 
|---|
 | 164 | 
 | 
|---|
 | 165 | for(i=0;i<indice;i+=kk) 
 | 
|---|
 | 166 |         {                       //  une ligne commence en indice==i
 | 
|---|
 | 167 |                                 // fit lineaire avec un poid null au milieu  :  y= ax+b
 | 
|---|
 | 168 |                                 //  
 | 
|---|
 | 169 |         //  calcule la droite a soustraire
 | 
|---|
 | 170 |         sx=0;sy=0;sx2=0;sxy=0;n=0;
 | 
|---|
 | 171 |         k=0;
 | 
|---|
 | 172 |         do      {
 | 
|---|
 | 173 | //              printf(" i=%d  k=%d  carte=%g  \n",i,k,carte[bolo-1][i+k]);
 | 
|---|
 | 174 |                 if( (xx[i+k]>0.25*taille_carte) ou (xx[i+k]<-0.25*taille_carte) )
 | 
|---|
 | 175 |                         {
 | 
|---|
 | 176 |                         n++;
 | 
|---|
 | 177 |                         sx+=xx[i+k];
 | 
|---|
 | 178 |                         sy+=carte[bolo_carte-1][i+k];
 | 
|---|
 | 179 |                         sx2+=xx[i+k]*xx[i+k];
 | 
|---|
 | 180 |                         sxy+=xx[i+k]*carte[bolo_carte-1][i+k];
 | 
|---|
 | 181 |                         }
 | 
|---|
 | 182 |                 k++;
 | 
|---|
 | 183 |                 }
 | 
|---|
 | 184 |         while ( (k<indice-i) &&  (flag_fin[i+k]!=1) );
 | 
|---|
 | 185 |         
 | 
|---|
 | 186 |         kk=k; // kk = longueur de ligne 
 | 
|---|
 | 187 |         a=(sxy*n-sx*sy)/(sx2*n-sx*sx); b=(sy-a*sx)/n;
 | 
|---|
 | 188 | //      printf(" une ligne indice i=%d  ligne de %d points a=%g  b=%g \n\n",i,kk,a,b); 
 | 
|---|
 | 189 |         
 | 
|---|
 | 190 |         //  soustrait la droite fittée sur la ligne et calcule la dynamique
 | 
|---|
 | 191 |         for(k=0;k<kk;k++)
 | 
|---|
 | 192 |                 {
 | 
|---|
 | 193 |                 carte[bolo_carte-1][i+k]-=a*xx[i+k]+b;
 | 
|---|
 | 194 |                 
 | 
|---|
 | 195 | //              printf(" k=%d  carte/fittee=%g  \n",k,carte[bolo_carte-1][i+k]);
 | 
|---|
 | 196 | 
 | 
|---|
 | 197 |                 if(dynamique<carte[bolo_carte-1][i+k])  dynamique=carte[bolo_carte-1][i+k];
 | 
|---|
 | 198 |                 if(dynamique<-carte[bolo_carte-1][i+k])  dynamique=-carte[bolo_carte-1][i+k];
 | 
|---|
 | 199 |                 }
 | 
|---|
 | 200 |         }
 | 
|---|
 | 201 |         
 | 
|---|
 | 202 | ecritD( fenetre_annexe,cart_dynamique,"%g",dynamique);
 | 
|---|
 | 203 | 
 | 
|---|
 | 204 | for(i=0;i<indice;i++)
 | 
|---|
 | 205 |         {       
 | 
|---|
 | 206 |         couleur_degrade=1050+(50.*carte[bolo_carte-1][i]/dynamique);
 | 
|---|
 | 207 | //      printf(" retrace : debut_ligne=%d i=%d :  x=%g  y=%g   valeur=%g  couleur=%d \n",debut_ligne,i,xx0,yy0,carte[8][i],couleur_degrade);
 | 
|---|
 | 208 |         if(flag_sens[i]>0)      rectangle(fenetre_annexe,xx[i]-0.25*pas,yy[i]-0.5*pas,xx[i]+0.25*pas,yy[i],couleur_degrade);
 | 
|---|
 | 209 |                 else            rectangle(fenetre_annexe,xx[i]-0.25*pas,yy[i],xx[i]+0.25*pas,yy[i]+0.5*pas,couleur_degrade);
 | 
|---|
 | 210 |         }       
 | 
|---|
 | 211 | }
 | 
|---|
 | 212 | 
 | 
|---|
 | 213 | 
 | 
|---|
 | 214 | 
 | 
|---|
 | 215 | 
 | 
|---|
 | 216 | 
 | 
|---|
 | 217 | 
 | 
|---|
 | 218 | 
 | 
|---|