00001 // this is for emacs file handling -*- mode: c++; indent-tabs-mode: nil -*- 00002 00003 // -- BEGIN LICENSE BLOCK ---------------------------------------------- 00004 00024 // -- END LICENSE BLOCK ------------------------------------------------ 00025 00026 //---------------------------------------------------------------------- 00033 //---------------------------------------------------------------------- 00034 00035 #include <sick_safetyscanners/data_processing/ParseTypeCodeData.h> 00036 00037 #include <sick_safetyscanners/cola2/Command.h> 00038 00039 namespace sick { 00040 namespace data_processing { 00041 00042 ParseTypeCodeData::ParseTypeCodeData() 00043 { 00044 m_reader_ptr = std::make_shared<sick::data_processing::ReadWriteHelper>(); 00045 } 00046 00047 00048 bool ParseTypeCodeData::parseTCPSequence(const datastructure::PacketBuffer& buffer, 00049 sick::datastructure::TypeCode& type_code) const 00050 { 00051 const uint8_t* data_ptr(buffer.getBuffer().data()); 00052 type_code.setInterfaceType(readInterfaceType(data_ptr)); 00053 type_code.setMaxRange(readMaxRange(data_ptr)); 00054 return true; 00055 } 00056 00057 00058 uint8_t ParseTypeCodeData::readInterfaceType(const uint8_t*& data_ptr) const 00059 { 00060 uint8_t type_code_interface_1 = m_reader_ptr->readuint8_t(data_ptr, 14); 00061 uint8_t type_code_interface_2 = m_reader_ptr->readuint8_t(data_ptr, 15); 00062 00063 uint8_t res = sick::datastructure::e_interface_type::E_EFIPRO; 00064 00065 if ((type_code_interface_1 == 'Z' && type_code_interface_2 == 'A') || 00066 (type_code_interface_1 == 'A' && type_code_interface_2 == 'A')) 00067 { 00068 res = sick::datastructure::e_interface_type::E_EFIPRO; 00069 } 00070 else if (type_code_interface_1 == 'I' && type_code_interface_2 == 'Z') 00071 { 00072 res = sick::datastructure::e_interface_type::E_ETHERNET_IP; 00073 } 00074 else if ((type_code_interface_1 == 'P' && type_code_interface_2 == 'Z') || 00075 (type_code_interface_1 == 'L' && type_code_interface_2 == 'Z')) 00076 { 00077 res = sick::datastructure::e_interface_type::E_PROFINET; 00078 } 00079 else if (type_code_interface_1 == 'A' && type_code_interface_2 == 'N') 00080 { 00081 res = sick::datastructure::e_interface_type::E_NONSAFE_ETHERNET; 00082 } 00083 00084 return res; 00085 } 00086 00087 float ParseTypeCodeData::readMaxRange(const uint8_t*& data_ptr) const 00088 { 00089 uint8_t type_code_interface_1 = m_reader_ptr->readuint8_t(data_ptr, 12); 00090 uint8_t type_code_interface_2 = m_reader_ptr->readuint8_t(data_ptr, 13); 00091 00092 int res = sick::datastructure::e_ranges::E_NORMAL_RANGE; 00093 00094 if ((type_code_interface_1 == '3' && type_code_interface_2 == '0') || 00095 (type_code_interface_1 == '4' && type_code_interface_2 == '0') || 00096 (type_code_interface_1 == '5' && type_code_interface_2 == '5')) 00097 { 00098 res = sick::datastructure::e_ranges::E_NORMAL_RANGE; 00099 } 00100 else if (type_code_interface_1 == '9' && type_code_interface_2 == '0') 00101 { 00102 res = sick::datastructure::e_ranges::E_LONG_RANGE; 00103 } 00104 00105 return (float)res; 00106 } 00107 00108 00109 } // namespace data_processing 00110 } // namespace sick