/* * 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}, rtr_flag_{false}, length_{0}, flags_{0}, format_{CanMessageFormat::ERROR} {} uint32_t can_message_t::get_id() const { return id_; } bool can_message_t::get_rtr_flag_() const { return rtr_flag_; } int can_message_t::get_format() const { if (format_ != CanMessageFormat::STANDARD || format_ != CanMessageFormat::EXTENDED) return CanMessageFormat::ERROR; return format_; } uint8_t can_message_t::get_flags() const { return flags_; } const uint8_t* can_message_t::get_data() const { return data_.data(); } uint8_t can_message_t::get_length() const { return length_; } void can_message_t::set_max_data_length(const struct canfd_frame& frame) { maxdlen_ = 0; switch(sizeof(frame)) { case CANFD_MTU: DEBUG(binder_interface, "convert_from_canfd_frame: Got an CAN FD frame with length %d and flags %d", frame.len, frame.flags); maxdlen_ = CANFD_MAX_DLEN; break; case CAN_MTU: DEBUG(binder_interface, "convert_from_canfd_frame: Got a legacy CAN frame with length %d", frame.len); maxdlen_ = CAN_MAX_DLEN; break; default: ERROR(binder_interface, "convert_from_canfd_frame: unsupported CAN frame"); break; } } bool can_message_t::is_correct_to_send() { if (id_ != 0 && length_ != 0 && format_ != CanMessageFormat::ERROR) { int i; for(i=0;i maxdlen_) ? maxdlen_ : new_length; } } void can_message_t::set_data(const __u8 new_data[], size_t dlen) { if (dlen > maxdlen_) ERROR(binder_interface, "Can set data, too big ! It is a CAN frame ?"); else { int i; /* Limiting to 8 bytes message for now, even on 64 bytes from fd frames*/ for(i=0;i