| 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 | |