@@ -28,8 +28,8 @@ def __new__(cls):
2828 def __init__ (self ):
2929 self .i2c = _ArduinoAlvikI2C (A4 , A5 )
3030 self ._packeter = ucPack (200 )
31- self .left_wheel = _ArduinoAlvikWheel (self ._packeter , ord ('L' ))
32- self .right_wheel = _ArduinoAlvikWheel (self ._packeter , ord ('R' ))
31+ self .left_wheel = _ArduinoAlvikWheel (self ._packeter , ord ('L' ), alvik = self )
32+ self .right_wheel = _ArduinoAlvikWheel (self ._packeter , ord ('R' ), alvik = self )
3333 self ._servo_positions = list ((None , None ,))
3434 self .servo_A = _ArduinoAlvikServo (self ._packeter , 'A' , 0 , self ._servo_positions )
3535 self .servo_B = _ArduinoAlvikServo (self ._packeter , 'B' , 1 , self ._servo_positions )
@@ -394,17 +394,22 @@ def set_wheels_speed(self, left_speed: float, right_speed: float, unit: str = 'r
394394 self ._packeter .packetC2F (ord ('J' ), left_speed , right_speed )
395395 uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
396396
397- def set_wheels_position (self , left_angle : float , right_angle : float , unit : str = 'deg' ):
397+ def set_wheels_position (self , left_angle : float , right_angle : float , unit : str = 'deg' , blocking : bool = True ):
398398 """
399399 Sets left/right motor angle
400400 :param left_angle:
401401 :param right_angle:
402402 :param unit: the speed unit of measurement (default: 'rpm')
403+ :param blocking:
403404 :return:
404405 """
405- self ._packeter .packetC2F (ord ('A' ), convert_angle (left_angle , unit , 'deg' ),
406- convert_angle (right_angle , unit , 'deg' ))
406+ left_angle = convert_angle (left_angle , unit , 'deg' )
407+ right_angle = convert_angle (right_angle , unit , 'deg' )
408+ self ._packeter .packetC2F (ord ('A' ), left_angle , right_angle )
407409 uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
410+ self ._waiting_ack = ord ('P' )
411+ if blocking :
412+ self ._wait_for_target (idle_time = (max (left_angle , right_angle ) / MOTOR_CONTROL_DEG_S ))
408413
409414 def get_wheels_position (self , unit : str = 'deg' ) -> (float | None , float | None ):
410415 """
@@ -1465,12 +1470,14 @@ def get_position(self) -> int:
14651470
14661471class _ArduinoAlvikWheel :
14671472
1468- def __init__ (self , packeter : ucPack , label : int , wheel_diameter_mm : float = WHEEL_DIAMETER_MM ):
1473+ def __init__ (self , packeter : ucPack , label : int , wheel_diameter_mm : float = WHEEL_DIAMETER_MM ,
1474+ alvik : ArduinoAlvik = None ):
14691475 self ._packeter = packeter
14701476 self ._label = label
14711477 self ._wheel_diameter_mm = wheel_diameter_mm
14721478 self ._speed = None
14731479 self ._position = None
1480+ self ._alvik = alvik
14741481
14751482 def reset (self , initial_position : float = 0.0 , unit : str = 'deg' ):
14761483 """
@@ -1538,16 +1545,27 @@ def get_position(self, unit: str = 'deg') -> float | None:
15381545 """
15391546 return convert_angle (self ._position , 'deg' , unit )
15401547
1541- def set_position (self , position : float , unit : str = 'deg' ):
1548+ def set_position (self , position : float , unit : str = 'deg' , blocking : bool = True ):
15421549 """
15431550 Sets left/right motor speed
1544- :param position: the speed of the motor
1551+ :param position: the position of the motor
15451552 :param unit: the unit of measurement
1553+ :param blocking:
15461554 :return:
15471555 """
1548- self . _packeter . packetC2B1F ( ord ( 'W' ), self . _label & 0xFF , ord ( 'P' ),
1549- convert_angle ( position , unit , 'deg' ) )
1556+ position = convert_angle ( position , unit , 'deg' )
1557+ self . _packeter . packetC2B1F ( ord ( 'W' ), self . _label & 0xFF , ord ( 'P' ), position )
15501558 uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
1559+ self ._alvik ._waiting_ack = ord ('P' )
1560+ if blocking :
1561+ self ._alvik ._wait_for_target (idle_time = (position / MOTOR_CONTROL_DEG_S ))
1562+
1563+ def is_target_reached (self ):
1564+ """
1565+ Checks if the target position is reached
1566+ :return:
1567+ """
1568+ return self ._alvik .is_target_reached ()
15511569
15521570
15531571class _ArduinoAlvikRgbLed :
0 commit comments