[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 |
|
---|
| 10 | int auto_tr[nb_max_bolo];
|
---|
| 11 | int 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 |
|
---|
| 20 | void exec_bolo(int fen,int item,double valeur,...)
|
---|
| 21 | {
|
---|
| 22 | int a,c,i;
|
---|
| 23 | int n=gg->reglage.horloge.nb_mesures;
|
---|
| 24 | if(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);
|
---|
| 26 | switch(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 |
|
---|
| 154 | unsigned char codage_12_bit(int av,int an);
|
---|
| 155 | unsigned char codage_12_bit(int av,int an)
|
---|
| 156 | {
|
---|
| 157 | int a=an-av;
|
---|
| 158 | if( (a>0) && (a<64) ) a = 0x40 | a;
|
---|
| 159 | else if( (a<0) && (a>-64) ) a = -a;
|
---|
| 160 | else a=0x80 | ((an&0xfff)>>5) ;
|
---|
| 161 | return(a);
|
---|
| 162 | }
|
---|
| 163 |
|
---|
| 164 |
|
---|
| 165 | void ecritgain(int fen) // ecrit gain, carre, triangle, .....gg->reglage.dac[...]
|
---|
| 166 | {
|
---|
| 167 | int carr,tri,lin,tran,i,j,gainbrut,phase,comm,voie;
|
---|
| 168 | int gain_MLPA[16]={1,2,4,8,10,20,40,80,100,200,400,800,1000,2000,4000,8000};
|
---|
| 169 | int gain_BEBO[4]={5,25,100,500}; /* gainbrut ampli 1 / 5 / 20 / 100 */
|
---|
| 170 | int gain_BEDIF[3]={10,40,200}; /* gainbrut ampli 2 / 8 / 40 */
|
---|
| 171 | int table_phase[4]={0,1,3,2};
|
---|
| 172 | char bit[80];
|
---|
| 173 | int b,ordre;
|
---|
| 174 | char mot_tc[10];
|
---|
| 175 | carr=litD(fen,b_carre,0L);
|
---|
| 176 | tri=litD(fen,b_tri,0L);
|
---|
| 177 | lin=litD(fen,b_lin,0L);
|
---|
| 178 | tran=litD(fen,b_trans,0L);
|
---|
| 179 | gainbrut=litD(fen,b_gain,0L);
|
---|
| 180 | phase=litD(fen,b_phase,0L);
|
---|
| 181 | comm=litD(fen,b_comm,0L);
|
---|
| 182 | if(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
|
---|
| 185 | switch(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 |
|
---|
| 208 | if(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 |
|
---|
| 231 | else {
|
---|
| 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 | }
|
---|
| 311 | mesures_bolo(fen,carr,tri,1); // mesure temperature, puissance,... pour les bolos
|
---|
| 312 |
|
---|
| 313 | tt->reglage=gg->reglage;
|
---|
| 314 |
|
---|
| 315 | fich_save_partiel(1);
|
---|
| 316 | }
|
---|
| 317 |
|
---|
| 318 |
|
---|
| 319 | /*
|
---|
| 320 |
|
---|
| 321 | void ecritpulseprisme(int per);
|
---|
| 322 |
|
---|
| 323 | void ecritpulseprisme(int per) // ecrit l'etat.bolo : gg->reglage.diode_dure
|
---|
| 324 | {
|
---|
| 325 | //int i;
|
---|
| 326 | gg->reglage.diode_dure=per;
|
---|
| 327 | per=per+1;
|
---|
| 328 | //printf(" ecriture de per=%d \n",per);
|
---|
| 329 | // lecture et ecriture carte du nopmbre de mesures
|
---|
| 330 | if(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);
|
---|
| 334 | fich_save_partiel(1);
|
---|
| 335 | }
|
---|
| 336 | */
|
---|