a
    ½Í`  ã                   @   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 )N©Ztimeout)ÚdevÚserialÚSerialÚBAUDÚTIMEOUT)ÚselfÚport© r   ú-D:\UnbrickRN8ProNoAuth\4.Bypass\src\device.pyÚ__init__   s    zDevice.__init__c                 C   sz   | j rtdƒ‚tdƒ |  ¡ }|  ¡ }||kr>||  ¡ }qVn||krJ|}t d¡ qtd |¡ƒ tj	|t
td| _ | S )NzDevice already foundzWaiting for bootromg      Ð?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 ]v}t|dƒr6|j}|j}n|d }|d }t	rt
|v rz$tj|td}| ¡  |  |¡ W q ttjfyŽ   Y q0 q| S )z† Lists available serial ports
            :returns:
                A set containing the serial ports available on the system
        Úhwidé   r   r   )Ú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rDd| ¡  }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ƒ}| |¡ qH|  | j d¡tddƒ¡ t|ƒdkr˜|d S |S d 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¡ qT|r„|  | j d¡tddƒ¡ 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rVt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_dict)N)r.   )r.   )r.   )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   