/* * HipMessage.cpp * * Created on: 4 мар. 2020 г. * Author: user */ #include "HipMessage.hh" #include unsigned short driver::Message::calcControlSumm( const char* data, std::size_t data_len ) { unsigned short csumm = 0; for( unsigned short i = 0; i < data_len; i++ ) csumm ^= data[i]; return csumm & 0xff; } driver::Message & driver::Message::operator=( const Header & header ) { data[0] = header.bytes_2[0]; data[1] = header.bytes_2[1]; return *this; } bool driver::Message::pack_message( const MessageControl* message ) { std::size_t data_len = 0; const unsigned short csumm_byte_pos = (data_len = message->send_data_size + 3) - 1; if( data_size < data_len ) return data_len = 0, false; else { operator=(Header(message->address, message->code)); static void * const message_data_start = &data[first_data_byte_pos]; std::memcpy( message_data_start, message->send_data, message->send_data_size ); data[csumm_byte_pos] = calcControlSumm(data, data_len - 1); } return true; } driver::HipResult driver::Message::unpack_message( const MessageControl * message ) { std::size_t data_len = 0; const unsigned short csumm_byte_pos = (data_len = message->rec_data_size + 3) - 1; if( data_size < data_len ) return driver::internal_error; else { if( (data[csumm_byte_pos] & 0xff) != calcControlSumm(data, data_len - 1) ) return driver::csumm_error; if( ( Header(*this).command_value + 0x40 ) != message->code ) return driver::unexpected_answer; static const void * const message_data_start = &data[first_data_byte_pos]; std::memcpy( message->rec_data, message_data_start, message->rec_data_size ); } return driver::OK; }