U
    ¿;­VÞ   ã                   @   s@   d dl T dd„ Zdd„ ZeddgƒZdd	„ ZG d
d„ deƒZdS )é    )Ú*c                 C   s2   t | ƒ}|  d¡}|dd … D ]}t||ƒ}q|S )NÚ.é   )Ú
__import__ÚsplitÚgetattr)ÚnameÚmodZ
componentsÚcomp© r   ú3/usr/lib/python3/dist-packages/serial/serialjava.pyÚ	my_import   s
    
r   c              
   C   sH   | D ]6}zt |ƒ}|j |W   S  ttfk
r8   Y qX qtdƒ‚dS )z1try given list of modules and return that importsz/No Java Communications API implementation foundN)r   Ú
SerialPortÚImportErrorÚAttributeError)Únamesr   r	   r   r   r   Údetect_java_comm   s    
r   z
javax.commzgnu.ioc                 C   sF   t j ¡ }g }| ¡ r:| ¡ }| ¡ t jjkr| |¡ q||   ¡ S )z%Turn a port number into a device name)	ÚcommÚCommPortIdentifierZgetPortIdentifiersZhasMoreElementsZnextElementZgetPortTypeZPORT_SERIALÚappendZgetName)Z
portnumberÚenumZportsZelr   r   r   Údevice*   s    
r   c                   @   s¨   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZd%dd„Z	dd„ Z
dd„ Zdd„ Zd&dd„Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZd$S )'ÚSerialzˆ    Serial port class, implemented with Java Communications API and
    thus usable with jython and the appropriate java extension.
    c              
   C   sÆ   | j dkrtdƒ‚| jr tdƒ‚t| j ƒtdƒkrBtj | j ¡}ntj t| j ƒ¡}z| dd¡| _	W n4 t
k
rš } zd| _	td| ƒ‚W 5 d}~X Y nX |  ¡  | j	 ¡ | _| j	 ¡ | _d| _dS )	zx        Open port with current settings. This may throw a SerialException
        if the port cannot be opened.
        Nz.Port must be configured before it can be used.zPort is already open.Ú zpython serial moduleé
   zCould not open port: %sT)Z_portÚSerialExceptionÚis_openÚtyper   r   ZgetPortIdentifierr   ÚopenÚsPortÚ	ExceptionÚ_reconfigurePortZgetInputStreamÚ	_instreamZgetOutputStreamÚ
