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