| | 67 | /*! |
| | 68 | * \brief Matlab wrapper for DS mapping functions step() to a matlab function |
| | 69 | |
| | 70 | The identifier of matlab function is stored in attribute \c name. |
| | 71 | This identifier defines: |
| | 72 | \li function to call to do a step(): name_step.m |
| | 73 | \li workspace variable to write input to: name_input |
| | 74 | */ |
| | 75 | class mexDS : public DS { |
| | 76 | protected: |
| | 77 | //! identifier of matlab function |
| | 78 | string step_name; |
| | 79 | //! identifier of matlab input variabel |
| | 80 | string input_name; |
| | 81 | //! cache of results from name_step |
| | 82 | vec dt; |
| | 83 | //! cache of inputs |
| | 84 | vec ut; |
| | 85 | public: |
| | 86 | //!Default constructor |
| | 87 | mexDS ():DS() {}; |
| | 88 | |
| | 89 | /*! \brief Create memory data source from mxArray |
| | 90 | |
| | 91 | \code |
| | 92 | system={ |
| | 93 | type="mexDS"; |
| | 94 | step_name=""; // name of function to call |
| | 95 | input_name=""; // name of workspace variable where inputs are written |
| | 96 | rv_out = {class='RV',...} // identification of outputs |
| | 97 | rv_in = {class='RV',...} // identification of inputs |
| | 98 | }; |
| | 99 | \endcode |
| | 100 | |
| | 101 | MemDS with the above fields will be created; |
| | 102 | |
| | 103 | */ |
| | 104 | void from_setting ( const Setting &set ) { |
| | 105 | UI::get(step_name, set, "step_name", UI::compulsory); |
| | 106 | UI::get(input_name, set, "input_name", UI::compulsory); |
| | 107 | |
| | 108 | shared_ptr<RV> ry = UI::build<RV> ( set, "rv_out", UI::compulsory ); |
| | 109 | shared_ptr<RV> ru = UI::build<RV> ( set, "rv_in", UI::compulsory); |
| | 110 | |
| | 111 | dtsize=ry->_dsize(); |
| | 112 | utsize=ru->_dsize(); |
| | 113 | |
| | 114 | set_drv(*ry, *ru); |
| | 115 | } |
| | 116 | |
| | 117 | void step() { |
| | 118 | mxArray* tmp; |
| | 119 | mxArray* tmp2; |
| | 120 | // write inputs to variable input_name |
| | 121 | mxArray* mxinp= mexGetVariable ( "global", input_name.c_str()) ; |
| | 122 | vec2mxArray(ut, mxinp); |
| | 123 | // call function step_name |
| | 124 | mexCallMATLAB(1, &tmp, 0, (mxArray **) &tmp2, step_name.c_str()); |
| | 125 | // save its results |
| | 126 | dt=mxArray2vec(tmp); |
| | 127 | } |
| | 128 | void write(vec &ut0){ ut=ut0;} |
| | 129 | void getdata(vec &dt_out){dt_out = dt; } |
| | 130 | |
| | 131 | |
| | 132 | // TODO dodelat void to_setting( Setting &set ) const; |
| | 133 | }; |
| | 134 | |
| | 135 | UIREGISTER ( mexDS ); |
| | 136 | SHAREDPTR ( mexDS ); |
| | 137 | |