source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/acqui_util.c@ 639

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

archediab 25

File size: 11.4 KB
Line 
1#include "diabolo.h"
2#include "bolo.h"
3#include "acqui.h"
4#include "fichier.h"
5#include "tm.h"
6#include "tache.h"
7#include "regul.h"
8#include "auto.h"
9#include "config_transputer.h"
10
11
12
13
14void init_struct(int PCI_actif)
15{
16int i,j;
17def_long_block
18def_nom_block
19printf("memoire pour stglob: %d K \nmemoire pour tmtc : %d K \n",
20 (sizeof(stglob)>>10),(sizeof(tmtc)>>10));
21
22gg=malloc(sizeof(stglob));
23
24random(-1);
25
26if(parametr.numero_version!=version_num) {erreur("erreur numero de version\n");return;}
27if(parametr.n_max_bolo!=nb_max_bolo) {erreur("erreur nb_max_bolo \n");return;}
28if(parametr.n_per_block!=nb_per_block) {erreur("erreur nb_per_block\n");return;}
29if(parametr.n_max_mes_per!=nb_max_mes_per) {erreur("erreur nb_max_mes_per\n");return;}
30if(parametr.nb_bolo!=nb_bolo_util) {erreur("erreur nb_bolo_util\n");return;}
31
32gg->reglage=reglage_standard[0];
33
34for(j=0;j<nb_max_bolo;j++)
35 {
36// parametr.bolo[j].bolo_code_util=0;
37// strcpy(parametr.bolo[j].bolo_nom,"");
38// parametr.bolo[j].bolo_bebo=0;
39// parametr.bolo[j].bolo_num=0;
40// parametr.bolo[j].bolo_gain=1000;
41// parametr.bolo[j].bolo_capa=0;
42// parametr.bolo[j].bolo_diviseur=0;
43// parametr.presence_bebo=0;
44// parametr.coef[nb_max_bolo][7] non initialisé
45
46 gg->reglage.bolo[j].mot1=0;
47 gg->reglage.bolo[j].mot2=0;
48// gg->reglage.gainbrut[j]=0;
49// gg->reglage.gain[j]=1;
50 }
51gg->temps_cntl=0;
52gg->depou_en_cours=0;
53gg->trace_ouvert=0;
54for(j=0;j<8;j++) gg->trace_tout[j]=0;
55gg->scan_en_cours=0;
56gg->flag_corel=0;
57gg->flag_tc_reduite=0;
58gg->fichier_dia2_ouvert=0;
59gg->fichier_arch_ouvert=0;
60gg->flag_fou=0;
61gg->temps_origine=0;
62
63//---------- initialise les structures de la tache -------------
64tt=malloc(sizeof(tmtc));
65
66tt->PCI_actif=PCI_actif;
67printf("tt->PCI_actif=%d \n",tt->PCI_actif);
68
69tt->reglage=gg->reglage;
70
71tt->vi.temps_cntl=0;
72
73tt->signal_scan_immediat=0;
74 // donc toujours zero pour archeops
75
76for(j=0;j<nb_max_bolo;j++)
77 {
78 tt->ds.ii[j]=0;
79 }
80
81
82tt->te.pos_ecrit=0;tt->te.pos_lit=0;
83tt->tc.pos_ecrit=0;tt->tc.pos_lit=0;
84tt->tm.pos_ecrit=0;tt->tm.pos_lit=0;
85
86
87
88j=0;
89for(i=0;i<nb_type_blocks;i++)
90 {
91 printf(" - size=%5d block : %s\n",long_block[i],nom_block[i]);
92 if (long_block[i]> j ) j=long_block[i];
93 }
94printf(" taille maxi du block de telemesure = %d // on reserve %d octets par block \n",
95 j,sizeof(block_type_modele));
96if(j>sizeof(block_type_modele)) erreur("block_type_modele trops petit");
97
98
99
100
101init_tache(); // init dependant des taches
102
103}
104
105
106
107//_________________________________________________________________________________________________________________
108int test_erreur(void)
109{
110int err,i;
111DateTimeRec date;
112err=tt->te.pos_ecrit-tt->te.pos_lit; if (err<0) err+=long_table_err;
113if(err>0)
114 {
115 GetTime(&date);
116 printf("%dh%d:%d : %d erreurs table: ",date.hour,date.minute,date.second,err);
117 for(i=0;(i<err);i++) {
118 if(i<5) switch(tt->te.err[tt->te.pos_lit])
119 {
120 case 900+err_sync_repart : printf(" sync_repart");break;
121// case 900+err_fifo_demi : printf(" fifo_demi");break;
122 case 900+err_fifo_pleine : printf(" fifo_pleine");break;
123 case 900+err_sync_bebo : printf(" sync-bebo");break;
124 case 900+err_sync_ctrl : printf(" sync-ctrl");break;
125 case 900+err_lect_pci : printf(" lect_pci");break;
126 case 900+err_lect_ctrl : printf(" lect_ctrl");break;
127 case 900+err_synchro_block : printf(" synchro_block");break;
128 case 900+err_recut_un_block_ok: printf(" err_recut_un_block_ok");break;
129 case 900+err_longueur_block : printf(" err_longueur_block");break;
130 case 900+err_sauve_block : printf(" err_sauve_block");break;
131 case 900+err_pile_pleine : printf(" err_pile_pleine");son(133);break;
132
133 case 8 : printf(" +");break;
134 case 9 : printf(" -");break;
135 default :
136 if(tt->te.err[tt->te.pos_lit]>=920)
137 printf("bit_%d ",tt->te.err[tt->te.pos_lit]-920);
138 else printf(" %d",tt->te.err[tt->te.pos_lit]);
139 break;
140 }
141 tt->te.pos_lit++; if( tt->te.pos_lit>=long_table_err) tt->te.pos_lit=0;
142 }
143 printf("\n");
144 }
145return(err);
146}
147//_________________________________________________________________________________________________________________
148
149
150
151// appel des bolo pour tracé des courbes individuelles
152void affi_bolo(void)
153{
154static int affi1=0,affi2=0;
155int j;
156static long t=0;
157if(!t) t=TickCount();
158if(t>TickCount()) return;
159t=TickCount()+60; //attente au minimum 1 sec entre 2 appels
160
161for(j=0;j<nb_max_bolo;j++) if(parametr.bolo[j].bolo_code_util) exec_bolo(j+1,tache_de_fond,0);
162}
163
164
165
166
167
168
169//*****************************************************************************************
170// ***
171#ifdef _archeops //--------- pour Archeops ------------------------------ ***
172// ***
173//*****************************************************************************************
174
175
176
177//_________________________________________________________________________________________________________________
178void reset_epld(void)
179{
180printf("reset epld");
181/*
182if(gg->flag_tc_reduite)
183 {
184 int i;
185 for(i=0;i<15;i++) emission_tc_reduite(tc2_reset_epld,i,0);
186 }
187else
188*/
189 {
190 char mot_tc[10];
191 emission_telecommande(tc_dir_reset_epld,mot_tc);
192 }
193}
194
195
196void calfreq(int flag_on) // fabrique l'etat.bolo gg->reglage.horloge et gg->periode_echantillonage
197 // le flag_on dit s'il faut commander la sortie des data
198{
199double p,f1,f2,f3;
200int pp,b,tm,flag;
201char mot_tc[10];
202
203p=litD(fenetre_acquisition,e_periode,0L);
204if(p<4) p=4; if(p>16) p=16; // butée sur la periode
205pp=p*5.; p=(double)pp / 5.;
206ecritD(fenetre_acquisition,e_periode,"%6.1f",p); // reconstruit p
207
208b=litD(fenetre_acquisition,e_nb_mes,0L);
209if(b<18) {b=18;ecritD(fenetre_acquisition,e_nb_mes,b);}
210if(b>44) {b=44;ecritD(fenetre_acquisition,e_nb_mes,b);}
211b=b*2;
212
213
214tm=litD(fenetre_acquisition,e_temp_mort,0L); // temps mort = 1 .. nbmes par 1/4 per
215if(tm<2) {tm=2;ecritD(fenetre_acquisition,e_temp_mort,tm);}
216if(tm>13) {tm=13;ecritD(fenetre_acquisition,e_temp_mort,tm);}
217
218
219flag=flag_on;
220if(litD(fenetre_acquisition,e_flag1,0L)) flag +=2;
221if(litD(fenetre_acquisition,e_flag2,0L)) flag +=4;
222
223//printf(" b=%d tm=%d a=%d h=%d \n",b,tm,a,h);
224
225if(gg->flag_tc_reduite)
226 {
227
228 if((pp!=gg->reglage.horloge.periode) ou clavier(touche_alt) ) emission_tc_reduite(tc2_horloge,tc3_periode,pp);
229 if((b!=gg->reglage.horloge.nb_mesures) ou clavier(touche_alt) ) emission_tc_reduite(tc2_horloge,tc3_nb_mesures,b);
230 if((tm!=gg->reglage.horloge.temp_mort) ou clavier(touche_alt) ) emission_tc_reduite(tc2_horloge,tc3_temp_mort,tm);
231 if(flag ou (flag!=gg->reglage.horloge.flag) ou clavier(touche_alt) ) emission_tc_reduite(tc2_horloge,tc3_flag,flag);
232 }
233
234else
235 {
236 mot_tc[0]=tc_horloge; // commande valeur des horloges
237 mot_tc[1]=pp; // periode en multiple de 0.2µsec : de 20 a 80 soit 4 a 16 µsec
238 mot_tc[2]=b/2 ; // nb pts/demi periode de 23 a 44
239 mot_tc[3]=tm;
240 mot_tc[4]=flag; // c'est le flag qui met en route la sortie des mesures
241 emission_telecommande(tc_dir_transputer,mot_tc);
242
243 gg->reglage.horloge.periode=pp;
244 gg->reglage.horloge.nb_mesures=b; // nombre de mesures dans une periode complete
245 gg->reglage.horloge.temp_mort=tm;
246 gg->reglage.horloge.flag=flag;
247
248 }
249// affichage de toutes les fréquences
250f1=1000/p;f2=f1/bitmot;f3=f2*1000./(double)(gg->reglage.horloge.nb_mesures);
251ecritD(fenetre_acquisition,e_freq,"freq: %5.1f kHz -- %5.2f kHz, modulation: %5.1f Hz",f1,f2,f3);
252printf("freq --> : %5.1f kHz -- %5.2f kHz, modulation: %5.1f Hz\n",f1,f2,f3);
253gg->periode_echantillonage=0.5/f3; // 2 fois la frequence de modulation
254printf(" periode d'échantillonage= %g \n",gg->periode_echantillonage);
255
256tt->reglage=gg->reglage;
257fich_save_partiel(1);
258}
259
260
261#endif
262//*****************************************************************************************
263// ***
264#ifdef _diabolo //--------- pour Diabolo ------------------------------ ***
265// ***
266//*****************************************************************************************
267
268void reset_epld(void)
269{
270}
271
272void calfreq(int flag_on) // fabrique l'etat.bolo gg->reglage.horloge.nb_mesures et gg->periode_echantillonage
273{
274double p,f1,f2,f3;
275int a,h,pp,b,tm;
276int j;
277char mot_tc[10];
278
279p=litD(fenetre_acquisition,e_periode,0L);
280b=litD(fenetre_acquisition,e_nb_mes,0L);
281tm=litD(fenetre_acquisition,e_temp_mort,0L); // temps mort = 1 .. nbmes par 1/4 per
282if(tm<1) {tm=1;ecritD(fenetre_acquisition,e_temp_mort,tm);}
283if(tm>b) {tm=b;ecritD(fenetre_acquisition,e_temp_mort,b);}
284// lecture externe ou local
285h=litD(fenetre_acquisition,e_horloge_ext_,0L);
286
287//if(p<5) p=5; // butée en periode minimum pour éviter de planter le Mac
288
289
290//---------------------------------------- nombre de mesures
291
292if(b<4) b=4; if(b>44) b=44;
293gg->reglage.horloge.nb_mesures=(b/2)*4;
294
295//---------------------------------------- periode de l'horloge de base
296if (h&1) p=p*frequ_horloge_externe;
297else p=p*frequ_horloge_interne;
298
299a=(p/frequ_divise)-ofset_periode ;
300
301if(a<0) a=0;
302if(a>1020) a=1020; // 10 bits maxi attention a l'ofset
303
304pp=a+ofset_periode;
305p=(double)(pp)*frequ_divise;
306if (h&1) p=p/frequ_horloge_externe;
307else p=p/frequ_horloge_interne;
308
309ecritD(fenetre_acquisition,e_periode,"%6.1f",p); // reconstruit p et pp
310
311
312//printf(" b=%d tm=%d a=%d h=%d \n",b,tm,a,h);
313
314mot_tc[0]=tc_horloge; //79..72
315mot_tc[1]=(tm%7)+ ((b/2)<<3) ; //71..64 3 bit temps mort et 5 bit mb (nombre de coups par 1/4 de periode = b/2)
316mot_tc[2]=(a>>8); //63..56 poid fort (2 bits)
317mot_tc[3]=a; //55..48 poid faible (8 bits)
318mot_tc[4]=h&3; //47..40 horloge externe et bolo-iram
319emission_telecommande(0,mot_tc);
320
321
322// affichage de toutes les fréquences
323f1=1000/p;f2=f1/bitmot;f3=f2*1000./(double)(gg->reglage.horloge.nb_mesures);
324gg->periode_echantillonage=0.5/f3; // 2 fois la frequence de modulation
325 // periode * 16 * nbdemesure / 2
326//printf(" durée= %ld \n",gg->periode_echantillonage);
327
328ecritD(fenetre_acquisition,e_freq,"freq: %5.1f kHz -- %5.2f kHz, modulation: %5.1f Hz",f1,f2,f3);
329
330
331
332 {//_______________ fabrique les detections synchrones de la modulation électrique
333 int i,v,tm;
334 tm=litD(fenetre_acquisition,e_temp_mort,0L);
335 gg->reglage.temp_mort=tm;
336 // detection plus/moins avec tm points supprimé
337 // ds[0] == plus / moins
338 // ds[1] == plus / plus
339 // ds[2] == + - 0 / - + 0
340
341 tt->ds.dsnorme=0;
342 i=0;
343 for(v=0 ;v<gg->reglage.horloge.nb_mesures/2 ;v++)
344 {
345 if(v<tm) tt->ds.dstable[i]=0;
346 else {tt->ds.dstable[i]=1; tt->ds.dsnorme++;}
347 i++;
348 }
349 for(v=0;v<gg->reglage.horloge.nb_mesures/2 ;v++)
350 {
351 if(v<tm) tt->ds.dstable[i]=0;
352 else {tt->ds.dstable[i]=-1; tt->ds.dsnorme++;}
353 i++;
354 }
355 }
356//printf(" normes = %d %d \n",tt->ds.dsnorme[0],tt->ds.dsnorme[1]);
357tt->reglage=gg->reglage;
358fich_save_partiel(1);
359}
360
361
362//*****************************************************************************************
363// ***
364#endif //-------------------------------------------------------------------- ***
365// ***
366//*****************************************************************************************
367
368
369
370
371void deglitch(void)
372{
373int j;
374double x,dx;
375static int debut=1;
376static double X[nb_max_bolo];
377static double DX[nb_max_bolo];
378if(debut)
379 {
380 for(j=0;j<nb_max_bolo;j++)
381 {
382 X[j]=0;DX[j]=1000;
383 }
384 debut=0;
385 }
386
387for(j=0;j<nb_max_bolo;j++)
388 {
389 x=gg->don.don_bolo[j];
390 dx=x-X[j]; if(dx<0) dx=-dx;
391 if( dx > DX[j] )
392 {
393 printf("glitch bolo %d ancien X=%g nouveau x=%g DX=%g \n",j+1,X[j],x,DX[j]);
394 gg->don.don_bolo[j]=X[j];
395 DX[j] *=1.1;
396 }
397 else {
398 DX[j]=0.9 * DX[j] + 0.5 * dx +1 ;
399 X[j]=x;
400 } // en moyenne, 5 fois l'interval moyen
401 }
402
403}
404
405
406
407
408
409
Note: See TracBrowser for help on using the repository browser.