00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MARSYAS_MARSYSTEM_H
00020 #define MARSYAS_MARSYSTEM_H
00021
00022 #include "common_header.h"
00023 #include "MarControl.h"
00024 #include "MarControlAccessor.h"
00025 #include "realvec.h"
00026 #include "Conversions.h"
00027
00028 #include "EvEvent.h"
00029 #include "TmTime.h"
00030 #include "Scheduler.h"
00031 #include "TmControlValue.h"
00032 #include "marostring.h"
00033
00034 #include <vector>
00035 #include <iostream>
00036 #include <map>
00037 #include <string>
00038 #include <cassert>
00039 #include <utility>
00040
00041 namespace Marsyas
00042 {
00086 class marsyas_EXPORT MarSystem
00087 {
00088
00089
00090 friend class MarSystemManager;
00091 friend class MarControl;
00092
00093 private:
00094 void addControls();
00095 virtual void activate(bool state);
00096
00097 protected:
00098
00100 MarSystem* parent_;
00101
00103 std::string type_;
00104
00106 std::string name_;
00107
00109 std::string prefix_;
00110
00114 std::string absPath_;
00115
00117 mrs_natural c,o,t;
00118
00119 bool isComposite_;
00120 mrs_natural marsystemsSize_;
00121
00123 std::vector<MarSystem*> marsystems_;
00124
00125 std::vector<realvec*> slices_;
00126
00127 std::vector<MarControlPtr> slPtrs_;
00128
00130 mutable std::map<std::string, MarControlPtr> controls_;
00131 std::map<std::string, MarControlPtr>::iterator ctrlIter_;
00132
00133
00134 mrs_natural inObservations_;
00135 mrs_natural inSamples_;
00136 mrs_real israte_;
00137 mrs_string inObsNames_;
00138 mrs_natural inStabilizingDelay_;
00139
00140
00141 mrs_natural onObservations_;
00142 mrs_natural onSamples_;
00143 mrs_real osrate_;
00144 mrs_string onObsNames_;
00145 mrs_natural onStabilizingDelay_;
00146
00147
00148 mrs_natural tinObservations_;
00149 mrs_natural tinSamples_;
00150 mrs_real tisrate_;
00151 mrs_string tinObsNames_;
00152 mrs_natural tinStabilizingDelay_;
00153
00154
00155 mrs_natural tonObservations_;
00156 mrs_natural tonSamples_;
00157 mrs_real tosrate_;
00158 mrs_string tonObsNames_;
00159 mrs_natural tonStabilizingDelay_;
00160
00161 mrs_natural irows_;
00162 mrs_natural icols_;
00163 mrs_natural orows_;
00164 mrs_natural ocols_;
00165
00166 realvec inTick_;
00167 realvec outTick_;
00168
00169 Scheduler scheduler_;
00170
00172 mrs_natural count_;
00173
00174 bool active_;
00175
00176 mrs_natural addToStabilizingDelay_;
00177
00179 bool isUpdating_;
00180
00181 std::string MATLABscript_;
00182
00184 std::string getControlRelativePath(std::string cname) const;
00185 std::string getControlLocalPath(std::string cname) const;
00186
00187 virtual void myUpdate(MarControlPtr sender);
00188
00189 virtual void localActivate(bool state);
00190
00191 virtual void myProcess(realvec& in, realvec& out) = 0;
00192
00194 MarSystem& operator=(const MarSystem&)
00195 {
00196 assert(0);
00197 return *this;
00198 }
00199
00200 virtual std::ostream& put_html_worker(std::ostream& o);
00201
00202 public:
00203 MarSystem(std::string type, std::string name);
00204 MarSystem(const MarSystem& a);
00205 virtual ~MarSystem();
00206
00207 virtual MarSystem* clone() const = 0;
00208 void relinkControls(const MarSystem& a);
00209
00211 virtual void setName(std::string name);
00212 virtual void setType(std::string type);
00213 std::string getType() const;
00214 std::string getName() const;
00215 std::string getPrefix() const;
00216 std::string getAbsPath() const;
00217 void updatePath();
00218
00220 bool linkControl(std::string cname1, std::string cname2, bool update = true);
00221 DEPRECATED(bool linkctrl(std::string cname1, std::string cname2, bool update = true))
00222 {
00223 return linkControl(cname1, cname2, update);
00224 }
00225
00227 bool updControl(MarControlPtr control, MarControlPtr newcontrol, bool upd = true);
00228 bool updControl(const char* cname, MarControlPtr newcontrol, bool upd = true);
00229 bool updControl(std::string cname, MarControlPtr newcontrol, bool upd = true);
00230 void updControl(EvEvent* me);
00231 void updControl(TmTime t, EvEvent* ev);
00232 void updControl(TmTime t, Repeat r, EvEvent* ev);
00233 void updControl(TmTime t, std::string cname, MarControlPtr control);
00234 void updControl(TmTime t, Repeat r, std::string cname, MarControlPtr control);
00235
00236 DEPRECATED(bool updctrl(MarControlPtr control, MarControlPtr newcontrol, bool upd = true))
00237 {
00238 return updControl(control, newcontrol, upd);
00239 }
00240
00241 DEPRECATED(bool updctrl(const char *cname, MarControlPtr newcontrol, bool upd = true))
00242 {
00243 MarControlPtr control = getControl(cname);
00244 if (control.isInvalid())
00245 {
00246 MRSWARN("MarSystem::updctrl - " + std::string(cname) + " is an invalid control @ " + getAbsPath());
00247 return false;
00248 }
00249 return updControl(control, newcontrol, upd);
00250 }
00251
00252 DEPRECATED(bool updctrl(std::string cname, MarControlPtr newcontrol, bool upd = true))
00253 {
00254 MarControlPtr control = getControl(cname);
00255 if (control.isInvalid())
00256 {
00257 MRSWARN("MarSystem::updctrl - " + cname + " is an invalid control @ " + getAbsPath());
00258 return false;
00259 }
00260 return updControl(control, newcontrol, upd);
00261 }
00262
00264 bool setControl(std::string cname, MarControlPtr newcontrol)
00265 {
00266 return updControl(cname, newcontrol, NOUPDATE);
00267 }
00268 bool setctrl(const char *cname, MarControlPtr newcontrol)
00269 {
00270 return updControl(std::string(cname), newcontrol, NOUPDATE);
00271 }
00272 bool setctrl(std::string cname, MarControlPtr newcontrol)
00273 {
00274 return updControl(cname, newcontrol, NOUPDATE);
00275 }
00276 bool setctrl(MarControlPtr control, MarControlPtr newcontrol)
00277 {
00278 return updControl(control, newcontrol, NOUPDATE);
00279 }
00280
00281
00282 bool hasControl(MarControlPtr control, bool searchChildren = true);
00283 bool hasControlLocal(MarControlPtr control)
00284 {
00285 return hasControl(control, false);
00286 }
00287 bool hasControl(std::string cname, bool searchChildren = true);
00288 bool hasControlLocal(std::string cname)
00289 {
00290 return hasControl(cname, false);
00291 }
00292
00293 bool isComposite()
00294 {
00295 return isComposite_;
00296 }
00297
00298
00299 MarControlPtr getControl(std::string cname, bool searchParent = false, bool searchChildren = true);
00300 MarControlPtr getControlLocal(std::string cname)
00301 {
00302 return getControl(cname, false, false);
00303 }
00304 MarControlPtr getctrl(std::string cname)
00305 {
00306 return getControl(cname);
00307 }
00308
00309
00310 bool addControl(std::string cname, MarControlPtr v);
00311 bool addControl(std::string cname, MarControlPtr v, MarControlPtr& ptr);
00312 bool addctrl(std::string cname, MarControlPtr v)
00313 {
00314 return addControl(cname, v);
00315 }
00316 bool addctrl(std::string cname, MarControlPtr v, MarControlPtr& ptr)
00317 {
00318 return addControl(cname, v, ptr);
00319 }
00320
00321 std::map<std::string, MarControlPtr> getControls(std::map<std::string, MarControlPtr>* cmap = NULL);
00322 const std::map<std::string, MarControlPtr>& getLocalControls();
00323
00324
00325 void setControlState(std::string cname, bool state);
00326 void setctrlState(std::string cname, bool state)
00327 {
00328 setControlState(cname, state);
00329 }
00330 void setctrlState(const char * cname, bool state)
00331 {
00332 setControlState(std::string(cname), state);
00333 }
00334 void setctrlState(MarControlPtr control, bool state)
00335 {
00336 control->setState(state);
00337 }
00338
00339
00340 bool hasControlState(std::string cname);
00341 bool hasctrlState(std::string cname)
00342 {
00343 return hasControlState(cname);
00344 }
00345 bool hasctrlState(char* cname)
00346 {
00347 return hasControlState(std::string(cname));
00348 }
00349 bool hasctrlState(MarControlPtr control)
00350 {
00351 return control->hasState();
00352 }
00353
00354
00355 virtual bool addMarSystem(MarSystem *marsystem);
00356 virtual MarSystem* getChildMarSystem(std::string childPath);
00357 virtual void setParent(const MarSystem* parent);
00358 MarSystem* getParent() const
00359 {
00360 return parent_;
00361 }
00362 virtual std::vector<MarSystem*> getChildren();
00363
00364
00365 bool isUpdating();
00366 void checkFlow(realvec&in, realvec& out);
00367 void update(MarControlPtr sender = MarControlPtr());
00368 void process(realvec& in, realvec& out);
00369 void tick();
00370
00371 std::string toString();
00372 std::string toStringShort();
00373 std::string toStringGraphViz();
00374 void toStringGraphViz(std::ostringstream& os_defs, std::ostringstream& os_links);
00375
00376 virtual marostring& toString(marostring& m);
00377
00378
00379
00380 virtual std::ostream& put(std::ostream& o, bool verbose);
00381
00383 virtual std::istream& put(std::istream& is);
00384
00386 virtual std::ostream& put_html(std::ostream& o);
00387
00389 marsyas_EXPORT friend std::ostream& operator<<(std::ostream&, MarSystem&);
00390
00392 marsyas_EXPORT friend std::istream& operator>>(std::istream&, MarSystem&);
00393 marsyas_EXPORT friend std::ostream& operator<<(std::ostream&, const std::map<std::string,MarControlPtr>&);
00394
00396 void setMATLABscript(std::string script);
00397 std::string getMATLABscript();
00398
00400
00402 mrs_natural getTime(std::string timer_name);
00403 void updtimer(std::string tmr_ctrl_path, TmControlValue value);
00404 void updtimer(std::string tmr_path, TmParam param);
00405 void updtimer(std::string tmr_path, std::vector<TmParam> params);
00406 void addTimer(std::string tmr_class, std::string tmr_ident);
00407 void addTimer(std::string tmr_class, std::string tmr_ident, std::vector<TmParam> params);
00408
00409 void removeTimer(std::string name);
00410
00411 void updctrl(EvEvent* me);
00412
00413
00414
00415
00416
00417
00418 void updctrl(TmTime t, EvEvent* ev);
00419 void updctrl(TmTime t, Repeat rep, EvEvent* ev);
00420 void updctrl(TmTime t, std::string cname, MarControlPtr control);
00421 void updctrl(TmTime t, Repeat rep, std::string cname, MarControlPtr control);
00423
00424
00425 MarControlPtr ctrl_inSamples_;
00426 MarControlPtr ctrl_inObservations_;
00427 MarControlPtr ctrl_israte_;
00428 MarControlPtr ctrl_inObsNames_;
00429 MarControlPtr ctrl_inStabilizingDelay_;
00430 MarControlPtr ctrl_onSamples_;
00431 MarControlPtr ctrl_onObservations_;
00432 MarControlPtr ctrl_osrate_;
00433 MarControlPtr ctrl_onObsNames_;
00434 MarControlPtr ctrl_onStabilizingDelay_;
00435 MarControlPtr ctrl_debug_;
00436 MarControlPtr ctrl_verbose_;
00437 MarControlPtr ctrl_mute_;
00438 MarControlPtr ctrl_active_;
00439 MarControlPtr ctrl_processedData_;
00440 };
00441
00443 mrs_string obsNamesAddPrefix(mrs_string observationNames, mrs_string prefix);
00444
00446 std::vector<mrs_string> stringSplit(mrs_string input, mrs_string delimiter);
00447
00449 std::vector<mrs_string> obsNamesSplit(mrs_string observationNames);
00450
00451 }
00452
00453 #endif