Xcos MVC: add ParamsAdapter
[scilab.git] / scilab / modules / scicos / src / cpp / model / Block.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014-2014 - Scilab Enterprises - Clement DAVID
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef BLOCK_HXX_
14 #define BLOCK_HXX_
15
16 #include <cassert>
17 #include <string>
18 #include <vector>
19 #include <bitset>
20 #include <utility>
21
22 #include "Model.hxx"
23 #include "model/BaseObject.hxx"
24
25 namespace org_scilab_modules_scicos
26 {
27 namespace model
28 {
29
30 /**
31  * Scilab data that can be passed to the simulator and simulation functions.
32  *
33  * This used the raw scicos-sim encoding to avoid any conversion out of the model.
34  */
35 struct list_t
36 {
37     // re-use the scicos sim encoding
38     int n;
39     int* sz;
40     int* typ;
41     void** data;
42 };
43
44 struct Parameter
45 {
46     std::vector<double> rpar;
47     std::vector<int> ipar;
48     list_t opar;
49 };
50
51 struct State
52 {
53     std::vector<double> state;
54     std::vector<int> dstate;
55     list_t odstate;
56 };
57
58 /**
59  * Mask list for all possible block scheduling descriptor from the simulator point of view.
60  *
61  * Examples:
62  *  * CONST_m == 0
63  *  * SUMMATION == DEP_U
64  *  * CLR == DEP_T
65  *  * SWITCH_f == DEP_U & DEP_T
66  */
67 enum dep_ut_t
68 {
69     DEP_U       = 1 << 0, //!< y=f(u)
70     DEP_T       = 1 << 1, //!< y=f(x)
71 };
72
73 enum blocktype_t
74 {
75     BLOCKTYPE_C = 'c', //!< N/A ; dummy value used to represent a 'c' blocktype (eg. not 'd')
76     BLOCKTYPE_D = 'd', //!< N/A ; dummy value used to represent a 'd' blocktype (eg. not 'c')
77     BLOCKTYPE_H = 'h', //!< N/A ; used to represent blocks composed by blocks
78     BLOCKTYPE_L = 'l', //!< synchronization block ; ifthenelse and eselect
79     BLOCKTYPE_M = 'm', //!< memorization block ; see the Scicos original paper
80     BLOCKTYPE_X = 'x', //!< derivable block without state ; these blocks will be treated as if they contains a state.
81     BLOCKTYPE_Z = 'z', //!< zero-crossing block ; see the Scicos original paper.
82 };
83
84 struct Descriptor
85 {
86     std::string functionName;
87     char functionApi;
88
89     char dep_ut;            //!< dep_ut_t masked value
90     char blocktype;         //!< one of blocktype_t value
91 };
92
93 class Block: public BaseObject
94 {
95 private:
96     friend class ::org_scilab_modules_scicos::Model;
97
98 private:
99     Block() : BaseObject(BLOCK), parentDiagram(0), interfaceFunction(), geometry(), parentBlock(0), portReference(0) {};
100     Block(const Block& o) : BaseObject(BLOCK), parentDiagram(o.parentDiagram), interfaceFunction(o.interfaceFunction), geometry(o.geometry), parentBlock(o.parentBlock), portReference(o.portReference) {};
101     ~Block() {}
102
103     const std::vector<ScicosID>& getChildren() const
104     {
105         return children;
106     }
107
108     void setChildren(const std::vector<ScicosID>& children)
109     {
110         this->children = children;
111     }
112
113     const std::vector<ScicosID>& getEin() const
114     {
115         return ein;
116     }
117
118     void setEin(const std::vector<ScicosID>& ein)
119     {
120         this->ein = ein;
121     }
122
123     const std::vector<ScicosID>& getEout() const
124     {
125         return eout;
126     }
127
128     void setEout(const std::vector<ScicosID>& eout)
129     {
130         this->eout = eout;
131     }
132
133     void getGeometry(size_t* len, double** data) const
134     {
135         *len = 4;
136         *data = geometry.copy();
137     }
138
139     update_status_t setGeometry(size_t len, double* data)
140     {
141         if (len != 4)
142         {
143             return FAIL;
144         }
145
146         Geometry g = Geometry(data);
147         if (g == geometry)
148         {
149             return NO_CHANGES;
150         }
151
152         geometry = g;
153         return SUCCESS;
154     }
155
156     const std::vector<ScicosID>& getIn() const
157     {
158         return in;
159     }
160
161     void setIn(const std::vector<ScicosID>& in)
162     {
163         this->in = in;
164     }
165
166     const std::string& getInterfaceFunction() const
167     {
168         return interfaceFunction;
169     }
170
171     void setInterfaceFunction(const std::string& interfaceFunction)
172     {
173         this->interfaceFunction = interfaceFunction;
174     }
175
176     const std::vector<ScicosID>& getOut() const
177     {
178         return out;
179     }
180
181     void setOut(const std::vector<ScicosID>& out)
182     {
183         this->out = out;
184     }
185
186     const Parameter& getParameter() const
187     {
188         return parameter;
189     }
190
191     void setParameter(const Parameter& parameter)
192     {
193         this->parameter = parameter;
194     }
195
196     ScicosID getParentBlock() const
197     {
198         return parentBlock;
199     }
200
201     void setParentBlock(ScicosID parentBlock)
202     {
203         this->parentBlock = parentBlock;
204     }
205
206     ScicosID getParentDiagram() const
207     {
208         return parentDiagram;
209     }
210
211     void setParentDiagram(ScicosID parentDiagram)
212     {
213         this->parentDiagram = parentDiagram;
214     }
215
216     ScicosID getPortReference() const
217     {
218         return portReference;
219     }
220
221     void setPortReference(ScicosID portReference)
222     {
223         this->portReference = portReference;
224     }
225
226     const Descriptor& getSim() const
227     {
228         return sim;
229     }
230
231     void setSim(const Descriptor& sim)
232     {
233         this->sim = sim;
234     }
235
236     const std::string& getStyle() const
237     {
238         return style;
239     }
240
241     void setStyle(const std::string& style)
242     {
243         this->style = style;
244     }
245 private:
246     ScicosID parentDiagram;
247     std::string interfaceFunction;
248     Geometry geometry;
249     std::string style;
250
251     Descriptor sim;
252
253     std::vector<ScicosID> in;
254     std::vector<ScicosID> out;
255     std::vector<ScicosID> ein;
256     std::vector<ScicosID> eout;
257
258     Parameter parameter;
259     State state;
260
261     /**
262      * SuperBlock: the blocks, links and so on contained into this block
263      */
264     ScicosID parentBlock;
265     std::vector<ScicosID> children;
266
267     /**
268      * I/O Blocks: the corresponding parent port
269      */
270     ScicosID portReference;
271 };
272
273 } /* namespace model */
274 } /* namespace org_scilab_modules_scicos */
275
276 #endif /* BLOCK_HXX_ */