o
    ½Í`  ã                   @   sN   d dl mZmZ d dlmZ d dlZd dlZdZdZ	dZ
dZG dd	„ d	ƒZdS )
é    )Úto_bytesÚ
from_bytes)ÚlogNi Â é   Z0E8DZ0003c                   @   sˆ   e Zd Zddd„Zdd„ Zedd„ ƒZedd	„ ƒZd
d„ Zddd„Z	ddd„Z
ddd„Zddd„Zd dd„Zdd„ Zdd„ Zdd„ ZdS )!ÚDeviceNc                 C   s$   d | _ |rtj|ttd| _ d S d S )N©Ztimeout)ÚdevÚserialÚSerialÚBAUDÚTIMEOUT)ÚselfÚport© r   úPD:\Phones\Redmi_Note_8_Pro\Recoveries\UnbrickRN8ProNoAuth\4.Bypass\src\device.pyÚ__init__   s   ÿzDevice.__init__c                 C   sz   | j rtdƒ‚tdƒ |  ¡ }	 |  ¡ }||kr||  ¡ }q+||kr%|}t d¡ qtd |¡ƒ tj	|t
td| _ | S )NzDevice already foundzWaiting for bootromTg      Ð?zFound port = {}r   )r   ÚRuntimeErrorr   Úserial_portsÚpopÚtimeÚsleepÚformatr	   r
   r   r   )r   ÚoldÚnewr   r   r   r   Úfind   s    
õzDevice.findc               
   C   s–   t ƒ } ttjj ¡ ƒ}|D ];}t|dƒr|j}|j}n|d }|d }t	rHt
|v rHztj|td}| ¡  |  |¡ W q ttjfyG   Y qw q| S )z† Lists available serial ports
            :returns:
                A set containing the serial ports available on the system
        Úhwidé   r   r   N)ÚsetÚlistr	   ZtoolsZ
list_portsZcomportsÚhasattrr   ÚdeviceÚVIDÚPIDr
   r   ÚcloseÚaddÚOSErrorZSerialException)ÚresultZportsr   Z	port_hwidZport_deviceÚsr   r   r   r   -   s$   
ÿ€zDevice.serial_portsc                 C   s`   | |kr.t | ƒtkrd|  ¡  } nt| ƒ} t |ƒtkr"d| ¡  }nt|ƒ}td || ¡ƒ‚d S )NZ0xz%Unexpected output, expected {} got {})ÚtypeÚbytesÚhexr   r   )ÚtestZgoldr   r   r   ÚcheckG   s   õzDevice.checkc                 C   s„   |   d¡ |  |  d¡tdƒ¡ |   d¡ |  |  d¡tdƒ¡ |   d¡ |  |  d¡tdƒ¡ |   d¡ |  |  d¡td	ƒ¡ d S )
Né    é   é_   é
   éõ   éP   é¯   r   éú   )Úwriter,   Úreadr   )r   r   r   r   Ú	handshakeV   s   



zDevice.handshaker.   c                 C   s(   |   ||¡ |  t|  |¡|ƒ|¡ d S ©N)r5   r,   r   r6   )r   ÚwordsÚsizer   r   r   Úechoc   s   zDevice.echoc                 C   s   | j  |¡S r8   )r   r6   )r   r:   r   r   r   r6   g   s   zDevice.readc                 C   sœ   g }|   d¡ |   |d¡ |   |d¡ |  | j d¡tddƒ¡ t|ƒD ]}t| j d¡dƒ}| |¡ q$|  | j d¡tddƒ¡ t|ƒdkrL|d S |S )NéÑ   é   r   r   r.   )	r;   r,   r   r6   r   Úranger   ÚappendÚlen)r   Úaddrr:   r&   Ú_Údatar   r   r   Úread32j   s   
zDevice.read32c                 C   s&   t |ƒtkrt||ƒ}| j |¡ d S r8   )r(   r)   r   r   r5   )r   rC   r:   r   r   r   r5      s   
zDevice.writeTc                 C   sŒ   t |tƒs|g}|  d¡ |  |d¡ |  t|ƒd¡ |  | j d¡tddƒ¡ |D ]}|  |d¡ q*|rD|  | j d¡tddƒ¡ d S d S )NéÔ   r=   r   r.   )Ú
isinstancer   r;   r@   r,   r   r6   r   )r   rA   r9   Zcheck_statusZwordr   r   r   Úwrite32…   s   

ÿzDevice.write32c                 C   sv   |   d¡ | j d¡}| j d¡}t|dƒdkrtd |¡ƒ‚t|dƒ}|d@ }|d@ }|d@ }t|ƒt|ƒt|ƒfS )NéØ   r=   r   r   ústatus is {}r.   )r;   r   r6   r   r   r   Úbool)r   Ztarget_configÚstatusÚsecure_bootÚserial_link_authorizationÚdownload_agent_authorizationr   r   r   Úget_target_config–   s   

zDevice.get_target_configc                 C   sH   |   d¡ | j d¡}| j d¡}t|dƒdkrtd |¡ƒ‚t|dƒS )Néý   r   r   rI   ©r;   r   r6   r   r   r   )r   Úhw_coderK   r   r   r   Úget_hw_code¨   s   

zDevice.get_hw_codec                 C   sr   |   d¡ | j d¡}| j d¡}| j d¡}| j d¡}t|dƒdkr+td |¡ƒ‚t|dƒt|dƒt|dƒfS )Néü   r   r   rI   rQ   )r   Úhw_sub_codeÚhw_verÚsw_verrK   r   r   r   Úget_hw_dict³   s   
zDevice.get_hw_dictr8   )r.   )T)Ú__name__Ú
__module__Ú__qualname__r   r   Ústaticmethodr   r,   r7   r;   r6   rD   r5   rG   rO   rS   rX   r   r   r   r   r      s     







r   )Z
src.commonr   r   Ú
src.loggerr   Zserial.tools.list_portsr	   r   r   r   r!   r"   r   r   r   r   r   Ú<module>   s    