00001 /*!@file Devices/HMR3300.H class for interfacing with a Honeywell 3300 compass */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2003 // 00005 // by the University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Nitin Dhavale <dhavale@usc.edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Devices/HMR3300.H $ 00035 // $Id: HMR3300.H 7880 2007-02-09 02:34:07Z itti $ 00036 // 00037 00038 #ifndef DEVICES_HMR3300_H_DEFINED 00039 #define DEVICES_HMR3300_H_DEFINED 00040 00041 #include "Component/OptionManager.H" 00042 #include "Devices/Serial.H" 00043 #include "Util/Angle.H" 00044 #include <pthread.h> 00045 00046 //! A hook which will be called when a new compass reading is received 00047 class HMR3300Listener { 00048 public: 00049 //! Destructor 00050 virtual ~HMR3300Listener(); 00051 00052 //! New data was received 00053 virtual void newData(const Angle heading, const Angle pitch, 00054 const Angle roll) = 0; 00055 }; 00056 00057 //! Class for interfacing with a Honeywell HMR-3300 compass 00058 /*! This is a 3-axis compass. The compass communicates with a host via 00059 RS-232 at 19,200 bauds. The compass sends the 3 angular measurements 00060 at regular intervals. 00061 00062 In our BeoSub, Pitch is approx 0.0 when horizontal; tilting the sub 00063 nose down makes the pitch more negative. 00064 00065 For Heading, 0.0 is north, turning left decreases the heading angle. 00066 00067 For Roll, rolling leftwards (so that the left side of the sub goes 00068 down while the right side goes up) increases the roll angle. 00069 */ 00070 class HMR3300 : public ModelComponent 00071 { 00072 public: 00073 //! Initialize 00074 HMR3300(OptionManager& mgr, 00075 const std::string& descrName = "HMR3300", 00076 const std::string& tagName = "HMR3300", 00077 const char *dev = "/dev/ttyS0"); 00078 00079 //! Destructor 00080 ~HMR3300(); 00081 00082 //! Install a callback (listener) 00083 /*! This callback will be called with the corresponding data each 00084 time new data is received from the device. */ 00085 void setListener(rutz::shared_ptr<HMR3300Listener>& listener); 00086 00087 //! Get the current filtered heading, pitch, and roll from the compass 00088 void get(Angle& heading, Angle& pitch, Angle& roll); 00089 00090 //! Get the current filtered heading 00091 Angle getHeading(); 00092 00093 //! Get the current filtered pitch 00094 Angle getPitch(); 00095 00096 //! Get the current filtered roll 00097 Angle getRoll(); 00098 00099 //! The user need not concern himself with this method. 00100 /*! Should have been protected, but is not because 00101 of the pthread hack. */ 00102 void run(); 00103 00104 protected: 00105 void start2(); //!< get started 00106 void stop1(); //!< get stopped 00107 00108 private: 00109 nub::soft_ref<Serial> itsSerial; 00110 bool itsKeepgoing; 00111 rutz::shared_ptr<HMR3300Listener> itsListener; 00112 Angle itsHeading, itsPitch, itsRoll; 00113 pthread_mutex_t itsLock; 00114 pthread_t itsRunner; 00115 }; 00116 00117 #endif 00118 00119 // ###################################################################### 00120 /* So things look consistent in everyone's emacs... */ 00121 /* Local Variables: */ 00122 /* indent-tabs-mode: nil */ 00123 /* End: */