00001
00002 #ifndef INCLUDED_PostureMC_h
00003 #define INCLUDED_PostureMC_h
00004
00005 #include "MotionCommand.h"
00006 #include "PostureEngine.h"
00007 #include "MotionManager.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016 class PostureMC : public MotionCommand, public PostureEngine {
00017 public:
00018
00019 PostureMC() : MotionCommand(),PostureEngine(),dirty(true),tolerance(.01) { }
00020
00021 PostureMC(const char* filename) : MotionCommand(),PostureEngine(filename),dirty(true),tolerance(.01) { }
00022
00023 virtual ~PostureMC() {}
00024
00025
00026
00027
00028
00029
00030
00031
00032 PostureMC& setDirty(bool d=true) { dirty=d; return *this; }
00033 bool isDirty() const {return dirty;}
00034 virtual PostureMC& setTolerance(float t) { tolerance=t; return *this; }
00035 virtual float getTolerance() { return tolerance; }
00036
00037
00038
00039
00040 virtual int updateOutputs() {
00041 for(unsigned int i=0; i<NumOutputs; i++)
00042 if(cmds[i].weight>0)
00043 motman->setOutput(this,i,cmds[i]);
00044 bool r=dirty; dirty=false; return r;
00045 }
00046 virtual int isDirty() { return dirty; }
00047
00048
00049
00050
00051
00052 virtual int isAlive() {
00053 if(dirty || getAutoPrune()==false)
00054 return true;
00055 PostureEngine tmp;
00056 tmp.takeSnapshot();
00057 return (maxdiff(tmp)>tolerance);
00058 }
00059
00060
00061
00062
00063 inline virtual void takeSnapshot() { dirty=true; PostureEngine::takeSnapshot(); }
00064 inline virtual void clear() { dirty=true; PostureEngine::clear(); }
00065 inline virtual PostureEngine& setOverlay(const PostureEngine& pe) { dirty=true; PostureEngine::setOverlay(pe); return *this; }
00066 inline virtual PostureEngine& setUnderlay(const PostureEngine& pe) { dirty=true; PostureEngine::setUnderlay(pe); return *this; }
00067 inline virtual PostureEngine& setAverage(const PostureEngine& pe,float w=0.5) { dirty=true; PostureEngine::setAverage(pe,w); return *this; }
00068 inline virtual PostureEngine& setCombine(const PostureEngine& pe) { dirty=true; PostureEngine::setCombine(pe); return *this; }
00069 inline PostureEngine& setOutputCmd(unsigned int i, const OutputCmd& c) { dirty=true; PostureEngine::setOutputCmd(i,c); return *this; }
00070 inline virtual unsigned int LoadBuffer(const char buf[], unsigned int len) { dirty=true; return PostureEngine::LoadBuffer(buf,len); }
00071
00072
00073 protected:
00074 bool dirty;
00075 float tolerance;
00076
00077
00078
00079
00080
00081
00082
00083 };
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 #endif