def test_head_pan_tilt_limits(self):
        # This assures that the motor limits for the head throwing exceptions
        joints = Joints()
        pan = joints.get_joint_by_name("HeadPan")
        tilt = joints.get_joint_by_name("HeadTilt")
        self.had_pan_tilt_limit_expect_exception(pan.limit_min - 1, 0)
        self.had_pan_tilt_limit_expect_exception(pan.limit_max + 1, 0)
        self.had_pan_tilt_limit_expect_exception(0, tilt.limit_min - 1)
        self.had_pan_tilt_limit_expect_exception(0, tilt.limit_max + 1)

        # This assures the motor limits that are inside the bounds do not raise
        # an exception
        self.had_pan_tilt_limit_expect_no_exception(pan.limit_min, 0)
        self.had_pan_tilt_limit_expect_no_exception(pan.limit_max, 0)
        self.had_pan_tilt_limit_expect_no_exception(0, tilt.limit_min)
        self.had_pan_tilt_limit_expect_no_exception(0, tilt.limit_max)
 def __init__(self):
     self.joints = Joints().all()
class MotorInfoProvider():
    def __init__(self):
        self.joints = Joints().all()

    def report_id(self, arg):
        """ Print out all ID belonging to the given Tag
        """
        matches = []
        for joint in self.joints:
            if joint.name.lower() == arg or arg in joint.tags:
                matches.append(joint.cid)
        if not matches:
            ilog.info("No Motor found in this Group!")
            return False

        ilog.info("%s" % sorted(matches))
        return True

    def get_motor_info(self, arg=""):
        matches = []
        # No specific info request, we give info on all motors
        if not arg:
            ilog.debug("No MotorInfo specification given, returning all Infos i have...")
            matches = self.joints

        # If we got a Motor ID given, just search for it
        elif arg.isdigit():
            try:
                arg = int(arg)
            except ValueError:
                # Can this even happen when arg.isdigit()?
                ilog.error("Thought %s was a int, but i appear to be in error...")
                return False
            try:
                match = self.joints.get_joint_by_cid(arg)
            except KeyError:
                # User might have given a random number get_joint_by_cid does
                # not check on its own
                ilog.warning("The given motor %i does not appear to exist!" % arg)
                return False

            # return Text Field list for use in the UI
            return [Text(self.formatted_motor_info(match))]

        # Otherwise search for a name match, or any tag matches
        else:
            for joint in self.joints:
                if joint.name.lower() == arg:
                    ilog.debug("Found exact match for MotorInfoRequest on %s" % arg)
                    return([Text(self.formatted_motor_info(joint))])
                elif arg in joint.tags:
                    matches.append(joint)

        # No match, no Info
        if not matches:
            ilog.warning("I could find no motors you could have meant by '%s'" % arg)
            return False

        new_texts = []
        for joint in matches:
            new_texts.append(Text(self.formatted_motor_info(joint)))
            #new_text.extend(self.formatted_motor_info(joint))
        return new_texts

    def formatted_motor_info(self, joint):
        """ Returns a urwid-formatted Info of the given "joint"
        """
        text = []
        text.append(('default', "Name: "))
        text.append(('mi_motor_name', str(joint.name) + "\n"))
        text.append(('default', "ID: "))
        text.append(('mi_motor_id', str(joint.cid) + "\n"))
        text.append(('default', "Tags:\n"))
        tags = ""
        for tag in joint.tags:
            tags += "    " + str(tag) + "\n"
        text.append(('mi_motor_tag', tags))
        if not joint.opposing:
            text.append(('default', "opposing motor: None\n\n"))
        else:
            text.append(('default', "opposing motor: %i\n" % joint.opposing))
            if joint.inverted:
                text.append(('default', "Motor IS inverted against the opposing motor\n\n"))
            else:
                text.append(('default', "Motor is NOT inverted against the opposing motor\n\n"))
        return text