From 57ddbb3178dcb3266e035dd4771a0e1860b9e252 Mon Sep 17 00:00:00 2001
From: Andrew Glusiec <airplanesrule@gmail.com>
Date: Wed, 9 Jul 2014 10:34:34 -0400
Subject: [PATCH] testing

---
 ur_driver/src/ur_driver/driver.py | 151 +++++++++++++++++++++++++++++-
 1 file changed, 150 insertions(+), 1 deletion(-)

diff --git a/ur_driver/src/ur_driver/driver.py b/ur_driver/src/ur_driver/driver.py
index 1a63b55..d73ec98 100755
--- a/ur_driver/src/ur_driver/driver.py
+++ b/ur_driver/src/ur_driver/driver.py
@@ -19,6 +19,9 @@ from geometry_msgs.msg import WrenchStamped
 
 from ur_driver.deserialize import RobotState, RobotMode
 
+from ur_driver.srv import SetIO
+from ur_driver.msg import *
+
 prevent_programming = False
 
 # Joint offsets, pulled from calibration information stored in the URDF
@@ -39,11 +42,23 @@ MSG_WAYPOINT_FINISHED = 5
 MSG_STOPJ = 6
 MSG_SERVOJ = 7
 MSG_WRENCH = 9
+MSG_SET_DIGITAL_OUT = 10
+MSG_GET_IO = 11
+MSG_SET_FLAG = 12
+MSG_SET_TOOL_VOLTAGE = 13
+MSG_SET_ANALOG_OUT = 14
 MULT_wrench = 10000.0
 MULT_jointstate = 10000.0
 MULT_time = 1000000.0
 MULT_blend = 1000.0
 
+FUN_SET_DIGITAL_OUT = 1
+FUN_SET_FLAG = 2
+FUN_SET_ANALOG_OUT = 3
+FUN_SET_TOOL_VOLTAGE = 4
+
+IO_SLEEP_TIME = 0.05
+
 JOINT_NAMES = ['shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint',
                'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint']
 
@@ -57,6 +72,7 @@ connected_robot_lock = threading.Lock()
 connected_robot_cond = threading.Condition(connected_robot_lock)
 pub_joint_states = rospy.Publisher('joint_states', JointState)
 pub_wrench = rospy.Publisher('wrench', WrenchStamped)
+pub_io_states = rospy.Publisher('io_states', IOStates)
 #dump_state = open('dump_state', 'wb')
 
 class EOF(Exception): pass
@@ -321,6 +337,75 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler):
                     wrench_msg.wrench.torque.z = state[5]
                     pub_wrench.publish(wrench_msg)
 
+#gets all IO States and publishes them into a message
+                elif mtype == MSG_GET_IO:
+
+                    #gets digital in states
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    buf = buf[4:]
+                    msg = IOStates()
+                    for i in range(0, 10):
+                        msg.digital_in_states.append(DigitalIn(i, (inp & (1<<i))>>i))
+                    #gets digital out states
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    buf = buf[4:]
+                    for i in range(0, 10):
+                        msg.digital_out_states.append(DigitalOut(i, (inp & (1<<i))>>i))
+                    #gets flag states
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    buf = buf[4:]
+                    for i in range(0, 32):
+                        msg.flag_states.append(Flag(i, (inp & (1<<i))>>i))
+                    #gets analog_out[0] state
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    inp /= 1000000.0
+                    buf = buf[4:]
+                    msg.analog_out_states.append(Analog(0, inp))
+                    #gets analog_out[1] state
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    inp /= 1000000.0
+                    buf = buf[4:]
+                    msg.analog_out_states.append(Analog(1, inp))
+                    #gets analog_in[0] state
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    inp /= 1000000.0
+                    buf = buf[4:]
+                    msg.analog_in_states.append(Analog(0, inp))
+                    #gets analog_in[1] state
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    inp /= 1000000.0
+                    buf = buf[4:]
+                    msg.analog_in_states.append(Analog(1, inp))
+                    #gets analog_in[2] state
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    inp /= 1000000.0
+                    buf = buf[4:]
+                    msg.analog_in_states.append(Analog(2, inp))
+                    #gets analog_in[3] state
+                    while len(buf) < 4:
+                        buf = buf + self.recv_more()
+                    inp = struct.unpack_from("!i", buf, 0)[0]
+                    inp /= 1000000.0
+                    buf = buf[4:]
+                    msg.analog_in_states.append(Analog(3, inp))
+                    pub_io_states.publish(msg)
+
                 elif mtype == MSG_QUIT:
                     print "Quitting"
                     raise EOF("Received quit")
@@ -354,7 +439,48 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler):
         buf = struct.pack("!%ii" % len(params), *params)
         with self.socket_lock:
             self.request.send(buf)
-        
+
+   #Experimental set_digital_output implementation
+    def set_digital_out(self, pinnum, value):
+        params = [MSG_SET_DIGITAL_OUT] + \
+                 [pinnum] + \
+                 [value]
+        buf = struct.pack("!%ii" % len(params), *params)
+	    #print params
+        with self.socket_lock:
+            self.request.send(buf) 
+        time.sleep(IO_SLEEP_TIME)
+
+    def set_analog_out(self, pinnum, value):
+        params = [MSG_SET_ANALOG_OUT] + \
+                 [pinnum] + \
+                 [value * 1000000]
+        buf = struct.pack("!%ii" % len(params), *params)
+	    #print params
+        with self.socket_lock:
+            self.request.send(buf) 
+        time.sleep(IO_SLEEP_TIME)
+
+    def set_tool_voltage(self, value):
+        params = [MSG_SET_TOOL_VOLTAGE] + \
+                 [value] + \
+                 [0]
+        buf = struct.pack("!%ii" % len(params), *params)
+	    #print params
+        with self.socket_lock:
+            self.request.send(buf) 
+        time.sleep(IO_SLEEP_TIME+.5)
+
+    def set_flag(self, pin, val):
+        params = [MSG_SET_FLAG] + \
+                 [pin] + \
+                 [val]
+        buf = struct.pack("!%ii" % len(params), *params)
+	    #print params
+        with self.socket_lock:
+            self.request.send(buf) 
+        #set_flag will fail if called too closely together--added delay
+        time.sleep(IO_SLEEP_TIME)
 
     def send_stopj(self):
         with self.socket_lock:
@@ -673,6 +799,27 @@ def get_my_ip(robot_ip, port):
     s.close()
     return tmp
 
+def handle_set_io(req):
+    r = getConnectedRobot(wait=False)
+    if r:
+        if req.fun == FUN_SET_DIGITAL_OUT:
+            r.set_digital_out(req.pin, req.state)
+            return True
+        elif req.fun == FUN_SET_FLAG:
+            r.set_flag(req.pin, req.state)
+            return True
+        elif req.fun == FUN_SET_ANALOG_OUT:
+            r.set_analog_out(req.pin, req.state)
+            return True
+        elif req.fun == FUN_SET_TOOL_VOLTAGE:
+            r.set_tool_voltage(req.pin)
+            return True
+    else:
+        raise ROSServiceException("Robot not connected")
+
+def set_io_server():
+    s= rospy.Service('set_io', SetIO, handle_set_io)
+
 def main():
     rospy.init_node('ur_driver', disable_signals=True)
     if rospy.get_param("use_sim_time", False):
@@ -721,6 +868,8 @@ def main():
     connection.connect()
     connection.send_reset_program()
     
+    set_io_server()
+
     action_server = None
     try:
         while not rospy.is_shutdown():
-- 
GitLab