class MouseHandler: def __init__(self, min_angle=50, max_angle=180): self.root = Display().screen().root screen_width = self.root.get_geometry().width screen_height = self.root.get_geometry().height self.stiffness_mapper = interp1d([0, screen_height], [50, -30]) self.angle_mapper = interp1d([0, screen_width], [min_angle, max_angle]) self.last_command = None self.last_update_time = None def get_cmd_from_mouse_position(self): qp = self.root.query_pointer() angle = self.angle_mapper(qp.root_x) stiffness = self.stiffness_mapper(qp.root_y) if [angle, stiffness] != self.last_command: position_changed = True self.last_command = [angle, stiffness] self.last_update_time = time() else: position_changed = False return angle, stiffness, position_changed def continuous_control(self, controller, timeout=float('inf')): self.last_update_time = time() while time() - self.last_update_time < timeout: sleep(0.001) angle, stiffness, position_changed = self.get_cmd_from_mouse_position() if not position_changed: continue try: controller.send(angle, stiffness) print(f'angle: {angle:3.0f} stiffness: {stiffness:3.0f}') except OutOfRangeError: print('servo out of range')
def primitiveScreenDepth(rcvr, context, vm): from Xlib.display import Display root = Display().screen().root return integer.create(root.get_geometry().depth, vm.memory)