68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
|
|
/*
|
|||
|
|
* HipMessage.cpp
|
|||
|
|
*
|
|||
|
|
* Created on: 4 <EFBFBD><EFBFBD><EFBFBD>. 2020 <EFBFBD>.
|
|||
|
|
* Author: user
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "HipMessage.hh"
|
|||
|
|
|
|||
|
|
#include <cstring>
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
}
|