Scope
Keywords: main

Subsections

- Library
- Description
- Dialog Box
- Default properties
- Interfacing function
- Computational function (type 4)

##
Scope

### Library

Sinks

### Description

### Dialog Box

Set Scope parameters |
Color (0) or mark (0) vector (8 entries) | 1 3 5 7 9 11 13 15
Output window number (-1 for automatic) | -1
Output window position | []
Output window sizes | [600;400]
Ymin | -15
Ymax | 15
Refresh period | 30
Buffer size | 2
Accept herited events 0/1 | 0
Name of Scope (label&Id) |

- Color : a vector of integers. The i-th element is the color number () or dash type () used to draw the evolution of the i-th input port signal. See plot2d for color (dash type) definitions.
- Output window number :The number of graphic window used for the display. It is often good to use high values to avoid conflict with palettes and Super Block windows. If default value is used (1), Scicos define the output window number.
- Output window position:a 2 vector specifying the coordinates of the upper left corner of the graphic window. Answer [] for default window position.
- Output window sizes: a 2 vector specifying the coordinates of the upper left corner of the graphic window. Answer [] for default window position.
- Ymin: Minimum values of the input; used to set up the Y-axis of the plot in the graphics window.
- Ymax: Maximum values of the input; used to set up the Y-axis of the plot in the graphics window.
- Refresh period: Maximum value on the X-axis (time). The plot is redrawn when time reaches a multiple of this value.
- Buffer size:To improve efficiency it is possible to buffer the input data. The drawing is only done after each Buffer size call to the block.
- Accept herited events 0/1: if 0 CSCOPE_f draws a new point only when an event occurs on its event input port. if 1 CSCOPE_f draws a new point when an event occurs on its event input port and when it's regular input changes due to an event on an other upstrem block (herited events).
- Name of Scope : Name/label of the block.

### Default properties

- always active: no
- direct-feedthrough: yes
- zero-crossing: no
- mode: no
- number/sizes of inputs: 1 / -1
- number/sizes of outputs: 0 /
- number/sizes of activation inputs: 1 / 1
- number/sizes of activation outputs: 0 /
- continuous-time state: no
- discrete-time state: yes
- name of computational function: cscope

### Interfacing function

`scilab/macros/scicos_blocks/sinks/CSCOPE.sci`

