00001 // Copyright (C) 2004 Christopher Mire 00002 00003 #ifndef SICK_MSG_0xC4_H 00004 #define SICK_MSG_0xC4_H 00005 00006 #include "sick_msg.H" 00007 00008 #include <cassert> 00009 00010 namespace sick 00011 { 00012 // Measured Values 00013 class msg_0xC4_t : public msg_t 00014 { 00015 protected: 00016 static unsigned const SCAN_FLAGS_OFFSET = 5; 00017 static unsigned const BEAM_BASE_OFFSET = 7; 00018 static unsigned const BEAM_SIZE = 2; 00019 static unsigned const REFLECT_SIZE = 1; 00020 00021 public: 00022 msg_0xC4_t (); 00023 msg_0xC4_t (msg_t const *msg) : msg_t (msg) {} 00024 00025 unsigned scan_flags (void) const 00026 { 00027 return (letoh<u16_t> (m_data + SCAN_FLAGS_OFFSET)); 00028 } 00029 00030 unsigned num_beams (void) const 00031 { 00032 return (scan_flags () & 0x03FF); 00033 } 00034 enum units_t 00035 { 00036 UNTIS_CM = 0, 00037 UNTIS_MM = 1, 00038 }; 00039 units_t units (void) const 00040 { 00041 return ((units_t) ((scan_flags () >> 14) & 0x03)); 00042 } 00043 00044 unsigned beam_flags (unsigned b) const 00045 { 00046 assert (b < num_beams ()); 00047 return (letoh<u16_t> 00048 (m_data + BEAM_BASE_OFFSET + b * BEAM_SIZE)); 00049 } 00050 00051 unsigned num_reflect_val () const 00052 { 00053 return (letoh<u16_t> (m_data + BEAM_BASE_OFFSET + 00054 num_beams () * BEAM_SIZE) & 00055 0x03FF); 00056 } 00057 unsigned first_reflect_val () const 00058 { 00059 return (letoh<u16_t>(m_data + BEAM_BASE_OFFSET + 00060 num_beams () * BEAM_SIZE + 2)); 00061 } 00062 00063 unsigned last_reflect_val () const 00064 { 00065 return (letoh<u16_t>(m_data + BEAM_BASE_OFFSET + 00066 num_beams () * BEAM_SIZE + 4)); 00067 } 00068 00069 unsigned reflectivity (unsigned b) const 00070 { 00071 b += 1; 00072 if (b < first_reflect_val () || 00073 b > last_reflect_val ()) 00074 return 0; 00075 00076 unsigned index = b - first_reflect_val (); 00077 return (m_data[BEAM_BASE_OFFSET + num_beams () * 00078 BEAM_SIZE + 6 + index * REFLECT_SIZE]); 00079 } 00080 00081 unsigned scan_index (void) const 00082 { 00083 return (m_data[BEAM_BASE_OFFSET + 00084 num_beams () * BEAM_SIZE + 6 + 00085 num_reflect_val () * REFLECT_SIZE]); 00086 } 00087 00088 unsigned dgram_index (void) const 00089 { 00090 return (m_data[BEAM_BASE_OFFSET + 00091 num_beams () * BEAM_SIZE + 7 + 00092 num_reflect_val () * REFLECT_SIZE]); 00093 } 00094 }; 00095 }; 00096 00097 00098 #endif