//  Scicos
//
//  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// See the file ../license.txt
//

function [x,y,typ] = FROMWSB(job,arg1,arg2)
    x=[];
    y=[];
    typ=[];
    select job
    case "set" then
        // look for the internal edge trigger block
        for i=1:length(arg1.model.rpar.objs) do
            o = arg1.model.rpar.objs(i);
            if typeof(o) == "Block" & o.gui == "FROMWS_c" then
                ppath = list(i);
                break;
            end
        end
        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 ~isequalbitwise(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=[-159.096,811.104,-121.216,617.984,1323,1008,331,284,630,480,1426,231,1.4],..
        Title="FROMWSB",..
        tol=[0.0001,0.000001,1.000D-10,100001,0,0],..
        tf=100000,..
        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="FROMWS_c",..
        graphics=scicos_graphics(..
        orig=[260.37067,261.584],..
        sz=[70,40],..
        flip=%t,..
        theta=0,..
        exprs=["V";"1";"1";"0"],..
        pin=[],..
        pout=4,..
        pein=2,..
        peout=2,..
        gr_i=[],..
        id="",..
        in_implicit=[],..
        out_implicit="E"),..
        model=scicos_model(..
        sim=list("fromws_c",4),..
        in=[],..
        in2=[],..
        intyp=1,..
        out=-1,..
        out2=-2,..
        outtyp=-1,..
        evtin=1,..
        evtout=1,..
        state=[],..
        dstate=[],..
        odstate=list(),..
        rpar=[],..
        ipar=[1;-31;1;1;0],..
        opar=list(),..
        blocktype="d",..
        firing=0,..
        dep_ut=[%f,%t],..
        label="",..
        nzcross=0,..
        nmode=0,..
        equations=list()),..
        doc=list())
        scs_m_1.objs(2)=scicos_link(..
        xx=[295.37067;295.37067;233.23733;233.23733;295.37067;295.37067],..
        yy=[255.86971;223.45067;223.45067;337.85067;337.85067;307.29829],..
        id="drawlink",..
        thick=[0,0],..
        ct=[5,-1],..
        from=[1,1,0],..
        to=[1,1,1])
        scs_m_1.objs(3)=scicos_block(..
        gui="OUT_f",..
        graphics=scicos_graphics(..
        orig=[358.9421,271.584],..
        sz=[20,20],..
        flip=%t,..
        theta=0,..
        exprs="1",..
        pin=4,..
        pout=[],..
        pein=[],..
        peout=[],..
        gr_i=[],..
        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(4)=scicos_link(..
        xx=[338.9421;358.9421],..
        yy=[281.584;281.584],..
        id="drawlink",..
        thick=[0,0],..
        ct=[1,1],..
        from=[1,1,0],..
        to=[3,1,1])
        model=scicos_model(..
        sim="csuper",..
        in=[],..
        in2=[],..
        intyp=1,..
        out=-1,..
        out2=-2,..
        outtyp=1,..
        evtin=[],..
        evtout=[],..
        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())
        //## modif made by hand
        gr_i=[]
        x=standard_define([5 2],model,[],gr_i)
    end
endfunction