dbfdg 3 M]Ws@sXddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZGdddeZejjZedddkrddlZdZdZd Zd Zd Zd Zd ZdZdZGdddeZnZedkrGdddeZn@edddkrddlZdZGdddeZnGdddeZe eddZ!e eddZ"e eddZ#e edd Z$e ed!d Z%e ed"dZ&e ed#d$Z'e ed%d&Z(e ed'd(Z)e ed)d*Z*e ed+e(Z+e ed,e)Z,e-ed-rej.Z.n e ed.d/Z.e ed0d1Z/ej0d2dZ1ej0d2e&Z2ej0d2e%Z3e ed3d4Z4e ed5d6Z5d7Z6Gd8d9d9e eZ7Gd:d;d;e7Z8GdN) SerialBaseSerialExceptionto_bytesportNotOpenErrorwriteTimeoutErrorc@s eZdZiZddZddZdS)PlatformSpecificBasecCs tddS)Nz9non-standard baudrates are not supported on this platform)NotImplementedError)selfbaudrater !/usr/lib/python3.6/serialposix.py_set_special_baudrate.sz*PlatformSpecificBase._set_special_baudratecCs tddS)Nz$RS485 not supported on this platform)r)r rs485_settingsr r r _set_rs485_mode1sz$PlatformSpecificBase._set_rs485_modeN)__name__ __module__ __qualname__BAUDRATE_CONSTANTSr rr r r r r+srlinuxl*TXi+T,@ii.Ti/Tc @s`eZdZddddddddd d d d d ddddddddddddddddddd Zd!d"Zd#d$Zd%S)&PlatformSpecificrrrrr iiiiiiiii i i i i ii)r2Kni,iXiii` ii%iKiiiiii iii@Bii`ii%&i-ig5i =cCstjddgd}yXtj|jt||dtjM<|dtO<||d<|d<tj|jt|Wn2t k r}zt dj ||WYdd}~XnXdS)Nir@rrr z'Failed to set custom baud rate ({}): {}) arrayfcntlioctlfdTCGETS2termiosZCBAUDBOTHERTCSETS2IOError ValueErrorformat)r r bufer r r r lsz&PlatformSpecific._set_special_baudratecCsFtjddgd}ytj|jt||dtO<|dk r|jrT|dtO<n|dtM<|jr~|dt O<n|dt M<|j r|dt O<n|dt M<|j dk rt |j d|d<|jdk rt |jd|d<nd|d<tj|jt|Wn2tk r@}ztdj|WYdd}~XnXdS)Nr,rrirrzFailed to set RS485 mode: {})r.r/r0r1 TIOCGRS485SER_RS485_ENABLEDZloopbackSER_RS485_RX_DURING_TXZrts_level_for_txSER_RS485_RTS_ON_SENDZrts_level_for_rxSER_RS485_RTS_AFTER_SENDZdelay_before_txintZdelay_before_rx TIOCSRS485r6r7r8)r rr9r:r r r r|s,  z PlatformSpecific._set_rs485_modeN)rrrrr rr r r r rIsBrcygwinc @s(eZdZddddddddd d d d Zd S)riiiii i i i i ii) iii iii@Bii`ii%&i-N)rrrrr r r r rsrdarwinlTc@s6eZdZejdjdZeeddkr2ddZdS)rr.rrcCs$tjd|g}tj|jt|ddS)Nr,r)r.r/r0r1 IOSSIOSPEED)r r r9r r r r sz&PlatformSpecific._set_special_baudrateN) rrrosunamesplitZ osx_versionr@r r r r r rsc@s eZdZdS)rN)rrrr r r r rsTIOCMGETiTTIOCMBISiTTIOCMBICiTTIOCMSETiT TIOCM_DTR TIOCM_RTS TIOCM_CTS TIOCM_CARr- TIOCM_RNG TIOCM_DSRTIOCM_CDTIOCM_RITIOCINQZFIONREADiTTIOCOUTQiTITIOCSBRKi'TTIOCCBRKi(Ti@c@seZdZdZddZd7ddZddZed d Zd8d d Z ddZ ddZ ddZ ddZ ddZddZd9ddZddZdd Zd!d"Zed#d$Zed%d&Zed'd(Zed)d*Zed+d,Zd-d.Zd:d0d1Zd;d2d3Zd4d5Zd6S)<Serialz Serial port class POSIX implementation. Serial port configuration is done with termios and fcntl. Runs on Linux and many other Un*x like systems. c,Cs||jdkrtd|jr tdd|_y"tj|jtjtjBtj B|_Wn>t k r}z"d|_t|j dj |j|WYdd}~XnXy|j ddWn2ytj|jWn YnXd|_YnXd|_y |js|j|js|jWn4tk r&}z|j dkrnWYdd}~XnX|jtj\|_|_tj\|_|_tj|jtjtj tj|jtjtj dS)zo 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.zPort is already open.zcould not open port {}: {}T) force_update)Z_portris_openr1rFopenZportstrO_RDWRO_NOCTTY O_NONBLOCKOSErrorerrnor8_reconfigure_portcloseZ_dsrdtr_update_dtr_state_rtscts_update_rts_stater6reset_input_bufferpipepipe_abort_read_rpipe_abort_read_wpipe_abort_write_rpipe_abort_write_wr/F_SETFL)r msgr:r r r rasD "(  z Serial.openFc,Cs~|jdkrtdd}d}}|jdk r:d}t|jd}y"tj|j}|\}}}} } } } Wn2tjk r} ztdj| WYdd} ~ XnX|tjtj BO}| tj tj Btj Btj BtjBtjBtjBM} x&dD]}tt|r| tt|M} qW|tjtjBtjBM}|tjtjBtjBtjBM}ttd rF|tjM}ttd r^|tjM}yttd j|j} } Wntk ry|j|j} } Wnttk rttd } } yt|j}Wn&t k rt d j|jYnX|dkrt d j|jYnXYnX|tj!M}|j"dkr>|tj#O}nX|j"dkrV|tj$O}n@|j"dkrn|tj%O}n(|j"dkr|tj&O}nt dj|j"|j't(j)kr|tj*M}nD|j't(j+kr|tj*O}n*|j't(j,kr|tj*O}nt dj|j'|tj-tj.BM}|j/t(j0kr*|tj1tj2BM}n|j/t(j3krP|tj2M}|tj1O}n|j/t(j4krp|tj1tj2BO}n|j/t(j5krt6dddkr|tj1t7Btj2BO}nL|j/t(j8krt6dddkr|tj1t7BO}|tj2M}nt dj|j/ttdr2|j9r|tj:tj;BO}n|tj:tj;BtjO}n |tj>M}n,ttdr|j=r|tj?O}n |tj?M}|dks|dkrt dj||| tj@<|dks|dkrt dj||| tjA<|s.|||| | | | g|krNtjB|jtjC|||| | | | g|dk rb|jD||jEdk rz|jF|jEdS)z,Set communication parameters on opened port.Nz+Can only operate on a valid file descriptorrrr zCould not configure port: {}ECHOCTLECHOKEIUCLCPARMRKzB{}ZB38400zInvalid baud rate: {!r}rrrrzInvalid char len: {!r}z$Invalid stop bit specification: {!r}rzInvalid parity: {!r}IXANYCRTSCTS CNEW_RTSCTSzInvalid vmin: {!r}zInvalid vtime: {!r})rtru)Gr1r_inter_byte_timeoutr@r3 tcgetattrerrorr8ZCLOCALZCREADZICANONZECHOZECHOEZECHOKZECHONLZISIGZIEXTENhasattrgetattrZOPOSTZONLCRZOCRNLZINLCRZIGNCRZICRNLZIGNBRKrvrwZ _baudrateAttributeErrorrKeyErrorr7ZCSIZEZ _bytesizeZCS8ZCS7ZCS6ZCS5Z _stopbitsserialZ STOPBITS_ONEZCSTOPBZSTOPBITS_ONE_POINT_FIVEZ STOPBITS_TWOZINPCKZISTRIPZ_parityZ PARITY_NONEZPARENBZPARODDZ PARITY_EVENZ PARITY_ODDZ PARITY_MARKplatCMSPARZ PARITY_SPACEZ_xonxoffZIXONZIXOFFrxrjryrzVMINVTIME tcsetattrTCSANOWr Z _rs485_moder)r r^Z custom_baudvminvtime orig_attriflagoflagcflaglflagispeedospeedccrsflagr r r rgs    .                                 zSerial._reconfigure_portcCst|jrp|jdk rjtj|jd|_tj|jtj|jtj|jtj|jd\|_|_d\|_|_d|_dS)z Close portNF)NN)NN)r`r1rFrhrornrqrp)r r r r rhs        z Serial.closecCs tj|jtt}tjd|dS)z9Return the number of bytes currently in the input buffer.rZr)r/r0r1rXTIOCM_zero_strstructunpack)r sr r r in_waitingszSerial.in_waitingrc CsX|js tt}|j}x6t||krNyvtj}tj|j|jggg|\}}}|j|krjt j |jdP|spPt j |j|t|}|st d|j |Wnt k r}z,|jtjkr|jtjkrt dj|WYdd}~XnDtjk r(}z$|dtjkrt dj|WYdd}~XnX|dk r|tj|8}|dkrPqWt|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. izgdevice reports readiness to read but returned no data (device disconnected or multiple access on port?)zread failed: {}Nr)r`r bytearray_timeoutlentimeselectr1rnrFreadrextendrerfEAGAINZEINTRr8r~bytes) r sizertimeoutZ start_timeready_r9r:r r r rs:  z Serial.readcCstj|jddS)Nx)rFwritero)r r r r cancel_readszSerial.cancel_readcCstj|jddS)Nr)rFrrq)r r r r cancel_writeszSerial.cancel_writec Cs|js tt|}t|}|j}|r8|dkr8|tj7}xT|dkrytj|j|}|dkrb|S|r|dkr|tj}|dkrt t j |j g|jgg|\}}} |rtj |j dP|st n@t j |j g|jggd\}}} |rtj |j dP|st d||d}||8}Wq<t k r0Yq<tk r} z>| jtjkr^t dj| |rz|tjdkrzt WYdd} ~ Xqd}t|jd}nd}t|jd}y"t j |j}|\}}}}} } } Wn4t j k r} zt j dj| WYdd} ~ XnX|dks|dkrtdj||| t j<|| t j<t j|jt j||||| | | gdS)z,Set communication parameters on opened port.rNrr zCould not configure port: {}r{zInvalid vtime: {!r})superrrgr/r1rrr|r@rr3r}r~rrr8r7rrrr) r r^rrrrrrrrrrrs) __class__r r rgs(  "  zVTIMESerial._reconfigure_portrcCsP|js tt}x6t||krFtj|j|t|}|s:P|j|qWt|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`rrrrFrr1rr)r rrr9r r r rszVTIMESerial.read)T)r)rrrrrgr __classcell__r r )rr rsr):rfr/rFrrsysr3rrZserial.serialutilrrrrrobjectrplatformlowerrr.r2r5r4r;rAr<r>r?r=rrErrIrJrKrLrMrNrOrQrRrTrVrWrrXrYpackrrrr[r\rr]rrr r r r st P                     J#