o
    ‰¦^_ !  ã                   @   sL   d dl mZ 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 )é    )Úabsolute_import)Ú*c                 C   s2   t | ƒ}|  d¡}|dd … D ]}t||ƒ}q|S )NÚ.é   )Ú
__import__ÚsplitÚgetattr)ÚnameÚmodÚ
componentsÚcomp© r   ú3/usr/lib/python3/dist-packages/serial/serialjava.pyÚ	my_import   s
   
r   c              
   C   s@   | D ]}zt |ƒ}|j |W   S  ttfy   Y qw tdƒ‚)z1try given list of modules and return that importsz/No Java Communications API implementation found)r   Ú
SerialPortÚImportErrorÚAttributeError)Únamesr	   r
   r   r   r   Údetect_java_comm   s   
ÿr   z
javax.commzgnu.ioc                 C   sL   t j ¡ }g }| ¡ r | ¡ }| ¡ t jjkr| |¡ | ¡ s||   ¡ S )z%Turn a port number into a device name)	ÚcommÚCommPortIdentifierÚgetPortIdentifiersÚhasMoreElementsÚnextElementÚgetPortTypeÚPORT_SERIALÚappendÚgetName)Ú
portnumberÚenumÚportsÚ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u r	tdƒ‚| jrtdƒ‚t| j ƒtdƒkr!tj | j ¡}n	tj t| j ƒ¡}z	| dd¡| _	W n t
yH } z	d| _	td| ƒ‚d}~ww |  ¡  | 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)Ú_portÚSerialExceptionÚis_openÚtyper   r   ÚgetPortIdentifierr"   ÚopenÚsPortÚ	ExceptionÚ_reconfigurePortÚgetInputStreamÚ	_instreamÚgetOutputStreamÚ
_outstream)ÚselfÚportIdÚmsgr   r   r   r+   =   s$   
€þ
zSerial.openc                 C   sÎ  | j stdƒ‚| j  d¡ | jtkrtjj}n%| jtkr!tjj	}n| jt
kr+tjj}n| jtkr5tjj}ntd| j ƒ‚| jtkrFtjj}n| jtkrPtjj}n| jtkrZtjj}ntd| j ƒ‚| jtkrktjj}n/| jtkrutjj}n%| 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 ƒ¡ dS | 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'   ÚenableReceiveTimeoutÚ	_bytesizeÚFIVEBITSr   r   Ú
DATABITS_5ÚSIXBITSÚ
DATABITS_6Ú	SEVENBITSÚ
DATABITS_7Ú	EIGHTBITSÚ
DATABITS_8Ú
ValueErrorÚ	_stopbitsÚSTOPBITS_ONEÚ
STOPBITS_1ÚSTOPBITS_ONE_POINT_FIVEÚSTOPBITS_1_5ÚSTOPBITS_TWOÚ
STOPBITS_2Ú_parityÚPARITY_NONEÚPARITY_EVENÚ
PARITY_ODDÚPARITY_MARKÚPARITY_SPACEÚ_rtsctsÚFLOWCONTROL_RTSCTS_INÚFLOWCONTROL_RTSCTS_OUTÚ_xonxoffÚFLOWCONTROL_XONXOFF_INÚFLOWCONTROL_XONXOFF_OUTÚsetSerialPortParamsÚ	_baudrateÚsetFlowControlModeÚ_timeoutÚintÚdisableReceiveTimeout)r3   Ú	jdatabitsÚ	jstopbitsÚjparityÚjflowinÚjflowoutr   r   r   r.   T   sT   
























zSerial._reconfigurePortc                 C   s>   | j r| jr| j ¡  | j ¡  | j ¡  d| _d| _ dS dS )z
Close portNF)r(   r,   r0   Úcloser2   ©r3   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,   ÚPortNotOpenErrorr0   Ú	availablera   r   r   r   Ú
in_waiting—   s   
zSerial.in_waitingr   c                 C   sl   | j stƒ ‚tƒ }|dkr2t|ƒ|k r2| j ¡ }|dkr'| jdkr&	 t|ƒS n| |¡ t|ƒ|k s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,   rb   Ú	bytearrayÚlenr0   ÚreadÚtimeoutr   Úbytes)r3   Úsizerh   Úxr   r   r   rh   ž   s   

ü
úzSerial.readc                 C   sB   | 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,   rb   Ú
isinstancerj   rf   Ú	TypeErrorr)   r2   Úwriterg   )r3   Údatar   r   r   ro   ±   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,   rb   r0   Úskiprc   ra   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,   rb   r2   Úflushra   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,   rb   Ú	sendBreak)r3   Údurationr   r   r   Ú
send_breakÉ   s   zSerial.send_breakc                 C   s   | j du rtƒ ‚tdƒ‚)zBSet break: Controls TXD. When active, to transmitting is possible.Nz<The _update_break_state function is not implemented in java.)Úfdrb   r'   ra   r   r   r   Ú_update_break_stateÏ   s   
zSerial._update_break_statec                 C   ó   | j stƒ ‚| j  | j¡ dS )z)Set terminal status line: Request To SendN)r,   rb   ÚsetRTSÚ
_rts_statera   r   r   r   Ú_update_rts_stateÕ   ó   zSerial._update_rts_statec                 C   r{   )z-Set terminal status line: Data Terminal ReadyN)r,   rb   ÚsetDTRÚ
_dtr_statera   r   r   r   Ú_update_dtr_stateÛ   r   zSerial._update_dtr_statec                 C   ó   | j stƒ ‚| j  ¡  dS )z(Read terminal status line: Clear To SendN)r,   rb   ÚisCTSra   r   r   r   Úctsá   ó   z
Serial.ctsc                 C   rƒ   )z)Read terminal status line: Data Set ReadyN)r,   rb   ÚisDSRra   r   r   r   Údsrè   r†   z
Serial.dsrc                 C   rƒ   )z)Read terminal status line: Ring IndicatorN)r,   rb   ÚisRIra   r   r   r   Úriï   r†   z	Serial.ric                 C   rƒ   )z)Read terminal status line: Carrier DetectN)r,   rb   ÚisCDra   r   r   r   Úcdö   r†   z	Serial.cdN)r   )ru   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   r.   r`   Úpropertyrd   rh   ro   rr   rt   rx   rz   r~   r‚   r…   rˆ   rŠ   rŒ   r   r   r   r   r#   7   s.    7

	
	


r#   N)	Ú
__future__r   Úserial.serialutilr   r   r   r"   Ú
SerialBaser#   r   r   r   r   Ú<module>   s   	þ