示例#1
0
class AbletonJS(ControlSurface):
    def __init__(self, c_instance):
        super(AbletonJS, self).__init__(c_instance)

        Socket.set_log(self.log_message)
        Socket.set_message(self.show_message)
        self.socket = Socket(self.command_handler)

        self.handlers = {
            "internal": Internal(c_instance, self.socket),
            "cue-point": CuePoint(c_instance, self.socket),
            "device": Device(c_instance, self.socket),
            "device-parameter": DeviceParameter(c_instance, self.socket),
            "scene": Scene(c_instance, self.socket),
            "song": Song(c_instance, self.socket),
            "song-view": SongView(c_instance, self.socket),
            "track": Track(c_instance, self.socket),
            "clip_slot": ClipSlot(c_instance, self.socket),
            "clip": Clip(c_instance, self.socket)
        }

        self.parse()

        self.socket.send("connect")

    def disconnect(self):
        self.log_message("Disconnecting")
        self.socket.send("disconnect")
        self.socket.shutdown()
        super(AbletonJS, self).disconnect()

    def parse(self):
        self.socket.process()
        self.schedule_message(1, self.parse)

    def command_handler(self, payload):
        self.log_message("Received command: " + str(payload))
        namespace = payload["ns"]

        if self.handlers.has_key(namespace):
            handler = self.handlers[namespace]
            handler.handle(payload)
        else:
            self.socket.send("error", "No handler for NS " + str(namespace))
