a
    i!                     @   s.   d Z ddlmZ ddlmZ G dd dZdS )u  
Класс - адаптер, для класса cls_PCA9685 
Цель адаптера: Приведение  протокола общения с внешним классом к унифицированным требованиям контроллера.
   )PCA9685    )Optionalc                   @   sv   e Zd ZddddZddddZdee ddd	d
Zdee ddddZdee e	dddZ
ddddZdS )PCA9685_adapterN@   P   i2c_busi2c_address	frequency)returnc                 C   s   d | _ | j | _d S )N)PCA9685_instanceDEFAULT_CONFIGcopyPCA9685_config)self r   7/var/aqua_controller/devices/pca9685/pca9685_adapter.py__init__   s    zPCA9685_adapter.__init__)optionsr   c              
   C   s   z|d u rt dt|ts$tddD ]}||v r(|| | j|< q(| jd}|d u r`td| jd| jd }| jd| jd }t|||d| _	| j	d ur| j	
  W n4 ty } ztd	| |W Y d }~n
d }~0 0 d S )
N.   Словарь options отсутствует./   options должен быть словарем.r   r	   u-   Не передан параметр i2c_bus.r
   r   )i2caddressr   u>   Ошибка инициализации устройства: )KeyError
isinstancedict	TypeErrorr   get
ValueErrorr   r   r   run	ExceptionRuntimeError)r   r   key_i2c_bus_i2c_addressZ
_frequencyer   r   r   r       s$    

zPCA9685_adapter.runc           	   
   C   s   z| j d u rtd|d u r&tdt|ts8tdd|vrHtdd|vrXtd|d}t|trt|g}n(t|tt	fr|}nt
dt| d	|D ]4}t|trd
|  krdksn t
d| dq|d}t|ttfr
d
|  krdksn t
d| d	|d}|d}|d urJ|d u rJtd|d urf|d u rftd|d urt|ttfr|d
krt
d| t|tr|d
krt
d| | j j||||d n| j j||d W n6 ty } ztd| |W Y d }~n
d }~0 0 d S )N;   Устройство не инициализировано.r   r   channelI   Обязательный параметр channel отсутствует.stateuG   Обязательный параметр state отсутствует.uo   Номер канала должен быть целым числом или списком. Получено: .r      u2   Некорректный номер канала: u.   . Допустимый диапазон: 0-15.d   uj   Величина ШИМ должна быть числом в диапазоне 0-100. Получено: durationstepsu@   Параметр duration требует указания steps.u@   Параметр steps требует указания duration.uZ   duration должен быть положительным числом. Получено: ub   steps должен быть положительным целым числом. Получено: )channelstarget_percentr.   r/   )r0   r1   u.   Ошибка установки данных: )r   r"   r   r   r   r   r   intlisttupler   typefloatZset_pwm_percent_smoothZset_pwm_percentr!   )	r   r   Z_pre_channel_channel_item_stateZ	_durationZ_stepsr&   r   r   r   set?   sL    



 
*


zPCA9685_adapter.setc           	   
   C   s(  z| j d u rtd|d u r&tdt|ts8tdd|vrHtd|d}|d urf|  nd}|dkr&d|vrtd|d}t|t	st
d	| d
t| dd|  krdksn t
d	| d| j |}||vrtd| || }|d u rtd| t|dW S |dkrzV| jd}| jd| jd }|d u rdtd|d u rvtd|| W W dS  ttfy   Y W dS  ty } ztd| |W Y d }~n
d }~0 0 nt
d| dW n6 ty" } ztd| |W Y d }~n
d }~0 0 d S )Nr'   r   r   modeuF   Обязательный параметр mode отсутствует.Noner(   r)   u   Номер канала #uB    должен быть целым числом. Получено: r+   r   r,   uU    выходит за диапазон допустимых значений (0 - 15).uJ   Не удалось получить значение для канала    devicer	   r
   uf   Невозможно проверить устройство: шина i2c_bus отсутствует.ul   Невозможно проверить устройство: адрес i2c_address отсутствует.r   u;   Ошибка при проверке устройства: u,   Значение параметра mode = 'u$   ' не поддерживается.u(   Ошибка чтения данных: )r   r"   r   r   r   r   r   striplowerr2   r   r5   Zget_pwm_percentroundr   r   	read_byteIOErrorOSErrorr!   )	r   r   _moder7   Z_get_state_dict
_get_stater$   r%   r&   r   r   r   r   z   sV    










(zPCA9685_adapter.getc              
   C   sh   | j rXz| j dd | j   W n4 tyV } ztd| |W Y d }~n
d }~0 0 d | _ d | _d S )Nr   u6   Ошибка остановки устройства: )r   Zset_all_pwmresetr!   r"   r   )r   r&   r   r   r   stop   s    &zPCA9685_adapter.stop)N)N)N)__name__
__module____qualname__r   r   r   r   r    r:   r6   r   rH   r   r   r   r   r      s   
 ;>r   N)__doc__Zpca9685r   typingr   r   r   r   r   r   <module>   s   