00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef HMI_CONSOLE_OUTPUT_HPP
00029 #define HMI_CONSOLE_OUTPUT_HPP
00030
00031 #include <rtt/TaskContext.hpp>
00032 #include <rtt/Activity.hpp>
00033 #include <rtt/Logger.hpp>
00034 #include <rtt/os/MutexLock.hpp>
00035 #include <sstream>
00036 #include <iostream>
00037
00038 #include <ocl/OCL.hpp>
00039
00040 namespace OCL
00041 {
00050 class OCL_API HMIConsoleOutput
00051 : public RTT::TaskContext
00052 {
00053 std::string coloron;
00054 std::string coloroff;
00055 std::string _prompt;
00056 std::ostringstream messages;
00057 std::ostringstream backup;
00058 std::ostringstream logmessages;
00059 std::ostringstream logbackup;
00060
00061 RTT::os::Mutex msg_lock;
00062 RTT::os::Mutex log_lock;
00063
00064 public :
00065 HMIConsoleOutput( const std::string& name = "cout")
00066 : RTT::TaskContext( name ),
00067 coloron("\033[1;34m"), coloroff("\033[0m"),
00068 _prompt("HMIConsoleOutput :\n")
00069 {
00070 this->addOperation("display", &HMIConsoleOutput::display, this, RTT::ClientThread).doc("Display a message on the console").arg("message", "The message to be displayed");
00071 this->addOperation("displayBool", &HMIConsoleOutput::displayBool, this, RTT::ClientThread).doc("Display a boolean on the console").arg("boolean", "The Boolean to be displayed");
00072 this->addOperation("displayInt", &HMIConsoleOutput::displayInt, this, RTT::ClientThread).doc("Display a integer on the console").arg("integer", "The Integer to be displayed");
00073 this->addOperation("displayDouble", &HMIConsoleOutput::displayDouble, this, RTT::ClientThread).doc("Display a double on the console").arg("double", "The Double to be displayed");
00074 this->addOperation("log", &HMIConsoleOutput::log, this, RTT::ClientThread).doc("Log a message on the console").arg("message", "The message to be logged");
00075 this->addOperation("logBool", &HMIConsoleOutput::logBool, this, RTT::ClientThread).doc("Log a boolean on the console").arg("boolean", "The Boolean to be logged");
00076 this->addOperation("logInt", &HMIConsoleOutput::logInt, this, RTT::ClientThread).doc("Log a integer on the console").arg("integer", "The Integer to be logged");
00077 this->addOperation("logDouble", &HMIConsoleOutput::logDouble, this, RTT::ClientThread).doc("Log a double on the console").arg("double", "The Double to be logged");
00078
00079 }
00080
00081 ~HMIConsoleOutput()
00082 {
00083 this->stop();
00084 }
00085
00086 void updateHook()
00087 {
00088 {
00089 RTT::os::MutexLock lock1( msg_lock );
00090 if ( ! messages.str().empty() ) {
00091 std::cout << coloron << _prompt<< coloroff <<
00092 messages.str() << std::endl;
00093 messages.rdbuf()->str("");
00094 }
00095 }
00096 {
00097 RTT::os::MutexLock lock1( log_lock );
00098 if ( ! logmessages.str().empty() ) {
00099 RTT::log(RTT::Info) << logmessages.str() << RTT::endlog();
00100 logmessages.rdbuf()->str("");
00101 }
00102 }
00103 }
00104
00108 void enableColor(bool yesno = true)
00109 {
00110 if (yesno == true) {
00111 coloron = "\033[1;34m";
00112 coloroff = "\033[0m";
00113 } else {
00114 coloron.clear();
00115 coloroff.clear();
00116 }
00117 }
00118
00122 void setPrompt(const std::string& prompt)
00123 {
00124 _prompt = prompt;
00125 }
00126
00127
00131 void display(const std::string & what)
00132 {
00133 this->enqueue( what );
00134 }
00135
00141 template<class T>
00142 void enqueue( const T& what )
00143 {
00144 {
00145 RTT::os::MutexTryLock try_lock( msg_lock );
00146 if ( try_lock.isSuccessful() ) {
00147
00148 messages << backup.str();
00149 messages << what << std::endl;
00150 backup.rdbuf()->str("");
00151 }
00152 else
00153 backup << what << std::endl;
00154
00155 }
00156 if ( this->engine()->getActivity() )
00157 this->engine()->getActivity()->trigger();
00158 }
00159
00163 void displayBool(bool what)
00164 {
00165 this->enqueue( what );
00166 }
00167
00171 void displayInt( int what)
00172 {
00173 this->enqueue( what );
00174 }
00175
00179 void displayDouble( double what )
00180 {
00181 this->enqueue( what );
00182 }
00183
00184 template<class T>
00185 void dolog( const T& what )
00186 {
00187 {
00188 RTT::os::MutexTryLock try_lock( log_lock );
00189 if ( try_lock.isSuccessful() ) {
00190
00191 logmessages << logbackup.str();
00192 logmessages << what;
00193 logbackup.rdbuf()->str("");
00194 }
00195 else
00196 logbackup << what;
00197 }
00198 if ( this->engine()->getActivity() )
00199 this->engine()->getActivity()->trigger();
00200 }
00201
00202
00203 void log(const std::string & what)
00204 {
00205 this->dolog( what );
00206 }
00210 void logBool(bool what)
00211 {
00212 this->dolog( what );
00213 }
00214
00218 void logInt( int what)
00219 {
00220 this->dolog( what );
00221 }
00222
00226 void logDouble( double what )
00227 {
00228 this->dolog( what );
00229 }
00230
00231 };
00232
00233 }
00234
00235 #endif