
    #)di<O                     n    d dl m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
mZ  G d de          ZdS )    )absolute_importN)win32)
SerialBaseSerialExceptionto_bytesPortNotOpenErrorSerialTimeoutExceptionc                   F    e Zd ZdZdZ fdZd Zd Zd Zd Z	e
d             Zd!d
Zd Zd Zd Zd Zd Zd Zd Zd Ze
d             Ze
d             Ze
d             Ze
d             Zd"dZd#dZe
d             Zd Zd Zd Zej         j!        d              Z  xZ"S )$Serialz5Serial port implementation for Win32 based on ctypes.)2   K   n            i,  iX  i  i  i`	  i  i%  i K  i   i   i  c                 r    d | _         d | _        d | _         t          t          |           j        |i | d S N)_port_handle_overlapped_read_overlapped_writesuperr   __init__)selfargskwargs	__class__s      Y/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/serial/serialwin32.pyr   zSerial.__init__   sC      $!%$fd$d5f55555    c           	      D   | j         t          d          | j        rt          d          | j        }	 |                                                    d          r t          |dd                   dk    rd|z   }n# t          $ r Y nw xY wt          j	        |t          j
        t          j        z  ddt          j        t          j        t          j        z  d          | _        | j        t          j        k    r@d| _        t          d	                    | j        t'          j                                        	 t          j                    | _        t          j        dd
dd          | j        _        t          j                    | _        t          j        dddd          | j        _        t          j        | j        dd           t          j                    | _        t          j        | j        t'          j        | j                             |                                  t          j         | j        t          j!        t          j"        z  t          j#        z  t          j$        z             d| _        dS #  	 | %                                 n#  Y nxY wd| _         xY w)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.COM      z\\.\r   zcould not open port {!r}: {!r}      T)&_portr   is_opennameupper
startswithint
ValueErrorr   
CreateFileGENERIC_READGENERIC_WRITEOPEN_EXISTINGFILE_ATTRIBUTE_NORMALFILE_FLAG_OVERLAPPEDr   INVALID_HANDLE_VALUEformatportstrctypesWinError
OVERLAPPEDr   CreateEventhEventr   	SetupCommCOMMTIMEOUTS_orgTimeoutsGetCommTimeoutsbyref_reconfigure_port	PurgeCommPURGE_TXCLEARPURGE_TXABORTPURGE_RXCLEARPURGE_RXABORT_close)r   ports     r   openzSerial.open#   ss   
 :!"RSSS< 	;!"9::: y	zz||&&u-- (#d122h--!2C2C 4' 	 	 	D	 ",!44'%*DD   ::: $D!"B"I"I$,X^XgXiXi"j"jkkk 	 $)$4$6$6D!+0+<T1a+N+ND!(%*%5%7%7D",1,=dAq$,O,OD") OD-tT::: !& 2 4 4D!$"3V\$BS5T5TUUU""$$$ O!#e&99#$&+&9:; ; ;  DLLL	  $Ds7   AA= =
B
	B
:D5I8 8J;JJJJc                    | j         st          d          t          j                    }| j        nG| j        dk    rt          j        |_        n*t          t          | j        dz            d          |_	        | j        dk    r1| j
        *t          t          | j
        dz            d          |_        | j        nG| j        dk    rt          j        |_        n*t          t          | j        dz            d          |_        t          j        | j         t          j        |                     t          j        | j         t          j                   t          j                    }t          j        | j         t          j        |                     | j        |_        | j        t.          j        k    rd|_        n~| j        t.          j        k    rd|_        na| j        t.          j        k    rd|_        nD| j        t.          j        k    rd	|_        n't;          d
                    | j                            | j        t.          j         k    rt          j!        |_"        d|_#        n| j        t.          j$        k    rt          j%        |_"        d|_#        n| j        t.          j&        k    rt          j'        |_"        d|_#        n| j        t.          j(        k    rt          j)        |_"        d|_#        nU| j        t.          j*        k    rt          j+        |_"        d|_#        n't;          d                    | j                            | j,        t.          j-        k    rt          j.        |_/        nu| j,        t.          j0        k    rt          j1        |_/        nN| j,        t.          j2        k    rt          j3        |_/        n't;          d                    | j,                            d|_4        | j5        K| j6        rt          j7        |_8        n$| j9        rt          j:        nt          j;        |_8        | j6        |_<        n0| j5        j=        s,t;          d                    | j5        j=                            | j5        j>        r,t;          d                    | j5        j>                            | j5        j?        ,t;          d                    | j5        j?                            | j5        j@        ,t;          d                    | j5        j@                            | j5        jA        r,t;          d                    | j5        jA                            t          jB        |_8        d|_<        | jC        rt          jD        |_E        n$| jF        rt          jG        nt          jH        |_E        | jC        |_I        | jJ        |_K        | jJ        |_L        d|_M        d|_N        d|_O        t.          jP        |_Q        t.          jR        |_S        t          jT        | j         t          j        |                    s3t          d                    t          jU                                        dS )z,Set communication parameters on opened port.z'Can only operate on a valid port handleNr   i  r#            r"   z%Unsupported number of data bits: {!r}zUnsupported parity mode: {!r}z%Unsupported number of stop bits: {!r}zQUnsupported value for RS485Settings.rts_level_for_tx: {!r} (only True is allowed)zRUnsupported value for RS485Settings.rts_level_for_rx: {!r} (only False is allowed)zPUnsupported value for RS485Settings.delay_before_tx: {!r} (only None is allowed)zPUnsupported value for RS485Settings.delay_before_rx: {!r} (only None is allowed)zJUnsupported value for RS485Settings.loopback: {!r} (only False is allowed)zCCannot configure port, something went wrong. Original message: {!r})Vr   r   r   r;   _timeoutMAXDWORDReadIntervalTimeoutmaxr*   ReadTotalTimeoutConstant_inter_byte_timeout_write_timeoutWriteTotalTimeoutConstantSetCommTimeoutsr5   r>   SetCommMaskEV_ERRDCBGetCommState	_baudrateBaudRate	_bytesizeserialFIVEBITSByteSizeSIXBITS	SEVENBITS	EIGHTBITSr+   r3   _parityPARITY_NONENOPARITYParityfParityPARITY_EVEN