_outstream)ÚselfZportIdÚmsgr   r   r   r   ;   s     
zSerial.openc                 C   sÖ  | j stdƒ‚| j  d¡ | jtkr.tjj}nJ| jtkrBtjj	}n6| jt
krVtjj}n"| jtkrjtjj}ntd| j ƒ‚| jtkrŒtjj}n6| jtkr tjj}n"| jtkr´tjj}ntd| j ƒ‚| jtkrÖtjj}nb| jtkrêtjj}nN| jtkrþtjj}n:| jtk�rtjj}n$| jtk�r*tjj}ntd| j ƒ‚d }}| j�r`|tjjO }|tjjO }| j�r€|tjj O }|tjj!O }| j  "| j#|||¡ | j  $||B ¡ | j%dk�rÈ| j  t&| j%d ƒ¡ n
| j  '¡  dS )	z,Set communication parameters on opened port.z'Can only operate on a valid port handleé   zunsupported bytesize: %rz"unsupported number of stopbits: %rzunsupported parity type: %rr   iè  N)(r   r   ZenableReceiveTimeoutZ	_bytesizeZFIVEBITSr   r   Z
DATABITS_5ZSIXBITSZ
DATABITS_6Z	SEVENBITSZ
DATABITS_7Z	EIGHTBITSZ
DATABITS_8Ú
ValueErrorZ	_stopbitsZSTOPBITS_ONEZ
STOPBITS_1ZSTOPBITS_ONE_POINT_FIVEZSTOPBITS_1_5ZSTOPBITS_TWOZ
STOPBITS_2Z_parityZPARITY_NONEZPARITY_EVENZ
PARITY_ODDZPARITY_MARKZPARITY_SPACEZ_rtsctsZFLOWCONTROL_RTSCTS_INZFLOWCONTROL_RTSCTS_OUTZ_xonxoffZFLOWCONTROL_XONXOFF_INZFLOWCONTROL_XONXOFF_OUTZsetSerialPortParamsZ	_baudrateZsetFlowControlModeZ_timeoutÚintZdisableReceiveTimeout)r$   Z	jdatabitsZ	jstopbitsZjparityZjflowinZjflowoutr   r   r   r!   R   sT    





















zSerial._reconfigurePortc                 C   s:   | j r6| jr0| j ¡  | j ¡  | j ¡  d| _d| _ dS )z
Close portNF)r   r   r"   Úcloser#   ©r$   r   r   r   r)   ‰   s    


zSerial.closec                 C   s   | j s
t‚| j ¡ S )z>Return the number of characters currently in the input buffer.)r   ÚportNotOpenErrorr"   Ú	availabler*   r   r   r   Ú
in_waiting•   s    zSerial.in_waitingr   c                 C   sX   | j s
t‚tƒ }|dkrPt|ƒ|k rP| j ¡ }|dkrD| jdkrNqPq| |¡ qt|ƒS )zÑ        Read size bytes from the serial port. If a timeout is set it may
        return less characters as requested. With no timeout it will block
        until the requested number of bytes is read.
        r   éÿÿÿÿ)	r   r+   Ú	bytearrayÚlenr"   ÚreadZtimeoutr   Úbytes)r$   Úsizer1   Úxr   r   r   r1   œ   s    

zSerial.readc                 C   s@   | j s
t‚t|ttfƒs,tdtt|ƒf ƒ‚| j |¡ t	|ƒS )z-Output the given string over the serial port.z expected %s or bytearray, got %s)
r   r+   Ú
isinstancer2   r/   Ú	TypeErrorr   r#   Úwriter0   )r$   Údatar   r   r   r7   ¯   s    zSerial.writec                 C   s    | j s
t‚| j | j ¡ ¡ dS )z9Clear input buffer, discarding all that is in the buffer.N)r   r+   r"   Úskipr,   r*   r   r   r   Úreset_input_buffer¸   s    zSerial.reset_input_bufferc                 C   s   | j s
t‚| j ¡  dS )zs        Clear output buffer, aborting the current output and
        discarding all that is in the buffer.
        N)r   r+   r#   Úflushr*   r   r   r   Úreset_output_buffer¾   s    zSerial.reset_output_bufferç      Ð?c                 C   s   | j s
t‚| j  |d ¡ dS )zHSend break condition. Timed, returns to idle state after given duration.g     @�@N)r   r+   Z	sendBreak)r$   Zdurationr   r   r   Ú
send_breakÇ   s    zSerial.send_breakc                 C   s   | j dkrt‚tdƒ‚dS )zBSet break: Controls TXD. When active, to transmitting is possible.Nz<The _update_break_state function is not implemented in java.)Úfdr+   r   r*   r   r   r   Ú_update_break_stateÍ   s    
zSerial._update_break_statec                 C   s   | j s
t‚| j  | j¡ dS )z)Set terminal status line: Request To SendN)r   r+   ZsetRTSZ
_rts_stater*   r   r   r   Ú_update_rts_stateÓ   s    zSerial._update_rts_statec                 C   s   | j s
t‚| j  | j¡ dS )z-Set terminal status line: Data Terminal ReadyN)r   r+   ZsetDTRZ
_dtr_stater*   r   r   r   Ú_update_dtr_stateÙ   s    zSerial._update_dtr_statec                 C   s   | j s
t‚| j  ¡  dS )z(Read terminal status line: Clear To SendN)r   r+   ZisCTSr*   r   r   r   Úctsß   s    z
Serial.ctsc                 C   s   | j s
t‚| j  ¡  dS )z)Read terminal status line: Data Set ReadyN)r   r+   ZisDSRr*   r   r   r   Údsræ   s    z
Serial.dsrc                 C   s   | j s
t‚| j  ¡  dS )z)Read terminal status line: Ring IndicatorN)r   r+   ZisRIr*   r   r   r   Úrií   s    z	Serial.ric                 C   s   | j s
t‚| j  ¡  dS )z)Read terminal status line: Carrier DetectN)r   r+   ZisCDr*   r   r   r   Úcdô   s    z	Serial.cdN)r   )r=   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r)   Úpropertyr-   r1   r7   r:   r<   r>   r@   rA   rB   rC   rD   rE   rF   r   r   r   r   r   5   s,   7

		



r   N)Zserial.serialutilr   r   r   r   Z
SerialBaser   r   r   r   r   Ú<module>
   s   þ