a
    jt%                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ e Zej	
eZdeeeddddZddddZedd	d
ZG dd dZdS )    N)logger)devicerule_id	operationreturnc                 C   s   | t _|t _|t _d S N_i2c_call_contextr   r   r   )r   r   r    r
   ./var/aqua_controller/core/resilient_i2c_bus.pyset_i2c_call_context   s    r   )r   c                   C   s   d t _d t _d t _d S r   r   r
   r
   r
   r   _clear_i2c_call_context   s    r   c                  C   sB   t  D ]4} tj| jtkr qtj| j d| j   S dS )N:zunknown:unknown)inspectstackospathbasenamefilename
_this_filefunction)framer
   r
   r   _get_caller_info%   s
    r   c                       s   e Zd Zi Ze Zedd fddZdd Z	eedddd	Z
eed
ddZeeeddddZeeedddZeeee ddddZeeeee dddZd eeedddZdd Zdd Z  ZS )!ResilientI2CBusN)bus_idr   c                    sr   | j X || jvrFt | }||_d |_t |_|	  || j|< | j| W  d    S 1 sd0    Y  d S r   )
_global_lock
_instancessuper__new___bus_id_raw_bus	threadingRLock_lock_open)clsr   instance	__class__r
   r   r   3   s    


zResilientI2CBus.__new__c                 C   s   | j  | jd ur.z| j  W n   Y n0 z0t| j| _td| j d t	d W n> t
y } z&td| j d|   W Y d }~n
d }~0 0 W d    n1 s0    Y  d S )NzResilientI2CBus #u#   : дескриптор открытg?u>   ResilientI2CBus: не удалось открыть шину #z: )r#   r    closesmbusSMBusr   r   debugtimesleep	Exceptionerrorselfer
   r
   r   r$   B   s    
zResilientI2CBus._open)addrvalr   c                    s    fdd}| j |d dS )Nc                    s   |   S r   )
write_byteZbusr4   r5   r
   r   _callS       z)ResilientI2CBus.write_byte.<locals>._callr6   r4   
_safe_call)r2   r4   r5   r9   r
   r8   r   r6   R   s    zResilientI2CBus.write_byte)r4   r   c                    s    fdd}| j |d dS )Nc                    s
   |   S r   )	read_byter7   r;   r
   r   r9   Z   r:   z(ResilientI2CBus.read_byte.<locals>._callr>   r;   r<   )r2   r4   r9   r
   r;   r   r>   Y   s    zResilientI2CBus.read_byte)r4   cmdr5   r   c                    s"    fdd}| j |d dS )Nc                    s   |   S r   )write_byte_datar7   r4   r?   r5   r
   r   r9   b   r:   z.ResilientI2CBus.write_byte_data.<locals>._callr@   r4   r?   r<   )r2   r4   r?   r5   r9   r
   rA   r   r@   a   s    zResilientI2CBus.write_byte_data)r4   r?   r   c                    s     fdd}| j |d dS )Nc                    s   |   S r   )read_byte_datar7   rB   r
   r   r9   j   r:   z-ResilientI2CBus.read_byte_data.<locals>._callrC   rB   r<   )r2   r4   r?   r9   r
   rB   r   rC   i   s    zResilientI2CBus.read_byte_data)r4   r?   datar   c                    s"    fdd}| j |d dS )Nc                    s   |   S r   )write_i2c_block_datar7   r4   r?   rD   r
   r   r9   r   r:   z3ResilientI2CBus.write_i2c_block_data.<locals>._callrE   rB   r<   )r2   r4   r?   rD   r9   r
   rF   r   rE   q   s    z$ResilientI2CBus.write_i2c_block_data)r4   r?   lengthr   c                    s"    fdd}| j |d dS )Nc                    s   |   S r   )read_i2c_block_datar7   r4   r?   rG   r
   r   r9   {   r:   z2ResilientI2CBus.read_i2c_block_data.<locals>._callrH   rB   r<   )r2   r4   r?   rG   r9   r
   rI   r   rH   z   s    z#ResilientI2CBus.read_i2c_block_data)	func_namer4   r?   c                 C   s  t  }|d urd|dnd}|d ur2d|dnd}d}ttdrVtjrVdtj }ttdrvtjrv|dtj 7 }d}	ttd	rtjrd
tj }	d| |	 | | | d}
tdD ]}z:| j  || jW  d    W   S 1 s0    Y  W q t	yf } zTt
d| j d|
 d| d|d  d| 
 |   td|d   W Y d }~qd }~0 0 qt
d| j d|
 d |   z8| j || jW  d    W S 1 s0    Y  W nF t	y
 } z,t
d| j d|
 d|   W Y d }~n
d }~0 0 d S )Nz @0xZ02X z cmd=0xr   z rule=r   z op=r   z dev=[]   	i2c_bus # u    Ошибка [u   ]. Попытка    u	    из 3: g333333?uF   : Исчерпаны все попытки. Запуск safe reset...u=   : Ошибка сохраняется после safe reset: )r   hasattrr	   r   r   r   ranger#   r    r/   r   warningr   _soft_recoverr-   r.   critical
safe_reset)r2   funcrJ   r4   r?   Zcalleraddr_strZcmd_strZrule_ctxZ
device_ctxZctx_tagattemptr3   r
   r
   r   r=      sD    2*0zResilientI2CBus._safe_callc                 C   sj   zXt | j}tdD ],}z|dd W n   Y n0 td q|  td W n   Y n0 d S )N	   r   gMbP?g{Gz?)r*   r+   r   rS   r6   r-   r.   r)   )r2   tmp_r
   r
   r   rU      s    zResilientI2CBus._soft_recoverc              
   C   sn   z*t d| j d |   td W n> tyh } z&t d| j d|   W Y d }~n
d }~0 0 d S )NrO   z: Safe reset (close/open)...g?u    : Safe reset не удался: )r   rT   r   r$   r-   r.   r/   rV   r1   r
   r
   r   rW      s    zResilientI2CBus.safe_reset)NN)__name__
__module____qualname__r   r!   Lockr   intr   r$   r6   r>   r@   rC   listrE   rH   strr=   rU   rW   __classcell__r
   r
   r'   r   r   -   s   	
+r   )NNN)r*   r-   r!   r   r   core.loggerr   localr	   r   r   __file__r   rd   r   r   r   r   r
   r
   r
   r   <module>   s   