a
    =Ri                     @   s.   d Z ddlmZ ddlmZ G dd dZdS )u   
Класс - адаптер, для класса MCP23017
Цель адаптера: Приведение  протокола общения с внешним классом к унифицированным требованиям контроллера.
   )MCP23017    )Optionalc                   @   sl   e Zd ZdddZddddZdedddd	Zdeddd
dZdeee	 dddZ
ddddZdS )MCP23017_adapterN    )i2c_busi2c_address)returnc                 C   s"   d | _ | jd | _| jd | _d S )Nr   r   )r   DEFAULT_CONFIGr   r   )self r   9/var/aqua_controller/devices/mcp23017/mcp23017_adapter.py__init__   s    zMCP23017_adapter.__init__)optionsr	   c              
   C   s   z\d|v r|d | _ d|v r&|d | _| j d urZt| j | jd| _| j  | jtj W n2 ty } ztd| W Y d }~n
d }~0 0 d S )Nr   r   )Zi2caddressu>   Ошибка инициализации устройства: )	r   r   r   r   Zset_all_inputset_all_stateLOW	ExceptionRuntimeError)r   r   er   r   r   run   s    



zMCP23017_adapter.runc              
   C   s  zn| j d u rtdd|vr&td|d }t|tsJtdt| d|  kr^dkspn td| dd }d }d	d
h| @ stdd	h| @ r|d	  }t|t	r|dvrtd|dkrt
jn|dkrt
jnd }d
h| @ r>|d
 }t|tr|dvrtd|dkr*t
jn|dkr:t
jnd }|d urV| j || |d urn| j || W n0 ty } ztd|W Y d }~n
d }~0 0 d S )N;   Устройство не инициализировано.channel3   Параметр 'channel' не обнаружен._   Номер канала должен быть целым числом (int). Получено: r         Номер канала #T    выходит за диапазон допустимых значений (0 - 15)modestateux   Не указано, какое действие 'mode|state' необходимо совершить с каналом.)inputoutputuX   Режим канала 'mode' может быть только 'input' или 'output'.r    r!   )r   r   us   Состояние канала может быть только числом равным 0 (LOW) или 1 (HIGH).r   uA   Ошибка установки состояния канала: )r   r   KeyError
isinstanceint
ValueErrortypekeyslowerstrr   ZINPUTZOUTPUTHIGHr   Zset_mode	set_stater   )r   r   r   r   r   _mode_stater   r   r   r   set9   s<    

 $

zMCP23017_adapter.setc              
   C   s   z| j d u rtdd|vr$td|d }t|tsHtdt| d|  kr\dksnn td| d| j |}|tj	krd	n|tj
krdnd }|W S  ty } ztd
| |W Y d }~n
d }~0 0 d S )Nr   r   r   r   r   r   r   r   r   uB   Ошибка чтения состояния для канала #)r   r   r"   r#   r$   r%   r&   	get_stater   r*   r   r   )r   r   r   _resultresultr   r   r   r   getl   s    

 zMCP23017_adapter.getc              
   C   sP   z| j   | j tj W n. tyJ } ztd|W Y d }~n
d }~0 0 d S )Nu6   Ошибка остановки устройства: )r   Zset_all_outputr   r   r   r   r   )r   r   r   r   r   stop   s
    
zMCP23017_adapter.stop)N)N)N)__name__
__module____qualname__r
   r   dictr   r.   r   r$   r2   r3   r   r   r   r   r      s   	3r   N)__doc__Zmcp23017r   typingr   r   r   r   r   r   <module>   s   