summaryrefslogtreecommitdiffstats
path: root/src/can-utils.cpp
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-02-22 17:47:39 +0100
committerRomain Forlot <romain.forlot@iot.bzh>2017-02-22 17:47:39 +0100
commit7a570f951d151a73ee9e0755c263c9a8eb8eb806 (patch)
treeb67cfd85bc3ef1962189a29072c508a2f5940275 /src/can-utils.cpp
parent836feaecd602e86ea6d954ae018a2d7bbc04aa7a (diff)
Enhance error handling about can_message_t class
Change-Id: I9fbda1110eea7a3bd7e5855739280aa10bce5a6b Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'src/can-utils.cpp')
-rw-r--r--src/can-utils.cpp54
1 files changed, 36 insertions, 18 deletions
diff --git a/src/can-utils.cpp b/src/can-utils.cpp
index fb6025c..42763b8 100644
--- a/src/can-utils.cpp
+++ b/src/can-utils.cpp
@@ -24,32 +24,42 @@
*********************************************************************************/
can_message_t::can_message_t(const struct afb_binding_interface* interface)
- : interface_{interface}
+ : interface_{interface}, id_{0}, length_{0}, format_{CanMessageFormat::ERROR}, data_{0,0,0,0,0,0,0,0}
{}
uint32_t can_message_t::get_id() const
{
- if (id_ != 0)
- return id_;
- return 0;
+ return id_;
}
int can_message_t::get_format() const
{
if (format_ != CanMessageFormat::STANDARD || format_ != CanMessageFormat::EXTENDED)
- return -1;
+ return CanMessageFormat::ERROR;
return format_;
}
const uint8_t* can_message_t::get_data() const
{
- return &data_;
+ 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;i++)
+ if(data_[i] != 0)
+ return true;
+ }
+ return false;
+}
+
void can_message_t::set_id(const uint32_t new_id)
{
switch(format_)
@@ -76,23 +86,25 @@ void can_message_t::set_format(const CanMessageFormat new_format)
void can_message_t::set_data(const uint8_t new_data)
{
- ::memcpy(&data_, &new_data, sizeof(new_data));
- length_ = sizeof(new_data);
+ if ((sizeof(new_data) / sizeof(uint8_t) > CAN_MESSAGE_SIZE))
+ ERROR(interface_, "Can set data, your data array is too big");
+ else
+ {
+ ::memcpy(&data_, &new_data, sizeof(new_data));
+ length_ = sizeof(new_data);
+ }
}
-/*
- * @brief This is the preferred way to initialize a CanMessage object
- * from a read canfd_frame message.
- *
- * @param: canfd_frame pointer
- */
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;
@@ -114,12 +126,18 @@ canfd_frame can_message_t::convert_to_canfd_frame()
{
canfd_frame frame;
- frame.can_id = get_id();
- frame.len = get_length();
- ::memcpy(frame.data, get_data(), length_);
-
+ if(is_correct_to_send())
+ {
+ frame.can_id = get_id();
+ frame.len = get_length();
+ ::memcpy(frame.data, get_data(), length_);
+ }
+ else
+ ERROR(interface_, "can_message_t not correctly initialized to be sent");
+
return frame;
}
+
/********************************************************************************
*
* can_bus_dev_t method implementation