X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fcan%2Fmessage%2Fj1939-message.cpp;h=8e056c174c8adaeac3a7a400026dd98ddcd31e2a;hb=b8e8186c95f50e76aa4d88c3c751053568ab7cdf;hp=147ab73561d6899cbabdbf6030a986296ef527c8;hpb=2f60d294b3fa4e243fa67a738f9b82a0b428a7fc;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/can/message/j1939-message.cpp b/low-can-binding/can/message/j1939-message.cpp index 147ab735..8e056c17 100644 --- a/low-can-binding/can/message/j1939-message.cpp +++ b/low-can-binding/can/message/j1939-message.cpp @@ -15,34 +15,45 @@ * limitations under the License. */ -#include "./j1939-message.hpp" #include +#include +#include #include "../../binding/low-can-hat.hpp" +#include "../../utils/converter.hpp" +#include "j1939-message.hpp" - -/// -/// @brief Class constructor -/// -/// j1939_message_t class constructor. -/// +/** + * @brief Construct a new j1939 message t::j1939 message t object + * + */ j1939_message_t::j1939_message_t(): - message_t(), - name_{0}, - pgn_{0}, - addr_{0} + message_t(), + name_{0}, + pgn_{0}, + addr_{0} {} -j1939_message_t::j1939_message_t(uint8_t length, - message_format_t format, - std::vector& data, - uint64_t timestamp, - name_t name, - pgn_t pgn, - uint8_t addr): - message_t(length, format, data, timestamp), - name_{name}, - pgn_{pgn}, - addr_{addr} +/** + * @brief Construct a new j1939 message t::j1939 message t object + * + * @param length The length of the message + * @param format The format of the message + * @param data The vector data of the message + * @param timestamp The timetamp of the message + * @param name The name of the message + * @param pgn The PGN of the message + * @param addr The address of the message + */ +j1939_message_t::j1939_message_t(uint32_t length, + std::vector& data, + uint64_t timestamp, + name_t name, + pgn_t pgn, + uint8_t addr): + message_t(J1939_MAX_DLEN, length, J1939_PROTOCOL, data, timestamp), + name_{name}, + pgn_{pgn}, + addr_{addr} {} /// @@ -51,7 +62,7 @@ j1939_message_t::j1939_message_t(uint8_t length, /// @return name_ class member /// uint64_t j1939_message_t::get_name() const { - return name_; + return name_; } /// @@ -60,7 +71,7 @@ uint64_t j1939_message_t::get_name() const { /// @return pgn_ class member /// uint32_t j1939_message_t::get_pgn() const{ - return pgn_; + return pgn_; } /// @@ -69,7 +80,7 @@ uint32_t j1939_message_t::get_pgn() const{ /// @return addr_ class member /// uint8_t j1939_message_t::get_addr() const{ - return addr_; + return addr_; } @@ -85,34 +96,34 @@ uint8_t j1939_message_t::get_addr() const{ /// @return A j1939_message_t object fully initialized with sockaddr_can and data values. std::shared_ptr j1939_message_t::convert_from_addr(struct sockaddr_can& addr, uint8_t (&data)[128],size_t nbytes, uint64_t timestamp) { - uint8_t length = 0; - message_format_t format; - std::vector dataVector; - - if(nbytes > J1939_MAX_DLEN) - { - AFB_DEBUG("Unsupported j1939 frame"); - format = message_format_t::INVALID; - } - else - { - AFB_DEBUG("Got a j1939 frame"); - format = message_format_t::J1939; - } - - length = (uint8_t) nbytes; - dataVector.reserve(length); - int i; - dataVector.clear(); - for(i=0;i(j1939_message_t(length, format, dataVector, timestamp,addr.can_addr.j1939.name,addr.can_addr.j1939.pgn,addr.can_addr.j1939.addr)); + int i; + uint32_t length = 0; + uint32_t flags; + std::vector data_vector; + + if(nbytes > J1939_MAX_DLEN) + { + AFB_DEBUG("Unsupported j1939 frame"); + return std::make_shared(j1939_message_t()); + } + + length = (uint32_t) nbytes; + data_vector.reserve(length); + + data_vector.clear(); + + std::string data_string; + data_string = converter_t::to_hex(data,length); + + for(i=0;i(j1939_message_t(length, data_vector, timestamp,addr.can_addr.j1939.name,addr.can_addr.j1939.pgn,addr.can_addr.j1939.addr)); } /// @brief Test if members pgn_ and length are set. @@ -129,12 +140,12 @@ bool j1939_message_t::is_set() std::string j1939_message_t::get_debug_message() { std::string ret = ""; - ret = ret + "Here is the next j1939 message : pgn " + std::to_string(pgn_) + " length " + std::to_string(length_) + ", data "; - for (size_t i = 0; i < data_.size(); i++) - { - ret = ret + std::to_string(data_[i]); - } - return ret; + ret = ret + "Here is the next j1939 message : pgn " + std::to_string(pgn_) + " length " + std::to_string(length_) + ", data "; + for (size_t i = 0; i < data_.size(); i++) + { + ret = ret + std::to_string(data_[i]); + } + return ret; } /// @@ -144,20 +155,73 @@ std::string j1939_message_t::get_debug_message() /// uint32_t j1939_message_t::get_id() const { - AFB_WARNING("Prefer method get_pgn() for j1939 messages"); + AFB_DEBUG("Prefer method get_pgn() for j1939 messages"); return get_pgn(); } +void j1939_message_t::set_id(const canid_t id) +{ + pgn_ = id; +} -struct bcm_msg j1939_message_t::get_bcm_msg() + +/** + * @brief Return the sockname of the message + * + * @return struct sockaddr_can The sockname of the message + */ +struct sockaddr_can j1939_message_t::get_sockname() { - AFB_WARNING("Not implemented"); - struct bcm_msg bcm_msg; - ::memset(&bcm_msg, 0, sizeof(struct bcm_msg)); - return bcm_msg; + return sockname_; } -void j1939_message_t::set_bcm_msg(struct bcm_msg bcm_msg) +/** + * @brief Allows to set a sockname at a message to send it after + * + * @param sockname The sockname of the message + */ +void j1939_message_t::set_sockname(struct sockaddr_can sockname) { - AFB_WARNING("Not implemented"); + sockname_ = sockname; } + +/** + * @brief Allows to generate a sockname for the message + * + * @param pgn The pgn for the sockname + * @param name The name for the sockname + * @param addr The address for the sockname + */ +void j1939_message_t::set_sockname(pgn_t pgn, name_t name, uint8_t addr) +{ + memset(&sockname_, 0, sizeof(sockname_)); + sockname_.can_family = AF_CAN; + sockname_.can_ifindex = 0; + + if(addr <= 0 || addr >= UINT8_MAX ) + { + sockname_.can_addr.j1939.addr = J1939_NO_ADDR; + } + else + { + sockname_.can_addr.j1939.addr = addr; + } + + if(name <= 0 || name >= UINT64_MAX ) + { + sockname_.can_addr.j1939.name = J1939_NO_NAME; + } + else + { + sockname_.can_addr.j1939.name = name; + } + + if(pgn <= 0 || pgn > J1939_PGN_MAX) + { + sockname_.can_addr.j1939.pgn = J1939_NO_PGN; + } + else + { + sockname_.can_addr.j1939.pgn = pgn; + } +} \ No newline at end of file