00001 // Copyright (C) 2004 Pablo Mejia 00002 00003 00004 #ifndef SICK_MSG_0xB0_H 00005 #define SICK_MSG_0xB0_H 00006 00007 00008 #include "sick_msg.H" 00009 00010 00011 #include <cassert> 00012 00013 00014 namespace sick 00015 { 00016 // Measured Values 00017 class msg_0xB0_t : public msg_t 00018 { 00019 protected: 00020 static unsigned const SCAN_FLAGS_OFFSET = 5; 00021 static unsigned const BEAM_BASE_OFFSET = 7; 00022 static unsigned const BEAM_SIZE = 2; 00023 00024 public: 00025 msg_0xB0_t (); 00026 msg_0xB0_t (msg_t const *msg) : msg_t (msg) {} 00027 00028 unsigned scan_flags (void) const 00029 { 00030 return (letoh<u16_t> (m_data + SCAN_FLAGS_OFFSET)); 00031 } 00032 00033 unsigned num_beams (void) const 00034 { 00035 return (scan_flags () & 0x03FF); 00036 } 00037 bool is_partial_scan (void) const 00038 { 00039 return (scan_flags () & 0x2000); 00040 } 00041 unsigned partial_scan_index (void) const 00042 { 00043 return ((scan_flags () >> 11) & 0x03); 00044 } 00045 00046 enum units_t 00047 { 00048 UNTIS_CM = 0, 00049 UNTIS_MM = 1, 00050 }; 00051 units_t units (void) const 00052 { 00053 return ((units_t) ((scan_flags () >> 14) & 0x03)); 00054 } 00055 00056 unsigned beam_flags (unsigned b) const 00057 { 00058 assert (b < num_beams ()); 00059 return (letoh<u16_t> 00060 (m_data + BEAM_BASE_OFFSET + b * BEAM_SIZE)); 00061 } 00062 00063 unsigned scan_index (void) const 00064 { 00065 return (m_data[BEAM_BASE_OFFSET + 00066 num_beams () * BEAM_SIZE]); 00067 } 00068 unsigned dgram_index (void) const 00069 { 00070 return (m_data[BEAM_BASE_OFFSET + 00071 num_beams () * BEAM_SIZE + 1]); 00072 } 00073 }; 00074 }; 00075 00076 00077 #endif