00001 // Copyright (C) 2004 Nitin Jyoti 00002 // Copyright (C) 2004 Pablo Mejia 00003 00004 00005 #ifndef CAJUN_VORAD_H 00006 #define CAJUN_VORAD_H 00007 00008 #define F2M (0.3048) 00009 #define MAX_ERROR_COUNT 32 //only bad pkts/data 00010 00011 #include <inttypes.h> 00012 00013 namespace cajun 00014 { 00015 class input_buffer_t; 00016 00017 class vorad_t 00018 { 00019 public: 00020 vorad_t (int fd_); 00021 ~vorad_t (); 00022 00023 enum vorad_message_enum 00024 { 00025 VORAD_STARTUP_MSG = 81, 00026 VORAD_TARGET_MSG = 82, 00027 VORAD_CALIB_MSG = 83 00028 }; 00029 00030 // All Eaton RADAR specific structures. 00031 struct vorad_targetinfo 00032 { 00033 // Range 3-4 int LSB = 0.1 ft 00034 uint8_t m_range[2]; 00035 // Relative Vel 5-6 int LSB = 0.1 ft/sec 00036 uint8_t m_velocity[2]; 00037 // Azimuth 7 char LSB = 0.002 radians 00038 int8_t m_azimuth; 00039 // Magnitude 8 uchar LSB = -0.543 dB 00040 uint8_t m_magnitude; 00041 // Lock 9 bmb bit mapped MofN reporting 00042 uint8_t m_lock; 00043 public: 00044 int range() const 00045 { 00046 return((m_range[1] << 8) | m_range[0]); 00047 } // Vorad units, as unsigned 00048 double range_in_m() const 00049 { 00050 return(range()*0.1*F2M); 00051 } // range in feet 00052 int velocity() const 00053 { 00054 return(((int8_t)m_velocity[1] << 8) | m_velocity[0]); 00055 } // Vorad units, as signed (>0 if receding) 00056 double velocity_in_mps() const 00057 { 00058 return(velocity()*0.1*F2M); 00059 } // velocity in feet per second. 00060 double azimuthrad() const 00061 { 00062 return(m_azimuth*0.002); 00063 } // azimuth in radians 00064 double magnitudedb() const 00065 { 00066 return(m_magnitude*(-0.543)); 00067 } // magnitude in dB 00068 void dump() const; 00069 }; 00070 00071 struct vorad_targetdrop 00072 { 00073 uint8_t m_targetdropped[7]; 00074 public: 00075 void dump() const; 00076 }; 00077 00078 struct vorad_field 00079 { 00080 uint8_t m_targetid;//ID number 1-255 00081 // 0 indicates a target drop 00082 union { // one of two formats 00083 vorad_targetinfo m_targetinfo; 00084 vorad_targetdrop m_targetsdropped; 00085 }; 00086 public: 00087 void dump() const; 00088 }; 00089 00090 struct vorad_target_msg 00091 { 00092 uint8_t m_msgnum; // message num 00093 uint8_t m_sequence; // message sequence 00094 uint8_t m_targetcount; // number of targets 00095 vorad_field m_targets[7]; // up to 7 targets 00096 // 7 is MAX_RADAR_TGTS which is defined also in 00097 // data_type.H. A duplication? do u care? 00098 public: 00099 void dump() const; 00100 }; 00101 // End Eaton RADAR structs 00102 00103 class observer_t 00104 { 00105 public: 00106 enum vorad_message_t 00107 { 00108 STATUS_FULL_BUFFER, 00109 STATUS_RESET 00110 }; 00111 00112 virtual ~observer_t () {} 00113 virtual void publish_status (double tstamp, 00114 unsigned status) {} 00115 virtual void radarData (vorad_target_msg *ptrMsg) {} 00116 }; 00117 00118 void register_observer (observer_t *observer) 00119 { 00120 m_observer = observer; 00121 } 00122 00123 void handle_input (void); 00124 bool is_valid_vorad_data(unsigned char const *beg, 00125 unsigned char const *end); 00126 int decode (unsigned char const *beg, 00127 unsigned char const *end); 00128 00129 protected: 00130 int m_fd; 00131 long m_errorcounter; 00132 input_buffer_t *m_ib; 00133 observer_t *m_observer; 00134 }; 00135 }; 00136 00137 00138 #endif