cmscope.c

Go to the documentation of this file.
00001 #include "scicos_block.h"
00002 #include <math.h>
00003 #include "machine.h"
00004 
00005 static int c__1 = 1;
00006 static int c__0 = 0;
00007 static int c_n1 = -1;
00008 static int c__3 = 3;
00009 static double c_b103 = 0.;
00010 
00011 void cmscope(scicos_block *block,int flag)
00012 {
00013   double t;
00014   double *z__;
00015   double *rpar;
00016   int *ipar, nipar,nu;
00017   
00018   //** Patch to OLD graphics
00019   
00020   int default_graphics ;
00021  
00022 
00023 
00024   static int cur = 0;
00025   static int verb = 0;
00026   
00027   int i__1, i__2, i__3,nwid,kk,i,j,sum;
00028   
00029   int kfun;  
00030   
00031   static double rect[4];
00032   static int kwid;
00033   extern int C2F(getlabel)();
00034   extern int C2F(dset)();
00035   static int i__, k, n, v;
00036   static double frect[4], tsave;
00037   static int n1, n2;
00038   extern int C2F(plot2d)(), C2F(setscale2d)();
00039   static int na;
00040   extern int C2F(dr)();
00041   static double dt, dv;
00042   static int it, nxname;
00043   extern int C2F(sciwin)(), C2F(dr1)(), C2F(scicosclip)();
00044   static char buf[40];
00045   static int wid, iwd;
00046   static double per;
00047   static int nax[4], ilt, iwp;
00048 
00049   /*     Scicos block simulator */
00050   /*     ipar(1) = win_num */
00051   /*     ipar(2) = number of subwindows (input ports) */
00052   /*     ipar(3) = buffer size */
00053   /*     ipar(4:5) : window position */
00054   /*     ipar(6:7) : window dimension */
00055   /*     ipar(8:7+ipar(2)) = input port sizes */
00056   /*     ipar(8+ipar(2):7+ipar(2)+nu) = line type for ith curve */
00057   /*     rpar(1)=dt */
00058   /*     rpar(2)=periode */
00059   /*     rpar(3)=ymin_1 */
00060   /*     rpar(4)=ymax_1 */
00061   /*     ... */
00062   /*     rpar(2*k+1)=ymin_k */
00063   /*     rpar(2*k+2)=ymax_k */
00064 
00065   nu=block->insz[0];
00066   rpar=block->rpar;
00067   ipar=block->ipar;
00068   nipar=block->nipar;
00069   t=get_scicos_time();
00070 
00071   --ipar;
00072   --rpar;
00073 
00074   wid = ipar[1];
00075   if(wid==-1){
00076     wid=20000+get_block_number();
00077   }
00078   nwid = ipar[2];
00079   n = ipar[3];
00080   per = rpar[2];
00081   dt = rpar[1];
00082 
00083   if (flag == 2) {
00084     z__=*block->work; 
00085     --z__;
00086     k = (int) z__[1];
00087     if (k > 0) {
00088       n1 = (int) (z__[k + 1] / per);
00089       if (z__[k + 1] < 0.) {
00090         --n1;
00091       }
00092     } else {
00093       n1 = 0;
00094     }
00095 
00096     tsave = t;
00097     if (dt > 0.) {
00098       t = z__[k + 1] + dt;
00099     }
00100 
00101     n2 = (int) (t / per);
00102     if (t < 0.) {
00103       --n2;
00104     }
00105 
00106     /*     add new point to the buffer */
00107     ++k;
00108     z__[k + 1] = t;
00109     kk=0;
00110     for (i=0;i<block->nin;++i){
00111       for (j = 0; j <block->insz[i] ; ++j) {
00112         z__[n + 1 + kk * n + k] =block->inptr[i][j] ;
00113         ++kk;
00114       }
00115     }
00116     z__[1] = (double) k;
00117     if (n1 == n2 && k < n) {
00118       t = tsave;
00119       return ;
00120     }
00121 
00122     /*     plot 1:K points of the buffer */
00123     C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
00124              &dv, &dv);
00125     if (cur != wid) {
00126       C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
00127                &dv, &dv);
00128     }
00129     C2F(dr1)("xset\000", "use color\000", &c__1, &c__0, &c__0, &c__0, &c__0, &
00130              v, &dv, &dv, &dv, &dv);
00131     C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0, &v, 
00132              &dv, &dv, &dv, &dv);
00133     C2F(dr1)("xsetdr\000", "Rec\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00134              dv);
00135     ilt = ipar[2] + 8;
00136     it = 0;
00137     /*     loop on input ports */
00138     if (k > 0) {
00139       i__1 = nwid;
00140       for (kwid = 1; kwid <= i__1; ++kwid) {
00141         rect[0] = per * n1;
00142         rect[1] = rpar[(kwid << 1) + 1];
00143         rect[2] = per * (n1 + 1);
00144         rect[3] = rpar[(kwid << 1) + 2];
00145         frect[0] = 0.;
00146         frect[1] = (kwid - 1) * (1. / nwid);
00147         frect[2] = 1.;
00148         frect[3] = 1. / nwid;
00149         C2F(setscale2d)(frect, rect, "nn\000");
00150         C2F(scicosclip)(&c__1);
00151         /*     loop on input port elements */
00152         i__2 = ipar[kwid + 7];
00153         for (i__ = 1; i__ <= i__2; ++i__) {
00154           C2F(dr1)("xpolys\000", "v\000", &v, &v, &ipar[ilt + it], &
00155                    c__1, &k, &v, &z__[2], &z__[n + 2 + it * n], &dv, 
00156                    &dv);
00157           ++it;
00158         }
00159         C2F(scicosclip)(&c__0);
00160       }
00161     }
00162     /*     shift buffer left */
00163     z__[2] = z__[k + 1];
00164     sum=0;
00165     for (i=0;i<block->nin;++i){
00166       sum=sum+block->insz[i];
00167     }    i__1 = sum;
00168     for (i__ = 1; i__ <= i__1; ++i__) {
00169       z__[n + 1 + (i__ - 1) * n + 1] = z__[n + 1 + (i__ - 1) * n + k];
00170     }
00171     z__[1] = 1.;
00172     if (n1 != n2) {
00173       /*     clear window */
00174       nax[0] = 2;
00175       nax[1] = 10;
00176       nax[2] = 5;
00177       nax[3] = 4;
00178       C2F(dr1)("xclear\000", "v\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv,
00179                &dv);
00180       C2F(dr1)("xset\000", "use color\000", &c__1, &c__0, &c__0, &c__0, &
00181                c__0, &v, &dv, &dv, &dv, &dv);
00182       C2F(dr)("xstart\000", "v\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &
00183               dv, &dv);
00184       C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0, 
00185                &v, &dv, &dv, &dv, &dv);
00186       i__1 = nwid;
00187       for (kwid = 1; kwid <= i__1; ++kwid) {
00188         rect[0] = per * (n1 + 1);
00189         rect[1] = rpar[(kwid << 1) + 1];
00190         rect[2] = per * (n1 + 2);
00191         rect[3] = rpar[(kwid << 1) + 2];
00192         frect[0] = 0.;
00193         frect[1] = (kwid - 1) * (1. / nwid);
00194         frect[2] = 1.;
00195         frect[3] = 1. / nwid;
00196         C2F(setscale2d)(frect, rect, "nn\000");
00197         C2F(plot2d)(rect, &rect[1], &c__1, &c__1, &c_n1, "011", "xlines", rect, 
00198                     nax);
00199       }
00200     }
00201     t = tsave;
00202 
00203   } else if (flag == 4) {
00204     sum=0;
00205     for (i=0;i<block->nin;++i){
00206       sum=sum+block->insz[i];
00207     }
00208     if ((*block->work=
00209          scicos_malloc(sizeof(double)*(1+ipar[3]*(1+sum))))== NULL ) {
00210       set_block_error(-16);
00211       return;
00212     }
00213     z__=*block->work; 
00214     --z__;
00215     z__[1]=-1.0;
00216     nax[0] = 2;
00217     nax[1] = 10;
00218     nax[2] = 5;
00219     nax[3] = 4;
00220     n1 = (int) (t / per);
00221     if (t <= 0.) {
00222       --n1;
00223     }
00224     
00225     //** --------------------- 
00226         //    default_graphics = getVersionFlag() ;
00227         //    setVersionFlag(1) ; //** force the old graphics
00228     
00229     C2F(sciwin)();
00230     C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
00231              &dv, &dv);
00232     if (cur != wid) {
00233       C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
00234                &dv, &dv);
00235     }
00236     iwp = 4;
00237     if (ipar[iwp] >= 0) {
00238       C2F(dr1)("xset\000", "wpos\000", &ipar[iwp], &ipar[iwp + 1], &v, &v, &
00239                v, &v, &dv, &dv, &dv, &dv);
00240     }
00241     iwd = 6;
00242     if (ipar[iwd] >= 0) {
00243       C2F(dr1)("xset\000", "wdim\000", &ipar[iwd], &ipar[iwd + 1], &v, &v, &
00244                v, &v, &dv, &dv, &dv, &dv);
00245     }
00246     C2F(dr1)("xsetdr\000", "Rec\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00247              dv);
00248     C2F(dr1)("xset\000", "use color\000", &c__1, &c__0, &c__0, &c__0, &c__0, &
00249              v, &dv, &dv, &dv, &dv);
00250     C2F(dr1)("xset\000", "alufunction\000", &c__3, &c__0, &c__0, &c__0, &c__0,
00251              &v, &dv, &dv, &dv, &dv);
00252     C2F(dr1)("xclear\000", "v\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00253              dv);
00254     C2F(dr)("xstart\000", "v\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00255             dv);
00256     C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0, &v, 
00257              &dv, &dv, &dv, &dv);
00258     nxname = 40;
00259     kfun=get_block_number();
00260     C2F(getlabel)(&kfun, buf, &nxname);
00261     if (nxname > 39) {
00262       nxname = 39;
00263     }
00264     i__1 = nxname;
00265     *(buf+i__1)=*"\000";
00266     if ((nxname == 1 && *(unsigned char *)buf == ' ') || nxname == 0) {
00267     } else {
00268       C2F(dr)("xname\000", buf, &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &dv);
00269     }
00270     i__1 = nwid;
00271     for (kwid = 1; kwid <= i__1; ++kwid) {
00272       rect[0] = per * (n1 + 1);
00273       rect[1] = rpar[(kwid << 1) + 1];
00274       rect[2] = per * (n1 + 2);
00275       rect[3] = rpar[(kwid << 1) + 2];
00276       frect[0] = 0.;
00277       frect[1] = (kwid - 1) * (1. / nwid);
00278       frect[2] = 1.;
00279       frect[3] = 1. / nwid;
00280       C2F(setscale2d)(frect, rect, "nn\000");
00281       C2F(plot2d)(rect, &rect[1], &c__1, &c__1, &c_n1, "011", buf, rect, nax);
00282     }
00283     
00284     z__[1] = 0.;
00285     z__[2] = t;
00286     i__1 = sum * n;
00287     C2F(dset)(&i__1, &c_b103, &z__[3], &c__1);
00288     
00289     //** --- restore the graphics mode 
00290         //    setVersionFlag(default_graphics);
00291     
00292   } else if (flag == 5) {
00293     z__=*block->work; 
00294     --z__;
00295     k = (int) z__[1];
00296     if (k <= 1) {
00297       scicos_free(*block->work);
00298       return ;
00299     }
00300     C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
00301              &dv, &dv);
00302     if (cur != wid) {
00303       C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
00304                &dv, &dv);
00305     }
00306     C2F(dr1)("xset\000", "use color\000", &c__1, &c__0, &c__0, &c__0, &c__0, &
00307              v, &dv, &dv, &dv, &dv);
00308     
00309     ilt = ipar[2] + 8;
00310     it = 0;
00311     n1 = (int) (z__[2] / per);
00312     /*     loop on input ports */
00313     i__1 = nwid;
00314     for (kwid = 1; kwid <= i__1; ++kwid) {
00315       rect[0] = per * (n1 + 0);
00316       rect[1] = rpar[(kwid << 1) + 1];
00317       rect[2] = per * (n1 + 1);
00318       rect[3] = rpar[(kwid << 1) + 2];
00319       frect[0] = 0.;
00320       frect[1] = (kwid - 1) * (1. / nwid);
00321       frect[2] = 1.;
00322       frect[3] = 1. / nwid;
00323       F2C(setscale2d)(frect, rect, "nn\000");
00324       F2C(scicosclip)(&c__1);
00325       /*     loop on input port elements */
00326       i__2 = ipar[kwid + 7];
00327       for (i__ = 1; i__ <= i__2; ++i__) {
00328         i__3 = k - 1;
00329         C2F(dr1)("xpolys\000", "v\000", &v, &v, &ipar[ilt + it], &c__1, &
00330                  i__3, &v, &z__[2], &z__[n + 2 + it * n], &dv, &dv);
00331         ++it;
00332       }
00333       C2F(scicosclip)(&c__0);
00334     }
00335   scicos_free(*block->work);
00336   }
00337 } 

Generated on Sun Mar 4 15:03:59 2007 for Scilab [trunk] by  doxygen 1.5.1