Xcos MVC: Fixed default datatype 20/15220/10
Paul Bignier [Mon, 15 Sep 2014 07:45:16 +0000 (09:45 +0200)]
 * Added a copy constructor for future use
 * Fixed Model destructor
 * Strengthened test

Change-Id: I2b9b690de593aad1fff8f9b82a1898695f25dc87

scilab/modules/scicos/includes/model/BaseObject.hxx
scilab/modules/scicos/src/cpp/Model.cpp
scilab/modules/scicos/src/cpp/model/Port.hxx
scilab/modules/scicos/src/cpp/view_scilab/LinkAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/ports_management.hxx
scilab/modules/scicos/tests/unit_tests/model/Annotation.dia.ref
scilab/modules/scicos/tests/unit_tests/model/Annotation.tst
scilab/modules/scicos/tests/unit_tests/model/Block.dia.ref
scilab/modules/scicos/tests/unit_tests/model/Block.tst
scilab/modules/scicos/tests/unit_tests/model/Diagram.dia.ref
scilab/modules/scicos/tests/unit_tests/model/Diagram.tst

index 8780c99..03437fc 100644 (file)
@@ -109,10 +109,10 @@ struct Geometry
 struct Datatype
 {
 public:
+    Datatype(const Datatype& d) :
+        refCount(0), datatype_id(d.datatype_id), rows(d.rows), columns(d.columns) {};
     Datatype(const std::vector<int>& v) :
-        refCount(0), datatype_id(v[2]), rows(v[0]), columns(v[1])
-    {
-    }
+        refCount(0), datatype_id(v[2]), rows(v[0]), columns(v[1]) {};
 
     // reference counter for the flyweight pattern
     int refCount;
index 4c23251..fb49b98 100644 (file)
@@ -28,12 +28,20 @@ namespace org_scilab_modules_scicos
 {
 
 Model::Model() :
-    lastId(0), allObjects(), datatypes()
+    lastId(0), allObjects()
 {
+    std::vector<int> datatypeDefault (3, 1);
+    datatypeDefault[0] = -1;
+    datatypes.push_back(new model::Datatype(datatypeDefault));
 }
 
 Model::~Model()
 {
+    while (!datatypes.empty())
+    {
+        Model::erase(datatypes[0]);
+    }
+    datatypes.clear();
 }
 
 ScicosID Model::createObject(kind_t k)
index ddbe5ce..59c71f2 100644 (file)
@@ -60,7 +60,9 @@ private:
     {
         if (dataType == 0)
         {
+            // By default, size is set to [-1,1] and type to real (1)
             v.resize(3, 1);
+            v[0] = -1;
         }
         else
         {
index e70884b..cc4f055 100644 (file)
@@ -400,12 +400,6 @@ static bool setLinkEnd(LinkAdapter& adaptor, Controller& controller, object_prop
         return false; // Must be an integer value
     }
 
-    // Disconnect the old port if it was connected
-    if (concernedPort != 0)
-    {
-        controller.setObjectProperty(concernedPort, PORT, CONNECTED_SIGNALS, unconnected);
-    }
-
     ScicosID parentDiagram;
     controller.getObjectProperty(adaptee->id(), BLOCK, PARENT_DIAGRAM, parentDiagram);
     std::vector<ScicosID> children;
@@ -546,6 +540,12 @@ static bool setLinkEnd(LinkAdapter& adaptor, Controller& controller, object_prop
         }
     }
 
+    // Disconnect the old port if it was connected. After that, concernedPort will be reused to designate the new port
+    if (concernedPort != 0)
+    {
+        controller.setObjectProperty(concernedPort, PORT, CONNECTED_SIGNALS, unconnected);
+    }
+
     nBlockPorts = static_cast<int>(sourceBlockPorts.size());
     if (nBlockPorts >= port)
     {
index 610f8d5..0f0c006 100644 (file)
@@ -66,6 +66,11 @@ types::InternalType* get_ports_property(const Adaptor& adaptor, object_propertie
             return o;
         }
         case DATATYPE_TYPE:
+            // The type defaults to [1] if no port has been defined
+            if (ids.empty())
+            {
+                return new types::Double(1);
+            }
             datatypeIndex++;
             // no break
         case DATATYPE_COLS:
index eb7135f..f392478 100644 (file)
@@ -401,3 +401,148 @@ nzcross = 0
 nmode = 0
 equations = list()
 uid = ""
+// Try with another block containing event inputs
+o = CSCOPE("define")
+objectCreated( 6 , BLOCK )
+propertyUpdated( 6 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , GEOMETRY ) : SUCCESS
+propertyUpdated( 6 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EXPRS ) : SUCCESS
+objectCreated( 7 , PORT )
+propertyUpdated( 7 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 7 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 6 , BLOCK , INPUTS ) : SUCCESS
+objectCreated( 8 , PORT )
+propertyUpdated( 8 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 8 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 6 , BLOCK , EVENT_INPUTS ) : SUCCESS
+propertyUpdated( 6 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 7 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 7 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 7 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_FUNCTION_NAME ) : SUCCESS
+propertyUpdated( 6 , BLOCK , SIM_FUNCTION_API ) : SUCCESS
+propertyUpdated( 7 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 7 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 8 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 6 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , RPAR ) : SUCCESS
+propertyUpdated( 6 , BLOCK , IPAR ) : SUCCESS
+propertyUpdated( 6 , BLOCK , SIM_BLOCKTYPE ) : SUCCESS
+propertyUpdated( 6 , BLOCK , SIM_DEP_UT ) : SUCCESS
+propertyUpdated( 6 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , INTERFACE_FUNCTION ) : SUCCESS
+o  = 
+scicos_Block type :
+  graphics
+  model
+  gui
+  doc
+o.graphics
+ ans  =
+orig = [0,0]
+sz = [2,2]
+flip = %t
+theta = 0
+exprs = ["1 3 5 7 9 11 13 15";"-1";"[]";"[600;400]";"-15";"15";"30";"20";"0";""]
+pin = 0
+pout = []
+pein = 0
+peout = []
+gr_i = []
+id = ""
+in_implicit = "E"
+out_implicit = 
+in_style = ""
+out_style = 
+in_label = ""
+out_label = 
+style = ""
+o.model
+ ans  =
+cscope type: 4
+in = -1
+in2 = 1
+intyp = 1
+out = []
+out2 = []
+outtyp = 1
+evtin = -1
+evtout = []
+state = []
+dstate = []
+odstate = list()
+rpar = [0;-15;15;30]
+ipar = [-1;1;20;1;3;5;7;9;11;13;15;-1;-1;600;400]
+opar = list()
+blocktype = "c"
+firing = []
+dep_ut = [%t,%f]
+label = ""
+nzcross = 0
+nmode = 0
+equations = list()
+uid = ""
+o.gui
+ ans  =
+ CSCOPE
+o.doc
+ ans  =
+()
+// Set the block to itself without making any modification
+// (scicos_getvalue returns CSCOPE_f default parameters)
+p = funcprot();
+funcprot(0);
+function [ok,clrs,win,wpos,wdim,ymin,ymax,per,N,heritance,nom,exprs] = scicos_getvalue(title, fields, Type, exprs)
+    ok = %t;
+    clrs = model.ipar(4:11)
+    win = model.ipar(1)
+    wpos = model.ipar(12:13)
+    wdim = model.ipar(14:15)
+    ymin = model.rpar(2)
+    ymax = model.rpar(3)
+    per = model.rpar(4)
+    N = model.ipar(3)
+    heritance = 0
+    nom = model.label
+    exprs = graphics.exprs;
+endfunction
+o = CSCOPE("set", o)
+propertyUpdated( 6 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 7 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 7 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 7 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 7 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 7 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 7 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 8 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 6 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , UID ) : NO_CHANGES
+o  = 
+scicos_Block type :
+  graphics
+  model
+  gui
+  doc
index 1929a9a..49e618c 100644 (file)
@@ -50,3 +50,30 @@ funcprot(p);
 o = BIGSOM_f("set", o)
 o.graphics
 o.model
+
+// Try with another block containing event inputs
+o = CSCOPE("define")
+o.graphics
+o.model
+o.gui
+o.doc
+
+// Set the block to itself without making any modification
+// (scicos_getvalue returns CSCOPE_f default parameters)
+p = funcprot();
+funcprot(0);
+function [ok,clrs,win,wpos,wdim,ymin,ymax,per,N,heritance,nom,exprs] = scicos_getvalue(title, fields, Type, exprs)
+    ok = %t;
+    clrs = model.ipar(4:11)
+    win = model.ipar(1)
+    wpos = model.ipar(12:13)
+    wdim = model.ipar(14:15)
+    ymin = model.rpar(2)
+    ymax = model.rpar(3)
+    per = model.rpar(4)
+    N = model.ipar(3)
+    heritance = 0
+    nom = model.label
+    exprs = graphics.exprs;
+endfunction
+o = CSCOPE("set", o)
index 10252cb..d086363 100644 (file)
@@ -43,7 +43,7 @@ scs_m.contrib
  ans  =
 ()
 // Create a diagram containing 2 summation blocks and an empty link
-Sum   = BIGSOM_f("define");
+Sum    = BIGSOM_f("define");
 objectCreated( 2 , BLOCK )
 propertyUpdated( 2 , BLOCK , GEOMETRY ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , GEOMETRY ) : SUCCESS
@@ -88,7 +88,7 @@ propertyUpdated( 2 , BLOCK , NZCROSS ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , NMODE ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , UID ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , INTERFACE_FUNCTION ) : SUCCESS
-Scope = CSCOPE("define");
+Scope1  = CSCOPE("define");
 objectCreated( 6 , BLOCK )
 propertyUpdated( 6 , BLOCK , GEOMETRY ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , GEOMETRY ) : SUCCESS
@@ -124,28 +124,76 @@ propertyUpdated( 6 , BLOCK , NZCROSS ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , NMODE ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , UID ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , INTERFACE_FUNCTION ) : SUCCESS
-lnk   = scicos_link();
-objectCreated( 9 , LINK )
-propertyUpdated( 9 , LINK , CONTROL_POINTS ) : NO_CHANGES
-propertyUpdated( 9 , LINK , CONTROL_POINTS ) : NO_CHANGES
-propertyUpdated( 9 , LINK , LABEL ) : NO_CHANGES
-propertyUpdated( 9 , LINK , THICK ) : NO_CHANGES
-propertyUpdated( 9 , LINK , COLOR ) : NO_CHANGES
-propertyUpdated( 9 , LINK , KIND ) : NO_CHANGES
-propertyUpdated( 9 , LINK , SOURCE_PORT ) : NO_CHANGES
-propertyUpdated( 9 , LINK , DESTINATION_PORT ) : NO_CHANGES
-scs_m = scicos_diagram( objs=list(Sum,Scope,lnk) )
-objectCreated( 10 , DIAGRAM )
-propertyUpdated( 10 , DIAGRAM , TITLE ) : NO_CHANGES
-propertyUpdated( 10 , DIAGRAM , PATH ) : NO_CHANGES
-propertyUpdated( 10 , DIAGRAM , PROPERTIES ) : NO_CHANGES
-propertyUpdated( 10 , DIAGRAM , PROPERTIES ) : NO_CHANGES
-propertyUpdated( 10 , DIAGRAM , CONTEXT ) : NO_CHANGES
+Scope2 = CSCOPE("define");
+objectCreated( 9 , BLOCK )
+propertyUpdated( 9 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , GEOMETRY ) : SUCCESS
+propertyUpdated( 9 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , EXPRS ) : SUCCESS
+objectCreated( 10 , PORT )
+propertyUpdated( 10 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 10 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 9 , BLOCK , INPUTS ) : SUCCESS
+objectCreated( 11 , PORT )
+propertyUpdated( 11 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 11 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 9 , BLOCK , EVENT_INPUTS ) : SUCCESS
+propertyUpdated( 9 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 10 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 10 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 10 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , SIM_FUNCTION_NAME ) : SUCCESS
+propertyUpdated( 9 , BLOCK , SIM_FUNCTION_API ) : SUCCESS
+propertyUpdated( 10 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 10 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 11 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 9 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , RPAR ) : SUCCESS
+propertyUpdated( 9 , BLOCK , IPAR ) : SUCCESS
+propertyUpdated( 9 , BLOCK , SIM_BLOCKTYPE ) : SUCCESS
+propertyUpdated( 9 , BLOCK , SIM_DEP_UT ) : SUCCESS
+propertyUpdated( 9 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , INTERFACE_FUNCTION ) : SUCCESS
+lnk    = scicos_link();          // Data link
+objectCreated( 12 , LINK )
+propertyUpdated( 12 , LINK , CONTROL_POINTS ) : NO_CHANGES
+propertyUpdated( 12 , LINK , CONTROL_POINTS ) : NO_CHANGES
+propertyUpdated( 12 , LINK , LABEL ) : NO_CHANGES
+propertyUpdated( 12 , LINK , THICK ) : NO_CHANGES
+propertyUpdated( 12 , LINK , COLOR ) : NO_CHANGES
+propertyUpdated( 12 , LINK , KIND ) : NO_CHANGES
+propertyUpdated( 12 , LINK , SOURCE_PORT ) : NO_CHANGES
+propertyUpdated( 12 , LINK , DESTINATION_PORT ) : NO_CHANGES
+lnk2   = scicos_link(ct=[1,-1]); // Activation link
+objectCreated( 13 , LINK )
+propertyUpdated( 13 , LINK , CONTROL_POINTS ) : NO_CHANGES
+propertyUpdated( 13 , LINK , CONTROL_POINTS ) : NO_CHANGES
+propertyUpdated( 13 , LINK , LABEL ) : NO_CHANGES
+propertyUpdated( 13 , LINK , THICK ) : NO_CHANGES
+propertyUpdated( 13 , LINK , COLOR ) : NO_CHANGES
+propertyUpdated( 13 , LINK , KIND ) : SUCCESS
+propertyUpdated( 13 , LINK , SOURCE_PORT ) : NO_CHANGES
+propertyUpdated( 13 , LINK , DESTINATION_PORT ) : NO_CHANGES
+scs_m = scicos_diagram( objs=list(Sum,Scope1,Scope2,lnk,lnk2) )
+objectCreated( 14 , DIAGRAM )
+propertyUpdated( 14 , DIAGRAM , TITLE ) : NO_CHANGES
+propertyUpdated( 14 , DIAGRAM , PATH ) : NO_CHANGES
+propertyUpdated( 14 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 14 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 14 , DIAGRAM , CONTEXT ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
 propertyUpdated( 6 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
-propertyUpdated( 9 , LINK , PARENT_DIAGRAM ) : SUCCESS
-propertyUpdated( 10 , DIAGRAM , CHILDREN ) : SUCCESS
-propertyUpdated( 10 , DIAGRAM , VERSION_NUMBER ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 12 , LINK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 13 , LINK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 14 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 14 , DIAGRAM , VERSION_NUMBER ) : NO_CHANGES
 scs_m  = 
 scicos_diagram type :
   props
@@ -167,6 +215,21 @@ scicos_Block type :
   gui
   doc
      (3)
+scicos_Block type :
+  graphics
+  model
+  gui
+  doc
+     (4)
+scicos_Link type :
+  xx
+  yy
+  id
+  thick
+  ct
+  from
+  to
+     (5)
 scicos_Link type :
   xx
   yy
@@ -175,69 +238,68 @@ scicos_Link type :
   ct
   from
   to
-// Link output port #1 of block #1 (ID #5 in this example) with input port #1 of block #2 (ID #7)
-// The link ID is #10
+// Link output port #1 of block #1 with input port #1 of block #2
 l = scs_m.objs;
-l(3).from = [1 1 0]; // Link block #1
+l(4).from = [1 1 0]; // Link block #1
 propertyUpdated( 5 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-propertyUpdated( 9 , LINK , SOURCE_PORT ) : SUCCESS
+propertyUpdated( 12 , LINK , SOURCE_PORT ) : SUCCESS
 l(1).graphics.pout   // Check that block #1 is connected to the link
  ans  =
-    3.
+    4.
 l(1).model.out       // "
  ans  =
   - 1.
-l(3).to = [2 1 1];   // Link block #2
+l(4).to = [2 1 1];   // Link block #2
 propertyUpdated( 7 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-propertyUpdated( 9 , LINK , DESTINATION_PORT ) : SUCCESS
-l(3).from
+propertyUpdated( 12 , LINK , DESTINATION_PORT ) : SUCCESS
+l(4).from
  ans  =
     1.    1.    0.
-l(3).to
+l(4).to
  ans  =
     2.    1.    1.
 l(2).graphics.pin    // Check that block #2 is connected to the link
  ans  =
-    3.
+    4.
 l(2).model.in        // "
  ans  =
   - 1.
-// Change the end of the link to input port #2 of block #2 (ID #8)
-l(3).to = [2 2 1];
+// Change the end of the link to input port #2 of block #2
+l(4).to = [2 2 1];
 propertyUpdated( 7 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-objectCreated( 11 , PORT )
-propertyUpdated( 11 , PORT , IMPLICIT ) : NO_CHANGES
-propertyUpdated( 11 , PORT , PORT_KIND ) : SUCCESS
-propertyUpdated( 11 , PORT , SOURCE_BLOCK ) : SUCCESS
-propertyUpdated( 11 , PORT , CONNECTED_SIGNALS ) : NO_CHANGES
-propertyUpdated( 11 , PORT , DATATYPE ) : SUCCESS
+objectCreated( 15 , PORT )
+propertyUpdated( 15 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 15 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 15 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 15 , PORT , CONNECTED_SIGNALS ) : NO_CHANGES
+propertyUpdated( 15 , PORT , DATATYPE ) : SUCCESS
 propertyUpdated( 6 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 11 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-propertyUpdated( 9 , LINK , DESTINATION_PORT ) : SUCCESS
-l(3).from
+propertyUpdated( 15 , PORT , CONNECTED_SIGNALS ) : SUCCESS
+propertyUpdated( 12 , LINK , DESTINATION_PORT ) : SUCCESS
+l(4).from
  ans  =
     1.    1.    0.
-l(3).to
+l(4).to
  ans  =
     2.    2.    1.
 l(2).graphics.pin  // Check that block #2 is connected to the link
  ans  =
     0.
-    3.
+    4.
 l(2).model.in      // "
  ans  =
   - 1.
   - 1.
 // Disconnect the source, the destination is also disconnected
-l(3).from = [0 0 0];
+l(4).from = [0 0 0];
 propertyUpdated( 5 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-propertyUpdated( 11 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-propertyUpdated( 9 , LINK , SOURCE_PORT ) : SUCCESS
-propertyUpdated( 9 , LINK , DESTINATION_PORT ) : SUCCESS
-l(3).from
+propertyUpdated( 15 , PORT , CONNECTED_SIGNALS ) : SUCCESS
+propertyUpdated( 12 , LINK , SOURCE_PORT ) : SUCCESS
+propertyUpdated( 12 , LINK , DESTINATION_PORT ) : SUCCESS
+l(4).from
  ans  =
     0.    0.    0.
-l(3).to
+l(4).to
  ans  =
     0.    0.    0.
 l(1).graphics.pout // Check that both blocks are unconnected
@@ -247,3 +309,40 @@ l(2).graphics.pin  // "
  ans  =
     0.
     0.
+// Now link the two Scope blocks together by adding an event output port to block #3
+l(5).from = [2 1 1]; // Link the input of block #2
+propertyUpdated( 8 , PORT , CONNECTED_SIGNALS ) : SUCCESS
+propertyUpdated( 13 , LINK , SOURCE_PORT ) : SUCCESS
+l(5).to = [3 1 0];   // Add an event output to block #3 and link it to the previous
+objectCreated( 16 , PORT )
+propertyUpdated( 16 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 16 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 16 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 16 , PORT , CONNECTED_SIGNALS ) : NO_CHANGES
+propertyUpdated( 16 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 9 , BLOCK , EVENT_OUTPUTS ) : SUCCESS
+propertyUpdated( 16 , PORT , CONNECTED_SIGNALS ) : SUCCESS
+propertyUpdated( 13 , LINK , DESTINATION_PORT ) : SUCCESS
+l(5).from
+ ans  =
+    2.    1.    1.
+l(5).to
+ ans  =
+    3.    2.    0.
+l(2).graphics.pein
+ ans  =
+    5.
+l(2).model.evtin
+ ans  =
+  - 1.
+l(3).graphics.peout
+ ans  =
+    5.
+l(3).model.evtout
+ ans  =
+  - 1.
+// Verify that it is impossible to link two inputs or two outputs together
+l(5).from = [2 1 0]; // Two outputs
+scicos_setfield: Wrong value for input argument #2: unable to set "from".
+l(5).to = [3 1 1];   // Two inputs
+scicos_setfield: Wrong value for input argument #2: unable to set "to".
index 543ac07..40ab4bb 100644 (file)
@@ -15,35 +15,50 @@ scs_m.version
 scs_m.contrib
 
 // Create a diagram containing 2 summation blocks and an empty link
-Sum   = BIGSOM_f("define");
-Scope = CSCOPE("define");
-lnk   = scicos_link();
+Sum    = BIGSOM_f("define");
+Scope1  = CSCOPE("define");
+Scope2 = CSCOPE("define");
+lnk    = scicos_link();          // Data link
+lnk2   = scicos_link(ct=[1,-1]); // Activation link
 
-scs_m = scicos_diagram( objs=list(Sum,Scope,lnk) )
+scs_m = scicos_diagram( objs=list(Sum,Scope1,Scope2,lnk,lnk2) )
 scs_m.objs
 
-// Link output port #1 of block #1 (ID #5 in this example) with input port #1 of block #2 (ID #7)
-// The link ID is #10
+// Link output port #1 of block #1 with input port #1 of block #2
 l = scs_m.objs;
-l(3).from = [1 1 0]; // Link block #1
+l(4).from = [1 1 0]; // Link block #1
 l(1).graphics.pout   // Check that block #1 is connected to the link
 l(1).model.out       // "
-l(3).to = [2 1 1];   // Link block #2
-l(3).from
-l(3).to
+l(4).to = [2 1 1];   // Link block #2
+l(4).from
+l(4).to
 l(2).graphics.pin    // Check that block #2 is connected to the link
 l(2).model.in        // "
 
-// Change the end of the link to input port #2 of block #2 (ID #8)
-l(3).to = [2 2 1];
-l(3).from
-l(3).to
+// Change the end of the link to input port #2 of block #2
+l(4).to = [2 2 1];
+l(4).from
+l(4).to
 l(2).graphics.pin  // Check that block #2 is connected to the link
 l(2).model.in      // "
 
 // Disconnect the source, the destination is also disconnected
-l(3).from = [0 0 0];
-l(3).from
-l(3).to
+l(4).from = [0 0 0];
+l(4).from
+l(4).to
 l(1).graphics.pout // Check that both blocks are unconnected
 l(2).graphics.pin  // "
+
+// Now link the two Scope blocks together by adding an event output port to block #3
+l(5).from = [2 1 1]; // Link the input of block #2
+l(5).to = [3 1 0];   // Add an event output to block #3 and link it to the previous
+l(5).from
+l(5).to
+l(2).graphics.pein
+l(2).model.evtin
+l(3).graphics.peout
+l(3).model.evtout
+
+// Verify that it is impossible to link two inputs or two outputs together
+l(5).from = [2 1 0]; // Two outputs
+l(5).to = [3 1 1];   // Two inputs