topic_to_socketcan.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2016, Ivor Wanders
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions are met:
00006  *   * Redistributions of source code must retain the above copyright notice,
00007  *     this list of conditions and the following disclaimer.
00008  *   * Redistributions in binary form must reproduce the above copyright
00009  *     notice, this list of conditions and the following disclaimer in the
00010  *     documentation and/or other materials provided with the distribution.
00011  *   * Neither the name of the copyright holder nor the names of its
00012  *     contributors may be used to endorse or promote products derived from
00013  *     this software without specific prior written permission.
00014  *
00015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00025  * POSSIBILITY OF SUCH DAMAGE.
00026  */
00027 
00028 #include <socketcan_bridge/topic_to_socketcan.h>
00029 #include <socketcan_interface/string.h>
00030 #include <string>
00031 
00032 namespace socketcan_bridge
00033 {
00034   TopicToSocketCAN::TopicToSocketCAN(ros::NodeHandle* nh, ros::NodeHandle* nh_param,
00035       boost::shared_ptr<can::DriverInterface> driver)
00036     {
00037       can_topic_ = nh->subscribe<can_msgs::Frame>("sent_messages", 10,
00038                     boost::bind(&TopicToSocketCAN::msgCallback, this, _1));
00039       driver_ = driver;
00040     };
00041 
00042   void TopicToSocketCAN::setup()
00043     {
00044       state_listener_ = driver_->createStateListener(
00045               can::StateInterface::StateDelegate(this, &TopicToSocketCAN::stateCallback));
00046     };
00047 
00048   void TopicToSocketCAN::msgCallback(const can_msgs::Frame::ConstPtr& msg)
00049     {
00050       // ROS_DEBUG("Message came from sent_messages topic");
00051 
00052       // translate it to the socketcan frame type.
00053 
00054       can_msgs::Frame m = *msg.get();  // ROS message
00055       can::Frame f;  // socketcan type
00056 
00057       // converts the can_msgs::Frame (ROS msg) to can::Frame (socketcan.h)
00058       convertMessageToSocketCAN(m, f);
00059 
00060       if (!f.isValid())  // check if the id and flags are appropriate.
00061       {
00062         // ROS_WARN("Refusing to send invalid frame: %s.", can::tostring(f, true).c_str());
00063         // can::tostring cannot be used for dlc > 8 frames. It causes an crash
00064         // due to usage of boost::array for the data array. The should always work.
00065         ROS_ERROR("Invalid frame from topic: id: %#04x, length: %d, is_extended: %d", m.id, m.dlc, m.is_extended);
00066         return;
00067       }
00068 
00069       bool res = driver_->send(f);
00070       if (!res)
00071       {
00072         ROS_ERROR("Failed to send message: %s.", can::tostring(f, true).c_str());
00073       }
00074     };
00075 
00076 
00077 
00078   void TopicToSocketCAN::stateCallback(const can::State & s)
00079     {
00080       std::string err;
00081       driver_->translateError(s.internal_error, err);
00082       if (!s.internal_error)
00083       {
00084         ROS_INFO("State: %s, asio: %s", err.c_str(), s.error_code.message().c_str());
00085       }
00086       else
00087       {
00088         ROS_ERROR("Error: %s, asio: %s", err.c_str(), s.error_code.message().c_str());
00089       }
00090     };
00091 };  // namespace socketcan_bridge


socketcan_bridge
Author(s): Ivor Wanders
autogenerated on Sun Sep 3 2017 03:11:00