18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# sermsdos.py 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# History: 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 3rd September 2002 Dave Haynes 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 1. First defined 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# Although this code should run under the latest versions of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# Python, on DOS-based platforms such as Windows 95 and 98, 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# it has been specifically written to be compatible with 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# PyDOS, available at: 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# http://www.python.org/ftp/python/wpy/dos.html 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner# 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# PyDOS is a stripped-down version of Python 1.5.2 for 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# DOS machines. Therefore, in making changes to this file, 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# please respect Python 1.5.2 syntax. In addition, please 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# limit the width of this file to 60 characters. 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# Note also that the modules in PyDOS contain fewer members 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# than other versions, so we are restricted to using the 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# following: 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# In module os: 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ------------- 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# environ, chdir, getcwd, getpid, umask, fdopen, close, 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# dup, dup2, fstat, lseek, open, read, write, O_RDONLY, 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC, 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# access, F_OK, R_OK, W_OK, X_OK, chmod, listdir, mkdir, 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# remove, rename, renames, rmdir, stat, unlink, utime, 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# execl, execle, execlp, execlpe, execvp, execvpe, _exit, 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# system. 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# In module os.path: 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ------------------ 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner# curdir, pardir, sep, altsep, pathsep, defpath, linesep. 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerimport os 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport sys 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport string 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerimport serial.serialutil 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectBAUD_RATES = { 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 110: "11", 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 150: "15", 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 300: "30", 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 600: "60", 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1200: "12", 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2400: "24", 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4800: "48", 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9600: "96", 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19200: "19"} 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project(PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectPARITY_SPACE) = (0, 1, 2, 3, 4) 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project(STOPBITS_ONE, STOPBITS_ONEANDAHALF, 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSTOPBITS_TWO) = (1, 1.5, 2) 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8) 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project(RETURN_ERROR, RETURN_BUSY, RETURN_RETRY, RETURN_READY, 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectRETURN_NONE) = ('E', 'B', 'P', 'R', 'N') 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerportNotOpenError = ValueError('port not open') 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdef device(portnum): 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 'COM%d' % (portnum+1) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass Serial(serialutil.FileLike): 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """ 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port: number of device; numbering starts at 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project zero. if everything fails, the user can 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project specify a device string, note that this 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project isn't portable any more 725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner baudrate: baud rate 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bytesize: number of databits 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parity: enable parity checking 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stopbits: number of stopbits 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project timeout: set a timeout (None for waiting forever) 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project xonxoff: enable software flow control 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rtscts: enable RTS/CTS flow control 795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner retry: DOS retry mode 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def __init__(self, 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port, 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project baudrate = 9600, 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bytesize = EIGHTBITS, 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parity = PARITY_NONE, 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stopbits = STOPBITS_ONE, 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project timeout = None, 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project xonxoff = 0, 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rtscts = 0, 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project retry = RETURN_RETRY 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ): 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if type(port) == type(''): 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project # strings are taken directly 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.portstr = port 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else: 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project # numbers are transformed to a string 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.portstr = device(port+1) 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.baud = BAUD_RATES[baudrate] 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.bytesize = str(bytesize) 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if parity == PARITY_NONE: 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.parity = 'N' 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project elif parity == PARITY_EVEN: 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.parity = 'E' 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project elif parity == PARITY_ODD: 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.parity = 'O' 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project elif parity == PARITY_MARK: 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.parity = 'M' 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project elif parity == PARITY_SPACE: 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.parity = 'S' 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.stop = str(stopbits) 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.retry = retry 1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner self.filename = "sermsdos.tmp" 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self._config(self.portstr, self.baud, self.parity, 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.bytesize, self.stop, self.retry, self.filename) 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def __del__(self): 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.close() 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner def close(self): 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pass 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def _config(self, port, baud, parity, data, stop, retry, 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filename): 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project comString = string.join(("MODE ", port, ":" 1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner , " BAUD= ", baud, " PARITY= ", parity 1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner , " DATA= ", data, " STOP= ", stop, " RETRY= ", 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project retry, " > ", filename ), '') 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project os.system(comString) 1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def setBaudrate(self, baudrate): 1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner self._config(self.portstr, BAUD_RATES[baudrate], 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.parity, self.bytesize, self.stop, self.retry, 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.filename) 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def inWaiting(self): 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """returns the number of bytes waiting to be read""" 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def read(self, num = 1): 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Read num bytes from serial port""" 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project handle = os.open(self.portstr, 1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner os.O_RDONLY | os.O_BINARY) 1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner rv = os.read(handle, num) 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project os.close(handle) 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rv 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def write(self, s): 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Write string to serial port""" 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project handle = os.open(self.portstr, 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project os.O_WRONLY | os.O_BINARY) 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rv = os.write(handle, s) 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project os.close(handle) 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rv 1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def flushInput(self): 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def flushOutput(self): 1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner raise NotImplementedError 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def sendBreak(self): 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def setRTS(self,level=1): 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Set terminal status line""" 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner def setDTR(self,level=1): 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Set terminal status line""" 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner def getCTS(self): 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Eead terminal status line""" 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def getDSR(self): 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Eead terminal status line""" 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def getRI(self): 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Eead terminal status line""" 1875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner raise NotImplementedError 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def getCD(self): 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project """Eead terminal status line""" 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project raise NotImplementedError 1925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project def __repr__(self): 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return string.join(( "<Serial>: ", self.portstr 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project , self.baud, self.parity, self.bytesize, self.stop, 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project self.retry , self.filename), ' ') 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectif __name__ == '__main__': 1995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner s = Serial(0) 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sys.stdio.write('%s %s\n' % (__name__, s)) 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project