00001 #include "MarSystemQtWrapper.h"
00002 namespace MarsyasQt
00003 {
00004
00005 MarSystemQtWrapper::MarSystemQtWrapper(MarSystem* msys, bool withTimer)
00006 {
00007 main_pnet_ = msys;
00008 running_ = false;
00009 pause_ = true;
00010 abort_ = false;
00011 counter_ = 0;
00012 qRegisterMetaType<MarControlPtr>("MarControlPtr");
00013
00014 withTimer_ = withTimer;
00015
00016 if (withTimer_)
00017 {
00018 QTimer *timer = new QTimer(this);
00019 connect(timer, SIGNAL(timeout()), this, SLOT(emitTrackedControls()));
00020 timer->start(100);
00021 }
00022 }
00023
00024 MarSystemQtWrapper::~MarSystemQtWrapper()
00025 {
00026 mutex_.lock();
00027 abort_ = true;
00028 pause_ = false;
00029 condition_.wakeOne();
00030 mutex_.unlock();
00031 wait();
00032 }
00033
00034
00035 void
00036 MarSystemQtWrapper::tickForever()
00037 {
00038 mutex_.lock();
00039 if (!isRunning()) {
00040 start(HighPriority);
00041 }
00042 else {
00043 main_pnet_->updctrl("mrs_bool/active", true);
00044 pause_ = false;
00045 condition_.wakeOne();
00046 }
00047
00048 mutex_.unlock();
00049
00050 }
00051
00052
00053
00054 MarControlPtr
00055 MarSystemQtWrapper::getctrl(string cname)
00056 {
00057 mutex_.lock();
00058 MarControlPtr value;
00059 value = main_pnet_->getctrl(cname);
00060 mutex_.unlock();
00061 return value;
00062 }
00063
00064 void
00065 MarSystemQtWrapper::updctrl(MarControlPtr cname,
00066 MarControlPtr cvalue)
00067 {
00068 if ( !running_ )
00069 {
00070 main_pnet_->updctrl(cname, cvalue);
00071 }
00072 else if (pause_)
00073 {
00074 main_pnet_->updctrl(cname, cvalue);
00075 }
00076 else
00077 {
00078 mutex_.lock();
00079
00080 control_names_.push_back(cname);
00081 control_values_.push_back(cvalue);
00082 mutex_.unlock();
00083 }
00084 }
00085
00086 void
00087 MarSystemQtWrapper::pause()
00088 {
00089
00090 mutex_.lock();
00091 pause_ = true;
00092 mutex_.unlock();
00093 }
00094
00095
00096
00097 void
00098 MarSystemQtWrapper::trackctrl(MarControlPtr control)
00099 {
00100 mutex_.lock();
00101 tracked_controls_.push_back(control);
00102 mutex_.unlock();
00103 }
00104
00105 void
00106 MarSystemQtWrapper::play()
00107 {
00108 mutex_.lock();
00109 main_pnet_->updctrl("mrs_bool/active", true);
00110 pause_ = false;
00111 condition_.wakeOne();
00112 mutex_.unlock();
00113 }
00114
00115
00116 void
00117 MarSystemQtWrapper::emitTrackedControls()
00118 {
00119 mutex_.lock();
00120 QVector<MarControlPtr>::iterator vsi;
00121 for (vsi = tracked_controls_.begin();
00122 vsi != tracked_controls_.end(); ++vsi)
00123 {
00124 emit ctrlChanged(*vsi);
00125 }
00126 mutex_.unlock();
00127 }
00128
00129 QVector<MarControlPtr> MarSystemQtWrapper::getTrackedControls()
00130 {
00131 return tracked_controls_;
00132 }
00133
00134
00135 void
00136 MarSystemQtWrapper::run()
00137 {
00138 while(1)
00139 {
00140 if (abort_)
00141 return;
00142
00143 running_ = true;
00144
00145 mutex_.lock();
00146 counter_ ++;
00147 QVector<MarControlPtr>::iterator vsi;
00148 QVector<MarControlPtr>::iterator vvi;
00149
00150 for (vsi = control_names_.begin(),
00151 vvi = control_values_.begin();
00152 vsi != control_names_.end(); ++vsi, ++vvi)
00153 {
00154 main_pnet_->updctrl(*vsi, *vvi);
00155 }
00156
00157 control_names_.clear();
00158 control_values_.clear();
00159 mutex_.unlock();
00160
00161 if (!withTimer_)
00162 emitTrackedControls();
00163
00164 if (!pause_)
00165 main_pnet_->tick();
00166
00167 mutex_.lock();
00168 if (pause_)
00169 {
00170 main_pnet_->updctrl("mrs_bool/active", false);
00171 condition_.wait(&mutex_);
00172 }
00173 pause_ = false;
00174 mutex_.unlock();
00175 }
00176 }
00177
00178 }
00179