
    |e                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	  ej
        e          ZdZdZdZdZd	d
ddddZe G d d                      Z G d de          ZdS )    N)	dataclass)Thread)Union)z255.255.255.255il}  z	f130 0000z	f1e1 0000zf1d1 0006 d100 0001zf1d0 0064 d100 0000 888876764800000010000000000000000000000000000000313233343536373800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000zSf1d0 0024 d100 %s 888876760800000001100000000000000000000000000000 0608000000000000zSf1d0 0024 d100 %s 888876760800000001100000000000000000000000000000 0308000000000000zSf1d0 0024 d100 %s 888876760800000001100000000000000000000000000000 0208000000000000zSf1d0 0024 d100 %s 888876760800000001100000000000000000000000000000 0108000000000000)initleftrightupdownc                       e Zd ZU dZeed<   dZeed<   dZe	ed<   dZ
 ej                    ZdZe	ed<   dZeed<   d	 Zd
efdZde	fdZdS )CameraNaddr	init_datar   	last_time	wait_data     wait_sequencec                 "    d| _         d| _        d S )Nr   r   )sequencer   selfs    7/config/custom_components/sonoff/core/ewelink/camera.pyr   zCamera.init7   s    (    returnc                     | xj         dz  c_         | j                             dd          | _        | j                                        S )N      big	byteorder)r   to_bytesr   hexr   s    r   get_sequencezCamera.get_sequence;   sD    !]33A3GG!%%'''r   datac                    K   || _         | j                                         | j                                         d {V  d S N)r   
wait_eventclearwait)r   r#   s     r   r(   zCamera.wait@   sM      o""$$$$$$$$$$$r   )__name__
__module____qualname__r   tuple__annotations__r   bytesr   intr   asyncioEventr&   r   r   r   strr"   r(    r   r   r   r   +   s         D%IuIsHJIs&M5&&&) ) )(c ( ( ( (
%s % % % % % %r   r   c                        e Zd ZU dZi Zeeef         ed<   dZ	e
ed<    fdZdedefdZdeeef         d	efd
Z fdZdedefdZd Z xZS )XCamerasz
    It's better to use `DatagramProtocol` and `create_datagram_endpoint`.
    But it don't supported in win32 with `ProactorEventLoop`.
    devicesNsockc                 N    t                                          dd           d S )N
Sonoff_CAMT)namedaemon)super__init__r   	__class__s    r   r=   zXCameras.__init__O   s&    l488888r   r#   r   c                 
   |d         }|dk    rt                               |dd         d          }|d}|| j        vr:t                              d| d	            t          |          | j        |<   d S | j        |         _        || j        |         _        t          fd
| j        	                                D             d           }|sd S |dk    rt          j
                    |_        |dk    rAt                              t                    |dd         z   }|                     ||           n|dk    r	 |j        |k    r4|dk    s|j        |dd         k    r|j                                         d S d S d S )Nr   A         r   r   06zFound new camera z: c              3   2   K   | ]}|j         k    |V  d S r%   )r   ).0pr   s     r   	<genexpr>z-XCameras.datagram_received.<locals>.<genexpr>g   s)      JJQ16T>>q>>>>JJr                  
   )r/   
from_bytesr6   _LOGGERdebugr   r   r   nextvaluestimer   r.   fromhexCMD_DATA_ACKsendtor   r   r&   set)r   r#   r   cmddeviceiddevices     `   r   datagram_receivedzXCameras.datagram_receivedR   s    1g$;;~~d2b5kU~CCH"''H t|++D(DDdDDEEE)/d););X& /3X&+37X&0JJJJ$,"5"5"7"7JJJDQQ 	F$;;#y{{F$;;==..ac:DKKf%%%%D[[ s""d{{f2d1R4j@@!%%''''' #"@@r   r[   c                     t          |t                    r5d|v r||                                z  }t                              |          }| j                            ||j                   d S )Nz%s)
isinstancer2   r"   r.   rU   r7   rW   r   )r   r#   r[   s      r   rW   zXCameras.sendto|   sd    dC   	't||f11333==&&D	v{+++++r   c                    t          j         t           j        t           j                  | _        | j                            t           j        t           j        d           | j                            t           j        t           j        d           | j                            d           t                      
                                 d S )Nr   ) r   )socketAF_INET
SOCK_DGRAMr7   
setsockopt
SOL_SOCKETSO_REUSEADDRSO_BROADCASTbindr<   startr>   s    r   ri   zXCameras.start   s    M&.&2CDD		V.0CQGGG	V.0CQGGG	wr   rZ   commandc                   K   | j                             |          }|r t          j                    |j        z
  dk    rq|                                 s|                                  |st                      x| j         |<   }n|                                 t          	                    d           t                              t                    }| j                            |t                     |                    d           d {V  t          	                    d           |                     |j        |           |                    d           d {V  t          	                    d           |                     t$          d         |           |                    d           d {V  t          	                    d	|            |                     t$          |         |           |                    d           d {V  d S )
N	   z
Send HELLOrA   zSend UID Session Open RequestB   zSend Init Commandr   rM   zSend Command )r6   getrT   r   is_aliveri   r   r   rP   rQ   r.   rU   	CMD_HELLOr7   rW   	BROADCASTr(   r   COMMANDS)r   rZ   rj   r[   r#   s        r   sendzXCameras.send   s     !!(++ 	$v'77!;;==?? 

 28((:X&MM,'''==++DIT9---++d#########MM9:::KK(&111++d#########MM-...KK(&111++d#########/g//000HW%v...kk$r   c                     	 	 | j                             d          \  }}|                     ||           n3# t          $ r&}t                              d|           Y d }~nd }~ww xY wi)NTi   zCamera read exception)exc_info)r7   recvfromr\   	ExceptionrP   error)r   r#   r   es       r   runzXCameras.run   s    	CC!Y//55
d&&tT2222 C C C5BBBBBBBBC		Cs   37 
A'A""A')r)   r*   r+   __doc__r6   dictr2   r   r-   r7   ra   r=   r.   r,   r\   r   rW   ri   rs   rz   __classcell__)r?   s   @r   r5   r5   F   s         
 "$GT#v+###D&9 9 9 9 9((e ((5 (( (( (( ((T,5, ,f , , , ,     3          >C C C C C C Cr   r5   )r0   loggingra   rT   dataclassesr   	threadingr   typingr   	getLoggerr)   rP   rq   rp   CMD_PONGrV   rr   r   r5   r3   r   r   <module>r      s&       ! ! ! ! ! !            
'
H
%
%&		$	+	"	"	"	") 4 % % % % % % % %4kC kC kC kC kCv kC kC kC kC kCr   