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 |
|
---|