From c009c3c329d30acfb6be3a8ed0671a9a07266546 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Tue, 28 Feb 2017 12:00:43 +0100 Subject: Re-arranging objects splitting all objects over separated files. Change-Id: Ifbdb2ea08704324e505a48ba3124df6f2af63c6b Signed-off-by: Romain Forlot --- src/can-message.cpp | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/can-message.cpp (limited to 'src/can-message.cpp') diff --git a/src/can-message.cpp b/src/can-message.cpp new file mode 100644 index 0000000..f9ec6b2 --- /dev/null +++ b/src/can-message.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2015, 2016 "IoT.bzh" + * Author "Romain Forlot" + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "can-message.hpp" + +#include + +#include "low-can-binding.hpp" + +/******************************************************************************** +* +* CanMessage method implementation +* +*********************************************************************************/ + +can_message_t::can_message_t() + : id_{0}, length_{0}, format_{CanMessageFormat::ERROR}, data_{0,0,0,0,0,0,0,0} +{} + +uint32_t can_message_t::get_id() const +{ + return id_; +} + +int can_message_t::get_format() const +{ + if (format_ != CanMessageFormat::STANDARD || format_ != CanMessageFormat::EXTENDED) + return CanMessageFormat::ERROR; + return format_; +} + +const uint8_t* can_message_t::get_data() const +{ + return data_; +} +uint8_t can_message_t::get_length() const +{ + return length_; +} + +bool can_message_t::is_correct_to_send() +{ + if (id_ != 0 && length_ != 0 && format_ != CanMessageFormat::ERROR) + { + int i; + for(i=0;i CAN_MESSAGE_SIZE)) + ERROR(binder_interface, "Can set data, your data array is too big"); + else + { + ::memcpy(&data_, &new_data, sizeof(new_data)); + length_ = sizeof(new_data); + } +} + +void can_message_t::convert_from_canfd_frame(const canfd_frame& frame) +{ + length_ = (frame.len > CAN_MAX_DLEN) ? (uint8_t)CAN_MAX_DLEN : frame.len; + length_ = (frame.len > CANFD_MAX_DLEN) ? (uint8_t)CANFD_MAX_DLEN : frame.len; + + if (frame.can_id & CAN_ERR_FLAG) + { + id_ = frame.can_id & (CAN_ERR_MASK|CAN_ERR_FLAG); + format_ = CanMessageFormat::ERROR; + } + else if (frame.can_id & CAN_EFF_FLAG) + { + id_ = frame.can_id & CAN_EFF_MASK; + format_ = CanMessageFormat::EXTENDED; + } + else + { + id_ = frame.can_id & CAN_SFF_MASK; + format_ = CanMessageFormat::STANDARD; + } + + if (sizeof(frame.data) <= sizeof(data_)) + ::memcpy(&data_, frame.data, length_); + else if (sizeof(frame.data) >= CAN_MAX_DLEN) + ERROR(binder_interface, "can_message_t: canfd_frame data too long to be stored into CanMessage object"); +} + +canfd_frame can_message_t::convert_to_canfd_frame() +{ + canfd_frame frame; + + if(is_correct_to_send()) + { + frame.can_id = get_id(); + frame.len = get_length(); + ::memcpy(frame.data, get_data(), length_); + } + else + ERROR(binder_interface, "can_message_t not correctly initialized to be sent"); + + return frame; +} + -- cgit 1.2.3-korg