EVENPARITY
PARITY_ODD	ODDPARITYPARITY_MARK
MARKPARITYPARITY_SPACESPACEPARITY	_stopbitsSTOPBITS_ONE
ONESTOPBITStopBitsSTOPBITS_ONE_POINT_FIVEONE5STOPBITSSTOPBITS_TWOTWOSTOPBITSfBinary_rs485_mode_rtsctsRTS_CONTROL_HANDSHAKEfRtsControl
_rts_stateRTS_CONTROL_ENABLERTS_CONTROL_DISABLEfOutxCtsFlowrts_level_for_txrts_level_for_rxdelay_before_txdelay_before_rxloopbackRTS_CONTROL_TOGGLE_dsrdtrDTR_CONTROL_HANDSHAKEfDtrControl
_dtr_stateDTR_CONTROL_ENABLEDTR_CONTROL_DISABLEfOutxDsrFlow_xonxofffOutXfInXfNull
fErrorCharfAbortOnErrorXONXonCharXOFFXoffCharSetCommStater6   )r   timeoutscomDCBs      r   r?   zSerial._reconfigure_portd   s     	M!"KLLL %''= ]a+0>H((03C8L4M4Mq0Q0QH-=A$":"F+.s43Kd3R/S/SUV+W+WH(& A%%16H..14S9Lt9S5T5TVW1X1XH.d/h1G1GHHH$+U\::: 4,fl6.B.BCCC.>V_,,FOO^v~--FOO^v///FOO^v///FOODKKDN[[\\\<6---!NFMFNN\V///!,FMFNN\V...!OFMFNN\V///!,FMFNN\V000!-FMFNN<CCDLQQRRR>V000#.FOO^v===#0FOO^v222#/FOODKKDN[[\\\#| p%*%@""AE%oU%=%=V[Vo""&,F #4 = gnn(9< <= = = 0 = hoo(9< <= = = /; fmm(8; ;< < < /; fmm(8; ;< < < ( 5 `gg(14 45 5 5 "'!9F"#F< 	l!&!<F=A_!k!9!9RWRkF"l}m  +!$"3V\&5I5IJJ 	D!))/0A0A)B)BD D D	D 	Dr   c                    | j         t          j        | j         | j                   | j        9|                                  t          j        | j        j                   d| _        | j        9| 	                                 t          j        | j        j                   d| _        t          j        | j                    d| _         dS dS )zinternal close port helperN)
r   r   rT   r<   r   cancel_readCloseHandler9   r   cancel_writer   s    r   rE   zSerial._close   s    (!$"3T5FGGG$0  """!$"7">???(,%%1!!###!$"8"?@@@)-&d/000 $D )(r   c                 N    | j         r|                                  d| _         dS dS )z
Close portFN)r&   rE   r   s    r   closezSerial.close   s.    < 	!KKMMM DLLL	! 	!r   c                 @   t          j                    }t          j                    }t          j        | j        t          j        |          t          j        |                    s3t          d                    t          j	                                        |j
        S )z9Return the number of bytes currently in the input buffer.ClearCommError failed ({!r}))r   DWORDCOMSTATClearCommErrorr   r5   r>   r   r3   r6   cbInQuer   flagscomstats      r   
