| 1 | #include "diabolo.h" | 
|---|
| 2 | #include "bolo.h" | 
|---|
| 3 | #include "auto.h" | 
|---|
| 4 | #include "arcunit.h" | 
|---|
| 5 | #include "tm.h" | 
|---|
| 6 |  | 
|---|
| 7 | //#define bon_type(j)           ( (litD(fen,auto_thermo,0)&&(parametres.bolo_type[j]==0)) ou(litD(fen,auto_voie1,0)&&(parametres.bolo_type[j]==1)) ou(litD(fen,auto_voie2,0)&&(parametres.bolo_type[j]==2)) ou(litD(fen,auto_voie3,0)&&(parametres.bolo_type[j]==3)) ) | 
|---|
| 8 | #define bon_type(j)     1 | 
|---|
| 9 |  | 
|---|
| 10 |  | 
|---|
| 11 | int     vg[nb_max_bolo];                        // 0 ou vieux gain pour remonter le gain | 
|---|
| 12 |  | 
|---|
| 13 |  | 
|---|
| 14 | //--------------------  fonction  exec  de  la  fenetre : auto  ------------------------------- | 
|---|
| 15 |  | 
|---|
| 16 | void exec_auto(int fen,int item,double valeur,...) | 
|---|
| 17 | { | 
|---|
| 18 | int j; | 
|---|
| 19 | if(item>1000) item-=1000;               // pour appeler le case pour tous les cara d'un edit texte | 
|---|
| 20 |  | 
|---|
| 21 | switch(item) | 
|---|
| 22 | { | 
|---|
| 23 | case ouverture      : | 
|---|
| 24 | /*    case auto_bolo_couleur : | 
|---|
| 25 | case auto_bolo_couleur+1 : | 
|---|
| 26 | case auto_bolo_couleur+2 : | 
|---|
| 27 | case auto_bolo_couleur+3 : | 
|---|
| 28 | case auto_bolo_couleur+4 : | 
|---|
| 29 | case auto_bolo_couleur+5 : | 
|---|
| 30 | case auto_bolo_couleur+6 : | 
|---|
| 31 | case auto_bolo_couleur+7 : | 
|---|
| 32 | case auto_bolo_couleur+8 : | 
|---|
| 33 | case auto_bolo_couleur+9 : | 
|---|
| 34 | case auto_bolo_couleur+10 : | 
|---|
| 35 | case auto_bolo_couleur+11 : | 
|---|
| 36 | case auto_bolo_couleur+12 : | 
|---|
| 37 |  | 
|---|
| 38 | for(i=0;i<max_couleur;i++) | 
|---|
| 39 | { | 
|---|
| 40 | bolo_couleur[i]=litD(fen,auto_bolo_couleur+i,0L); | 
|---|
| 41 | if( (bolo_couleur[i]<1) ou (bolo_couleur[i]>nb_max_bolo) )   bolo_couleur[i]=0; | 
|---|
| 42 | printf(" i=%d bolo=%d    ",i,bolo_couleur[i]); | 
|---|
| 43 | } | 
|---|
| 44 | printf("\n"); | 
|---|
| 45 | */                              break; | 
|---|
| 46 |  | 
|---|
| 47 |  | 
|---|
| 48 |  | 
|---|
| 49 |  | 
|---|
| 50 | case caseferme  :           cache(fen);     infos(fen)->action=0;   break; | 
|---|
| 51 |  | 
|---|
| 52 | case auto_tout_auto : | 
|---|
| 53 | for(j=0;j<nb_max_bolo;j++) | 
|---|
| 54 | if( fenetre(j+1) && (!litD(j+1,b_bloq,0L)) && bon_type(j) ) | 
|---|
| 55 | {ecritD(j+1,b_auto,1);auto_control(j,auto_force);} | 
|---|
| 56 | break; | 
|---|
| 57 |  | 
|---|
| 58 | case auto_rien_auto : | 
|---|
| 59 | for(j=0;j<nb_max_bolo;j++) | 
|---|
| 60 | if( fenetre(j+1) && (!litD(j+1,b_bloq,0L)) && bon_type(j)) | 
|---|
| 61 | ecritD(j+1,b_auto,0); | 
|---|
| 62 | break; | 
|---|
| 63 |  | 
|---|
| 64 | case auto_transitoire_auto : | 
|---|
| 65 | for(j=0;j<nb_max_bolo;j++) | 
|---|
| 66 | if( fenetre(j+1) && (!litD(j+1,b_bloq,0L)) && bon_type(j) ) | 
|---|
| 67 | exec_bolo(j+1,b_auto_trans,0); | 
|---|
| 68 | break; | 
|---|
| 69 |  | 
|---|
| 70 |  | 
|---|
| 71 | case auto_fixe_gain : | 
|---|
| 72 | for(j=0;j<nb_max_bolo;j++) | 
|---|
| 73 | if( fenetre(j+1) && bon_type(j)) | 
|---|
| 74 | if(!litD(j+1,b_bloq,0L))        exec_bolo(j+1,b_gain,litD(fen,auto_gain,0L)); | 
|---|
| 75 | break; | 
|---|
| 76 |  | 
|---|
| 77 |  | 
|---|
| 78 | case auto_fixe_courant : | 
|---|
| 79 | for(j=0;j<nb_max_bolo;j++) | 
|---|
| 80 | if( fenetre(j+1) && bon_type(j)) | 
|---|
| 81 | if(!litD(j+1,b_bloq,0L))        exec_bolo(j+1,b_tri,litD(fen,auto_courant,0L)); | 
|---|
| 82 | break; | 
|---|
| 83 |  | 
|---|
| 84 |  | 
|---|
| 85 | case auto_auto_val :        break; | 
|---|
| 86 | case auto_gain :            break; | 
|---|
| 87 | default  :                  break; | 
|---|
| 88 | } | 
|---|
| 89 | } | 
|---|
| 90 |  | 
|---|
| 91 |  | 
|---|
| 92 | void auto_transitoire(int bolo,int ct) | 
|---|
| 93 | { | 
|---|
| 94 | int i; | 
|---|
| 95 | double a,tt,dd; | 
|---|
| 96 | int n=gg->reglage.horloge.nb_mesures; | 
|---|
| 97 | static double   coef[nb_max_bolo]={0,0}; | 
|---|
| 98 | static double   val_p[nb_max_bolo]; | 
|---|
| 99 | def_gains | 
|---|
| 100 | if(ct%4!=0)     return; | 
|---|
| 101 |  | 
|---|
| 102 | if(coef[0]==0)  for(i=0;i<nb_max_bolo;i++)      coef[i]=0.05; | 
|---|
| 103 |  | 
|---|
| 104 |  | 
|---|
| 105 | tt=0;for(i=0;i<n;i++) | 
|---|
| 106 | { | 
|---|
| 107 | a=(double) ((gg->bol_per[bolo-1][i]&0x7fff)-0x4000);    //  16 bit utiles dans     gg->bol_per | 
|---|
| 108 | // FONCTION :   3 -1 -1 -1 -3 1 1 1 | 
|---|
| 109 | switch(8*i/n) | 
|---|
| 110 | { | 
|---|
| 111 | case 0  :       tt      +=      3*a;    break; | 
|---|
| 112 | case 1  :       tt      -=      a;      break; | 
|---|
| 113 | case 2  :       tt      -=      a;      break; | 
|---|
| 114 | case 3  :       tt      -=      a;      break; | 
|---|
| 115 | case 4  :       tt      -=      3*a;    break; | 
|---|
| 116 | case 5  :       tt      +=      a;      break; | 
|---|
| 117 | case 6  :       tt      +=      a;      break; | 
|---|
| 118 | case 7  :       tt      +=      a;      break; | 
|---|
| 119 | default :       break; | 
|---|
| 120 | } | 
|---|
| 121 | } | 
|---|
| 122 | tt/=0.01*(double)parametr.bolo[bolo-1].bolo_gain*gain_ampli(gg->reglage.bolo[bolo-1]); | 
|---|
| 123 |  | 
|---|
| 124 | printf("transitoire auto ct=%d  bolo %d  : ",ct,bolo); | 
|---|
| 125 | printf(" valeur tt=%g ",tt); | 
|---|
| 126 |  | 
|---|
| 127 |  | 
|---|
| 128 | if(ct==16)              // premiere mesure en 20  :  change le coef  en  16 | 
|---|
| 129 | { | 
|---|
| 130 | double rr; | 
|---|
| 131 | /*      correction faite                                = ( tt - val_p[bolo-1] ) | 
|---|
| 132 | correction qu'il falait faire                   =       - val_p[bolo-1] | 
|---|
| 133 |  | 
|---|
| 134 | la correction  en valeur de dac faite   =        val_p[bolo-1] * coef[bolo-1] | 
|---|
| 135 |  | 
|---|
| 136 | la correction dac qu'il aurait fallu faire       val_p[bolo-1] * coef[bolo-1]   * (- val_p[bolo-1]) / ( tt - val_p[bolo-1] ) | 
|---|
| 137 | */ | 
|---|
| 138 | if(val_p[bolo-1] -tt )          rr =  ( val_p[bolo-1]) / (  val_p[bolo-1]-tt ); | 
|---|
| 139 | if(rr<0.2) rr=0.2; | 
|---|
| 140 | if(rr>4) rr=4; | 
|---|
| 141 | coef[bolo-1]= coef[bolo-1] * rr; | 
|---|
| 142 | printf(" calcul du coef = coef=%g \n", coef[bolo-1]); | 
|---|
| 143 |  | 
|---|
| 144 | } | 
|---|
| 145 |  | 
|---|
| 146 |  | 
|---|
| 147 | val_p[bolo-1]=tt; | 
|---|
| 148 | //dd=(double)gg->reglage.dac[d_trans][bolo-1] + tt * coef[bolo-1] ;     // nouvelle valeur de transitoire | 
|---|
| 149 | dd=(double)dac_T(gg->reglage.bolo[bolo-1]) + tt * coef[bolo-1] ;        // nouvelle valeur de transitoire | 
|---|
| 150 |  | 
|---|
| 151 | while( (dd<-10) ou (dd>4010) )  {coef[bolo-1]*=0.8;dd=(double)dac_T(gg->reglage.bolo[bolo-1]) + tt * coef[bolo-1] ;} | 
|---|
| 152 |  | 
|---|
| 153 | printf(" coef=%g  :  valeur nouvelle du DAC =%g \n",coef[bolo-1],dd); | 
|---|
| 154 |  | 
|---|
| 155 | exec_bolo(bolo,b_trans,dd); | 
|---|
| 156 | } | 
|---|
| 157 |  | 
|---|
| 158 |  | 
|---|
| 159 |  | 
|---|
| 160 | int     test_saturation(int bolo) | 
|---|
| 161 | { | 
|---|
| 162 | int i,sat; | 
|---|
| 163 | int n=gg->reglage.horloge.nb_mesures; | 
|---|
| 164 |  | 
|---|
| 165 | sat=0;for(i=0;i<n;i++) | 
|---|
| 166 | { | 
|---|
| 167 | if ( ((gg->bol_per[bolo-1][i]&0x7fff)<0x400) | 
|---|
| 168 | ou ((gg->bol_per[bolo-1][i]&0x7fff)>0x7c00) ) sat++;//  16 bit utiles dans     gg->bol_per | 
|---|
| 169 | } | 
|---|
| 170 | return(sat); | 
|---|
| 171 | } | 
|---|
| 172 |  | 
|---|
| 173 |  | 
|---|
| 174 |  | 
|---|
| 175 |  | 
|---|
| 176 | void auto_control(int bolo,int mode)    // voir les modes | 
|---|
| 177 | { | 
|---|
| 178 | static int ct[nb_max_bolo],cg[nb_max_bolo];     // static compteur pour changement carre et gain  auto | 
|---|
| 179 | static int at[nb_max_bolo];                     // attente pour ne pas changer plusieurs fois a la suite | 
|---|
| 180 | double nseuil; | 
|---|
| 181 | double  y;int yi; | 
|---|
| 182 | int cc; | 
|---|
| 183 | double r,coef;  //  point convert.  /  µV | 
|---|
| 184 | def_gains; | 
|---|
| 185 | //printf("autocontrole de bolo%d en mode %d \n",bolo,mode); | 
|---|
| 186 |  | 
|---|
| 187 | coef=pt_micV(bolo);                     //  point convert.  /  µV | 
|---|
| 188 | coef=coef*litD(fenetre_auto,auto_correct,0L);   // correction augmentée artificiellement | 
|---|
| 189 | nseuil=litD(fenetre_auto,auto_auto_val,0L);             // seuil defini dans la fenetre violette | 
|---|
| 190 | cc=xbolbrut(bolo-1)*coef;                                                       // correction exacte | 
|---|
| 191 |  | 
|---|
| 192 | if(  (ct[bolo-1]>10) ou   (ct[bolo-1]<-10)  ) {ct[bolo-1]=0;cg[bolo-1]=0;}      // initialisation si n'importe quoi | 
|---|
| 193 | if(  (at[bolo-1]>20) ou   (at[bolo-1]<0)  )     at[bolo-1]=0;                   // initialisation si n'importe quoi | 
|---|
| 194 |  | 
|---|
| 195 |  | 
|---|
| 196 | //____________  test de depassement     :       change  ct ++ ou --  : change le carré si ct > 2 en module | 
|---|
| 197 |  | 
|---|
| 198 | if       (xbolbrut(bolo-1)>nseuil)  ct[bolo-1]++; | 
|---|
| 199 | else    { | 
|---|
| 200 | if (xbolbrut(bolo-1)<-nseuil)   ct[bolo-1]--; | 
|---|
| 201 | else ct[bolo-1]=0; | 
|---|
| 202 | } | 
|---|
| 203 |  | 
|---|
| 204 |  | 
|---|
| 205 | //printf("bolo %d : moyenne=%g   valeur=%g  ct=%d  cg=%d \n",bolo,gg->xx[bolo-1][1],gg->xx[bolo-1][0],ct[bolo-1],cg[bolo-1]); | 
|---|
| 206 |  | 
|---|
| 207 | //_____________   action de correction | 
|---|
| 208 |  | 
|---|
| 209 | if(((longueur_table_tm+tt->tm.pos_ecrit-tt->tm.pos_lit)%longueur_table_tm)>2)   return; | 
|---|
| 210 |  | 
|---|
| 211 | if ( (litD(fenetre_auto,auto_verouille,0)==1) && gg->scan_en_cours &&  (mode==auto_val) ) return;                                                       // pas de corrections pendant le scan | 
|---|
| 212 | if ( (litD(fenetre_auto,auto_verouille,0)==2)  && (gg->don.sync[sync_subscan] && gg->don.sync[sync_scan]) &&  (mode==auto_val) ) return;                        // pas de corrections pendant les subscan | 
|---|
| 213 |  | 
|---|
| 214 |  | 
|---|
| 215 | if(litD(bolo,b_bloq,0L))  return;                               // sort si blocqué | 
|---|
| 216 |  | 
|---|
| 217 |  | 
|---|
| 218 |  | 
|---|
| 219 | if(test_saturation(bolo)>5)                                     //*****************************  baisse le gain si sature | 
|---|
| 220 | { | 
|---|
| 221 | printf("bolo %d sature (sat=%d) cg=%d \n",bolo,test_saturation(bolo),cg[bolo-1]); | 
|---|
| 222 | if(!vg[bolo-1]) vg[bolo-1]=gainbrut(gg->reglage.bolo[bolo-1]); | 
|---|
| 223 | cg[bolo-1]++; | 
|---|
| 224 | at[bolo-1]=5;                                           // ne va pas changer le carre avant 5 sec | 
|---|
| 225 | if(cg[bolo-1]>2) | 
|---|
| 226 | { | 
|---|
| 227 | yi=gainbrut(gg->reglage.bolo[bolo-1]); | 
|---|
| 228 | if (yi>=16)     yi=yi&3; | 
|---|
| 229 | yi--; | 
|---|
| 230 | if(yi<0) yi=0; | 
|---|
| 231 | //              exec_bolo(bolo,b_gain,yi); | 
|---|
| 232 | ecritD(bolo,b_gain,yi);ecritgain(bolo); | 
|---|
| 233 | cg[bolo-1]=0; | 
|---|
| 234 | son(130); | 
|---|
| 235 | } | 
|---|
| 236 | } | 
|---|
| 237 |  | 
|---|
| 238 |  | 
|---|
| 239 | if(at[bolo-1]) {at[bolo-1]--;return;} | 
|---|
| 240 |  | 
|---|
| 241 |  | 
|---|
| 242 | if( (mode==auto_carre) ou (mode==auto_force) ou (ct[bolo-1]>2) ou (ct[bolo-1]<-2) )//*************************  change le carre | 
|---|
| 243 | { | 
|---|
| 244 | at[bolo-1]=5;                                           // attend 5 coups avant de changer une seconde fois                                                             // change le carre apres 3 fois depassement | 
|---|
| 245 | if( (r=litD(bolo,b_auto_R,0L)) ==0 ) | 
|---|
| 246 | { | 
|---|
| 247 | y=(double)dac_V(gg->reglage.bolo[bolo-1])-cc; | 
|---|
| 248 | exec_bolo(bolo,b_carre,y); | 
|---|
| 249 | } | 
|---|
| 250 | else                                                    //  ************     mesure a resistance donnee | 
|---|
| 251 | { | 
|---|
| 252 | cc=cc*2;                                        // correction double pour converger plus vite | 
|---|
| 253 | y=(double)dac_V(gg->reglage.bolo[bolo-1])-cc;   // nouvelle valeur de tension | 
|---|
| 254 | exec_bolo(bolo,b_carre,y); | 
|---|
| 255 |  | 
|---|
| 256 | r = 1e-6 *      ( y / pt_micV(bolo) ) /r ;      // y/pt_micV  donne des microvolts | 
|---|
| 257 | // I = V / R (V en volt, R en MOhm) -> I en µA | 
|---|
| 258 |  | 
|---|
| 259 | printf(" carre=%g  I=V/r =%g nA  ",y,r*1000);   // V en pts,  I en nA | 
|---|
| 260 |  | 
|---|
| 261 | r *= pt_micA(bolo);                             // changement i en valeur triangle | 
|---|
| 262 | printf(" triangle=%g  \n",r); | 
|---|
| 263 | exec_bolo(bolo,b_tri,r); | 
|---|
| 264 | } | 
|---|
| 265 | ct[bolo-1]=0; | 
|---|
| 266 | son(130); | 
|---|
| 267 | } | 
|---|
| 268 |  | 
|---|
| 269 | //if(bolo==3) printf(" vg=%d  at=%d \n",vg[bolo-1],at[bolo-1]); | 
|---|
| 270 | if(at[bolo-1]) return; | 
|---|
| 271 |  | 
|---|
| 272 | if(vg[bolo-1])                  //  *********************  remonte le gain | 
|---|
| 273 | { | 
|---|
| 274 | yi=gainbrut(gg->reglage.bolo[bolo-1]); | 
|---|
| 275 | if (yi>=16)     yi=yi&3; | 
|---|
| 276 | if(yi>=vg[bolo-1])      vg[bolo-1]=0; | 
|---|
| 277 | else            { | 
|---|
| 278 | //                      exec_bolo(bolo,b_gain,yi+1); | 
|---|
| 279 | printf("remonte gain\n"); | 
|---|
| 280 | ecritD(bolo,b_gain,yi+1);ecritgain(bolo); | 
|---|
| 281 | son(130); | 
|---|
| 282 | at[bolo-1]=5; // attend 5 coups avant de rechanger le carre ou le gain | 
|---|
| 283 | } | 
|---|
| 284 | cg[bolo-1]=0; | 
|---|
| 285 | son(130); | 
|---|
| 286 | } | 
|---|
| 287 |  | 
|---|
| 288 |  | 
|---|
| 289 | } | 
|---|
| 290 |  | 
|---|
| 291 |  | 
|---|
| 292 |  | 
|---|
| 293 |  | 
|---|
| 294 | //----------------------------------------------------------------------------------------- | 
|---|
| 295 | //----------------------------------------------------------------------------------------- | 
|---|
| 296 | //--------------------  fonction  exec  de  la  fenetre : automatismes  ------------------- | 
|---|
| 297 | //----------------------------------------------------------------------------------------- | 
|---|
| 298 | //----------------------------------------------------------------------------------------- | 
|---|
| 299 |  | 
|---|
| 300 |  | 
|---|
| 301 |  | 
|---|
| 302 | void exec_automatismes(int fen,int item,double valeur,...) | 
|---|
| 303 | { | 
|---|
| 304 | int i,a; | 
|---|
| 305 | long ll; | 
|---|
| 306 | if(item>0)      for(i=0;i<nombre_de_voies;i++) | 
|---|
| 307 | { | 
|---|
| 308 | ll=(long)(&(gg->reglage.autom[i].mode))-(long)(&(gg->reglage.autom[0])); | 
|---|
| 309 | a=litD(fenetre_automatismes,atm_auto+i,0L)-1; | 
|---|
| 310 | if( (a!=gg->reglage.autom[i].mode) ou ( /*clavier(touche_alt) et*/ (item==atm_auto+i) ) ) | 
|---|
| 311 | emission_tc_reduite(tc2_auto_bolo,ll,a); | 
|---|
| 312 |  | 
|---|
| 313 | ll=(long)(&(gg->reglage.autom[i].gain))-(long)(&(gg->reglage.autom[0])); | 
|---|
| 314 | a=litD(fenetre_automatismes,atm_gain+i,0L)-1+20; | 
|---|
| 315 | if( (a!=gg->reglage.autom[i].gain) ou ( /*clavier(touche_alt) et*/ (item==atm_gain+i) ) ) | 
|---|
| 316 | emission_tc_reduite(tc2_auto_bolo,ll,a); | 
|---|
| 317 |  | 
|---|
| 318 | ll=(long)(&(gg->reglage.autom[i].courant))-(long)(&(gg->reglage.autom[0])); | 
|---|
| 319 | a=litD(fenetre_automatismes,atm_courant+i,0L)-1; | 
|---|
| 320 | if( (a!=gg->reglage.autom[i].courant) ou ( /*clavier(touche_alt) et*/ (item==atm_courant+i) ) ) | 
|---|
| 321 | emission_tc_reduite(tc2_auto_bolo,ll,a); | 
|---|
| 322 |  | 
|---|
| 323 | ll=(long)(&(gg->reglage.autom[i].delai))-(long)(&(gg->reglage.autom[0])); | 
|---|
| 324 | a=litD(fenetre_automatismes,atm_delai+i,0L); | 
|---|
| 325 | if( (a!=gg->reglage.autom[i].delai) ou ( /*clavier(touche_alt) et*/  (item==atm_delai+i) ) ) | 
|---|
| 326 | emission_tc_reduite(tc2_auto_bolo,ll,a); | 
|---|
| 327 | } | 
|---|
| 328 | } | 
|---|
| 329 |  | 
|---|
| 330 |  | 
|---|
| 331 |  | 
|---|