
    zh
                    ~    d Z ddlmZ ddlmZ ddlmZ ddlmZ e G d d                      Z	 G d d	          Z
d
S )zServo motor control utilities.    )annotations)	dataclass)Optional)LOGGERc                  Z    e Zd ZU dZded<   ded<   ded<   ded<   dZded<   ddZddZdS )Servoa1  Representation of a single PWM controlled servo.

    Parameters
    ----------
    channel: int
        PWM channel on PCA9685 controller.
    min_angle: int
        Minimum pulse width allowed.
    max_angle: int
        Maximum pulse width allowed.
    idle: int
        Idle position pulse width.
    intchannel	min_angle	max_angleidler   positionreturnNonec                v    | j         | _        t          j        d| j        | j        | j        | j                    d S )Nz:Servo initialised on channel %s with min=%s max=%s idle=%s)r   r   r   debugr
   r   r   selfs    /opt/SkullPi/motors.py__post_init__zServo.__post_init__!   s@    	HLNNI	
 	
 	
 	
 	
    pulsec                    t          | j        t          | j        |                    }|| _        t          j        d| j        |           |S )a
  Set servo to a given pulse width respecting soft limits.

        Parameters
        ----------
        pulse: int
            Desired pulse width.

        Returns
        -------
        int
            Actual pulse width sent to the servo after clamping.
        zServo %s set to %s)maxr   minr   r   r   r   r
   )r   r   clampeds      r   set_positionzServo.set_position+   sD     dnc$.%&@&@AA)4<AAAr   Nr   r   )r   r	   r   r	   )__name__
__module____qualname____doc____annotations__r   r   r    r   r   r   r      s           LLLNNNNNNIIIH
 
 
 
     r   r   c                  *    e Zd ZdZddZdd	ZddZdS )MotorControllerzHigh level motor controller for multiple servos.

    This is a minimal stub compatible with the PCA9685 board. Hardware
    communication is intentionally left out so that the module can be
    executed on systems without the hardware attached.
    r   r   c                <    i | _         t          j        d           d S )Nz(Motor controller initialised (stub mode))servosr   infor   s    r   __init__zMotorController.__init__F   s     (*>?????r   namestrservor   c                F    || j         |<   t          j        d||           dS )z-Register a servo under a human readable name.zRegistered servo %s -> %sN)r(   r   r   )r   r+   r-   s      r   register_servozMotorController.register_servoJ   s)    !D0$>>>>>r   r   r	   Optional[int]c                    | j                             |          }|st          j        d|           dS |                    |          S )a&  Move a registered servo.

        Parameters
        ----------
        name: str
            Servo identifier.
        pulse: int
            Desired pulse width.

        Returns
        -------
        Optional[int]
            The clamped pulse width if servo exists else ``None``.
        zUnknown servo %sN)r(   getr   errorr   )r   r+   r   r-   s       r   movezMotorController.moveO   sK     %% 	L+T2224!!%(((r   Nr   )r+   r,   r-   r   r   r   )r+   r,   r   r	   r   r0   )r   r    r!   r"   r*   r/   r4   r$   r   r   r&   r&   >   s^         @ @ @ @? ? ? ?
) ) ) ) ) )r   r&   N)r"   
__future__r   dataclassesr   typingr   loggerr   r   r&   r$   r   r   <module>r9      s    $ $ " " " " " " ! ! ! ! ! !             / / / / / / / /d$) $) $) $) $) $) $) $) $) $)r   