00001 // Copyright (C) 2006 Pablo Mejia 00002 00003 00004 #ifndef NAVCOM_MSG_H 00005 #define NAVCOM_MSG_H 00006 00007 00008 #include "endian.H" 00009 00010 00011 namespace navcom 00012 { 00013 using namespace endian; 00014 00015 00016 class msg_t 00017 { 00018 protected: 00019 bool m_valid; 00020 unsigned m_size; 00021 u8_t const *m_data; 00022 00023 static unsigned const STX_OFFSET = 0; 00024 static unsigned const PREAMBLE1_OFFSET = 1; 00025 static unsigned const PREAMBLE2_OFFSET = 2; 00026 static unsigned const COMMAND_OFFSET = 3; 00027 static unsigned const LENGTH_OFFSET = 4; 00028 00029 static unsigned const ENVELOPE_SIZE = 4; 00030 static unsigned const MIN_SIZE = 8; 00031 00032 static unsigned skip_to_stx (unsigned size_, 00033 unsigned char const *data_); 00034 00035 00036 public: 00037 static unsigned const MAX_SIZE = 65543; 00038 00039 static u8_t const STX = 0x02; 00040 static u8_t const PREAMBLE1 = 0x99; 00041 static u8_t const PREAMBLE2 = 0x66; 00042 static u8_t const ETX = 0x03; 00043 00044 msg_t () : m_valid (false), m_size (0), m_data (0) {} 00045 00046 unsigned decode (unsigned size_, unsigned char const *data_); 00047 00048 bool valid () const { return m_valid; } 00049 unsigned size () const { return m_size; } 00050 unsigned char const *data () const { return m_data; } 00051 00052 u8_t stx () const { return m_data[STX_OFFSET]; } 00053 u8_t preamble1 () const { return m_data[PREAMBLE1_OFFSET]; } 00054 u8_t preamble2 () const { return m_data[PREAMBLE2_OFFSET]; } 00055 u8_t command () const { return m_data[COMMAND_OFFSET]; } 00056 u16_t length () const { return letoh<u16_t> (m_data + LENGTH_OFFSET); } 00057 u8_t cksum () const { return m_data[m_size - 2]; } 00058 u8_t etx () const { return m_data[m_size - 1]; } 00059 }; 00060 00061 00062 }; 00063 00064 00065 #endif