<s> '''<STR_LIT>''' <EOL> import serial <EOL> import time <EOL> import threading <EOL> import sys <EOL> _max_trys = <NUM_LIT:3> <EOL> CMD_READY = <NUM_LIT:0> <EOL> CMD_STEPS = <NUM_LIT:1> <EOL> CMD_EXEC_QUEUE = <NUM_LIT:2> <EOL> class Dobot : <EOL> def __init__ ( self , comport , rate ) : <EOL> self . _lock = threading . Lock ( ) <EOL> self . _comport = comport <EOL> self . _rate = rate <EOL> self . _port = None <EOL> self . _crc = <NUM_LIT> <EOL> def Open ( self , timeout = <NUM_LIT:0.1> ) : <EOL> self . _port = serial . Serial ( self . _comport , baudrate = self . _rate , timeout = timeout , interCharTimeout = <NUM_LIT> ) <EOL> def Close ( self ) : <EOL> self . _port . close ( ) <EOL> def _crc_clear ( self ) : <EOL> self . _crc = <NUM_LIT> <EOL> def _crc_update ( self , data ) : <EOL> self . _crc = self . _crc ^ ( data << <NUM_LIT:8> ) <EOL> for bit in range ( <NUM_LIT:0> , <NUM_LIT:8> ) : <EOL> if ( self . _crc & <NUM_LIT> ) == <NUM_LIT> : <EOL> self . _crc = ( ( self . _crc << <NUM_LIT:1> ) ^ <NUM_LIT> ) <EOL> else : <EOL> self . _crc = self . _crc << <NUM_LIT:1> <EOL> def _readchecksumword ( self ) : <EOL> data = self . _port . read ( <NUM_LIT:2> ) <EOL> if len ( data ) == <NUM_LIT:2> : <EOL> crc = ( ord ( data [ <NUM_LIT:0> ] ) << <NUM_LIT:8> ) | ord ( data [ <NUM_LIT:1> ] ) <EOL> return ( <NUM_LIT:1> , crc ) <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _readbyte ( self ) : <EOL> data = self . _port . read ( <NUM_LIT:1> ) <EOL> if len ( data ) : <EOL> val = ord ( data ) <EOL> self . _crc_update ( val ) <EOL> return ( <NUM_LIT:1> , val ) <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _readlong ( self ) : <EOL> val1 = self . _readbyte ( ) <EOL> if val1 [ <NUM_LIT:0> ] : <EOL> val2 = self . _readbyte ( ) <EOL> if val2 [ <NUM_LIT:0> ] : <EOL> val3 = self . _readbyte ( ) <EOL> if val3 [ <NUM_LIT:0> ] : <EOL> val4 = self . _readbyte ( ) <EOL> if val4 [ <NUM_LIT:0> ] : <EOL> return ( <NUM_LIT:1> , val1 [ <NUM_LIT:1> ] << <NUM_LIT> | val2 [ <NUM_LIT:1> ] << <NUM_LIT:16> | val3 [ <NUM_LIT:1> ] << <NUM_LIT:8> | val4 [ <NUM_LIT:1> ] ) <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _readslong ( self ) : <EOL> val = self . _readlong ( ) <EOL> if val [ <NUM_LIT:0> ] : <EOL> if val [ <NUM_LIT:1> ] & <NUM_LIT> : <EOL> return ( val [ <NUM_LIT:0> ] , val [ <NUM_LIT:1> ] - <NUM_LIT> ) <EOL> return ( val [ <NUM_LIT:0> ] , val [ <NUM_LIT:1> ] ) <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _read1 ( self , cmd ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _port . flushInput ( ) <EOL> self . _sendcommand ( cmd ) <EOL> val1 = self . _readbyte ( ) <EOL> if val1 [ <NUM_LIT:0> ] : <EOL> crc = self . _readchecksumword ( ) <EOL> if crc [ <NUM_LIT:0> ] : <EOL> if self . _crc & <NUM_LIT> != crc [ <NUM_LIT:1> ] & <NUM_LIT> : <EOL> raise Exception ( '<STR_LIT>' , self . _crc , crc ) <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> return ( <NUM_LIT:1> , val1 [ <NUM_LIT:1> ] ) <EOL> trys -= <NUM_LIT:1> <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _read4 ( self , cmd ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _port . flushInput ( ) <EOL> self . _sendcommand ( cmd ) <EOL> val1 = self . _readlong ( ) <EOL> if val1 [ <NUM_LIT:0> ] : <EOL> crc = self . _readchecksumword ( ) <EOL> if crc [ <NUM_LIT:0> ] : <EOL> if self . _crc & <NUM_LIT> != crc [ <NUM_LIT:1> ] & <NUM_LIT> : <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> return ( <NUM_LIT:1> , val1 [ <NUM_LIT:1> ] ) <EOL> trys -= <NUM_LIT:1> <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _read4_1 ( self , cmd ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _port . flushInput ( ) <EOL> self . _sendcommand ( cmd ) <EOL> val1 = self . _readslong ( ) <EOL> if val1 [ <NUM_LIT:0> ] : <EOL> val2 = self . _readbyte ( ) <EOL> if val2 [ <NUM_LIT:0> ] : <EOL> crc = self . _readchecksumword ( ) <EOL> if crc [ <NUM_LIT:0> ] : <EOL> if self . _crc & <NUM_LIT> != crc [ <NUM_LIT:1> ] & <NUM_LIT> : <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> return ( <NUM_LIT:1> , val1 [ <NUM_LIT:1> ] , val2 [ <NUM_LIT:1> ] ) <EOL> trys -= <NUM_LIT:1> <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def _writebyte ( self , val ) : <EOL> self . _crc_update ( val & <NUM_LIT> ) <EOL> self . _port . write ( chr ( val & <NUM_LIT> ) ) <EOL> def _writeword ( self , val ) : <EOL> self . _writebyte ( ( val >> <NUM_LIT:8> ) & <NUM_LIT> ) <EOL> self . _writebyte ( val & <NUM_LIT> ) <EOL> def _writelong ( self , val ) : <EOL> self . _writebyte ( ( val >> <NUM_LIT> ) & <NUM_LIT> ) <EOL> self . _writebyte ( ( val >> <NUM_LIT:16> ) & <NUM_LIT> ) <EOL> self . _writebyte ( ( val >> <NUM_LIT:8> ) & <NUM_LIT> ) <EOL> self . _writebyte ( val & <NUM_LIT> ) <EOL> def _writechecksum ( self ) : <EOL> self . _writeword ( self . _crc & <NUM_LIT> ) <EOL> val = self . _readbyte ( ) <EOL> if val [ <NUM_LIT:0> ] : <EOL> return True <EOL> return False <EOL> def _sendcommand ( self , command ) : <EOL> self . _crc_clear ( ) <EOL> self . _crc_update ( command ) <EOL> self . _port . write ( chr ( command ) ) <EOL> return <EOL> def _write0 ( self , cmd ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _sendcommand ( cmd ) <EOL> if self . _writechecksum ( ) : <EOL> return True <EOL> trys = trys - <NUM_LIT:1> <EOL> return False <EOL> def _write1 ( self , cmd , val ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _sendcommand ( cmd ) <EOL> self . _writebyte ( val ) <EOL> if self . _writechecksum ( ) : <EOL> return True <EOL> trys = trys - <NUM_LIT:1> <EOL> return False <EOL> def _write2 ( self , cmd , val ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _sendcommand ( cmd ) <EOL> self . _writeword ( val ) <EOL> if self . _writechecksum ( ) : <EOL> return True <EOL> trys = trys - <NUM_LIT:1> <EOL> return False <EOL> def _write4 ( self , cmd , val ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _sendcommand ( cmd ) <EOL> self . _writelong ( val ) <EOL> if self . _writechecksum ( ) : <EOL> return True <EOL> trys = trys - <NUM_LIT:1> <EOL> return False <EOL> def _write14 ( self , cmd , val1 , val2 ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _sendcommand ( cmd ) <EOL> self . _writebyte ( val1 ) <EOL> self . _writelong ( val2 ) <EOL> if self . _writechecksum ( ) : <EOL> return True <EOL> trys = trys - <NUM_LIT:1> <EOL> return False <EOL> def _write11121read1 ( self , cmd , val1 , val2 , val3 , val4 , val5 ) : <EOL> trys = _max_trys <EOL> while trys : <EOL> self . _sendcommand ( cmd ) <EOL> self . _writebyte ( val1 ) <EOL> self . _writebyte ( val2 ) <EOL> self . _writebyte ( val3 ) <EOL> self . _writeword ( val4 ) <EOL> self . _writebyte ( val5 ) <EOL> self . _writeword ( self . _crc & <NUM_LIT> ) <EOL> self . _port . flushInput ( ) <EOL> self . _crc_clear ( ) <EOL> ret = self . _readbyte ( ) <EOL> if ret [ <NUM_LIT:0> ] : <EOL> crc = self . _readchecksumword ( ) <EOL> if crc [ <NUM_LIT:0> ] : <EOL> if self . _crc & <NUM_LIT> != crc [ <NUM_LIT:1> ] & <NUM_LIT> : <EOL> raise Exception ( '<STR_LIT>' , self . _crc , crc ) <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> return ( <NUM_LIT:1> , ret [ <NUM_LIT:1> ] ) <EOL> trys = trys - <NUM_LIT:1> <EOL> return ( <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def Steps ( self , j1 , j2 , j3 , ticks , j1dir , j2dir , j3dir , deferred ) : <EOL> '''<STR_LIT>''' <EOL> control = ( ( j1dir & <NUM_LIT> ) << <NUM_LIT:1> ) | ( ( j2dir & <NUM_LIT> ) << <NUM_LIT:2> ) | ( ( j3dir & <NUM_LIT> ) << <NUM_LIT:3> ) ; <EOL> if deferred : <EOL> control |= <NUM_LIT> <EOL> self . _lock . acquire ( ) <EOL> result = self . _write11121read1 ( CMD_STEPS , j1 , j2 , j3 , ticks , control ) <EOL> self . _lock . release ( ) <EOL> return result <EOL> def ExecQueue ( self ) : <EOL> '''<STR_LIT>''' <EOL> self . _lock . acquire ( ) <EOL> result = self . _write0 ( CMD_EXEC_QUEUE ) <EOL> self . _lock . release ( ) <EOL> return result <EOL> def isReady ( self ) : <EOL> '''<STR_LIT>''' <EOL> self . _lock . acquire ( ) <EOL> result = self . _read1 ( CMD_READY ) <EOL> self . _lock . release ( ) <EOL> return [ result [ <NUM_LIT:0> ] , result [ <NUM_LIT:1> ] ] <EOL> def reset ( self ) : <EOL> i = <NUM_LIT:0> <EOL> while i < <NUM_LIT:5> : <EOL> self . _port . flushInput ( ) <EOL> self . _port . read ( <NUM_LIT:1> ) <EOL> i += <NUM_LIT:1> <EOL> self . _crc_clear ( ) </s>
