
    di                         d dl Z 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m	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ  G d d          Z G d	 d
e          Z G d de          Z G d de          ZdS )    N)Optional)h2bb2hHexstr)LinkBaseTpdu)ReaderErrorProtocolError)ResTuplec                       e Zd ZddZd ZdS )L1CTLMessager   c                 <    t          j        d||          | _        d S )NBBxx)structpackdata)selfmsg_typeflagss      E/home/jenkins/workspace/simtester-sanitize/pySim/transport/calypso.py__init__zL1CTLMessage.__init__*   s    K%88			    c                 `    t          j        dt          | j                            | j        z   S )N!H)r   r   lenr   r   s    r   gen_msgzL1CTLMessage.gen_msg.   s#    {4TY0049<<r   N)r   )__name__
__module____qualname__r   r    r   r   r   r       s7        9 9 9 9= = = = =r   r   c                   :     e Zd ZdZdZdZdZdZdZef fd	Z	 xZ
S )L1CTLMessageReset         r         c                     t                                          | j                   | xj        t	          j        d|          z  c_        d S )NBxxx)superr   L1CTL_RESET_REQr   r   r   )r   ttype	__class__s     r   r   zL1CTLMessageReset.__init__>   s>    -...		V[///				r   )r   r   r   r+   L1CTL_RESET_INDL1CTL_RESET_CONFL1CTL_RES_T_BOOTL1CTL_RES_T_FULLL1CTL_RES_T_SCHEDr   __classcell__r-   s   @r   r"   r"   2   sf         OO - 0 0 0 0 0 0 0 0 0 0r   r"   c                   &     e Zd ZdZdZ fdZ xZS )L1CTLMessageSIM      c                 t    t                                          | j                   | xj        |z  c_        d S N)r*   r   L1CTL_SIM_REQr   )r   tpdur-   s     r   r   zL1CTLMessageSIM.__init__I   s2    +,,,		T				r   )r   r   r   r;   L1CTL_SIM_CONFr   r3   r4   s   @r   r6   r6   C   sD         MN        r   r6   c                        e Zd ZdZdZ ej        d          fdej        f fdZd Zdd	e	fd
Z
d Zd ZdefdZd Zddee	         defdZdedefdZdefdZedej        fd            Z xZS )CalypsoSimLinkz(Transport Link for Calypso based phones.z Calypso-based (OsmocomBB) readerz/tmp/osmocom_l2)osmocon_sockoptsc                 l   |j         } t                      j        di | t          j                            |          st          d|z            t          d|z             t          j        t          j	        t          j
                  | _        | j                            |           || _        d S )Nz#There is no such ('%s') UNIX socketz Connecting to osmocon at '%s'...r    )r@   r*   r   ospathexistsr   printsocketAF_UNIXSOCK_STREAMsockconnect
_sock_path)r   rA   kwargs	sock_pathr-   s       r   r   zCalypsoSimLink.__init__R   s    %	""6"""w~~i(( 	C5	AC C C 	09<=== M&.&2DEE		)$$$ $r   c                 8    | j                                          d S r:   )rJ   closer   s    r   __del__zCalypsoSimLink.__del__c   s    	r      exp_lenc                     t          j         | j        gg g d          \  }}}|st          d          | j                            |          }|S )Ng      @z!Timeout waiting for card response)selectrJ   r   recv)r   rS   s_rsps        r   wait_for_rspzCalypsoSimLink.wait_for_rspf   sS    -RS991a 	CABBB innW%%
r   c                    t                      }| j                            |                                           |                                 }t          j        d|          }|d         t           j        k    rt          d          d S )Nz!HBr&   zFailed to reset Calypso PHY)	r"   rJ   sendr   rZ   r   unpack_fromr/   r   )r   req_msgrY   rsp_msgs       r   _reset_cardzCalypsoSimLink._reset_cardp   sz    #%%	w(())) !!$UC001:*;;;;<<< <;r   c                 .    |                                   d S r:   )
reset_cardr   s    r   rK   zCalypsoSimLink.connect{   s    r   returnc                     dS )N3b00r    r   s    r   get_atrzCalypsoSimLink.get_atr~   s    vr   c                     d S r:   r    r   s    r   
disconnectzCalypsoSimLink.disconnect       r   NFtimeoutnewcardonlyc                     d S r:   r    )r   rj   rk   s      r   wait_for_cardzCalypsoSimLink.wait_for_card   ri   r   r<   c                    t          t          |                    }| j                            |                                           |                     t          j        d                    }t          j        d|          d         }|t          j        d          k     rt          d          | j        
                    |          }t          j        d|          }|d         t           j        k    rt          d          t          j        d          }t          |          |k    rt          d          ||d          }|d d         }|dd          }t          |          t          |          fS )Nr   r   r   z'Missing L1CTL header for L1CTL_SIM_CONFz!Unexpected L1CTL message receivedzEmpty response from SIM?!?)r6   r   rJ   r\   r   rZ   r   calcsizer]   r   rV   r=   r   r	   r   )	r   r<   r^   rY   msg_lenhdroffsetr   sws	            r   	send_tpduzCalypsoSimLink.send_tpdu   sL    "#d)),,	w(()))  5 566$T3//2V_V,,,,GHHH innW%%  --q6_333ABBB ((s88v <=== &''l 3B3xX4yy#b''!!r   c                     d| j         z  S )Nz
osmocon:%s)rL   r   s    r   __str__zCalypsoSimLink.__str__   s    t//r   
arg_parserc                 f    |                      dd          }|                    dddd d           d S )NzOsmocomBB Readera2  Use an OsmocomBB compatible phone
to access the SIM inserted to the phone SIM slot.  This will require you to run the OsmocomBB firmware inside
the phone (can be ram-loaded).  It also requires that you run the ``osmocon`` program, which provides a unix
domain socket to which this reader driver can attach.z	--osmoconr@   PATHzISocket path for Calypso (e.g. Motorola C1XX) based reader (via OsmocomBB))destmetavardefaulthelp)add_argument_groupadd_argument)rx   osmobb_groups     r   argparse_add_reader_argsz'CalypsoSimLink.argparse_add_reader_args   sZ    !445G J9 : : 	!!+NF\`'r 	" 	t 	t 	t 	t 	tr   )rR   )NF)r   r   r   __doc__nameargparse	Namespacer   rQ   intrZ   r`   rK   r   rf   rh   r   boolrm   r
   ru   strrw   staticmethodArgumentParserr   r3   r4   s   @r   r?   r?   N   s~       22-D2D(2DRc2d2d2d $ $X/ $ $ $ $ $ $"   C    	= 	= 	=         Xc]      "f  "  "  "  "  "D0 0 0 0 0 tX-D t t t \t t t t tr   r?   )rU   r   rG   rC   r   typingr   osmocom.utilsr   r   r   pySim.transportr   pySim.exceptionsr   r	   pySim.utilsr
   r   r"   r6   r?   r    r   r   <module>r      sd  &    				        * * * * * * * * * * ( ( ( ( ( ( 7 7 7 7 7 7 7 7            = = = = = = = =$0 0 0 0 0 0 0 0"    l   et et et et et\ et et et et etr   