#include #include "message.h" /* Private */ void Message::free() { delete[] this->msg; } void Message::copyFrom(const Message& other) { this->can_id = other.can_id; this->size = other.size; this->received = other.received; this->latest_index = other.latest_index; this->msg = new unsigned char[this->size]; std::memcpy(this->msg, other.msg, this->size); } /* Public */ Message::Message(unsigned int can_id, const Frame& first_frame) : can_id(can_id), received(0), latest_index(0) { this->size = first_frame.get_size(); this->msg = new unsigned char[this->size]; this->receive_frame(first_frame); } Message::~Message() { this->free(); } Message::Message(const Message& other) { this->copyFrom(other); } Message& Message::operator=(const Message& other) { if (this != &other) { this->free(); this->copyFrom(other); } return *this; } void Message::receive_frame(const Frame& f) { // This logic isn't really necessary, but I like to be thorough if ((this->latest_index + 1) % 16 < f.get_index()) { throw std::invalid_argument("A consecutive frame was lost!"); } this->latest_index = f.get_index(); // For CFs we set the data size to 7 (the maximum), however, we may be expecting // to receive less data (in the last CF). size_t expects = std::min(this->size - this->received, f.get_data_size()); std::memcpy(this->msg + this->received, f.get_data(), expects); this->received += expects; } bool Message::expects_more_frames() const { return this->received < this->size; } std::ostream& operator<<(std::ostream& os, const Message& m) { os << std::hex << m.can_id << ":"; for (int i = 0; i < m.received; ++i) { os << " 0x" << (unsigned)m.msg[i]; } if (m.expects_more_frames()) os << "..."; return os << std::dec; }