bridge.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Fraunhofer Institute for Manufacturing Engineering and Automation (IPA)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #include <ros/node_handle.h>
19 
22 #include <cob_hand_bridge/SetPWM.h>
24 #include <cob_hand_bridge/Status.h>
25 #include <std_msgs/UInt8.h>
26 #include <std_srvs/Trigger.h>
27 
28 #include <boost/thread/thread.hpp>
29 #include <boost/scoped_ptr.hpp>
30 
31 #include "hardware.h"
32 #include "gpio.h"
33 #include "sdhx.h"
34 
37 
38 
39 // SDHX
40 boost::scoped_ptr<SDHX> g_sdhx;
41 
43 
44 InitFinger::Request g_init_req;
45 std::string g_port;
46 
47 bool initFinger(const InitFinger::Request & req){
48  if(!g_sdhx){
49  g_sdhx.reset(new SDHX);
50  if(g_sdhx->init(req.port, req.min_pwm0, req.min_pwm1, req.max_pwm0, req.max_pwm1)){
51  g_port = req.port;
52  g_init_req = req;
53  g_init_req.port = g_port.c_str();
54  return true;
55  }
56  }
57  return false;
58 }
59 
60 void handleInitFinger(const InitFinger::Request & req, InitFinger::Response & res){
61  res.success = initFinger(req);
62 }
64 
65 using std_srvs::Trigger;
66 void handleHaltFinger(const Trigger::Request & req, Trigger::Response & res){
67  res.success = g_sdhx && g_sdhx->halt();
68 }
70 
71 void handleRecover(const Trigger::Request & req, Trigger::Response & res){
72  if(g_sdhx) {
74  res.success = true;
75  }else if(g_sdhx->isInitialized()) {
76  g_sdhx.reset();
77  res.success = initFinger(g_init_req);
78  if(res.success) g_status_msg.status &= ~g_status_msg.MASK_ERROR;
79  g_status_msg.rc = 0;
80  }else{
81  res.message = "Not initialized";
82  }
83  }
84 }
86 
89 }
91 
92 // GPIO
94 
96 
97 void handleInitPins(const InitPins::Request & req, InitPins::Response & res){
98  res.success = g_gpio.init();
99 
100  for(size_t i = 0; i < req.input_pins_length; ++i)
101  if(!g_gpio.setInput(req.input_pins[i]))
102  res.success = false;
103 
104  for(size_t i = 0; i < req.output_pins_length; ++i)
105  if(!g_gpio.setOutput(req.output_pins[i]))
106  res.success = false;
107 }
109 
111 void handleUpdatePins(const UpdatePins::Request & req, UpdatePins::Response & res){
112  res.success = g_gpio.setPins(req.set_pins) | g_gpio.clearPins(req.clear_pins);
113  uint32_t state = g_gpio.getState();
114  res.success = res.success && (state & req.set_pins) == req.set_pins && (state & req.clear_pins) == 0;
115 }
117 
119  g_gpio.writePin(mgs.data, 0);
120 }
122 
123 void handleSetPin(const std_msgs::UInt8& mgs){
124  g_gpio.writePin(mgs.data, 1);
125 }
127 
128 ros::Publisher g_pub("status", &g_status_msg);
129 
131 
132 void handleSetPWM(const SetPWM::Request & req, SetPWM::Response & res){
133 
134  if(req.pins_length != req.levels_length){
135  res.success = false;
136  return;
137  }
138  res.success = true;
139 
140  for(size_t i = 0; i < req.pins_length; ++i)
141  if(!g_gpio.pwmPin(req.pins[i],req.levels[i]))
142  res.success = false;
143 }
145 
146 void step(){
147  g_status_msg.stamp = g_nh.now();
148 
151 
153 
154  if(g_sdhx && g_sdhx->isInitialized()){
155  if(g_sdhx->getData(j.position_cdeg, j.velocity_cdeg_s, j.current_100uA, boost::chrono::seconds(1))) g_status_msg.status |= g_status_msg.MASK_FINGER_READY;
157  g_status_msg.rc = g_sdhx->getRC();
158  }
159 
161 
163  g_nh.spinOnce();
164 
165  if(g_sdhx) g_sdhx->poll();
166 
167  ++g_status_msg.seq;
168 }
169 
170 int main(int argc, char** argv){
171 
172  double rate = 20;
173 
174  if(argc != 2 && argc != 3){
175  std::cerr << "Usage: " << argv[0] << " port@baud [looprate]" << std::endl;
176  exit(1);
177  }
178  if(argc == 3){
179  rate = boost::lexical_cast<double>(argv[2]);
180  if(rate <= 0.0){
181  std::cerr << "Rate must be postive" << std::endl;
182  exit(1);
183  }
184  }
185 
186  std::string dev(argv[1]);
187  g_nh.initNode(&dev[0]);
188 
189  g_nh.advertiseService(g_srv_init_finger);
190  g_nh.advertiseService(g_srv_halt_finger);
191  g_nh.advertiseService(g_srv_recover);
192  g_nh.subscribe(g_sub_command);
193 
194  g_nh.advertiseService(g_srv_init_pins);
195  g_nh.advertiseService(g_srv_set_pwm);
196  g_nh.advertiseService(g_srv_update_pins);
197  g_nh.subscribe(g_sub_clear_pin);
198  g_nh.subscribe(g_sub_set_pin);
199 
200  g_nh.advertise(g_pub);
201 
202  boost::chrono::duration<double> double_interval(1.0/rate);
203  boost::chrono::milliseconds interval = boost::chrono::duration_cast<boost::chrono::milliseconds>(double_interval);
204  boost::chrono::steady_clock::time_point next = boost::chrono::steady_clock::now();
205 
206  while(true) {
207  step();
208  next += interval;
209  boost::this_thread::sleep_until(next);
210  }
211 
212  return 0;
213 }
main
int main(int argc, char **argv)
Definition: bridge.cpp:170
cob_hand_bridge::Status::status
uint8_t status
Definition: Status.h:36
GPIO::isInitialized
bool isInitialized() const
Definition: gpio.h:31
cob_hand_bridge::Status::NOT_INITIALIZED
@ NOT_INITIALIZED
Definition: Status.h:40
g_srv_init_pins
ros::ServiceServer< InitPins::Request, InitPins::Response > g_srv_init_pins("init_pins",&handleInitPins)
ros::Publisher
handleSetPWM
void handleSetPWM(const SetPWM::Request &req, SetPWM::Response &res)
Definition: bridge.cpp:132
handleSetPin
void handleSetPin(const std_msgs::UInt8 &mgs)
Definition: bridge.cpp:123
GPIO::clearPins
bool clearPins(uint32_t pins)
Definition: gpio.h:45
cob_hand_bridge::Status::MASK_GPIO_READY
@ MASK_GPIO_READY
Definition: Status.h:42
std_srvs::Trigger
Definition: Trigger.h:113
cob_hand_bridge::Status::seq
uint32_t seq
Definition: Status.h:34
cob_hand_bridge::Status::MASK_ERROR
@ MASK_ERROR
Definition: Status.h:43
g_srv_init_finger
ros::ServiceServer< InitFinger::Request, InitFinger::Response > g_srv_init_finger("init_finger",&handleInitFinger)
GPIO
Definition: gpio.h:23
g_srv_update_pins
ros::ServiceServer< UpdatePins::Request, UpdatePins::Response > g_srv_update_pins("update_pins",&handleUpdatePins)
GPIO::setPins
bool setPins(uint32_t pins)
Definition: gpio.h:48
InitPins.h
Trigger.h
InitFinger.h
cob_hand_bridge::Status
Definition: Status.h:31
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
cob_hand_bridge::JointValues::current_100uA
int16_t current_100uA[2]
Definition: JointValues.h:34
cob_hand_bridge::UpdatePins
Definition: UpdatePins.h:121
std_msgs::UInt8
Definition: UInt8.h:29
cob_hand_bridge::Status::MASK_FINGER_READY
@ MASK_FINGER_READY
Definition: Status.h:41
argv
argv
cob_hand_bridge::Status::pins
uint32_t pins
Definition: Status.h:38
g_sub_command
ros::Subscriber< cob_hand_bridge::JointValues > g_sub_command("command", handleJointCommand)
handleUpdatePins
void handleUpdatePins(const UpdatePins::Request &req, UpdatePins::Response &res)
Definition: bridge.cpp:111
ros::NodeHandle_
Definition: node_handle.h:81
std_msgs::UInt8::data
uint8_t data
Definition: UInt8.h:32
initFinger
bool initFinger(const InitFinger::Request &req)
Definition: bridge.cpp:47
handleHaltFinger
void handleHaltFinger(const Trigger::Request &req, Trigger::Response &res)
Definition: bridge.cpp:66
handleRecover
void handleRecover(const Trigger::Request &req, Trigger::Response &res)
Definition: bridge.cpp:71
g_status_msg
cob_hand_bridge::Status g_status_msg
Definition: bridge.cpp:36
handleClearPin
void handleClearPin(const std_msgs::UInt8 &mgs)
Definition: bridge.cpp:118
GPIO::writePin
bool writePin(uint32_t pin, uint32_t level)
Definition: gpio.h:51
sdhx.h
cob_hand_bridge::JointValues
Definition: JointValues.h:29
cob_hand_bridge::Status::joints
cob_hand_bridge::JointValues joints
Definition: Status.h:39
cob_hand_bridge::JointValues::position_cdeg
int16_t position_cdeg[2]
Definition: JointValues.h:32
g_port
std::string g_port
Definition: bridge.cpp:45
cob_hand_bridge::Status::stamp
ros::Time stamp
Definition: Status.h:35
UInt8.h
cob_hand_bridge::InitPins
Definition: InitPins.h:141
hardware.h
handleInitFinger
void handleInitFinger(const InitFinger::Request &req, InitFinger::Response &res)
Definition: bridge.cpp:60
g_sub_set_pin
ros::Subscriber< std_msgs::UInt8 > g_sub_set_pin("set_pin", handleSetPin)
g_sub_clear_pin
ros::Subscriber< std_msgs::UInt8 > g_sub_clear_pin("clear_pin", handleClearPin)
gpio.h
GPIO::setOutput
bool setOutput(uint32_t pin)
Definition: gpio.h:35
g_srv_halt_finger
ros::ServiceServer< Trigger::Request, Trigger::Response > g_srv_halt_finger("halt",&handleHaltFinger)
g_srv_recover
ros::ServiceServer< Trigger::Request, Trigger::Response > g_srv_recover("recover",&handleRecover)
GPIO::init
bool init()
Definition: gpio.h:42
GPIO::setInput
bool setInput(uint32_t pin)
Definition: gpio.h:32
Status.h
GPIO::getState
uint32_t getState()
Definition: gpio.h:68
cob_hand_bridge::Status::rc
uint8_t rc
Definition: Status.h:37
g_gpio
GPIO g_gpio
Definition: bridge.cpp:93
g_init_req
InitFinger::Request g_init_req
Definition: bridge.cpp:44
ros::ServiceServer
Definition: service_server.h:29
SetPWM.h
SDHX
Definition: sdhx.h:25
ros::Subscriber
Definition: subscriber.h:43
g_srv_set_pwm
ros::ServiceServer< SetPWM::Request, SetPWM::Response > g_srv_set_pwm("set_pwm",&handleSetPWM)
g_sdhx
boost::scoped_ptr< SDHX > g_sdhx
Definition: bridge.cpp:40
handleJointCommand
void handleJointCommand(const cob_hand_bridge::JointValues &j)
Definition: bridge.cpp:87
cob_hand_bridge::InitFinger
Definition: InitFinger.h:189
cob_hand_bridge::JointValues::velocity_cdeg_s
int16_t velocity_cdeg_s[2]
Definition: JointValues.h:33
g_nh
ros::NodeHandle_< HandBridgeHardware > g_nh
Definition: bridge.cpp:35
cob_hand_bridge::SetPWM
Definition: SetPWM.h:158
UpdatePins.h
GPIO::pwmPin
bool pwmPin(uint32_t pin, float level)
Definition: gpio.h:57
handleInitPins
void handleInitPins(const InitPins::Request &req, InitPins::Response &res)
Definition: bridge.cpp:97
g_pub
ros::Publisher g_pub("status", &g_status_msg)
step
void step()
Definition: bridge.cpp:146


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Fri Aug 2 2024 09:40:56