
    h                         d dl Z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	 d dl
mZ d dlmZ d dlmZmZ  G d de          ZdS )	    N)Optional)Hexstr)ResTuple)LinkBaseTpdu)ReaderErrorProtocolErrorc                        e Zd ZdZdZ ej        dd          fdej        f fdZd ZddZ	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 )ModemATCommandLinkz3Transport Link for 3GPP TS 27.007 compliant modems.z-modem for Generic SIM Access (3GPP TS 27.007)z/dev/ttyUSB0  )	modem_dev
modem_baudoptsc                    |j         }|j        } t                      j        di | t	          j        ||d          | _        d| _        || _        d | _	        | 
                                 |                                  d S )N   )timeoutF )r   r   super__init__serialSerial_sl_echo_device_atr_check_echo
reset_card)selfr   kwargsdevicebaudrate	__class__s        I/home/jenkins/workspace/simtester-sanitize/pySim/transport/modem_atcmd.pyr   zModemATCommandLink.__init__'   s    ?""6"""=1===
	 	 	    c                 \    t          | d          r| j                                         d S d S )Nr   )hasattrr   closer   s    r"   __del__zModemATCommandLink.__del__7   s6    4 	HNN	 	r#   皙?Mb`?c                 n   t          |t                    r|n|                                }|dz  }| j                                         t          j        d|           	 | j                            |          }|t          |          k    sJ n%# t          $ r}t          d|z            |d }~ww xY wd}d}t          j                    }		 || j                            | j        j                  z   }|                    d          }
t          |
          dk    rU|
d	         }|d
k    rt          j        d|           n{|dk    s|                    d          rt          j        d|           nJt          j                    |	z
  |k    rt          j        d|           nt          j        |           |dz  }t          j        dt          j                    |	z
  ||           | j        r
||d          }|                                }|                    d          }t          j        d|           |S )N   zSending AT command: %szFailed to send AT command: %sr#      Ts   
      OKz Command finished with result: %ss   ERROR   +CME ERROR:zCommand failed with result: %sz$Command finished with timeout >= %ssz%Command took %0.6fs (%d cycles a %fs)s   

zGot response from modem: %s)
isinstancebytesencoder   reset_input_bufferlogdebugwritelen	Exceptionr   timeread
in_waitingsplit
startswitherrorinfosleepr   strip)r   cmdr   patiencebcmdwlenexcrspitst_startlinesress               r"   send_at_cmdzModemATCommandLink.send_at_cmd;   s/    e,,>ss#**,, 	##%%% 		*C000	N8>>$''D3t99$$$$$ 	N 	N 	N=CDD#M	N )++	dh&9:::CIIg&&E5zzQBi%<<I@#FFF(??cnn^&D&D?I>DDDy{{W$//?IIIJx   1HC!	" 		949;;;PRUW_```: 	dee*Ciikkii$$	/555
s    /B 
B2B--B2c                     d| _         |                     d          }t          |          dk    r*|d         dk    r	d| _         dS |d         dk    r	d| _         dS t          d	| j        z            )
a  Verify the correct response to 'AT' command
        and detect if inputs are echoed by the device

        Although echo of inputs can be enabled/disabled via
        ATE1/ATE0, respectively, we rather detect the current
        configuration of the modem without any change.
        FATr   r0   Ns   AT
OKTz/Interface '%s' does not respond to 'AT' command)r   rN   r9   r   r   )r   results     r"   r   zModemATCommandLink._check_echoj   s}     
!!$'' v;;??bzU"""
bz]**!
ORVR^^___r#   c                     |                      d          dgk    rt          d          |                      d          dgk    rt          d          t          j        d| j                   d S )NATZr0   zFailed to reset the modemz	AT+CSIM=?z-The modem does not seem to support SIM accesszModem at '%s' is ready!)rN   r   r6   rA   r   r'   s    r"   _reset_cardzModemATCommandLink._reset_card   ss    E""ug--9::: K((UG33MNNN,dl;;;;;r#   c                     d S Nr   r'   s    r"   connectzModemATCommandLink.connect       r#   returnc                     dS )N3b00r   r'   s    r"   get_atrzModemATCommandLink.get_atr   s    vr#   c                     d S rW   r   r'   s    r"   
disconnectzModemATCommandLink.disconnect   rY   r#   NFr   newcardonlyc                     d S rW   r   )r   r   r`   s      r"   wait_for_cardz ModemATCommandLink.wait_for_card   rY   r#   tpduc                 8   |                                 }dt          |          |fz  }t          j        d|           |                     |          }|d                             d          rt          dt          |          z            t          |          dk    s|d         dk    rt          dt          |          z            |d	         }	 t          j
        d
|          }|                                \  }}n%# t          $ r}t          d|z            |d }~ww xY w|d d                                                                         }|dd                                                                          }	t          j        d||	           ||	fS )NzAT+CSIM=%d,"%s"zSending command: %srQ   r1   zAT+CSIM failed with: %sr.   r0   zAPDU transfer failed: %sr   s   \+CSIM: (\d+),"([0-9A-F]+)"z'Failed to parse response from modem: %szCommand response: %s, %s)upperr9   r6   r7   rN   r?   r   strr   rematchgroupsr:   decodelower)
r   rc   rD   rI   rR   _rsp_tpdu_lenrsp_tpdurH   datasws
             r"   	send_tpduzModemATCommandLink.send_tpdu   s   zz|| "SYY$55	'#... s##r7n-- 	F 9CHH DEEEs88q==CGu,,83s88CDDD!f	XX>DDF(.%]HH 	X 	X 	XG#MNNTWW	X }##%%++--bcc]!!##))++	,dB777Rxs   ,D 
D#DD#c                     d| j         z  S )Nzmodem:%s)r   r'   s    r"   __str__zModemATCommandLink.__str__   s    DL((r#   
arg_parserc                     |                      dd          }|                    dddd d           |                    dt          d	d
d           d S )NzAT Command Modem ReaderzTalk to a SIM Card inside a
mobile phone or cellular modem which is attached to this computer and offers an AT command interface including
the AT+CSIM interface for Generic SIM access as specified in 3GPP TS 27.007.z--modem-devicer   DEVz<Serial port of modem for Generic SIM Access (3GPP TS 27.007))destmetavardefaulthelpz--modem-baudBAUDr   zBaud rate used for modem port)typerx   ry   rz   )add_argument_groupadd_argumentint)rt   modem_groups     r"   argparse_add_reader_argsz+ModemATCommandLink.argparse_add_reader_args   s     334M PP Q Q 	  !1U\`&d 	! 	f 	f 	f  c6SY&E 	! 	G 	G 	G 	G 	Gr#   )r)   r*   )NF)__name__
__module____qualname____doc__nameargparse	Namespacer   r(   rN   r   rU   rX   r   r]   r_   r   r   boolrb   r   rq   rg   rs   staticmethodArgumentParserr   __classcell__)r!   s   @r"   r
   r
   #   s       ==:D2D(2D~PV3X 3X 3X  X/         - - - -^` ` `,	< 	< 	<         Xc]     f     :) ) ) ) ) GX-D G G G \G G G G Gr#   r
   )loggingr6   r;   rh   r   typingr   r   osmocom.utilsr   pySim.utilsr   pySim.transportr   pySim.exceptionsr   r   r
   r   r#   r"   <module>r      s   &      				                                 ( ( ( ( ( ( 7 7 7 7 7 7 7 7\G \G \G \G \G \G \G \G \G \Gr#   