00001 // Copyright (C) 2004 Pablo Mejia 00002 00003 00004 #ifndef SICK_MSG_BUILDER_H 00005 #define SICK_MSG_BUILDER_H 00006 00007 00008 #include "endian.H" 00009 00010 00011 #include <cassert> 00012 #include <cstring> 00013 00014 00015 namespace sick 00016 { 00017 using namespace endian; 00018 00019 class msg_builder_t 00020 { 00021 public: 00022 msg_builder_t (); 00023 virtual ~msg_builder_t () {}; 00024 00025 unsigned build (unsigned address, 00026 unsigned char *data, unsigned max_size); 00027 00028 protected: 00029 unsigned m_offset; 00030 00031 unsigned m_max_size; 00032 unsigned char *m_data; 00033 00034 template <typename T> 00035 void encode (T const &v) 00036 { 00037 assert ((m_offset + sizeof (v)) <= m_max_size); 00038 htole (v, m_data + m_offset); 00039 m_offset += sizeof (v); 00040 } 00041 00042 void encode (void *data, unsigned size) 00043 { 00044 assert ((m_offset + size) <= m_max_size); 00045 memcpy (m_data + m_offset, data, size); 00046 m_offset += size; 00047 } 00048 00049 virtual unsigned _build (void) = 0; 00050 }; 00051 }; 00052 00053 00054 #endif