in_waitingzSerial.in_waiting   sw     -//#D$5v|E7J7JFLY`LaLabb 	\!"@"G"GHYHY"Z"Z[[[r   r#   c           	      J   | j         st                      |dk    rkt          j        | j        j                   t          j                    }t          j                    }t          j        | j	        t          j        |          t          j        |                    s3t          d                    t          j                                        | j        dk    rt!          |j        |          n|}|dk    r}t          j        |          }t          j                    }t          j        | j	        ||t          j        |          t          j        | j                            }|s^t          j                    t          j        t          j        fvr3t          d                    t          j                                        t          j        | j	        t          j        | j                  t          j        |          d          }|sTt          j                    t          j        k    r3t          d                    t          j                                        |j        d|j                 }	nt7                      }	nt7                      }	t7          |	          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   zReadFile failed ({!r})Tz!GetOverlappedResult failed ({!r})N)r&   r   r   
ResetEventr   r9   r   r   r   r   r5   r>   r   r3   r6   timeoutminr   create_string_bufferReadFileGetLastErrorERROR_SUCCESSERROR_IO_PENDINGGetOverlappedResultERROR_OPERATION_ABORTEDrawvaluebytes)
r   sizer   r   nbufrcread_ok	result_okreads
             r   r   zSerial.read  s+    | 	%"$$$!88T29:::KMMEmooG'(96<;N;NPVP\]dPePeff `%&D&K&KFOL]L]&^&^___.2la.?.?GOT***TA1uu1!44[]].%L$$L!6779 9  ^5#5#7#7@SUZUk?l#l#l)*B*I*I&/J[J[*\*\]]]!5%L!677L$$	 	
 ! m)++u/LLL-.Q.X.XY_YhYjYj.k.klllwyy)ww77DT{{r   c                 ,   | j         st                      t          |          }|rt          j                    }t          j        | j        |t          |          t          j	        |          | j
                  }| j        dk    r|s^t          j                    t          j        t          j        fvr3t          d                    t          j                                        t          j        | j        | j
        t          j	        |          d           t          j                    t          j        k    r|j        S |j        t          |          k    rt+          d          |j        S |rt          j        nt          j                    }|t          j        t          j        t          j        fv rdS |t          j        t          j        fv rt          |          S t          d                    t          j                                        dS )z2Output the given byte string over the serial port.r   zWriteFile failed ({!r})TzWrite timeout)r&   r   r   r   r   	WriteFiler   lenr5   r>   r   rR   r   r   r   r   r3   r6   r   r   r   r	   ERROR_INVALID_USER_BUFFERERROR_NOT_ENOUGH_MEMORY)r   datar   success	errorcodes        r   writezSerial.write/  s   | 	%"$$$ ~~ 	Aod&7s4yy&,WX//[_[qrrG"a'' _5#5#7#7@SUZUk?l#l#l)*C*J*J6?K\K\*]*]^^^ )$*;T=SU[UabcUdUdfjkkk%''5+HHH7N7c$ii''0AAAw3:TE//@R@T@T	!@%B_!&!>!@ @ @15#68N"OOOt99$)*C*J*J6?K\K\*]*]^^^1r   c                 N    | j         rt          j        d           | j         dS dS )zb        Flush of file like objects. In this case, wait until all data
        is written.
        g?N)out_waitingtimesleepr   s    r   flushzSerial.flushT  s@    
  	Jt  	 	 	 	 	r   c                     | j         st                      t          j        | j        t          j        t          j        z             dS )z9Clear input buffer, discarding all that is in the buffer.N)r&   r   r   r@   r   rC   rD   r   s    r   reset_input_bufferzSerial.reset_input_buffer_  s>    | 	%"$$$)5+>AT+TUUUUUr   c                     | j         st                      t          j        | j        t          j        t          j        z             dS )zs        Clear output buffer, aborting the current output and discarding all
        that is in the buffer.
        N)r&   r   r   r@   r   rA   rB   r   s    r   reset_output_bufferzSerial.reset_output_buffere  s@    
 | 	%"$$$)5+>AT+TUUUUUr   c                     | j         st                      | j        rt          j        | j                   dS t          j        | j                   dS )zBSet break: Controls TXD. When active, to transmitting is possible.N)r&   r   _break_stater   SetCommBreakr   ClearCommBreakr   s    r   _update_break_statezSerial._update_break_staten  sW    | 	%"$$$ 	4t011111 !233333r   c                     | j         r&t          j        | j        t          j                   dS t          j        | j        t          j                   dS )z)Set terminal status line: Request To SendN)r|   r   EscapeCommFunctionr   SETRTSCLRRTSr   s    r   _update_rts_statezSerial._update_rts_statew  I    ? 	F$T%6EEEEE$T%6EEEEEr   c                     | j         r&t          j        | j        t          j                   dS t          j        | j        t          j                   dS )z-Set terminal status line: Data Terminal ReadyN)r   r   r   r   SETDTRCLRDTRr   s    r   _update_dtr_statezSerial._update_dtr_state~  r   r   c                     | j         st                      t          j                    }t          j        | j        t          j        |                     |j        S r   )	r&   r   r   r   GetCommModemStatusr   r5   r>   r   )r   stats     r   _GetCommModemStatuszSerial._GetCommModemStatus  sK    | 	%"$$${}} !2FL4F4FGGGzr   c                 L    t           j        |                                 z  dk    S )z(Read terminal status line: Clear To Sendr   )r   	MS_CTS_ONr   r   s    r   ctsz
