ROS Serial library for Mbed platforms for ROS Melodic Morenia. Check http://wiki.ros.org/rosserial_mbed/ for more information.

Dependencies:   BufferedSerial

Committer:
Gary Servin
Date:
Fri Nov 08 14:38:09 2019 -0300
Revision:
0:04ac6be8229a
Initial commit, generated based on a clean melodic-desktop-full

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gary Servin 0:04ac6be8229a 1 /*
Gary Servin 0:04ac6be8229a 2 * Software License Agreement (BSD License)
Gary Servin 0:04ac6be8229a 3 *
Gary Servin 0:04ac6be8229a 4 * Copyright (c) 2011, Willow Garage, Inc.
Gary Servin 0:04ac6be8229a 5 * All rights reserved.
Gary Servin 0:04ac6be8229a 6 *
Gary Servin 0:04ac6be8229a 7 * Redistribution and use in source and binary forms, with or without
Gary Servin 0:04ac6be8229a 8 * modification, are permitted provided that the following conditions
Gary Servin 0:04ac6be8229a 9 * are met:
Gary Servin 0:04ac6be8229a 10 *
Gary Servin 0:04ac6be8229a 11 * * Redistributions of source code must retain the above copyright
Gary Servin 0:04ac6be8229a 12 * notice, this list of conditions and the following disclaimer.
Gary Servin 0:04ac6be8229a 13 * * Redistributions in binary form must reproduce the above
Gary Servin 0:04ac6be8229a 14 * copyright notice, this list of conditions and the following
Gary Servin 0:04ac6be8229a 15 * disclaimer in the documentation and/or other materials provided
Gary Servin 0:04ac6be8229a 16 * with the distribution.
Gary Servin 0:04ac6be8229a 17 * * Neither the name of Willow Garage, Inc. nor the names of its
Gary Servin 0:04ac6be8229a 18 * contributors may be used to endorse or promote prducts derived
Gary Servin 0:04ac6be8229a 19 * from this software without specific prior written permission.
Gary Servin 0:04ac6be8229a 20 *
Gary Servin 0:04ac6be8229a 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Gary Servin 0:04ac6be8229a 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Gary Servin 0:04ac6be8229a 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
Gary Servin 0:04ac6be8229a 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
Gary Servin 0:04ac6be8229a 25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
Gary Servin 0:04ac6be8229a 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
Gary Servin 0:04ac6be8229a 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Gary Servin 0:04ac6be8229a 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Gary Servin 0:04ac6be8229a 29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Gary Servin 0:04ac6be8229a 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
Gary Servin 0:04ac6be8229a 31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Gary Servin 0:04ac6be8229a 32 * POSSIBILITY OF SUCH DAMAGE.
Gary Servin 0:04ac6be8229a 33 */
Gary Servin 0:04ac6be8229a 34
Gary Servin 0:04ac6be8229a 35 #ifndef ROS_SUBSCRIBER_H_
Gary Servin 0:04ac6be8229a 36 #define ROS_SUBSCRIBER_H_
Gary Servin 0:04ac6be8229a 37
Gary Servin 0:04ac6be8229a 38 #include "rosserial_msgs/TopicInfo.h"
Gary Servin 0:04ac6be8229a 39
Gary Servin 0:04ac6be8229a 40 namespace ros
Gary Servin 0:04ac6be8229a 41 {
Gary Servin 0:04ac6be8229a 42
Gary Servin 0:04ac6be8229a 43 /* Base class for objects subscribers. */
Gary Servin 0:04ac6be8229a 44 class Subscriber_
Gary Servin 0:04ac6be8229a 45 {
Gary Servin 0:04ac6be8229a 46 public:
Gary Servin 0:04ac6be8229a 47 virtual void callback(unsigned char *data) = 0;
Gary Servin 0:04ac6be8229a 48 virtual int getEndpointType() = 0;
Gary Servin 0:04ac6be8229a 49
Gary Servin 0:04ac6be8229a 50 // id_ is set by NodeHandle when we advertise
Gary Servin 0:04ac6be8229a 51 int id_;
Gary Servin 0:04ac6be8229a 52
Gary Servin 0:04ac6be8229a 53 virtual const char * getMsgType() = 0;
Gary Servin 0:04ac6be8229a 54 virtual const char * getMsgMD5() = 0;
Gary Servin 0:04ac6be8229a 55 const char * topic_;
Gary Servin 0:04ac6be8229a 56 };
Gary Servin 0:04ac6be8229a 57
Gary Servin 0:04ac6be8229a 58 /* Bound function subscriber. */
Gary Servin 0:04ac6be8229a 59 template<typename MsgT, typename ObjT = void>
Gary Servin 0:04ac6be8229a 60 class Subscriber: public Subscriber_
Gary Servin 0:04ac6be8229a 61 {
Gary Servin 0:04ac6be8229a 62 public:
Gary Servin 0:04ac6be8229a 63 typedef void(ObjT::*CallbackT)(const MsgT&);
Gary Servin 0:04ac6be8229a 64 MsgT msg;
Gary Servin 0:04ac6be8229a 65
Gary Servin 0:04ac6be8229a 66 Subscriber(const char * topic_name, CallbackT cb, ObjT* obj, int endpoint = rosserial_msgs::TopicInfo::ID_SUBSCRIBER) :
Gary Servin 0:04ac6be8229a 67 cb_(cb),
Gary Servin 0:04ac6be8229a 68 obj_(obj),
Gary Servin 0:04ac6be8229a 69 endpoint_(endpoint)
Gary Servin 0:04ac6be8229a 70 {
Gary Servin 0:04ac6be8229a 71 topic_ = topic_name;
Gary Servin 0:04ac6be8229a 72 };
Gary Servin 0:04ac6be8229a 73
Gary Servin 0:04ac6be8229a 74 virtual void callback(unsigned char* data)
Gary Servin 0:04ac6be8229a 75 {
Gary Servin 0:04ac6be8229a 76 msg.deserialize(data);
Gary Servin 0:04ac6be8229a 77 (obj_->*cb_)(msg);
Gary Servin 0:04ac6be8229a 78 }
Gary Servin 0:04ac6be8229a 79
Gary Servin 0:04ac6be8229a 80 virtual const char * getMsgType()
Gary Servin 0:04ac6be8229a 81 {
Gary Servin 0:04ac6be8229a 82 return this->msg.getType();
Gary Servin 0:04ac6be8229a 83 }
Gary Servin 0:04ac6be8229a 84 virtual const char * getMsgMD5()
Gary Servin 0:04ac6be8229a 85 {
Gary Servin 0:04ac6be8229a 86 return this->msg.getMD5();
Gary Servin 0:04ac6be8229a 87 }
Gary Servin 0:04ac6be8229a 88 virtual int getEndpointType()
Gary Servin 0:04ac6be8229a 89 {
Gary Servin 0:04ac6be8229a 90 return endpoint_;
Gary Servin 0:04ac6be8229a 91 }
Gary Servin 0:04ac6be8229a 92
Gary Servin 0:04ac6be8229a 93 private:
Gary Servin 0:04ac6be8229a 94 CallbackT cb_;
Gary Servin 0:04ac6be8229a 95 ObjT* obj_;
Gary Servin 0:04ac6be8229a 96 int endpoint_;
Gary Servin 0:04ac6be8229a 97 };
Gary Servin 0:04ac6be8229a 98
Gary Servin 0:04ac6be8229a 99 /* Standalone function subscriber. */
Gary Servin 0:04ac6be8229a 100 template<typename MsgT>
Gary Servin 0:04ac6be8229a 101 class Subscriber<MsgT, void>: public Subscriber_
Gary Servin 0:04ac6be8229a 102 {
Gary Servin 0:04ac6be8229a 103 public:
Gary Servin 0:04ac6be8229a 104 typedef void(*CallbackT)(const MsgT&);
Gary Servin 0:04ac6be8229a 105 MsgT msg;
Gary Servin 0:04ac6be8229a 106
Gary Servin 0:04ac6be8229a 107 Subscriber(const char * topic_name, CallbackT cb, int endpoint = rosserial_msgs::TopicInfo::ID_SUBSCRIBER) :
Gary Servin 0:04ac6be8229a 108 cb_(cb),
Gary Servin 0:04ac6be8229a 109 endpoint_(endpoint)
Gary Servin 0:04ac6be8229a 110 {
Gary Servin 0:04ac6be8229a 111 topic_ = topic_name;
Gary Servin 0:04ac6be8229a 112 };
Gary Servin 0:04ac6be8229a 113
Gary Servin 0:04ac6be8229a 114 virtual void callback(unsigned char* data)
Gary Servin 0:04ac6be8229a 115 {
Gary Servin 0:04ac6be8229a 116 msg.deserialize(data);
Gary Servin 0:04ac6be8229a 117 this->cb_(msg);
Gary Servin 0:04ac6be8229a 118 }
Gary Servin 0:04ac6be8229a 119
Gary Servin 0:04ac6be8229a 120 virtual const char * getMsgType()
Gary Servin 0:04ac6be8229a 121 {
Gary Servin 0:04ac6be8229a 122 return this->msg.getType();
Gary Servin 0:04ac6be8229a 123 }
Gary Servin 0:04ac6be8229a 124 virtual const char * getMsgMD5()
Gary Servin 0:04ac6be8229a 125 {
Gary Servin 0:04ac6be8229a 126 return this->msg.getMD5();
Gary Servin 0:04ac6be8229a 127 }
Gary Servin 0:04ac6be8229a 128 virtual int getEndpointType()
Gary Servin 0:04ac6be8229a 129 {
Gary Servin 0:04ac6be8229a 130 return endpoint_;
Gary Servin 0:04ac6be8229a 131 }
Gary Servin 0:04ac6be8229a 132
Gary Servin 0:04ac6be8229a 133 private:
Gary Servin 0:04ac6be8229a 134 CallbackT cb_;
Gary Servin 0:04ac6be8229a 135 int endpoint_;
Gary Servin 0:04ac6be8229a 136 };
Gary Servin 0:04ac6be8229a 137
Gary Servin 0:04ac6be8229a 138 }
Gary Servin 0:04ac6be8229a 139
Gary Servin 0:04ac6be8229a 140 #endif