source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/auto.c@ 651

Last change on this file since 651 was 651, checked in by ansari, 26 years ago

archediab 29

File size: 10.1 KB
RevLine 
[637]1#include "diabolo.h"
2#include "bolo.h"
3#include "auto.h"
[651]4#include "arcunit.h"
[637]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
11int vg[nb_max_bolo]; // 0 ou vieux gain pour remonter le gain
12
13
14//-------------------- fonction exec de la fenetre : auto -------------------------------
15
16void exec_auto(int fen,int item,double valeur,...)
17{
18int j;
19if(item>1000) item-=1000; // pour appeler le case pour tous les cara d'un edit texte
20
21switch(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
92void auto_transitoire(int bolo,int ct)
93{
94int i;
95double a,tt,dd;
96int n=gg->reglage.horloge.nb_mesures;
97static double coef[nb_max_bolo]={0,0};
98static double val_p[nb_max_bolo];
99def_gains
100if(ct%4!=0) return;
101
102if(coef[0]==0) for(i=0;i<nb_max_bolo;i++) coef[i]=0.05;
103
104
105tt=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 }
122tt/=0.01*(double)parametr.bolo[bolo-1].bolo_gain*gain_ampli(gg->reglage.bolo[bolo-1]);
123
124printf("transitoire auto ct=%d bolo %d : ",ct,bolo);
125printf(" valeur tt=%g ",tt);
126
127
128if(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
147val_p[bolo-1]=tt;
148//dd=(double)gg->reglage.dac[d_trans][bolo-1] + tt * coef[bolo-1] ; // nouvelle valeur de transitoire
149dd=(double)dac_T(gg->reglage.bolo[bolo-1]) + tt * coef[bolo-1] ; // nouvelle valeur de transitoire
150
151while( (dd<-10) ou (dd>4010) ) {coef[bolo-1]*=0.8;dd=(double)dac_T(gg->reglage.bolo[bolo-1]) + tt * coef[bolo-1] ;}
152
153printf(" coef=%g : valeur nouvelle du DAC =%g \n",coef[bolo-1],dd);
154
155exec_bolo(bolo,b_trans,dd);
156}
157
158
159
160int test_saturation(int bolo)
161{
162int i,sat;
163int n=gg->reglage.horloge.nb_mesures;
164
165sat=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 }
170return(sat);
171}
172
173
174
175
176void auto_control(int bolo,int mode) // voir les modes
177{
178static int ct[nb_max_bolo],cg[nb_max_bolo]; // static compteur pour changement carre et gain auto
179static int at[nb_max_bolo]; // attente pour ne pas changer plusieurs fois a la suite
180double nseuil;
181double y;int yi;
182int cc;
183double r,coef; // point convert. / µV
184def_gains;
185//printf("autocontrole de bolo%d en mode %d \n",bolo,mode);
186
187coef=pt_micV(bolo); // point convert. / µV
188coef=coef*litD(fenetre_auto,auto_correct,0L); // correction augmentée artificiellement
189nseuil=litD(fenetre_auto,auto_auto_val,0L); // seuil defini dans la fenetre violette
190cc=xbolbrut(bolo-1)*coef; // correction exacte
191
192if( (ct[bolo-1]>10) ou (ct[bolo-1]<-10) ) {ct[bolo-1]=0;cg[bolo-1]=0;} // initialisation si n'importe quoi
193if( (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
198if (xbolbrut(bolo-1)>nseuil) ct[bolo-1]++;
199else {
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
209if(((longueur_table_tm+tt->tm.pos_ecrit-tt->tm.pos_lit)%longueur_table_tm)>2) return;
210
211if ( (litD(fenetre_auto,auto_verouille,0)==1) && gg->scan_en_cours && (mode==auto_val) ) return; // pas de corrections pendant le scan
212if ( (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
215if(litD(bolo,b_bloq,0L)) return; // sort si blocqué
216
217
218
219if(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
239if(at[bolo-1]) {at[bolo-1]--;return;}
240
241
242if( (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]);
270if(at[bolo-1]) return;
271
272if(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
302void exec_automatismes(int fen,int item,double valeur,...)
303{
304int i,a;
305long ll;
306if(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;
[643]315 if( (a!=gg->reglage.autom[i].gain) ou ( /*clavier(touche_alt) et*/ (item==atm_gain+i) ) )
[637]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;
[643]320 if( (a!=gg->reglage.autom[i].courant) ou ( /*clavier(touche_alt) et*/ (item==atm_courant+i) ) )
[637]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);
[643]325 if( (a!=gg->reglage.autom[i].delai) ou ( /*clavier(touche_alt) et*/ (item==atm_delai+i) ) )
[637]326 emission_tc_reduite(tc2_auto_bolo,ll,a);
327 }
328}
329
330
331
Note: See TracBrowser for help on using the repository browser.