
    di:                         d dl Z d dlZd dlZd dlmZ d dlZd dlmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZ  G d de          ZdS )	    N)Optional)h2bb2hi2hHexstr)NoCardErrorProtocolError)LinkBaseTpdu)ResTuplec                        e Zd ZdZdZ ej        dd          ddfded	ef fd
Z	d Z
ddee         defdZd ZdefdZd Zd Zd Zd Zd Zd Zd ZdedefdZdefdZedej        fd            Z xZS ) SerialSimLinkzM pySim: Transport Link for serial (RS232) based readers included with simcardSerial/dev/ttyUSB0%  )devicebaudratez-rtsFrstdebugc           
      l    t                      j        di | t          j                            |j                  st          d|j        z            t          j        |j        t          j	        t          j
        t          j        ddd|j                  | _        || _        || _        d | _        d S )Nz&device file %s does not exist -- abort   r   )portparitybytesizestopbitstimeoutxonxoffrtsctsr    )super__init__ospathexistsr   
ValueErrorserialr   PARITY_EVEN	EIGHTBITSSTOPBITS_TWOr   _sl_rst_pin_debug_atr)selfoptsr   r   kwargs	__class__s        D/home/jenkins/workspace/simtester-sanitize/pySim/transport/serial.pyr    zSerialSimLink.__init__#   s    ""6"""w~~dk** 	UESTTT=%%(]	
 	
 	
 			    c                 \    t          | d          r| j                                         d S d S )Nr)   )hasattrr)   closer-   s    r1   __del__zSerialSimLink.__del__6   s6    4 	HNN	 	r2   Nr   newcardonlyc                    d}	 |                                   |sd S d}n# t          $ r Y nw xY w|t          j                    |z   nd }d}|t          j                    |k     ru	 t          j        d           |                                   |sd S n.# t          $ r d}Y n t          $ r |rd}n|dz  }|dk    r Y nw xY w|^t          j                    |k     ut                      )NFTr   g      ?r      )
reset_cardr   timesleepr	   )r-   r   r8   existingmtpes         r1   wait_for_cardzSerialSimLink.wait_for_card:   s;   	OO HH 	 	 	D	 '.&9TY[[7""tzty{{R//
3!!! F ! ! !      $HH !GBAvv zty{{R//& mms(     
,,%*B B= B=<B=c                 .    |                                   d S N)r;   r6   s    r1   connectzSerialSimLink.connect_   s    r2   returnc                 *    t          | j                  S rC   )r   r,   r6   s    r1   get_atrzSerialSimLink.get_atrb   s    49~~r2   c                     d S rC   r   r6   s    r1   
disconnectzSerialSimLink.disconnecte   s    r2   c                 ~    |                                  }|dk    rt                      |dk     rt                      |S )Nr   )_SerialSimLink__reset_cardr   r	   )r-   rvs     r1   _reset_cardzSerialSimLink._reset_cardh   s>      77--66//!	r2   c           	         d | _         | j        j        | j        j        d}ddd}	 || j        dd                   }|| j        d                  }n*# t
          $ r}t          d| j        z            |d }~ww xY w ||           t          j        d           | j        	                                  ||dz             | 
                                }|sdS t          |          dk    rdS |                     d	t          |          z             t          |          dk    r'| 
                                }t          |          dk    '|sdS t          |          }|                     d
|z             dt          |          g| _         t          d          D ]}|d|z  z  r| 
                                }| j                             t          |                     |                     dt          t          d          |z             t          |          fz             t          d|dz            D ]b}| 
                                }| j                             t          |                     |                     dt          |          z             c	 | 
                                }	|	snM| j                             t          |	                     |                     dt          |	          z             ddS )N)rtsdtrr   r   )+-zInvalid reset pin %sg?;   zTS: 0x%x Direct conventionzT0: 0x%x      z	T%si = %xA   zHistorical = %xTz	Extra: %x)r,   r)   setRTSsetDTRr*   	Exceptionr$   r<   r=   
flushInput_rx_byteord
_dbg_printrangeappendchr)
r-   rst_meth_maprst_val_maprst_methrst_valexcbt0ixs
             r1   __reset_cardzSerialSimLink.__reset_cardp   s   	8?8?
 
 A&&	N#DM!""$56H!$-"23GG 	N 	N 	N3dmCDD#M	N 	
