o 1_7@sddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z m Z mZmZmZGdddeZdZejZedddkrnddlZdZd Zd Zd Zd Zd ZdZdZdZdZ GdddeZ!n]edkr{GdddeZ!nPedddkrddlZdZ"GdddeZ!n9edddksedddksedddksedddkrGd d!d!eZ#Gd"ddeZ!nGd#ddeZ!e$ed$d%Z%e$ed&d'Z&e$ed(d)Z'e$ed*d+Z(e$ed,dZ)e$ed-dZ*e$ed.d/Z+e$ed0d1Z,e$ed2d3Z-e$ed4d5Z.e$ed6e,Z/e$ed7e-Z0e1ed8rej2Z2ne$ed9d:Z2e$ed;d<Z3e4d=dZ5e4d=e*Z6e4d=e)Z7e$ed>d?Z8e$ed@dAZ9GdBdCdCe e!Z:GdDdEdEe:Z;GdFdGdGe:Zr?r@rArBrCrDrE) iirFrGrHrIrJrKrLrMrNN)rr r!r"rrrrr)s r1darwinlTc@sFeZdZeddZdZdZe eddkrddZ d d Z d S) r)r&.{t zt rr3cCs$td|g}t|jt|ddS)NrOr%)rQrrr IOSSIOSPEED)r rrXrrrrsr_cC.|jr t|jtjdSt|jtjdSz[ Set break: Controls TXD. When active, no transmitting is possible. Nrrrrr)rrrrrrr$PlatformSpecific._update_break_stateN) rr r!osunamesplit osx_versionrrrjrrrrrrr)s r-bsdr2freebsdnetbsdopenbsdc@seZdZddZdS)ReturnBaudratecCs|S)Nr)r keyrrr __getitem__szReturnBaudrate.__getitem__N)rr r!rrrrrrs rc@s"eZdZeZdZdZddZdS)r)rprqcCrsrtrurrrrrrvrwN)rr r!rr"rrrrrrrr)s  c@s eZdZdS)r)N)rr r!rrrrr) sTIOCMGETiTTIOCMBISiTTIOCMBICiTTIOCMSETiT TIOCM_DTR TIOCM_RTS TIOCM_CTSrP TIOCM_CARrZ TIOCM_RNG TIOCM_DSRTIOCM_CDTIOCM_RITIOCINQFIONREADiTTIOCOUTQiTIri'Tri(Tc@seZdZdZddZd7ddZddZed d Zd8d d Z ddZ ddZ ddZ ddZ ddZddZddZd9ddZdd 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|jdur td|jrtdd|_zt|jtjtjBtj B|_Wnt y>}zd|_t|j d |j|d}~wwd\|_ |_d\|_|_z]|jddz|jsZ||jsa|Wnty~}z|j t jt jfvrtWYd}~nd}~ww|t\|_ |_t\|_|_t|j tjtj t|jtjtj WnUtyzt|jWn tyYnwd|_|jdurt|jd|_|j durt|j d|_ |jdurt|jd|_|jdurt|jd|_wd|_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 {}: {}NNT) force_update) _portris_openrrxopenportstrO_RDWRO_NOCTTY O_NONBLOCKOSErrorerrnorWpipe_abort_read_rpipe_abort_read_wpipe_abort_write_rpipe_abort_write_w_reconfigure_port_dsrdtr_update_dtr_state_rtscts_update_rts_staterUEINVALENOTTY_reset_input_bufferpiperF_SETFL BaseExceptionclose Exception)r msgrYrrrr7sn "               z Serial.openFcCs|jdur td|jdur>|jr6z t|jtjtjBWnty5}z t|jd |j |d}~wwt|jtj d}d}}|j durRd}t |j d}zt|j}|\}}} } } } } Wntjyw}ztd |d}~ww| tjtjBO} | tjtjBtjBtjBtjBtjBtjBM} dD]}tt|r| tt|M} q|tjtjBtjBM}|tjtj Btj!Btj"BM}ttd r|tj#M}ttd r|tj$M}z ttd |j%} } Wn\t&yDz |j'|j%} } WnGt(yAzt)} } Wnt*yttd } } Ynwzt |j%}Wnt+y1t+d |j%w|dkr?t+d |j%YnwYnw| tj,M} |j-dkrW| tj.O} n,|j-dkrc| tj/O} n |j-dkro| tj0O} n|j-dkr{| tj1O} nt+d |j-|j2t3j4kr| tj5M} n"|j2t3j6kr| tj5O} n|j2t3j7kr| tj5O} nt+d |j2|tj8tj9BM}|j:t3j;kr| tjBM} n_|j:t3j?kr| tj=t>BM} | tjM} | tjr| tjBtj=BO} n |j:t3jBkr&t>r&| tjBO} | tj=M} nt+d |j:ttdrN|jCrA|tjDtjEBO}n#|tjDtjEBtjFBM}n|jCr[|tjDtjEBO}n |tjDtjEBM}ttdr{|jGrt| tjHO} n| tjHM} nttdr|jGr| tjIO} n| tjIM} |dks|dkrt+d ||| tjJ<|dks|dkrt+d ||| tjK<|s||| | | | | g|krtL|jtjM||| | | | | g|dur|N||jOdur|P|jOdSdS),Set communication parameters on opened port.Nz+Can only operate on a valid file descriptorz&Could not exclusively lock port {}: {}rr%r5Could not configure port: {})ECHOCTLECHOKEIUCLCPARMRKzB{}B38400zInvalid baud rate: {!r}r3r2r1r#zInvalid char len: {!r}z$Invalid stop bit specification: {!r}zInvalid parity: {!r}IXANYCRTSCTS CNEW_RTSCTSzInvalid vmin: {!r}Invalid vtime: {!r})Qrr _exclusiverflockLOCK_EXLOCK_NBrUrrWrLOCK_UN_inter_byte_timeoutrjrR tcgetattrerrorCLOCALCREADICANONECHOECHOEECHOKECHONLISIGIEXTENhasattrgetattrOPOSTONLCROCRNLINLCRIGNCRICRNLIGNBRKrr _baudrateAttributeErrorr"KeyErrorr] NameErrorrVCSIZE _bytesizeCS8CS7CS6CS5 _stopbitsserial STOPBITS_ONECSTOPBSTOPBITS_ONE_POINT_FIVE STOPBITS_TWOINPCKISTRIP_parity PARITY_NONEPARENBPARODDCMSPAR PARITY_EVEN PARITY_ODD PARITY_MARK PARITY_SPACE_xonxoffIXONIXOFFrrrrVMINVTIME tcsetattrTCSANOWr _rs485_moder)r rr custom_baudvminvtime orig_attriflagoflagcflaglflagispeedospeedccflagrrrrxs                                   zSerial._reconfigure_portcCsx|jr:|jdur5t|jd|_t|jt|jt|jt|jd\|_|_d\|_|_d|_dSdS)z Close portNrF)rrrxrrrrrrrrrrs         z Serial.closecC t|jtt}td|dS)z9Return the number of bytes currently in the input buffer.rr)rrrrTIOCM_zero_strstructunpackr srrr in_waiting!zSerial.in_waitingr%c Cst|jstt}t|j}t||krz6t|j|jggg| \}}}|j|vr7t |jdWt|S|s>Wt|St |j|t|}WnQt yr}z|j t jt jt jt jt jfvrhtd|WYd}~n9d}~wtjy}z|dt jt jt jt jt jfvrtd|WYd}~nd}~ww|std|||r t|St||kst|S) 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`zread failed: {}Nrzgdevice reports readiness to read but returned no data (device disconnected or multiple access on port?))rr bytearrayr_timeoutlenselectrr time_leftrxreadrrEAGAINEALREADY EWOULDBLOCK EINPROGRESSEINTRrrWrextendexpiredbytes)r sizertimeoutready_rXrYrrrr)sH  " "      'z Serial.readcC|jr t|jddSdSNx)rrxwriterrrrr cancel_read\zSerial.cancel_readcCr#r$)rrxr&rrrrr cancel_write`r(zSerial.cancel_writec Cs|jstt|}t|}}t|j}|dkrzot|j|}|j r'|WS|j sU| r2t dt |jg|jgg|\}}} |rNt|jdWn|sTt dn(|dus]Jt |jg|jggd\}}} |rwt|jdWny|s}td||d}||8}WnXtyty} z| jtjtjtjtjtjfvrtd| WYd} ~ n.d} ~ wt jy} z| dtjtjtjtjtjfvrtd| WYd} ~ nd} ~ ww|j s| rt d|dks|t|S)z2Output the given byte string over the serial port.rz Write timeoutr`Nr%zwrite failed (select)zwrite failed: {})rrrrr_write_timeoutrxr&ris_non_blocking is_infiniterrrrrrrrrrrrrrrWr) r datadtx_lenlengthr nabortr!r"rYrrrr&ds\  "       -z Serial.writecCs|jstt|jdS)zb Flush of file like objects. In this case, wait until all data is written. N)rrrRtcdrainrrrrrflushsz Serial.flushcCst|jtjdSz9Clear input buffer, discarding all that is in the buffer.N)rRtcflushrTCIFLUSHrrrrrszSerial._reset_input_buffercCs|jst|dSr5)rrrrrrrreset_input_buffers zSerial.reset_input_buffercCs |jstt|jtjdS)zs Clear output buffer, aborting the current output and discarding all that is in the buffer. N)rrrRr6rTCOFLUSHrrrrreset_output_bufferszSerial.reset_output_buffer?cCs&|jstt|jt|ddS)za Send break condition. Timed, returns to idle state after given duration. r;N)rrrR tcsendbreakrrj)r durationrrr send_breakszSerial.send_breakcC.|jr t|jttdSt|jttdS)z)Set terminal status line: Request To SendN) _rts_staterrrr TIOCM_RTS_strrrrrrrzSerial._update_rts_statecCr?)z-Set terminal status line: Data Terminal ReadyN) _dtr_staterrrr TIOCM_DTR_strrrrrrrrBzSerial._update_dtr_statecC4|jstt|jtt}td|dt @dkS)z(Read terminal status line: Clear To Sendrr) rrrrrrr r r rr rrrctsz Serial.ctscCrE)z)Read terminal status line: Data Set Readyrr) rrrrrrr r r rr rrrdsrrGz Serial.dsrcCrE)z)Read terminal status line: Ring Indicatorrr) rrrrrrr r r rr rrrrirGz Serial.ricCrE)z)Read terminal status line: Carrier Detectrr) rrrrrrr r r rr rrrcdrGz Serial.cdcCr)z:Return the number of bytes currently in the output buffer.rr)rrrrr r r r rrr out_waitingrzSerial.out_waitingcCs|jst|jS)z For easier use of the serial port instance with select. WARNING: this function is not portable to different platforms! )rrrrrrrfilenosz Serial.filenoTcC8|jst|rt|jtjdSt|jtjdS)z Manually control flow - when software flow control is enabled. This will send XON (true) or XOFF (false) to the other device. WARNING: this function is not portable to different platforms! N)rrrRtcflowrTCIONTCIOFFr enablerrrset_input_flow_control zSerial.set_input_flow_controlcCrM)z Manually control flow of outgoing data - when hardware or software flow control is enabled. WARNING: this function is not portable to different platforms! N)rrrRrNrTCOONTCOOFFrQrrrset_output_flow_control rTzSerial.set_output_flow_controlcCsddl}|dtdS)zDEPRECATED - has no userNz0nonblocking() has no effect, already nonblocking)warningswarnDeprecationWarning)r rXrrr nonblockingszSerial.nonblockingN)Fr%)r;T)rr r!__doc__rrrpropertyrrr'r)r&r4rr8r:r>rrrFrHrIrJrKrLrSrWr[rrrrr0sB A  36         rc@seZdZdZdddZdS)PosixPollSerialz Poll based read implementation. Not all systems support poll properly. However this one has better handling of errors, such as a device disconnecting while it's in use (e.g. USB-serial unplugged). r%cCsN|jstt}t|j}t}||jtj tj Btj Btj B||j tj tj Btj Btj B|dkrt||kr||jrEdn|dD]\}}||j krWn|tj tj Btj B@rftdqL||j krxt|j d t|St|j|t|}|||s|jdur|jdkr|s t|St||ks>t|S)rrNr`zdevice reports error (poll))rrrrrrpollregisterrPOLLINPOLLERRPOLLHUPPOLLNVALrrr,rrrxrrrrr)r rrr rareventrXrrrr&s6 "" $    zPosixPollSerial.readNr\)rr r!r^rrrrrr`sr`cs2eZdZdZdfdd Zd ddZeZZS) VTIMESerialab Implement timeout using vtime of tty device instead of using select. This means that no inter character timeout can be specified and that the error handling is degraded. Overall timeout is disabled when inter-character timeout is used. Note that this implementation does NOT support cancel_read(), it will just ignore that. Tc stt|t|jtjd|jdurd}t|jd}n|jdur)d}d}n d}t|jd}zt |j}|\}}}}} } } Wnt j yX} zt d| d} ~ ww|dksa|dkrhtd||| t j<|| t j<t |jt j||||| | | gdS)rrNr%r5rrr)superrhrrrrrrjrrRrrrrrWrVrrrr) r rrrrrrrrrrrr __class__rrrUs4     zVTIMESerial._reconfigure_portr%cCs`|jstt}t||kr,t|j|t|}|s! t|S||t||kst|S)r) rrrrrxrrrr)r rrrXrrrrss  zVTIMESerial.readr]r\) rr r!r^rrr_r' __classcell__rrrjrrhIs  rh)= __future__rrrrxrr sysrRrserial.serialutilrrrrrrobjectr rplatformlowerplatrQr[r^r]rarlrbrfrhrdr)rrrrrrrrrrrrrrrrrrrpackr rArDrrrr`rhrrrrs   b                    r*