Xcos MVC: partial implementation of a model.
[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 struct Parameter
31 {
32     // FIXME: list the possible parameters kind, name, and so on
33     double foo;
34 };
35
36 // FIXME add more values there
37 enum SchedulingProperties
38 {
39     DEP_U       = 1 << 0, //!< y=f(u)
40     DEP_T       = 1 << 1, //!< y=f(x)
41     BLOCKTYPE_H = 1 << 2, //!< y=f(u) but depends on t (if then else block)
42 };
43
44 struct Descriptor
45 {
46     std::string functionName;
47     int functionApi;
48
49     // FIXME: should encode all possible values for dep_ut and blocktype
50     int schedulingProperties;
51 };
52
53 class Block: public BaseObject
54 {
55 private:
56     friend class ::org_scilab_modules_scicos::Model;
57
58 private:
59     Block() : BaseObject(BLOCK), parentDiagram(0), interfaceFunction(), geometry(), parentBlock(0), portReference(0) {};
60     Block(const Block& o) : BaseObject(BLOCK), parentDiagram(o.parentDiagram), interfaceFunction(o.interfaceFunction), geometry(o.geometry), parentBlock(o.parentBlock), portReference(o.portReference) {};
61     ~Block() {}
62
63     const std::vector<ScicosID>& getChildren() const
64     {
65         return children;
66     }
67
68     void setChildren(const std::vector<ScicosID>& children)
69     {
70         this->children = children;
71     }
72
73     const std::vector<ScicosID>& getEin() const
74     {
75         return ein;
76     }
77
78     void setEin(const std::vector<ScicosID>& ein)
79     {
80         this->ein = ein;
81     }
82
83     const std::vector<ScicosID>& getEout() const
84     {
85         return eout;
86     }
87
88     void setEout(const std::vector<ScicosID>& eout)
89     {
90         this->eout = eout;
91     }
92
93     void getGeometry(size_t* len, double** data) const
94     {
95         *len = 4;
96         *data = geometry.copy();
97     }
98
99     update_status_t setGeometry(size_t len, double* data)
100     {
101         if (len != 4)
102         {
103             return FAIL;
104         }
105
106         Geometry g = Geometry(data);
107         if (g == geometry)
108         {
109             return NO_CHANGES;
110         }
111
112         geometry = g;
113         return SUCCESS;
114     }
115
116     const std::vector<ScicosID>& getIn() const
117     {
118         return in;
119     }
120
121     void setIn(const std::vector<ScicosID>& in)
122     {
123         this->in = in;
124     }
125
126     const std::string& getInterfaceFunction() const
127     {
128         return interfaceFunction;
129     }
130
131     void setInterfaceFunction(const std::string& interfaceFunction)
132     {
133         this->interfaceFunction = interfaceFunction;
134     }
135
136     const std::vector<ScicosID>& getOut() const
137     {
138         return out;
139     }
140
141     void setOut(const std::vector<ScicosID>& out)
142     {
143         this->out = out;
144     }
145
146     const Parameter& getParameters() const
147     {
148         return parameters;
149     }
150
151     void setParameters(const Parameter& parameters)
152     {
153         this->parameters = parameters;
154     }
155
156     ScicosID getParentBlock() const
157     {
158         return parentBlock;
159     }
160
161     void setParentBlock(ScicosID parentBlock)
162     {
163         this->parentBlock = parentBlock;
164     }
165
166     ScicosID getParentDiagram() const
167     {
168         return parentDiagram;
169     }
170
171     void setParentDiagram(ScicosID parentDiagram)
172     {
173         this->parentDiagram = parentDiagram;
174     }
175
176     ScicosID getPortReference() const
177     {
178         return portReference;
179     }
180
181     void setPortReference(ScicosID portReference)
182     {
183         this->portReference = portReference;
184     }
185
186     const Descriptor& getSim() const
187     {
188         return sim;
189     }
190
191     void setSim(const Descriptor& sim)
192     {
193         this->sim = sim;
194     }
195
196     const std::string& getStyle() const
197     {
198         return style;
199     }
200
201     void setStyle(const std::string& style)
202     {
203         this->style = style;
204     }
205 private:
206     ScicosID parentDiagram;
207     std::string interfaceFunction;
208     Geometry geometry;
209     std::string style;
210
211     Descriptor sim;
212
213     std::vector<ScicosID> in;
214     std::vector<ScicosID> out;
215     std::vector<ScicosID> ein;
216     std::vector<ScicosID> eout;
217
218     Parameter parameters;
219
220     /**
221      * SuperBlock: the blocks, links and so on contained into this block
222      */
223     ScicosID parentBlock;
224     std::vector<ScicosID> children;
225
226     /**
227      * I/O Blocks: the corresponding parent port
228      */
229     ScicosID portReference;
230 };
231
232 } /* namespace model */
233 } /* namespace org_scilab_modules_scicos */
234
235 #endif /* BLOCK_HXX_ */