Xcos: fix xcosBlockEval call 22/1122/2
Clément DAVID [Fri, 25 Jun 2010 09:44:51 +0000 (11:44 +0200)]
Type the interFunction as a macro
Add unitary test for the xcosBlockEval

Bug: 7129
Change-Id: I0dc7332f0e6c5fb6a6647d7b28154dfc508dabff

scilab/CHANGES_5.3.X
scilab/modules/xcos/macros/xcosBlockEval.sci
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/io/ContextUpdate.java
scilab/modules/xcos/tests/unit_tests/xcosBlockEval.tst [new file with mode: 0644]

index d4bb44c..a580c89 100644 (file)
@@ -370,6 +370,8 @@ Xcos:
 
 * bug 7099 fixed - xml2modelica called ocamlrun (wrong dependency on Windows).
 
+* bug 7129 fixed - Xcos hangs while opening superblocks with context.
+
 * bug 7143 fixed - Simulation values were not valid if the exponential sign is
                    an 'e'.
 
index c134ee7..b5ae2d3 100644 (file)
@@ -1,6 +1,6 @@
-//
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2009-2009 - DIGITEO - Antoine ELIAS
+// Copyright (C) 2009-2009 - DIGITEO - Antoine ELIAS <antoine.elias@scilab.org>
+// Copyright (C) 2010-2010 - DIGITEO - Clément DAVID <clement.david@scilab.org>
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 //
 //
 
-//hdf5FileToLoad : input block file
-//hdf5FileToSave : output block file
-//interfaceAlias : block interface function name ( ex "IN_f" )
-//hdf5ContextFile : input context file
-
+// Evaluate a block with the context input.
+//
+// @param hdf5FileToLoad input block file
+// @param hdf5FileToSave output block file
+// @param interfaceAlias block interface function ( ex IN_f )
+// @param hdf5ContextFile input context file
 function xcosBlockEval(hdf5FileToLoad, hdf5FileToSave, interfaceAlias, hdf5ContextFile)
 
-       //replace scicos_getvalue by    setvalue ( call by interfaceAlias )
-  %mprt = funcprot()
-  funcprot(0)
-  scicos_getvalue = setvalue;
-  function message(txt)
-    messagebox(['In block ' + o.gui + ': ';
-               txt;
-              'current parameter value kept'],'error','modal');
-    [str,n,line,func]=lasterror();
-    printf('do_eval: error %d - %s in %s at line %d\n', n, str, func, line); 
-  endfunction
-  %scicos_prob = %f
-  funcprot(%mprt)
-
-       import_from_hdf5(hdf5ContextFile);
-       %scicos_context = struct();
-       [%scicos_context, ierr] = script2var(context, %scicos_context)
-
-       import_from_hdf5(hdf5FileToLoad);
-
-
-  //create a structure with the new context
-  [new_scs_m, y, typ] = interfaceAlias('set', scs_m, []);
-
-       export_to_hdf5(hdf5FileToSave, "new_scs_m");
+    //replace scicos_getvalue by setvalue (call by interfaceAlias)
+    %mprt = funcprot()
+    funcprot(0)
+    scicos_getvalue = setvalue;
+    function message(txt)
+        messagebox(..
+            ['In block ' + o.gui + ': ' ; txt ; 'current parameter value kept'],..
+            'error','modal');
+        [str,n,line,func]=lasterror();
+        printf('do_eval: error %d - %s in %s at line %d\n', n, str, func, line); 
+    endfunction
+    %scicos_prob = %f
+    funcprot(%mprt)
+
+    // allocate the context
+    import_from_hdf5(hdf5ContextFile);
+    %scicos_context = struct();
+    [%scicos_context, ierr] = script2var(context, %scicos_context)
+
+    // Every parameter settings is done, perform block update
+
+    import_from_hdf5(hdf5FileToLoad);
+
+    //create a structure with the new context
+    [new_scs_m, y, typ] = interfaceAlias('set', scs_m, []);
+
+    export_to_hdf5(hdf5FileToSave, "new_scs_m");
 endfunction
index 25b5fff..49099de 100644 (file)
@@ -222,7 +222,7 @@ public abstract class ContextUpdate extends BasicBlock {
 
                        String cmd = ScilabInterpreterManagement.buildCall("xcosBlockEval",
                                        tempOutput.getAbsolutePath(), tempInput.getAbsolutePath(),
-                                       getInterfaceFunctionName(), tempContext.getAbsolutePath());
+                                       getInterfaceFunctionName().toCharArray(), tempContext.getAbsolutePath());
 
                        try {
                                ScilabInterpreterManagement.synchronousScilabExec(cmd);
diff --git a/scilab/modules/xcos/tests/unit_tests/xcosBlockEval.tst b/scilab/modules/xcos/tests/unit_tests/xcosBlockEval.tst
new file mode 100644 (file)
index 0000000..0e8f70c
--- /dev/null
@@ -0,0 +1,47 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010-2010 - DIGITEO - Clément DAVID <clement.david@scilab.org>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH XCOS -->
+//
+// <-- Unitary test for the xcosBlockEval macro -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7129
+//
+// <-- Short Description -->
+// The xcosBlockEval macro is used on Xcos to update SuperBlocks I/O blocks 
+// from the context data.
+
+loadScicosLibs();
+funcprot(0); // avoid function assignation message
+
+ioBlocks = ["IN_f", "OUT_f", "INIMPL_f", "OUTIMPL_f", "CLKIN_f", "CLKOUT_f", ..
+            "CLKINV_f", "CLKOUTV_f"];
+
+for index = 1:size(ioBlocks, '*')
+    cmd = "scs_m = " + ioBlocks(index) + "(""define"");";
+    if (execstr(cmd, "errcatch") <> 0) then pause, end;
+    
+    fileToLoad = TMPDIR + "/in.h5";
+    fileToSave = TMPDIR + "/out.h5";
+    fileContext = TMPDIR + "/context.h5";
+    
+    // context and block settings
+    context = ["myVariable = 42;"];
+    scs_m.graphics.exprs = "myVariable";
+    
+    // call xcosBlockEval
+    export_to_hdf5(fileToLoad, "scs_m");
+    export_to_hdf5(fileContext, "context");
+    xcosBlockEval(fileToLoad, fileToSave, evstr(ioBlocks(index)), fileContext);
+    import_from_hdf5(fileToSave);
+    
+    // check settings
+    if (new_scs_m.graphics.exprs <> "myVariable") then pause, end;
+    if (new_scs_m.model.ipar <> 42) then pause, end;
+end
+