00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __PLUGINS_PANTILT_DIRPERC_DP_THREAD_H_
00024 #define __PLUGINS_PANTILT_DIRPERC_DP_THREAD_H_
00025
00026 #include "../act_thread.h"
00027
00028 #include <blackboard/interface_listener.h>
00029
00030 #ifdef USE_TIMETRACKER
00031 # include <utils/time/tracker.h>
00032 #endif
00033 #include <string>
00034 #include <memory>
00035
00036 namespace fawkes {
00037 class PanTiltInterface;
00038 }
00039
00040 class DirectedPerceptionPTU;
00041
00042 class PanTiltDirectedPerceptionThread
00043 : public PanTiltActThread,
00044 public fawkes::BlackBoardInterfaceListener
00045 {
00046 public:
00047 PanTiltDirectedPerceptionThread(std::string &pantilt_cfg_prefix,
00048 std::string &ptu_cfg_prefix,
00049 std::string &ptu_name);
00050
00051 virtual void init();
00052 virtual void finalize();
00053 virtual void loop();
00054
00055
00056 virtual bool bb_interface_message_received(fawkes::Interface *interface,
00057 fawkes::Message *message) throw();
00058
00059 void update_sensor_values();
00060
00061
00062 protected: virtual void run() { Thread::run(); }
00063
00064 private:
00065 fawkes::PanTiltInterface *__pantilt_if;
00066
00067 fawkes::RefPtr<DirectedPerceptionPTU> __ptu;
00068
00069 std::string __pantilt_cfg_prefix;
00070 std::string __ptu_cfg_prefix;
00071 std::string __ptu_name;
00072 std::string __cfg_device;
00073 unsigned int __cfg_read_timeout_ms;
00074
00075
00076 class WorkerThread : public fawkes::Thread
00077 {
00078 public:
00079 WorkerThread(std::string ptu_name, fawkes::Logger *logger,
00080 fawkes::RefPtr<DirectedPerceptionPTU> ptu);
00081
00082 ~WorkerThread();
00083 void goto_pantilt(float pan, float tilt);
00084 void get_pantilt(float &pan, float &tilt);
00085 bool is_final();
00086 void stop_motion();
00087 bool has_fresh_data();
00088 void reset();
00089
00090 virtual void loop();
00091
00092 private:
00093 void exec_goto_pantilt(float pan, float tilt);
00094
00095 private:
00096 fawkes::RefPtr<DirectedPerceptionPTU> __ptu;
00097 fawkes::Logger *__logger;
00098
00099 float __pan_min;
00100 float __pan_max;
00101 float __tilt_min;
00102 float __tilt_max;
00103
00104 fawkes::Mutex *__move_mutex;
00105 bool __move_pending;
00106 float __target_pan;
00107 float __target_tilt;
00108
00109 float __cur_pan;
00110 float __cur_tilt;
00111
00112 bool __reset_pending;
00113 bool __fresh_data;
00114 };
00115
00116 WorkerThread *__wt;
00117 };
00118
00119 #endif