Serial.cts  "     !9!9!;!;;q@@r   c                 L    t           j        |                                 z  dk    S )z)Read terminal status line: Data Set Readyr   )r   	MS_DSR_ONr   r   s    r   dsrz
Serial.dsr  r   r   c                 L    t           j        |                                 z  dk    S )z)Read terminal status line: Ring Indicatorr   )r   
MS_RING_ONr   r   s    r   riz	Serial.ri  #     $":":"<"<<AAr   c                 L    t           j        |                                 z  dk    S )z)Read terminal status line: Carrier Detectr   )r   
MS_RLSD_ONr   r   s    r   cdz	Serial.cd  r   r   r$   Nc                 D    ||}t          j        | j        ||           dS )z        Recommend a buffer size to the driver (device driver can ignore this
        value). Must be called after the port is opened.
        N)r   r:   r   )r   rx_sizetx_sizes      r   set_buffer_sizezSerial.set_buffer_size  s+    
 ?G)7G<<<<<r   Tc                     | j         st                      |r&t          j        | j        t          j                   dS t          j        | j        t          j                   dS )a*          Manually control flow - when software flow control is enabled.
        This will do the same as if XON (true) or XOFF (false) are received
        from the other device and control the transmission accordingly.
        WARNING: this function is not portable to different platforms!
        N)r&   r   r   r   r   SETXONSETXOFF)r   enables     r   set_output_flow_controlzSerial.set_output_flow_control  s_     | 	%"$$$ 	G$T%6EEEEE$T%6FFFFFr   c                 @   t          j                    }t          j                    }t          j        | j        t          j        |          t          j        |                    s3t          d                    t          j	                                        |j
        S )z0Return how many bytes the in the outgoing bufferr   )r   r   r   r   r   r5   r>   r   r3   r6   cbOutQuer   s      r   r   zSerial.out_waiting  sx     -//#D$5v|E7J7JFLY`LaLabb 	\!"@"G"GHYHY"Z"Z[[[r   c                 B   t          j                    }t          j        | j        t	          j        |          t	          j        |          d          }|sGt          j                    t           j        t           j        fv rt          j	        | j        |           dS dS dS )ACancel a blocking read operation, may be called from other threadFN)
r   r   r   r   r5   r>   r   r   ERROR_IO_INCOMPLETE
CancelIoEx)r   
overlappedr   errs       r   _cancel_overlapped_iozSerial._cancel_overlapped_io  s     []]'L$$L	 
  	<u)++0FHa/bbbT.
;;;;;	< 	<bbr   c                 :    |                      | j                   dS )r   N)r  r   r   s    r   r   zSerial.cancel_read  s    ""4#899999r   c                 :    |                      | j                   dS )zBCancel a blocking write operation, may be called from other threadN)r  r   r   s    r   r   zSerial.cancel_write  s    ""4#9:::::r   c                     |$|s"t          d                    |                    t          j        j                            | |           dS )z$Change the exclusive access setting.Nz.win32 only supports exclusive access (not: {}))r+   r3   r\   r   	exclusive__set__)r   r  s     r   r  zSerial.exclusive  sO       MTTU^__```'//i@@@@@r   )r#   )r$   N)T)#__name__
__module____qualname____doc__	BAUDRATESr   rG   r?   rE   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  setter__classcell__)r   s   @r   r   r      sS       ??4I6 6 6 6 6?  ?  ? B|D |D |DB% % % ! ! !   X' ' ' 'R# # #J  V V VV V V4 4 4F F FF F F   A A XA A A XA B B XB B B XB= = = =G G G G     X < < <: : :; ; ;  A A ! A A A A Ar   r   )
__future__r   r5   r   r\   r   serial.serialutilr   r   r   r   r	   r    r   r   <module>r     s    ' & & & & &          m m m m m m m m m m m m m mFA FA FA FA FAZ FA FA FA FA FAr   