Interfacing function
eng

##
Sigbuilder

### File content

    function [x,y,typ]=Sigbuilder(job,arg1,arg2)
    x=[];y=[],typ=[]
    select job
    case 'plot' then
      standard_draw(arg1)
    case 'getinputs' then
      [x,y,typ]=standard_inputs(arg1)
    case 'getoutputs' then
      [x,y,typ]=standard_outputs(arg1)
    case 'getorigin' then
      [x,y]=standard_origin(arg1)
    case 'set' then
      //paths to updatable parameters or states
      ppath = list(1,3)
      newpar=list();
      y=0;
      for path=ppath do
        np=size(path,'*')
        spath=list()
        for k=1:np
          spath($+1)='model'
          spath($+1)='rpar'
          spath($+1)='objs'
          spath($+1)=path(k)
        end
        xx=arg1(spath)// get the block
        execstr('xxn='+xx.gui+'(''set'',xx)')
        if diffobjs(xxn,xx) then
          model=xx.model
          model_n=xxn.model
          if ~is_modelica_block(xx) then
            modified=or(model.sim<>model_n.sim)|..
                     ~isequal(model.state,model_n.state)|..
                     ~isequal(model.dstate,model_n.dstate)|..
                     ~isequal(model.odstate,model_n.odstate)|..
                     ~isequal(model.rpar,model_n.rpar)|..
                     ~isequal(model.ipar,model_n.ipar)|..
                     ~isequal(model.opar,model_n.opar)|..
                     ~isequal(model.label,model_n.label)
            if or(model.in<>model_n.in)|or(model.out<>model_n.out)|..
               or(model.in2<>model_n.in2)|or(model.out2<>model_n.out2)|..
               or(model.outtyp<>model_n.outtyp)|or(model.intyp<>model_n.intyp) then
              needcompile=1
            end
            if or(model.firing<>model_n.firing) then
              needcompile=2
            end
            if (size(model.in,'*')<>size(model_n.in,'*'))|..
              (size(model.out,'*')<>size(model_n.out,'*')) then
              needcompile=4
            end
            if model.sim=='input'|model.sim=='output' then
              if model.ipar<>model_n.ipar then
                needcompile=4
              end
            end
            if or(model.blocktype<>model_n.blocktype)|..
               or(model.dep_ut<>model_n.dep_ut) then
              needcompile=4
            end
            if (model.nzcross<>model_n.nzcross)|(model.nmode<>model_n.nmode) then
              needcompile=4
            end
            if prod(size(model_n.sim))>1 then
              if model_n.sim(2)>1000 then
                if model.sim(1)<>model_n.sim(1) then
                  needcompile=4
                end
              end
            end
          else
            modified=or(model_n<>model)
            eq=model.equations;eqn=model_n.equations;
            if or(eq.model<>eqn.model)|or(eq.inputs<>eqn.inputs)|..
               or(eq.outputs<>eqn.outputs) then
              needcompile=4
            end
          end
         //parameter or states changed
          arg1(spath)=xxn// Update
          newpar(size(newpar)+1)=path// Notify modification
          y=max(y,needcompile)
        end
      end
      x=arg1
      typ=newpar
    case 'define' then
    scs_m_1=scicos_diagram(..
            version="scicos4.2",..
            props=scicos_params(..
                  wpar=[600,450,0,0,600,450],..
                  Title=["Sigbuilder","./"],..
                  tol=[0.0001;0.000001;1.000D-10;100001;0;0;0],..
                  tf=100,..
                  context=" ",..
                  void1=[],..
                  options=tlist(["scsopt","3D","Background","Link","ID","Cmap"],list(%t,33),[8,1],[1,5],..
                  list([5,1],[4,1]),[0.8,0.8,0.8]),..
                  void2=[],..
                  void3=[],..
                  doc=list()))
    scs_m_1.objs(1)=scicos_block(..
                    gui="CURVE_c",..
                    graphics=scicos_graphics(..
                             orig=[329.63473,606.18517],..
                             sz=[40,40],..
                             flip=%t,..
                             theta=0,..
                             exprs=["3";"[0,1,2]";"[10,20,-30]";"y";"n"],..
                             pin=[],..
                             pout=6,..
                             pein=4,..
                             peout=2,..
                             gr_i=list(..
                             ["rpar=arg1.model.rpar;n=model.ipar(1);order=model.ipar(2);";
                             "xx=rpar(1:n);yy=rpar(n+1:2*n);";
                             "[XX,YY,rpardummy]=Do_Spline(n,order,xx,yy)";
                             "xmx=maxi(XX);xmn=mini(XX);";
                             "ymx=maxi(YY);ymn=mini(YY);";
                             "dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end";
                             "xmn=xmn-dx/20;xmx=xmx+dx/20;";
                             "dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;";
                             "ymn=ymn-dy/20;ymx=ymx+dy/20;";
                             "xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));";
                             "yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));";
                             "xset(''color'',2)";
                             "xpoly(xx2,yy2,''lines'');"],8),..
                             id="",..
                             in_implicit=[],..
                             out_implicit="E"),..
                    model=scicos_model(..
                             sim=list("curve_c",4),..
                             in=[],..
                             in2=[],..
                             intyp=1,..
                             out=1,..
                             out2=[],..
                             outtyp=1,..
                             evtin=1,..
                             evtout=1,..
                             state=[],..
                             dstate=[],..
                             odstate=list(),..
                             rpar=[0;1;2;10;20;-30],..
                             ipar=[3;3;1],..
                             opar=list(),..
                             blocktype="c",..
                             firing=0,..
                             dep_ut=[%f,%t],..
                             label="",..
                             nzcross=0,..
                             nmode=0,..
                             equations=list()),..
                    doc=list())
    scs_m_1.objs(2)=scicos_link(..
                      xx=[349.63473;349.49528],..
                      yy=[600.47089;565.10704],..
                      id="drawlink",..
                      thick=[0,0],..
                      ct=[5,-1],..
                      from=[1,1,0],..
                      to=[3,1,1])
    scs_m_1.objs(3)=scicos_block(..
                    gui="CLKSPLIT_f",..
                    graphics=scicos_graphics(..
                             orig=[349.49528;565.10704],..
                             sz=[0.3333333,0.3333333],..
                             flip=%t,..
                             theta=0,..
                             exprs=[],..
                             pin=[],..
                             pout=[],..
                             pein=2,..
                             peout=[8;4],..
                             gr_i=list([],8),..
                             id="",..
                             in_implicit=[],..
                             out_implicit=[]),..
                    model=scicos_model(..
                             sim="split",..
                             in=[],..
                             in2=[],..
                             intyp=1,..
                             out=[],..
                             out2=[],..
                             outtyp=1,..
                             evtin=1,..
                             evtout=[1;1],..
                             state=[],..
                             dstate=[],..
                             odstate=list(),..
                             rpar=[],..
                             ipar=[],..
                             opar=list(),..
                             blocktype="d",..
                             firing=[%f,%f,%f],..
                             dep_ut=[%f,%f],..
                             label="",..
                             nzcross=0,..
                             nmode=0,..
                             equations=list()),..
                    doc=list())
    scs_m_1.objs(4)=scicos_link(..
                      xx=[349.49528;266.69602;266.69602;270.35525;342.80795;342.80795;349.63473],..
                      yy=[565.10704;565.10704;680.99483;680.99483;680.99483;651.89946;651.89946],..
                      id="drawlink",..
                      thick=[0,0],..
                      ct=[5,-1],..
                      from=[3,2,0],..
                      to=[1,1,1])
    scs_m_1.objs(5)=scicos_block(..
                    gui="OUT_f",..
                    graphics=scicos_graphics(..
                             orig=[398.20616,616.18517],..
                             sz=[20,20],..
                             flip=%t,..
                             theta=0,..
                             exprs="1",..
                             pin=6,..
                             pout=[],..
                             pein=[],..
                             peout=[],..
                             gr_i=list(" ",8),..
                             id="",..
                             in_implicit="E",..
                             out_implicit=[]),..
                    model=scicos_model(..
                             sim="output",..
                             in=-1,..
                             in2=-2,..
                             intyp=-1,..
                             out=[],..
                             out2=[],..
                             outtyp=1,..
                             evtin=[],..
                             evtout=[],..
                             state=[],..
                             dstate=[],..
                             odstate=list(),..
                             rpar=[],..
                             ipar=1,..
                             opar=list(),..
                             blocktype="c",..
                             firing=[],..
                             dep_ut=[%f,%f],..
                             label="",..
                             nzcross=0,..
                             nmode=0,..
                             equations=list()),..
                    doc=list())
    scs_m_1.objs(6)=scicos_link(..
                      xx=[378.20616;398.20616],..
                      yy=[626.18517;626.18517],..
                      id="drawlink",..
                      thick=[0,0],..
                      ct=[1,1],..
                      from=[1,1,0],..
                      to=[5,1,1])
    scs_m_1.objs(7)=scicos_block(..
                    gui="CLKOUTV_f",..
                    graphics=scicos_graphics(..
                             orig=[339.49528,505.10704],..
                             sz=[20,30],..
                             flip=%t,..
                             theta=0,..
                             exprs="1",..
                             pin=[],..
                             pout=[],..
                             pein=8,..
                             peout=[],..
                             gr_i=list(" ",8),..
                             id="",..
                             in_implicit=[],..
                             out_implicit=[]),..
                    model=scicos_model(..
                             sim="output",..
                             in=[],..
                             in2=[],..
                             intyp=1,..
                             out=[],..
                             out2=[],..
                             outtyp=1,..
                             evtin=1,..
                             evtout=[],..
                             state=[],..
                             dstate=[],..
                             odstate=list(),..
                             rpar=[],..
                             ipar=1,..
                             opar=list(),..
                             blocktype="d",..
                             firing=[],..
                             dep_ut=[%f,%f],..
                             label="",..
                             nzcross=0,..
                             nmode=0,..
                             equations=list()),..
                    doc=list())
    scs_m_1.objs(8)=scicos_link(..
                      xx=[349.49528;349.49528],..
                      yy=[565.10704;535.10704],..
                      id="drawlink",..
                      thick=[0,0],..
                      ct=[5,-1],..
                      from=[3,1,0],..
                      to=[7,1,1])
    model=scicos_model(..
             sim="csuper",..
             in=[],..
             in2=[],..
             intyp=1,..
             out=-1,..
             out2=[],..
             outtyp=1,..
             evtin=[],..
             evtout=1,..
             state=[],..
             dstate=[],..
             odstate=list(),..
             rpar=scs_m_1,..
             ipar=[],..
             opar=list(),..
             blocktype="h",..
             firing=[],..
             dep_ut=[%f,%f],..
             label="",..
             nzcross=0,..
             nmode=0,..
             equations=list())
    //  gr_i='xstringb(orig(1),orig(2),''Sigbuilder'',sz(1),sz(2),''fill'')';
        gr_i=['ipar=arg1.model.rpar.objs(1).model.ipar';
    	'rpar=arg1.model.rpar.objs(1).model.rpar';
    	'n=ipar(1);order=ipar(2);';
    	'xx=rpar(1:n);yy=rpar(n+1:2*n);';
    	'[XX,YY,rpardummy]=Do_Spline2(n,order,xx,yy)';
    	'xmx=maxi(XX);xmn=mini(XX);';
    	'ymx=maxi(YY);ymn=mini(YY);';
    	'dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end';
    	'xmn=xmn-dx/20;xmx=xmx+dx/20;';
    	'dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;';
    	'ymn=ymn-dy/20;ymx=ymx+dy/20;';
    	'rect=[xmn,ymn;xmx,ymx];';
    	'xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));';
    	'yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));';
    	'xset(''color'',2)';
    	'xpoly(xx2,yy2,''lines'');']

      x=standard_define([2 2],model,[],gr_i)
    end
    endfunction

    //=========================================================
    function [X,Y,orpar]=Do_Spline2(N,order,x,y)

      X=[];Y=[];orpar=[];
      METHOD=getmethod(order);

      if (METHOD=='zero order') then
        X=x(1);Y=y(1);
        for i=1:N-1
          X=[X;x(i);x(i+1);x(i+1)];
          Y=[Y;y(i);y(i);y(i+1)];
        end
        return;
      end
      //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (METHOD=='linear') then
        X=[];
        for i=1:N
          X=[X;x(i)];
          Y=[Y;y(i)];
        end
        return;
      end
      //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       if (N<20) then NP=4;else
       if (N<40) then NP=2;else
        if (N<100) then NP=1;else
            NP=0;end;end;
      end
      for i=1:N-1
        X=[X;linspace(x(i),x(i+1),NP+2)']; // pour tous sauf "linear" et "zero order"
      end
      //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (N>2) & (METHOD=='order 2') then
        Z=ORDER2(x,y);
        A=Z(1:N-1);
        B=Z(N:2*N-2);
        C=Z(2*N-1:3*N-3);

        for j=1:size(X,'*')
          for i=N-1:-1:1
    	if X(j)>=x(i) then,break;end
          end
          Y(j)=A(i)*(X(j)-x(i))^2+B(i)*(X(j)-x(i))+C(i);
        end
        orpar=matrix(Z,-1,1)
      end
       //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (METHOD=='not_a_knot') then
        try
        d = splin(x, y, METHOD);
        Y = interp(X, x, y, d);
        orpar=d(:);
        catch
         xinfo('ERROR in SPLINE: '+METHOD)
        end

      end
       //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (METHOD=='periodic') then
        if y(1)<>y(N) then
          y(N)=y(1)
        end
        try
          d = splin(x, y,METHOD);
          Y = interp(X, x, y, d);
          orpar=d(:);
        catch
        xinfo('ERROR in SPLINE: '+METHOD)
        end
      end
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (METHOD=='monotone' ) then
        try
          d = splin(x, y, METHOD);
          Y = interp(X, x, y, d);
          orpar=d(:);
        catch
        xinfo('ERROR in SPLINE: '+METHOD)
        end

      end
       //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (METHOD=='fast') then
        try
          d = splin(x, y, METHOD);
          Y = interp(X, x, y, d);
          orpar=d(:);
        catch
          xinfo('ERROR in SPLINE:  '+METHOD)
        end
      end
       //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if (METHOD=='clamped') then
        try
          d = splin(x, y, METHOD,[0;0]);
          Y = interp(X, x, y, d);
          orpar=d(:);
        catch
          xinfo('ERROR in SPLINE: '+METHOD)
        end
      end

    endfunction

    function METHOD=getmethod(order)
      select order
       case 0 then, METHOD='zero order'
       case 1 then, METHOD='linear'
       case 2 then, METHOD='order 2'
       case 3 then, METHOD='not_a_knot'
       case 4 then, METHOD='periodic'
       case 5 then, METHOD='monotone'
       case 6 then, METHOD='fast'
       case 7 then, METHOD='clamped'
      end
    endfunction

    function [Z]=ORDER2(x,y)
    N=size(x,'*')-1;
    A=zeros(3*N-1,N*3);
    B=zeros(3*N-1,1);
    for i=1:N
       j=3*(i-1)+1;
       A(j,i+2*N)=1;
       B(j)=y(i);
       A(j+1,i)=(x(i+1)-x(i))^2;
       A(j+1,i+N)=x(i+1)-x(i);
       A(j+1,i+2*N)=1;
       B(j+1)=y(i+1);
    end

    for i=1:N-1
       j=3*(i-1)+1;
       A(j+2,i)=2*(x(i+1)-x(i));
       A(j+2,i+N)=1;
       A(j+2,i+N+1)=-1;
    end

    Q=zeros(3*N,3*N);
    for i=1:N
      Q(i,i)=4*(x(i+1)-x(i))^2
      Q(i,i+N)=2*(x(i+1)-x(i))
      Q(i+N,i)=2*(x(i+1)-x(i))
      Q(i+N,i+N)=1;
    end

    At=[Q,A';A,zeros(3*N-1,3*N-1)]
    Bt=[zeros(3*N,1);B]
    Zt=At\Bt;
    Z=Zt(1:3*N,1)
    endfunction
    //===================================================