00001 #include "Component/ModelComponent.H" 00002 #include "Component/ModelParam.H" 00003 #include "Media/FrameSeries.H" 00004 #include "Transport/FrameInfo.H" 00005 #include "Raster/GenericFrame.H" 00006 #include "Image/Image.H" 00007 #include "GUI/XWinManaged.H" 00008 #include "GUI/ImageDisplayStream.H" 00009 #include "Image/Image.H" 00010 #include "Image/Pixels.H" 00011 #include "Robots/RobotBrain/RobotBrainComponent.H" 00012 00013 #include "Ice/RobotBrainObjects.ice.H" 00014 #include "Ice/RobotSimEvents.ice.H" 00015 #include "Ice/IceImageUtils.H" 00016 #include <IceUtil/Thread.h> 00017 00018 #include "Devices/BeeStem3.H" 00019 #include <vector> 00020 00021 #define HEADING_K 0 00022 #define HEADING_P 15 00023 #define HEADING_I 0 00024 #define HEADING_D 0 00025 00026 #define DEPTH_K 0 00027 #define DEPTH_P 33 00028 #define DEPTH_I 0 00029 #define DEPTH_D 0 00030 00031 class BeeStemI: public RobotBrainComponent 00032 { 00033 public: 00034 00035 struct FiringDeviceID 00036 { 00037 const static int Null = -1; 00038 const static int MIN = 0; 00039 const static int Shooter = 0; 00040 const static int DropperStage1 = 1; 00041 const static int DropperStage2 = 2; 00042 const static int MAX = 2; 00043 }; 00044 00045 struct ShooterState 00046 { 00047 const static int Idle = 0; 00048 const static int Armed = 1; 00049 const static int Firing = 2; 00050 const static int Reset = 3; 00051 const static int MAX = 3; 00052 }; 00053 00054 /* 00055 * Ensures proper functioning of the dropper; 00056 * -Each stage must be armed prior to dropping 00057 * -Stage2 can't be armed until Stage1 has been reset 00058 */ 00059 struct DropperState 00060 { 00061 const static int AllIdle = 0; 00062 const static int Stage1Armed = 1; 00063 const static int Stage1Dropping = 2; 00064 const static int Stage1Reset = 3; 00065 const static int Stage1Idle = 4; 00066 const static int Stage2Armed = 5; 00067 const static int Stage2Dropping = 6; 00068 const static int Stage2Reset = 7; 00069 const static int MAX = 7; 00070 }; 00071 00072 struct BeeStemFlags 00073 { 00074 bool needsUpdateFromJoystick; 00075 bool initFlag; 00076 00077 BeeStemFlags() 00078 { 00079 needsUpdateFromJoystick = false; 00080 initFlag = false; 00081 } 00082 }; 00083 00084 BeeStemI(int id, OptionManager& mgr, const std::string& descrName = 00085 "BeeStemI", const std::string& tagName = "BeeStemI"); 00086 00087 ~BeeStemI(); 00088 00089 virtual void evolve(); 00090 00091 //!Get a message 00092 virtual void updateMessage(const RobotSimEvents::EventMessagePtr& eMsg, 00093 const Ice::Current&); 00094 00095 virtual void registerTopics(); 00096 00097 void fireDevice(int deviceID); 00098 00099 static void getMotorControllerMsg(RobotSimEvents::BeeStemMotorControllerMessagePtr & msg, int mc0, int mc1, int mc2, int mc3, int mc4, int mc5, int mc6, int mc7, int mc8); 00100 00101 private: 00102 00103 void initPose(); 00104 void setValuesFromJoystick(); 00105 00106 nub::soft_ref<BeeStem3> itsStem; 00107 // nub::soft_ref<Serial> itsKillSwitch; 00108 // pthread_mutex_t itsKillSwitchLock; 00109 00110 IceUtil::Mutex itsStemMutex; 00111 std::map<int, int> itsJSMappings; 00112 //std::vector<int> itsJSValues; 00113 std::vector<int> itsButValues; 00114 int itsDesiredHeading, itsDesiredDepth, itsDesiredSpeed; 00115 int itsUpdateHeading, itsUpdateDepth, itsUpdateSpeed; 00116 int itsLastUpdateHeading, itsLastUpdateDepth, itsLastUpdateSpeed; 00117 IceUtil::Mutex itsUpdateMutex; 00118 int mShooterState; 00119 int mDropperState; 00120 int mFiringDeviceID; 00121 00122 BeeStemFlags mFlags; 00123 };