31MMOO 	1q66T>>24s1vv=>>>!ffnnA !ffnn  	2VV
R(((3q66N	q 	I 	IATQY IMMOO	  Q(((s3s88A:A.G GHHHq"s(## 	8 	8AAISVV$$$OO-A67777	2A ISVV$$$OOK#a&&0111	2 qs   (A 
A7A22A7c                 6    | j         rt          |           d S d S rC   )r+   print)r-   ss     r1   r_   zSerialSimLink._dbg_print   s%    ; 	!HHHHH	 	r2   c                     | j                             |           | j                                         }||k    r5t          dt	          |          |rdt	          |          z  ndfz            d S )Nz&Bad echo value. Expected %02x, got %s)z%02xz(nil))r)   writereadr	   r^   )r-   rh   rs      r1   _tx_bytezSerialSimLink._tx_byte   ss    qHMMOO66 HA19Q'L; !; < < < 6r2   c                     | j                             |           | j                             t          |                    }||k    r0t	          dt          |          dt          |          d          dS )zqThis is only safe if it's guaranteed the card won't send any data
        during the time of tx of the string !!!zBad echo value (Expected: z, got )N)r)   rq   rr   lenr	   r   )r-   ro   rs   s      r1   
_tx_stringzSerialSimLink._tx_string   st     	qHMM#a&&!!66-;>q66663q6666JL L L 6r2   c                 4    | j                                         S rC   )r)   rr   r6   s    r1   r]   zSerialSimLink._rx_byte   s    x}}r2   tpduc                 P   t          |          }|d         }|                     |dd                    	 |                                 }t          |          |d         k    rnW|dk    rP|}|                                 }|                                 }|r|sdt	          ||z             fS t                      t          |          dk    r|                     |dd                     |t          |          z
  dz   dz   }t          d          }t          |          |k     r<|                                 }|dk    r|dk    r4|sn||z  }t          |          |k     <t          |          dk     rd	S |d
d          }	|dd
         }t	          |          t	          |	          fS )NrU   r      Tr   ` r:   )NN)r   rx   r]   r^   r   r	   rw   bytes)
r-   rz   data_lenrh   sw1sw2nilto_recvdatasws
             r1   	send_tpduzSerialSimLink.send_tpdu   s   4yy7 	QqS	"""	&A1vva  F{{mmoommoo , ,s3s7||++#oo%	& t99q==OODH%%% SYY&*Q.Qxx$ii'!!A11;; AID $ii'!! t99q==:"##YAbDz 4yy#b''!!r2   c                      d| j         j        z  S )Nz	serial:%s)r)   namer6   s    r1   __str__zSerialSimLink.__str__   s    dhm,,r2   
arg_parserc           	          |                      dd          }|                    ddddd           |                    d	d
dt          ddd           d S )NzSerial ReaderzUse a simple/ultra-low-cost serial reader
attached to a (physical or USB/virtual) RS232 port.  This doesn't work with all RS232-attached smart card
readers, only with the very primitive readers following the ancient `Phoenix` or `Smart Mouse` design.z-dz--deviceDEVr   zSerial Device for SIM access)metavardefaulthelpz-bz--baudr   BAUDr   zBaud rate used for SIM access)desttyper   r   r   )add_argument_groupadd_argumentint)r   serial_groups     r1   argparse_add_reader_argsz&SerialSimLink.argparse_add_reader_args   s    !44_ Gj k k 	!!$
E>'E 	" 	G 	G 	G!!$zU[ei'F 	" 	H 	H 	H 	H 	Hr2   )NF)__name__
__module____qualname____doc__r   argparse	Namespacestrboolr    r7   r   r   rA   rD   r   rG   rI   rM   rK   r_   rt   rx   r]   r   r   r   staticmethodArgumentParserr   __classcell__)r0   s   @r1   r   r      s       WWD0h0QUVVVci$ ]`      &  # #Xc] # # # # #J          5 5 5n  < < <L L L  2"f 2" 2" 2" 2" 2"h- - - - - HX-D H H H \H H H H Hr2   r   )r<   r!   r   typingr   r%   osmocom.utilsr   r   r   r   pySim.exceptionsr   r	   pySim.transportr
   pySim.utilsr   r   r   r2   r1   <module>r      s   &  				         / / / / / / / / / / / / 7 7 7 7 7 7 7 7 ( ( ( ( ( (            ^H ^H ^H ^H ^HL ^H ^H ^H ^H ^Hr2   