00001 #ifndef __MOVEMENT_AGENT_H__ 00002 #define __MOVEMENT_AGENT_H__ 00003 00004 #include "Captain.H" 00005 #include "AgentManager.H" 00006 #include "SubController.H" 00007 #include "SubmarineAgent.H" 00008 #include "Point3D.H" 00009 00010 class AgentManager; 00011 class CaptainAgent; 00012 00013 class MovementAgent : public SubmarineAgent 00014 { 00015 00016 public: 00017 00018 MovementAgent(OptionManager& mgr, 00019 nub::soft_ref<AgentManager> ama, 00020 nub::soft_ref<SubController> subController, 00021 const std::string& name = "MovementAgent"); 00022 00023 00024 ~MovementAgent(); 00025 00026 inline void setCaptainAgent 00027 (nub::soft_ref<CaptainAgent> pfc); 00028 00029 private: 00030 00031 bool pickAndExecuteAnAction(); 00032 00033 00034 bool dive(int depth, bool relative = false, int timeout = 0); 00035 00036 bool goStraight(int speed, int time); 00037 00038 bool setHeading(int heading, bool relative = false, int timeout = 0); 00039 00040 int trackPipe(const Point2D<int>& pointToTrack, const Point2D<int>& desiredPoint); 00041 00042 void paramChanged(ModelParamBase* const param, 00043 const bool valueChanged, 00044 ParamClient::ChangeStatus* status); 00045 00046 NModelParam<int> itsDepthErrThresh; 00047 NModelParam<int> itsHeadingErrThresh; 00048 00049 NModelParam<float> pipeP; 00050 NModelParam<float> pipeI; 00051 NModelParam<float> pipeD; 00052 PID<float> itsPipePID; 00053 00054 NModelParam<int> setDiveValue; 00055 NModelParam<int> setGoStraightTimeValue; 00056 NModelParam<int> setSpeedValue; 00057 NModelParam<int> setHeadingValue; 00058 NModelParam<bool> setRelative; 00059 NModelParam<int> setTimeout; 00060 00061 nub::soft_ref<SubController> itsSubController; 00062 nub::soft_ref<CaptainAgent> itsCaptainAgent; 00063 nub::soft_ref<AgentManager> itsAgentManager; 00064 00065 uint itsFrameNumber; 00066 00067 rutz::shared_ptr<Timer> itsTimer; 00068 00069 }; 00070 00071 00072 // ###################################################################### 00073 inline void MovementAgent::setCaptainAgent 00074 (nub::soft_ref<CaptainAgent> ca) 00075 { 00076 itsCaptainAgent = ca; 00077 } 00078 00079 #endif