MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/HipMessage.cpp

68 lines
1.8 KiB
C++

/*
* HipMessage.cpp
*
* Created on: 4 ìàð. 2020 ã.
* 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;
}