source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/bolo.c@ 649

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

archediab 28 vol

File size: 10.5 KB
RevLine 
[637]1#include "diabolo.h"
2#include "bolo.h"
3#include "acqui.h"
4#include "fichier.h"
5#include "auto.h"
6#include "regul.h"
7#include "tm.h"
8
9
10int auto_tr[nb_max_bolo];
11int ib_efface[nb_max_bolo];
12
13
14//---------------------------------- fenetre : bolo -----------------------------------
15
16
17
18// le numero du bolometre dans fen (fenetres 1 à parametres.nb_bolo )
19
20void exec_bolo(int fen,int item,double valeur,...)
21{
22int a,c,i;
23int n=gg->reglage.horloge.nb_mesures;
24if(item>1000) item-=1000; // pour appeler le case pour tous les cara d'un edit texte
25//printf("execbolo avec fen=%d , item=%d \n",fen,item);
26switch(item)
27 {
28 case ouverture : ib_efface[fen-1]=0;
29 selectgra(fen);
30 graph->ymin=-18000;
31 graph->ymax=18000;
32 graph->ypas=9000;
33 graph->xmax=gg->reglage.horloge.nb_mesures;
34 graph->xpas=graph->xmax/4;
35 graph->grille=1;
36 graph->graduations=0;
37 graph->sans_image=1;
[639]38 graph->avec_icones=0;
39 graph->aspect=0;
[637]40 graph->xtitre[0]=0;
41 graph->ytitre[0]=0;
42// ecritD(fen,b_voy,fen+1);
43
44 ecritgain(fen);
45 break;
46
47
48 case tache_de_fond : // appellé par le programme d'acquisition pour tracer ---- la cadence est variable
49 n=gg->reglage.horloge.nb_mesures;
[643]50// printf(" nb mesure = %d \n",n);
[637]51 {
52 selectgra(fen);
53 graph->xmax=n; graph->xpas=n/4;
54 graph->ymin=-18000; graph->ymax=18000; graph->ypas=9000;
55 }
56 if(ib_efface[fen-1]--<0) { ib_efface[fen-1]=10; retrace(fen);}
57 c=1234;
58 effacecourbe(fen);
59// style(fen);
60 //tt->bololut[fen-1]=lecture_en_cours;
61
62 for(i=0;i<n;i++)
63 {
64 // 16 bit utiles dans gg->bol_per
65 trace(fen,i, ((double)((gg->bol_per[fen-1][i]&0x7fff)-0x4000)));
66 a=(gg->bol_per[fen-1][i]>>15)&1;
67 if(a!=c) {
68 c=a; if(a) modtrace(fen,1,bleu);
69 else modtrace(fen,1,rouge);
70 }
71 }
72 trace(fen,n, ((double)((gg->bol_per[fen-1][0]&0x7fff)-0x4000)));
73 if(gg->flag_tc_reduite) break; /* pas d'auto en local si en tc_reduites */
74 if( (litD(fen,b_auto,0L))!=0) auto_control(fen,auto_val);
75 if(auto_tr[fen-1]) {auto_transitoire(fen,auto_tr[fen-1]);auto_tr[fen-1]--;}
76
77 break;
[649]78// avec fenetre de dialogue pour envoyer une valeur directe
79 case b_carre : ouvreD(fen_change_bolo,change_bolo_id,"chgbolo",0);
80 if(1==modal(fen_change_bolo))
81 {
82 valeur=litD(fen_change_bolo,chb_val,0);
83 printf(" val=%d %n",(int)valeur);
84 ecritD(fen,b_carre,(int)valeur);
85 ecritgain(fen);
86 }
87 ferme(fen_change_bolo);
88 break;
[637]89
[649]90 case b_tri : ouvreD(fen_change_bolo,change_bolo_id,"chgbolo",0);
91 if(1==modal(fen_change_bolo))
92 {
93 valeur=litD(fen_change_bolo,chb_val,0);
94 printf(" val=%d %n",(int)valeur);
95 ecritD(fen,b_tri,(int)valeur);
96 ecritgain(fen);
97 }
98 ferme(fen_change_bolo);
99 break;
100
101 case b_trans : ouvreD(fen_change_bolo,change_bolo_id,"chgbolo",0);
102 if(1==modal(fen_change_bolo))
103 {
104 valeur=litD(fen_change_bolo,chb_val,0);
105 printf(" val=%d %n",(int)valeur);
106 ecritD(fen,b_trans,(int)valeur);
107 ecritgain(fen);
108 }
109 ferme(fen_change_bolo);
110 break;
111
112 case b_lin : ouvreD(fen_change_bolo,change_bolo_id,"chgbolo",0);
113 if(1==modal(fen_change_bolo))
114 {
115 valeur=litD(fen_change_bolo,chb_val,0);
116 printf(" val=%d %n",(int)valeur);
117 ecritD(fen,b_lin,(int)valeur);
118 ecritgain(fen);
119 }
120 ferme(fen_change_bolo);
121 break;
122
123
124
125/*
[637]126// reecrit les valeurs dans la fenetre pour appel par un autre programme
127 case b_carre : ecritD(fen,b_carre,(int)valeur); ecritgain(fen); break;
128 case b_tri : ecritD(fen,b_tri,(int)valeur); ecritgain(fen); break;
129 case b_trans : ecritD(fen,b_trans,(int)valeur); ecritgain(fen); break;
130 case b_lin : ecritD(fen,b_lin,(int)valeur); ecritgain(fen); break;
[649]131
132*/
[637]133 case b_gain : vg[fen-1]=0; ecritD(fen,b_gain,(int)valeur); ecritgain(fen); break;
134 case b_phase : ecritD(fen,b_phase,(int)valeur); ecritgain(fen); break;
135 case b_comm : ecritD(fen,b_comm,(int)valeur); ecritgain(fen); break;
136 case b_voie : ecritgain(fen); break;
137 case caseferme : //SizeWindow(ptf->ptwindow,210,105,1);MoveWindow(ptf->ptwindow,620,-20+fen*95,0);zoom(fen);
138 stop_exec(fen); break;
139
140 break;
141 case b_auto_trans: case b_auto_trans+1000 : auto_tr[fen-1]=20; break;
142 case b_auto_lin : case b_auto_lin+1000 : ecritD(fen,b_lin,2048); break;
143
144 case b_auto : ecritgain(fen);
145// if(valeur && (! gg->flag_tc_reduite) )
146 if(valeur) auto_control(fen,auto_force);
147 break;
148
149 default : break;
150 }
151}
152
153
154unsigned char codage_12_bit(int av,int an);
155unsigned char codage_12_bit(int av,int an)
156{
157int a=an-av;
158if( (a>0) && (a<64) ) a = 0x40 | a;
159 else if( (a<0) && (a>-64) ) a = -a;
160 else a=0x80 | ((an&0xfff)>>5) ;
161return(a);
162}
163
164
165void ecritgain(int fen) // ecrit gain, carre, triangle, .....gg->reglage.dac[...]
166{
167int carr,tri,lin,tran,i,j,gainbrut,phase,comm,voie;
168int gain_MLPA[16]={1,2,4,8,10,20,40,80,100,200,400,800,1000,2000,4000,8000};
169int gain_BEBO[4]={5,25,100,500}; /* gainbrut ampli 1 / 5 / 20 / 100 */
170int gain_BEDIF[3]={10,40,200}; /* gainbrut ampli 2 / 8 / 40 */
171int table_phase[4]={0,1,3,2};
172char bit[80];
173int b,ordre;
174char mot_tc[10];
175carr=litD(fen,b_carre,0L);
176tri=litD(fen,b_tri,0L);
177lin=litD(fen,b_lin,0L);
178tran=litD(fen,b_trans,0L);
179gainbrut=litD(fen,b_gain,0L);
180phase=litD(fen,b_phase,0L);
181comm=litD(fen,b_comm,0L);
182if(litD(fen,b_auto,0L)) voie=litD(fen,b_voie,0L); else voie=0;
183
184// verifie les gainsbrut en fonction de la boite utilisée
185switch(parametr.bolo[fen-1].bolo_bebo)
186 {
187 case 0: // ---------------------- programmation MLPA -------------------
188 break;
189 case 2:
190 case 3:
191 case 4: // ---------------------- programmation BEBO -------------------
192 if(gainbrut>3) {gainbrut=3;ecritD(fen,b_gain,3);}
193 gainbrut+=16; // pour une BEBO
194 break;
195
196 case 10: // ---------------------- programmation Bediff -------------------
197 if(gainbrut>2) {gainbrut=2;ecritD(fen,b_gain,2);}
198 gainbrut+=20; // pour une BEDIFF
199 if(phase>1) {phase=1;ecritD(fen,b_phase,1);}
200
201 default : break;
202 }
203
204
205
206// emission des telecommandes reduites au lieu des telecommandes completes
207
208if(gg->flag_tc_reduite)
209 {
210 if(carr!=dac_V(gg->reglage.bolo[fen-1]))
211 emission_tc_reduite(tc2_bolo_dacV,fen-1,codage_12_bit(dac_V(gg->reglage.bolo[fen-1]),carr));
212
213 if(tri!=dac_I(gg->reglage.bolo[fen-1]))
214 emission_tc_reduite(tc2_bolo_dacI,fen-1,codage_12_bit(dac_I(gg->reglage.bolo[fen-1]),tri));
215
216 if(tran!=dac_T(gg->reglage.bolo[fen-1]))
217 emission_tc_reduite(tc2_bolo_dacT,fen-1,codage_12_bit(dac_T(gg->reglage.bolo[fen-1]),tran));
218
219 if(lin!=dac_L(gg->reglage.bolo[fen-1]))
220 emission_tc_reduite(tc2_bolo_dacL,fen-1,codage_12_bit(dac_L(gg->reglage.bolo[fen-1]),lin));
221
222 if( (gainbrut!=gainbrut(gg->reglage.bolo[fen-1]))
223 ou (phase!=phase(gg->reglage.bolo[fen-1]))
224 ou (comm!=comm(gg->reglage.bolo[fen-1])) )
225 emission_tc_reduite(tc2_bolo_gain,fen-1,bolo_mot1(carr,tri,gainbrut,phase,comm));
226
227 if(voie!=voie(gg->reglage.bolo[fen-1]))
228 emission_tc_reduite(tc2_bolo_voie,fen-1,voie);
229 }
230
231else {
232 for(j=0;j<72;j++) bit[j]=0; // prepare 72 bits à envoyer en 9 mots de 8 bits
233
234 switch(parametr.bolo[fen-1].bolo_bebo)
235 {
236 case 0:
237 { // ---------------------- programmation MLPA -------------------
238 // printf("programmation MLPA: tri=%d car=%d \n",tri,carr);
239
240 mot_tc[0]=parametr.bolo[fen-1].bolo_num; // premier mot de 8 bit (code adresse bolometre)
241 // printf(" ecrit bolo %d \n",gg->bolo[fen-1].bolo_num);
242 bit[0]=table_phase[phase&3]>>1; bit[1]=table_phase[phase&3];
243 b=2;
244 for(i=11;i>=0;i--) {bit[b]=1; bit[b+1]=tran>>i; bit[b+2]=lin>>i; bit[b+3]=tri>>i; bit[b+4]=carr>>i;b+=5;}
245 bit[b]=1; bit[b+1]=gainbrut>>3; bit[b+2]=gainbrut>>2; bit[b+3]=gainbrut>>1; bit[b+4]=gainbrut;
246 ordre=0;
247 }
248 break;
249
250
251 case 2:
252 case 3:
253 case 4:
254 { // ---------------------- programmation BEBO -------------------
255 mot_tc[0]=8*parametr.bolo[fen-1].bolo_bebo + parametr.bolo[fen-1].bolo_num; // premier mot de 8 bit (code adresse bolometre)
256 // printf("programmation BEBO N° : tri=%d car=%d \n",mot_tc[0],tri,carr);
257
258 bit[0]=gainbrut>>1; bit[1]=gainbrut; bit[2]=table_phase[phase&3]>>1; bit[3]=table_phase[phase&3];
259 b=4;
260 for(i=11;i>=0;i--) bit[b++]=(tri>>i)&1;
261 for(i=11;i>=0;i--) bit[b++]=(carr>>i)&1;
262 for(i=11;i>=0;i--) bit[b++]=(tran>>i)&1;
263
264 ecritD(fen,b_lin,0);
265 ordre=0;
266 }
267 break;
268
269 case 10:
270 { // ---------------------- programmation Bediff -------------------
271 // --- les bits sortent dans l'autre sens : poid faible d'abord ----
272 // -- il faut donc retourner les bits des dacs
273 // lin=0;
274 // ecritD(fen,b_lin,lin); gg->reglage.dac[d_lin][fen-1]=lin; // pas de linearité
275 mot_tc[0]= parametr.bolo[fen-1].bolo_num; // premier mot de 8 bit (code adresse bolometre)
276 printf("programmation BEdiff N° %d: tri=%d car=%d \n",mot_tc[0],tri,carr);
277
278 bit[0]=gainbrut>>1; bit[1]=gainbrut; bit[2]=comm; bit[3]=phase;
279 b=4;
280 for(i=11;i>=0;i--) bit[b++]=(tri>>i)&1;
281 for(i=11;i>=0;i--) bit[b++]=(carr>>i)&1;
282 for(i=11;i>=0;i--) bit[b++]=(tran>>i)&1;
283 for(i=11;i>=0;i--) bit[b++]=(lin>>i)&1;
284 ordre=1;
285 }
286 break;
287
288
289 default : break;
290 }
291
292
293
294
295 if (ordre) // remet les bit par mot de 8 bit poid faible en premier
296 for(i=0;i<9;i++) mot_tc[i+1]=
297 ( ((bit[8*i]&1)) | ((bit[8*i+1]&1)<<1) | ((bit[8*i+2]&1)<<2) | ((bit[8*i+3]&1)<<3)
298 | ((bit[8*i+4]&1)<<4) | ((bit[8*i+5]&1)<<5) | ((bit[8*i+6]&1)<<6) | ((bit[8*i+7]&1)<<7 ) );
299
300 else // remet les bit par mot de 8 bit, poid fort en premier
301 for(i=0;i<9;i++) mot_tc[i+1]=
302 ( ((bit[8*i]&1)<<7) | ((bit[8*i+1]&1)<<6) | ((bit[8*i+2]&1)<<5) | ((bit[8*i+3]&1)<<4)
303 | ((bit[8*i+4]&1)<<3) | ((bit[8*i+5]&1)<<2) | ((bit[8*i+6]&1)<<1) | ((bit[8*i+7]&1) ) );
304
305 emission_telecommande(tc_dir_transputer,mot_tc);
306
307 gg->reglage.bolo[fen-1].mot1=bolo_mot1(carr,tri,gainbrut,phase,comm);
308 gg->reglage.bolo[fen-1].mot2=bolo_mot2(tran,lin,voie);
309
310 }
311mesures_bolo(fen,carr,tri,1); // mesure temperature, puissance,... pour les bolos
312
313tt->reglage=gg->reglage;
314
315fich_save_partiel(1);
316}
317
318
319/*
320
321void ecritpulseprisme(int per);
322
323void ecritpulseprisme(int per) // ecrit l'etat.bolo : gg->reglage.diode_dure
324{
325//int i;
326gg->reglage.diode_dure=per;
327per=per+1;
328//printf(" ecriture de per=%d \n",per);
329// lecture et ecriture carte du nopmbre de mesures
330if(per<1) per=1; if(per>31) per=31;
331//ecrit_nubus_dec(25); // valeur 2 * num_bolo +1 = 2*12 + 1 = 25
332//ecrit_nubus_dec(per & 31 ); // 5 bits ecriture
333//for(i=0;i<12;i++) ecrit_nubus_dec(0);
334fich_save_partiel(1);
335}
336*/
Note: See TracBrowser for help on using the repository browser.