#include "diabolo.h" #include "bolo.h" #include "auto.h" #include "courbeVI.h" #include "fenetres_diabolo.h" int voie_bit; // octet contenant dans chaque bit le flag qui dit si on equiloibre cette voie int bolo; int posi=0; // valeur du courant (triangle ) int act=0; int ref_nep=0; double Ip=0,Vp=0; //-------------------- fonction exec de la fenetre : courbeVI ------------------------------- void equilibre_tout(void); void exec_courbeVI(int fen,int item,double valeur,...) { int i,j;double I,V,A,nep;int c;double x[50]; double y[nb_max_bolo+1]; def_gains switch(item) { case ouverture : graph->type_symbole=rondplein;efface(fen); break; case cvi_bolo : voie_bit=valeur; posi=0;tachedefond(fen,-1); break; /* bolo=litD(fen,cvi_bolo,0L);posi=0;tachedefond(fen,-1); if(bolo) exec_bolo(bolo,b_tri,posi); if(bolo) exec_bolo(bolo,b_carre,0); break; */ /* case cvi_tous : bolo=0;posi=0;tachedefond(fen,-1); for(j=0;jtype_symbole=rondplein;efface(ref_nep); position(fen,0);Ip=0;Vp=0; while( (c=litvaleur(fen,x)) >=0) { // printf(" c=%d \n",c); if (c>1) { I=x[0];V=x[1]; ecritD(fen,cvi_valI,"I=%g",I); ecritD(fen,cvi_valV,"V=%g",V); if(Ip>0) { A=( (V-Vp)/(I-Ip)-(V+Vp)/(I+Ip) ) / (V+Vp); nep= 30. * A / sqrt((V+Vp)/(I+Ip)); printf(" I=%g V=%g A=%g (10^9V/W^) 1/nep=%g (10^16) \n",I,V,A,nep); trace(ref_nep,I,nep); } Ip=I;Vp=V; } } break; case tache_de_fond : switch(act) { case 0: /*pas=4; if(posi>=20) pas=10; if(posi>=60) pas=20; if(posi>=100) pas=50; if(posi>=200) pas=100; if(posi>=600) pas=200; if(posi>=1000) pas=500; if(litD(fen,cvi_precis,0L)) pas=pas/2; posi+=pas; if(posi>4000) {posi=0;tachedefond(fen,-1);} if(litD(fen,cvi_tous,0L)) for(j=0;j=25) {son(133);posi=0;tachedefond(fen,-1);} if(!fenetre(fenetre_automatismes)) ouvreD(fenetre_automatismes,automatismes_id,"automatismes",exec_automatismes); for(i=0;i<6;i++) if((voie_bit>>i)&1) { long ll; ll=(long)(&(gg->reglage.autom[i].courant))-(long)(&(gg->reglage.autom[0])); ecritD(fenetre_automatismes,atm_courant+i,posi+1); emission_tc_reduite(tc2_auto_bolo,ll,posi); } act++; break; case 1: /* if(litD(fen,cvi_tous,0L)) equilibre_tout(); else auto_control(bolo,auto_carre); */ act++; break; case 2: /* if(litD(fen,cvi_tous,0L)) equilibre_tout(); else auto_control(bolo,auto_carre); */ act++; break; case 3: j=bolo_rouge(); I=calcI(j)*1e3;ecritD(fen,cvi_valI,"I=%g",I); // nA for(j=0;j=0;j--) if(!litD(j+1,b_bloq,0L) ) {y[j]=calcV(j+1)*1e-3; I=calcI(j+1)*1e3;} else y[j]=0; ecritD(fen,cvi_valI,"I=%g",I); montracen(fen,nb_max_bolo,I,y); } else { auto_control(bolo,auto_carre); I=calcI(bolo)*1e3; // en nA V=calcV(bolo)*1e-3; // en mV ecritD(fen,cvi_valI,"I=%g",I); ecritD(fen,cvi_valV,"V=%g",V); trace(fen,I,V); } act=0; break; */ default : act=0; } break; case cvi_mesure : if(!posi) style(fen); tachedefond(fen,litD(fen,cvi_vitesse,0L)*60);act=0; break; case cvi_stop : posi=0;act=0; tachedefond(fen,-1); break; default : break; } } void equilibre_tout(void) // fait la correction sans passer par auto_control { int j; double coef[nb_max_bolo]; def_gains; for(j=0;jreglage.bolo[j])-coef[j]; } for(j=0;j