### Computational function (type 4)

    #include "scicos_block.h"
    #include <math.h>
    #include "../machine.h"

    #if WIN32
    #define NULL    0
    #endif

    static int c__1 = 1;
    static int c__0 = 0;
    static int c_n1 = -1;
    static int c__4 = 4;
    static int c__21 = 21;
    static int c__3 = 3;
    static double c_b84 = 0.;

    void cscope(scicos_block *block,int flag)
    {
      double t;
      double *z__;
      double *rpar;
      int *ipar, nipar,nu,kfun;

      /* Initialized data */

      static double frect[4] = { 0.,0.,1.,1. };
      static int cur = 0;
      static int verb = 0;

      int i__1,i;

      static double rect[4];
      extern int C2F(getlabel)(), C2F(dset)();
      static double ymin, ymax;
      static int i__, k, n, v;
      static double tsave;
      static int n1, n2;
      extern int C2F(plot2d)(), C2F(setscale2d)();
      static int na;
      extern int C2F(dr)();
      static double dt, dv;
      static int nxname;
      extern int C2F(sciwin)(), C2F(dr1)(), C2F(scicosclip)();
      static char buf[40];
      static int wid, iwd;
      static double per;
      static int nax[4], iwp;

      /*     Copyright INRIA */
      /*     Scicos block simulator */
      /*     ipar(1) = win_num */
      /*     ipar(2) = 0/1 color flag */
      /*     ipar(3) = buffer size */
      /*     ipar(4:11) = line type for ith curve */

      /*     ipar(12:13) : window position */
      /*     ipar(14:15) : window dimension */

      /*     rpar(1)=dt */
      /*     rpar(2)=ymin */
      /*     rpar(3)=ymax */
      /*     rpar(4)=periode */

       nu=block->insz[0];
      if (nu>8) {nu=8;}
      rpar=block->rpar;
      ipar=block->ipar;
      nipar=block->nipar;
      t=get_scicos_time();

      /*      character*(4) logf */
      /* Parameter adjustments */
      --ipar;
      --rpar;

      iwp = nipar - 3;
      iwd = nipar - 1;

      wid = ipar[1];
      if(wid==-1){
        wid=20000+get_block_number();
      }

      if (flag == 2) {
        z__=*block->work;
        --z__;
        dt = rpar[1];
        ymin = rpar[2];
        ymax = rpar[3];
        per = rpar[4];
        n = ipar[3];
        k = (int) z__[1];
        if (k > 0) {
          n1 = (int) (z__[k + 1] / per);
          if (z__[k + 1] < 0.) {
    	--n1;
          }
        } else {
          n1 = 0;
        }

        tsave = t;
        if (dt > 0.) {
          t = z__[k + 1] + dt;
        }

        n2 = (int) (t / per);
        if (t < 0.) {
          --n2;
        }

        /*     add new point to the buffer */
        ++k;
        z__[k + 1] = t;
        for (i = 0; i < nu; ++i) {
          z__[n + 1 + i * n + k] = block->inptr[0][i];
          /* L1: */
        }
        z__[1] = (double) k;
        if (n1 == n2 && k < n) {
          t = tsave;
          return ;
        }

        /*     plot 1:K points of the buffer */
        C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
    	     &dv, &dv);
        if (cur != wid) {
          C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
    	       &dv, &dv);
        }
        C2F(dr1)("xsetdr\000", "Rec\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
    	     dv);
        if (k > 0) {
          C2F(scicosclip)(&c__1);
          for (i__ = 0; i__ < nu; ++i__) {
    	C2F(dr1)("xpolys\000", "v\000", &v, &v, &ipar[i__ + 4], &c__1, &k,
    		 &v, &z__[2], &z__[n + 2 + i__  * n], &dv, &dv);
          }
          C2F(scicosclip)(&c__0);
        }
        /*     shift buffer left */
        z__[2] = z__[k + 1];
        for (i__ = 0; i__ < nu; ++i__) {
          z__[n + 1 + i__ * n + 1] = z__[n + 1 + i__ * n + k];
        }
        z__[1] = 1.;
    	if (n1 != n2) {
    	  /*     clear window */
    	  nax[0] = 2;
    	  nax[1] = 10;
    	    nax[2] = 2;
    	    nax[3] = 10;
    	    C2F(dr1)("xclear\000", "v\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv,
    		     &dv);
    	    C2F(dr1)("xset\000", "use color\000", &ipar[2], &c__0, &c__0, &c__0, &
    		     c__0, &v, &dv, &dv, &dv, &dv);
    	    C2F(dr)("xstart\000", "v\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &
    		    dv, &dv);
    	    rect[0] = per * (n1 + 1);
    	    rect[1] = ymin;
    	    rect[2] = per * (n1 + 2);
    	    rect[3] = ymax;
    	    C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0,
    		     &v, &dv, &dv, &dv, &dv);
    	    C2F(plot2d)(rect, &rect[1], &c__1, &c__1, &c_n1, "011", buf, rect, nax,
    			&c__4, &c__21);
    	}
    	t = tsave;

      } else if (flag == 4) {/* the workspace is used to store buffer
    			     */
        if ((*block->work=
    	 scicos_malloc(sizeof(double)*(1+ipar[3]*(1+nu))))== NULL ) {
          set_block_error(-16);
          return;
        }
        z__=*block->work;
        --z__;
        z__[1]=-1.0;

        n = ipar[3];
        ymin = rpar[2];
        ymax = rpar[3];
        per = rpar[4];
        nax[0] = 2;
        nax[1] = 10;
        nax[2] = 2;
        nax[3] = 10;
        n1 = (int) (t / per);
        if (t <= 0.) {
          --n1;
        }
        C2F(sciwin)();
        C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &
    	     dv, &dv);
        C2F(dr1)("xsetdr\000", "Rec\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
    	     dv);
        if (ipar[iwp] >= 0) {
    	    C2F(dr1)("xset\000", "wpos\000", &ipar[iwp], &ipar[iwp + 1], &v, &v, &
    		     v, &v, &dv, &dv, &dv, &dv);
        }
        if (ipar[iwd] >= 0) {
          C2F(dr1)("xset\000", "wdim\000", &ipar[iwd], &ipar[iwd + 1], &v, &v, &
    	       v, &v, &dv, &dv, &dv, &dv);
          /*     to force dimensions update */
          C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
    	       &dv, &dv);
        }
        rect[0] = per * (n1 + 1);
        rect[1] = ymin;
        rect[2] = per * (n1 + 2);
        rect[3] = ymax;
        C2F(setscale2d)(frect, rect, "nn\000");
        C2F(dr1)("xset\000", "use color\000", &ipar[2], &c__0, &c__0, &c__0, &
    	     c__0, &v, &dv, &dv, &dv, &dv);
        C2F(dr1)("xset\000", "alufunction\000", &c__3, &c__0, &c__0, &c__0, &c__0,
    	     &v, &dv, &dv, &dv, &dv);
        C2F(dr1)("xclear\000", "v\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
    	     dv);
        C2F(dr)("xstart\000", "v\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
    	    dv);
        C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0, &v,
    	     &dv, &dv, &dv, &dv);
        C2F(plot2d)(rect, &rect[1], &c__1, &c__1, &c_n1, "011", buf, rect, nax, &
    		c__4, &c__21);
        C2F(scicosclip)(&c__1);
        nxname = 40;
        kfun=get_block_number();
        C2F(getlabel)(&kfun, buf, &nxname);
        if (nxname > 39) {
          nxname = 39;
        }
        i__1 = nxname;
        *(buf+i__1)=*"\000";
        if ((nxname == 1 && *(unsigned char *)buf == ' ') || (nxname == 0)) {
        } else {
          C2F(dr)("xname\000", buf, &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &dv);
        }
        z__[1] = 0.;
        z__[2] = t;
        i__1 = nu * n;
        C2F(dset)(&i__1, &c_b84, &z__[3], &c__1);
      } else if (flag == 5) {
        z__=*block->work;
        --z__;
        n = ipar[3];
        k = (int) z__[1];
        if (k <= 1) {
          scicos_free(*block->work);
          return ;
        }
        C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
    	     &dv, &dv);
        if (cur != wid) {
          C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
    	       &dv, &dv);
        }
        C2F(scicosclip)(&c__1);
        for (i__ = 0; i__ < nu; ++i__) {
          C2F(dr1)("xpolys\000", "v\000", &v, &v, &ipar[i__ + 4], &c__1, &k, &v,
    	       &z__[2], &z__[n + 2 + i__ * n], &dv, &dv);
        }
        C2F(scicosclip)(&c__0);
        scicos_free(*block->work);
      }
    }