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
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
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
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
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
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
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
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
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
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
00227
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
00290
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
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
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 }