Controller.h

Go to the documentation of this file.
00001 /* ============================================================
00002  *
00003  * This file is a part of RCI project
00004  *
00005  * Copyright (C) 2011 by Arne Nordmann <anordman at cor-lab dot uni-bielefeld dot de>
00006  *
00007  * This file may be licensed under the terms of the
00008  * GNU Lesser General Public License Version 3 (the ``LGPL''),
00009  * or (at your option) any later version.
00010  *
00011  * Software distributed under the License is distributed
00012  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
00013  * express or implied. See the LGPL for the specific language
00014  * governing rights and limitations.
00015  *
00016  * You should have received a copy of the LGPL along with this
00017  * program. If not, go to http://www.gnu.org/licenses/lgpl.html
00018  * or write to the Free Software Foundation, Inc.,
00019  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00020  *
00021  * The development of this software was supported by:
00022  *   CoR-Lab, Research Institute for Cognition and Robotics
00023  *     Bielefeld University
00024  *
00025  * ============================================================ */
00026 
00027 #pragma once
00028 
00029 #include <sstream>
00030 #include <iostream>
00031 #include <math.h>
00032 
00033 #include <cca/Config.h>
00034 #include <cca/Node.h>
00035 
00036 #include <NemoMath/Vector.h>
00037 
00038 namespace cca {
00039 namespace rci {
00040 
00041 //template<class T>
00042 //class Controller;
00043 //typedef boost::shared_ptr<Controller<T> > ControllerPtr;
00044 
00049 template<class T>
00050 class Controller: public CCANode {
00051 
00052 public:
00053 
00054     Controller(std::string nodename) :
00055         CCANode(nodename), _task(), _status() {
00056 
00057         this->addInputPort<T> ();
00058         this->addInputPort<T> ();
00059         this->addOutputPort<T> ();
00060 
00061         _task = nemo::RealVector(nemo::dim(1), 0.0);
00062         _status = nemo::RealVector(nemo::dim(1), 0.0);
00063     }
00064     virtual ~Controller() {
00065     }
00066 
00070     virtual std::string print() const {
00071         std::ostringstream outstream(std::ostringstream::out);
00072         outstream.precision(3); // Precision when printing double values
00073         outstream << "<Controller \"" << this->getName() << "\">" << std::endl;
00074         return outstream.str();
00075     }
00076 
00081     virtual void onProcess() {
00082         //std::cout << "[Controller] Controlling ..." << std::endl;
00083         T *step;
00084 
00085         // Take input values
00086         if (!this->inputs[0]->empty() && this->inputs[0]->newItem()) {
00087             _task = *boost::static_pointer_cast<T>(this->inputs[0]->tryGet());
00088             std::cout << "[Controller] New task is\t" << _task;
00089         }
00090 
00091         if (!this->inputs[1]->empty() && this->inputs[1]->newItem()) {
00092             _status = *boost::static_pointer_cast<T>(this->inputs[1]->tryGet());
00093             std::cout << "[Controller] Status is\t\t" << _status;
00094         }
00095 
00096         // Calculate step
00097         double dstep = (_task.asDouble(0) - _status.asDouble(0)) / 4;
00098         step = new T(dstep);
00099         std::cout << "[Controller] Ctrl step is\t" << *step;
00100 
00101         // Publish task
00102         typename rsb::Informer<T>::DataPtr task(step);
00103         this->publish(0, task);
00104     }
00105 
00106 private:
00111     Controller(Controller &node);
00112 
00117     void operator=(const Controller &node);
00118 
00119     T _task, _status;
00120 };
00121 
00122 }
00123 }
Generated on Thu Aug 2 14:02:49 2012 for RCI by  doxygen 1.6.3