import compLib.CompLib_pb2 as CompLib_pb2 from compLib.CompLibClient import CompLibClient MOTOR_COUNT = 4 class Motor(object): """Class used to control the motors """ @staticmethod def power(port: int, percent: float): """Set specified motor to percentage power :param port: Port, which the motor is connected to. 0-3 :param percent: Percentage of max speed. between -100 and 100 :raises: IndexError """ if port < 0 or port >= MOTOR_COUNT: raise IndexError("Invalid Motor port specified!") if percent < -100 or percent > 100: raise IndexError("Invalid Motor speed specified! Speed is between -100 and 100 percent!") request = CompLib_pb2.MotorsSetPowerRequest() request.header.message_type = request.DESCRIPTOR.full_name request.port = port request.power = percent CompLibClient.send(request.SerializeToString(), request.ByteSize()) @staticmethod def multiple_power(*arguments: tuple[int, float]): """Set specified motors to percentage power :param arguments: tuples of port, percentage :raises: IndexError """ request = CompLib_pb2.MotorsSetPowerRequest() request.header.message_type = request.DESCRIPTOR.full_name for port, percent in arguments: if port < 0 or port >= MOTOR_COUNT: raise IndexError("Invalid Motor port specified!") if percent < -100 or percent > 100: raise IndexError("Invalid Motor speed specified! Speed is between -100 and 100 percent!") inner_request = CompLib_pb2.MotorSetPowerRequest() inner_request.port = port inner_request.power = percent request.requests.append(inner_request) CompLibClient.send(request.SerializeToString(), request.ByteSize()) @staticmethod def speed(port: int, speed: float): """Set specified motor to percentage power :param port: Port, which the motor is connected to. 0-3 :param speed: Speed at which a motor should turn in RPM :raises: IndexError """ if port < 0 or port >= MOTOR_COUNT: raise IndexError("Invalid Motor port specified!") request = CompLib_pb2.MotorsSetSpeedRequest() request.header.message_type = request.DESCRIPTOR.full_name request.port = port request.speed = speed CompLibClient.send(request.SerializeToString(), request.ByteSize()) @staticmethod def multiple_speed(*arguments: tuple[int, float]): """Set specified motor to percentage power :param arguments: tuples of port, speed in rpm :raises: IndexError """ request = CompLib_pb2.MotorsSetSpeedRequest() request.header.message_type = request.DESCRIPTOR.full_name for port, speed in arguments: if port < 0 or port >= MOTOR_COUNT: raise IndexError("Invalid Motor port specified!") inner_request = CompLib_pb2.MotorSetSpeedRequest() inner_request.port = port inner_request.speed = speed request.requests.append(inner_request) CompLibClient.send(request.SerializeToString(), request.ByteSize()) # @staticmethod # def all_off(): # """ # Turns of all motors # """ # Logging.get_logger().debug(f"Motor.all_off") # # for i in range(1, MOTOR_COUNT + 1): # Motor.active_break(i) # @staticmethod # def active_break(port: int): # """ # Actively break with a specific motor # # :param port: Port, which the motor is connected to. 1-4 # """ # Motor.pwm(port, 0, MotorMode.BREAK)