Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

RunSequenceControl.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 #ifndef INCLUDED_RunSequenceControl_h_
00003 #define INCLUDED_RunSequenceControl_h_
00004 
00005 #include "FileBrowserControl.h"
00006 #include "Motion/MotionSequenceMC.h"
00007 #include "Motion/EmergencyStopMC.h"
00008 #include "Motion/LedMC.h"
00009 #include "Sound/SoundManager.h"
00010 #include "Motion/MMAccessor.h"
00011 #include "Shared/TimeET.h"
00012 #include "Shared/Config.h"
00013 #include <string>
00014 
00015 //! Upon activation, loads a position from a file name read from cin (stored in ms/data/motion...)
00016 /*! The template parameter is passed to MotionSequenceMC's template
00017  *  parameter in order to specify the number of keyframes to reserve -
00018  *  larger values use more memory, but will allow you to load more
00019  *  complicated sequences.
00020  *
00021  *  The motion sequence doesn't actually start playing until the
00022  *  emergency stop is deactivated.  This avoids either cutting off the
00023  *  beginning of the sequence while still in estop, or having to
00024  *  override the estop, which may be unexpected.
00025  */
00026 template<unsigned int SequenceSize>
00027 class RunSequenceControl : public FileBrowserControl, public EventListener {
00028 public:
00029   //! Constructor, sets filter to *.mot
00030   RunSequenceControl(const std::string& n, MotionManager::MC_ID estop_id)
00031     : FileBrowserControl(n,"Runs a motion sequence from a user-specified file",config->portPath(config->motion.root)),
00032       estopid(estop_id), ledid(MotionManager::invalid_MC_ID), waitingFile()
00033   {
00034     setFilter("*.mot");
00035   }
00036 
00037   virtual ~RunSequenceControl() {
00038     erouter->removeListener(this);
00039     motman->removeMotion(ledid);
00040   }
00041 
00042   //! only called when e-stop has been turned off and we're waiting to load a file
00043   virtual void processEvent(const EventBase& /*event*/) {
00044     erouter->removeListener(this);
00045     runFile();
00046     motman->removeMotion(ledid);
00047   }
00048   
00049 protected:
00050   //! loads the motion sequence and runs it
00051   void runFile() {
00052     //TimeET timer;
00053     SharedObject< MotionSequenceMC<SequenceSize> > s(waitingFile);
00054     //cout << "Load Time: " << timer.Age() << endl;
00055     motman->addPrunableMotion(s);
00056     waitingFile="";
00057   }
00058 
00059   //!does the actual loading of the MotionSequence
00060   virtual ControlBase* selectedFile(const std::string& f) {
00061     waitingFile=f;
00062     if(!MMAccessor<EmergencyStopMC>(estopid)->getStopped()) {
00063       runFile();
00064     } else {
00065       //we have to wait for the estop to be turned off
00066       sndman->PlayFile("donkey.wav");
00067       SharedObject<LedMC> led;
00068       led->cset(FaceLEDMask,0);
00069       led->cycle(BotLLEDMask,1000,3,0,0);
00070       led->cycle(BotRLEDMask,1000,3,0,500);
00071       ledid=motman->addPersistentMotion(led);
00072       erouter->addListener(this,EventBase::estopEGID,estopid,EventBase::deactivateETID);
00073     }
00074     return this;
00075   }
00076 
00077   MotionManager::MC_ID estopid; //!< MC_ID of the emergency stop (so we can tell if it's active and wait until it's turned off)
00078   MotionManager::MC_ID ledid; //!< MC_ID of the led we use to signal there's a MotionSequence lined up
00079   std::string waitingFile; //!< filename of the motion sequence waiting to load
00080 };
00081 
00082 /*! @file
00083  * @brief Defines RunSequenceControl, which when activated, loads and runs a motion sequence from a file name read from cin (stored in ms/data/motion)
00084  * @author ejt (Creator)
00085  *
00086  * $Author: ejt $
00087  * $Name: tekkotsu-2_4_1 $
00088  * $Revision: 1.17 $
00089  * $State: Exp $
00090  * $Date: 2005/06/06 23:05:51 $
00091  */
00092 
00093 #endif

Tekkotsu v2.4.1
Generated Tue Aug 16 16:32:48 2005 by Doxygen 1.4.4