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