示例#2
0
class DepthInfo(QObject):
    """
    *DepthInfo* class for firing system driver
    """
    def __init__(self, port="/dev/ttyUSB0", baudrate=38400):
        """

        :param port:
        :param baudrate: Baud rate, 115200 by default (can be 9600-115200)
        """
        self.port = port
        self.baudrate = baudrate

        self.conn = None
        self.initialized = False
        self.configured = False

        # Create TransformStamped message
        self.transf = geometry_msgs.msg.TransformStamped()
        self.transf.header.frame_id = 'world'
        self.transf.child_frame_id = 'sonar'
        # Initialize values to publish
        self.transf.transform.translation.x = 0
        self.transf.transform.translation.y = 0
        self.transf.transform.translation.z = 0
        self.transf.transform.rotation.x = 0.0
        self.transf.transform.rotation.y = 0.0
        self.transf.transform.rotation.z = 0.0
        self.transf.transform.rotation.w = 1.0
        self.tfbroad = tf2_ros.TransformBroadcaster()

    def __enter__(self):
        """
        Initializes for first use
        """
        self.open()
        srv = Server(WinchConfig, self.config_callback)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        Cleans up
        :param exc_type:
        :param exc_val:
        :param exc_tb:
        :return:
        """
        self.close()
        rospy.loginfo("Closed depth reader on %s", self.port)

    def open(self):
        """
        Initializes connection
        :return:
        """
        # Initialize the port
        if not self.conn:
            try:
                self.conn = Socket(port=self.port, baudrate=self.baudrate)
                self.conn.conn.open()
            except OSError as e:
                raise SonarNotFound(self.port, e)

        rospy.loginfo("Initializing connection with depth board on %s",
                      self.port)
        self.initialized = True
        #self.read()

    def close(self):
        self.conn.close()

    def config_callback(self, config, level):
        rospy.loginfo(
            """Reconfigure request: {winch_port_baudrate}, {winch_port}""".
            format(**config))
        self.set_params(**config)
        return config

    def set_params(self,
                   winch_port_baudrate=None,
                   winch_port=None,
                   groups=None):
        self.port = winch_port
        self.baudrate = winch_port_baudrate
        self.close()
        self.conn = None
        self.open()
        #self.read()
        return self

    def send(self, message=None):
        self.conn.send(message)
        rospy.logdebug('%s sent', message)

    def read(self):
        """
        Receives information form port
        :return:
        """
        # send here something to verify sonar is connected?
        if not self.initialized:
            raise SonarNotConfigured(self.initialized)
        # Timeout count
        timeout_count = 0
        MAX_TIMEOUT_COUNT = 5

        # Scan until stopped
        self.preempted = False
        while not self.preempted:
            # Preempt on ROS shutdown
            if rospy.is_shutdown():
                self.preempt()
                return

            # Get the scan data
            try:
                data = self.get(wait=1)
                self.transf.header.stamp = rospy.Time.now()
                self.transf.transform.translation.z = data
                self.tfbroad.sendTransform(self.transf)
                timeout_count = 0
            except TimeoutError:
                timeout_count += 1
                rospy.logdebug("Timeout count: %d", timeout_count)
                if timeout_count >= MAX_TIMEOUT_COUNT:
                    timeout_count = 0
                rospy.sleep(0.5)
                # Try again
                continue

    def get(self, wait=2):
        """
        Sends command and returns reply
        :param message: Message to expect
        :param wait: Seconds to wait until received
        :return:
        """
        # Verify if sonar is initialized
        if not self.initialized:
            raise SonarNotConfigured

        #rospy.logdebug("Waiting for depth message")

        # Determine end time
        end = datetime.datetime.now() + datetime.timedelta(seconds=wait)

        # Wait until received
        while datetime.datetime.now() < end:
            try:
                reply = self.conn.conn.read(4)

                inhex = int(reply.encode('hex'), 16)

                return inhex
            except:
                break

        # Timeout
        rospy.logerr("Timed out before receiving depth message")
        raise TimeoutError()

    def preempt(self):
        """
        Preempts the process
        :return:
        """
        rospy.logwarn("Preempting depth reader process...")
        self.preempted = True
示例#3
0
class Firing_Sys(object):
    """
    *Firing_Sys* class for firing system driver
    """
    def __init__(self, port="/dev/ttyUSB0", baudrate=115200):
        """

        :param port:
        :param baudrate: Baud rate, 115200 by default (can be 9600-115200)
        """
        self.port = port
        self.baudrate = baudrate

        self.conn = None
        self.initialized = False
        self.configured = False

        self.range = 0
        self.max_range = 0
        self.min_range = 0

    def __enter__(self):
        """
        Initializes for first use
        """
        self.open()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        Cleans up
        :param exc_type:
        :param exc_val:
        :param exc_tb:
        :return:
        """
        self.close()
        rospy.loginfo("Closed firing mechanism on %s", self.port)

    def open(self):
        """
        Initializes sonar connection
        :return:
        """
        # Initialize the port
        if not self.conn:
            try:
                self.conn = Socket(self.port, self.baudrate)
            except OSError as e:
                raise SonarNotFound(self.port, e)

        rospy.loginfo("Initializing connection with firing mechanism on %s",
                      self.port)
        self.initialized = True
        self.read()

    def close(self):
        self.conn.close()

    def send(self, message=None):
        self.conn.send(message)
        rospy.logdebug('%s sent', message)

    def read(self):
        """
        Receives information form port
        :return:
        """
        # send here something to verify sonar is connected?
        if not self.initialized:
            raise SonarNotConfigured(self.initialized)
        # Timeout count
        timeout_count = 0
        MAX_TIMEOUT_COUNT = 5

        # Scan until stopped
        self.preempted = False
        while not self.preempted:
            # Preempt on ROS shutdown
            if rospy.is_shutdown():
                self.preempt()
                return

            # Get the scan data
            try:
                data = self.get('AFS', wait=1).payload
                self.range = float(data)
                timeout_count = 0
            except TimeoutError:
                timeout_count += 1
                rospy.logdebug("Timeout count: %d", timeout_count)
                if timeout_count >= MAX_TIMEOUT_COUNT:
                    timeout_count = 0
                # Try again
                continue

    def get(self, message=None, wait=2):
        """
        Sends command and returns reply
        :param message: Message to expect
        :param wait: Seconds to wait until received
        :return:
        """
        # Verify if sonar is initialized
        if not self.initialized:
            raise SonarNotConfigured

        rospy.logdebug("Waiting for limit switches state message")

        # Determine end time
        end = datetime.datetime.now() + datetime.timedelta(seconds=wait)

        # Wait until received
        while datetime.datetime.now() < end:
            try:
                reply = self.conn.get_reply(expected_reply=message,
                                            enabled=True)
                return reply
            except:
                break

        # Timeout
        rospy.logerr("Timed out before receiving limit switches message")
        raise TimeoutError()

    def preempt(self):
        """
        Preempts the process
        :return:
        """
        rospy.logwarn("Preempting fixing process...")
        self.preempted = True