a
    kÄ#dØ  ã                   @   s    d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZ d dlmZmZ d dlmZmZ d d	lmZ ed
dƒZG dd„ dƒZdS )é    N)Ú
namedtuple)ÚOptionalÚListÚTypeÚIterator)Úconf)Úlog_automotive)ÚTransportLayerCmdÚTransportLayerCmdGetSlaveIdÚConnect)ÚConnectPositiveResponseÚ#TransportLayerCmdGetSlaveIdResponse)Ú
CTORequestÚXCPOnCAN)Ú	CANSocketÚXCPScannerResultzrequest_id response_idc                   @   sB   e Zd ZdZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dS )ÚXCPOnCANScannerz$
    Scans for XCP Slave on CAN
    Nçš™™™™™¹?Fc                 C   s>   |t jd d< || _|p tddƒ| _|| _|r:t tj	¡ dS )a  
        Constructor
        :param can_socket: Can Socket with XCPonCAN as basecls for scan
        :param id_range: CAN id range to scan
        :param sniff_time: time the scan waits for a response
                           after sending a request
        ZXCPZadd_padding_for_canr   é   N)
r   ZcontribsÚ_XCPOnCANScanner__socketÚrangeÚid_rangeÚ_XCPOnCANScanner__sniff_timer   ÚsetLevelÚloggingÚDEBUG)ÚselfZ
can_socketr   Z
sniff_timeZadd_paddingÚverbose© r   ú[/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/automotive/xcp/scanner.pyÚ__init__   s    zXCPOnCANScanner.__init__c           
         s’   t  dt|ƒ ¡ |dkrdnd}t||d�t|d� | }| jj|| jddd	�\}}t|ƒdkrxt  d
t|ƒ ¡ g S t	‡ fdd„|ƒ}	t
|	ƒS )NzScan for id: r   Úextendedr   )Ú
identifierÚflags)ÚpidFT)Útimeoutr   ÚmultizNo answer for identifier: c                    s   | d   ˆ ¡S )Né   )Zhaslayer)Úreq_and_res©Úanswer_typer   r   Ú<lambda>C   ó    z'XCPOnCANScanner._scan.<locals>.<lambda>)r   ÚinfoÚstrr   r   r   Úsrr   ÚlenÚfilterÚlist)
r   r"   Úbodyr$   r*   r#   Zcto_requestZreq_and_res_listZ_unansweredZvalid_req_and_res_listr   r)   r   Ú_scan0   s,    
ÿÿÿÿÿ
ÿ
þzXCPOnCANScanner._scanc                 C   s„   g }t dd�}|  ||dt¡}|D ]>}t|d j|d�}| |¡ t dt|ƒ d t|ƒ ¡ q"t	|ƒdkr€t dt|ƒ ¡ |S )	zC
        Sends CONNECT Message on the Control Area Network
        r   )Zconnection_modeéÿ   r'   )Úresponse_idÚ
request_idú-Detected XCP slave for broadcast identifier: ú
Response: z&No XCP slave detected for identifier: )
r   r4   r   r   r"   Úappendr   r-   r.   r0   )r   r"   Ú
all_slavesr3   Úxcp_req_and_res_listr(   Úresultr   r   r   Ú_send_connectG   s0    

ÿ
ÿ
ÿÿÿÿ
ÿzXCPOnCANScanner._send_connectc           	      C   s–   g }t ƒ tƒ  }|  ||dt¡}|D ]l}|d }|jdks$|jdks$|jdkrPq$|d j}t||j	d�}| 
|¡ t dt|ƒ d	 t|ƒ ¡ q$|S )
zH
        Sends GET_SLAVE_ID message on the Control Area Network
        éò   r'   éX   éC   éP   r   )r7   r6   r8   r9   )r	   r
   r4   r   Z
position_1Z
position_2Z
position_3Zcan_identifierr   r"   r:   r   r-   r.   )	r   r"   r;   r3   r<   r(   Úresponser7   r=   r   r   r   Ú_send_get_slave_id^   s8    ÿÿÿÿÿ
ÿÿÿÿz"XCPOnCANScanner._send_get_slave_idc                 C   sB   t  dt| jƒ ¡ | jD ]"}|  |¡}t|ƒdkr|  S qg S )z]Starts the scan for XCP devices on CAN with the transport specific
        GetSlaveId Messagez(Start scan with GetSlaveId id in range: r   )r   r-   r.   r   rD   r0   )r   r"   Zidsr   r   r   Úscan_with_get_slave_id€   s    ÿ


z&XCPOnCANScanner.scan_with_get_slave_idc                 C   sH   t  dt| jƒ ¡ g }| jD ]$}|  |¡}t|ƒdkr| |¡ q|S )Nz%Start scan with CONNECT id in range: r   )r   r-   r.   r   r>   r0   Úextend)r   Úresultsr"   r=   r   r   r   Úscan_with_connectŽ   s    ÿ

z!XCPOnCANScanner.scan_with_connect)Nr   FF)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r4   r>   rD   rE   rH   r   r   r   r   r      s     ÿ
"r   )r   Úcollectionsr   Zscapy.compatr   r   r   r   Zscapy.configr   Zscapy.contrib.automotiver   Z0scapy.contrib.automotive.xcp.cto_commands_masterr	   r
   r   Z/scapy.contrib.automotive.xcp.cto_commands_slaver   r   Z scapy.contrib.automotive.xcp.xcpr   r   Zscapy.contrib.cansocket_nativer   r   r   r   r   r   r   Ú<module>   s   
