]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blobdiff - software/miniterm.py
Copied all needed files.
[fpga/virtex2/uart.git] / software / miniterm.py
diff --git a/software/miniterm.py b/software/miniterm.py
new file mode 100644 (file)
index 0000000..d0bd887
--- /dev/null
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+#very simple serial terminal
+#http://pyserial.sf.net package required
+#input characters are sent directly, received characters are displays as is
+#baudrate and echo configuartion is done through globals:
+
+#<cliechti@gmx.net>
+
+import sys, os, serial, threading, getopt
+#EXITCHARCTER = '\x1b'   #ESC
+EXITCHARCTER = '\x04'   #ctrl+d
+
+#first choosea platform dependant way to read single characters from the console
+if os.name == 'nt': #sys.platform == 'win32':
+    import msvcrt
+    def getkey():
+        while 1:
+            if echo:
+                z = msvcrt.getche()
+            else:
+                z = msvcrt.getch()
+            if z == '\0' or z == '\xe0':    #functions keys
+                msvcrt.getch()
+            else:
+                return z
+
+elif os.name == 'posix':
+    #XXX: Untested code derrived from the Python FAQ....
+#    import termios, TERMIOS, sys, os
+    import termios, sys, os
+    fd = sys.stdin.fileno()
+    old = termios.tcgetattr(fd)
+    new = termios.tcgetattr(fd)
+    new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO
+    new[6][TERMIOS.VMIN] = 1
+    new[6][TERMIOS.VTIME] = 0
+    termios.tcsetattr(fd, TERMIOS.TCSANOW, new)
+    s = ''    # We'll save the characters typed and add them to the pool.
+    def getkey():
+        c = os.read(fd, 1)
+        if echo: sys.stdout.write(c)
+        return c
+    def clenaup_console():
+        termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old)
+    sys.exitfunc = clenaup_console  #terminal modes have to be restored on exit...
+
+else:
+    raise "Sorry no implementation for your platform (%s) available." % sys.platform
+
+
+def reader():
+    """loop forever and copy serial->console"""
+    while 1:
+        sys.stdout.write(s.read())
+
+def writer():
+    """loop forever and copy console->serial"""
+    while 1:
+        c = getkey()
+        if c == EXITCHARCTER: break   #exit on esc
+        s.write(c)              #send character
+        if convert_outgoing_cr and c == '\r':
+            s.write('\n')
+            if echo: sys.stdout.write('\n')
+
+
+#print a short help message
+def usage():
+    print >>sys.stderr, """USAGE: %s [options]
+    Simple Terminal Programm for the serial port.
+
+    options:
+    -p, --port=PORT: port, a number, defualt = 0 or a device name
+    -b, --baud=BAUD: baudrate, default 9600
+    -r, --rtscts:    enable RTS/CTS flow control (default off)
+    -x, --xonxoff:   enable software flow control (default off)
+    -e, --echo:      enable local echo (default off)
+    -c, --cr:        disable CR -> CR+LF translation
+
+    """ % sys.argv[0]
+
+if __name__ == '__main__':
+    #parse command line options
+    try:
+        opts, args = getopt.getopt(sys.argv[1:],
+                "hp:b:rxec",
+                ["help", "port=", "baud=", "rtscts", "xonxoff", "echo", "cr"])
+    except getopt.GetoptError:
+        # print help information and exit:
+        usage()
+        sys.exit(2)
+    
+    port  = 0
+    baudrate = 9600
+    echo = 0
+    convert_outgoing_cr = 1
+    rtscts = 0
+    xonxoff = 0
+    for o, a in opts:
+        if o in ("-h", "--help"):   #help text
+            usage()
+            sys.exit()
+        elif o in ("-p", "--port"):   #specified port
+            try:
+                port = int(a)
+            except ValueError:
+                port = a
+        elif o in ("-b", "--baud"):   #specified baudrate
+            try:
+                baudrate = int(a)
+            except ValueError:
+                raise ValueError, "Baudrate must be a integer number"
+        elif o in ("-r", "--rtscts"):
+            rtscts = 1
+        elif o in ("-x", "--xonxoff"):
+            xonxoff = 1
+        elif o in ("-e", "--echo"):
+            echo = 1
+        elif o in ("-c", "--cr"):
+            convert_outgoing_cr = 0
+
+    try:
+        s = serial.Serial(port, baudrate, rtscts=rtscts, xonxoff=xonxoff)
+    except:
+        print "could not open port"
+        sys.exit(1)
+    print "--- Miniterm --- type Ctrl-D to quit"
+    #start serial->console thread
+    r = threading.Thread(target=reader)
+    r.setDaemon(1)
+    r.start()
+    #enter console->serial loop
+    writer()
+
+    print "\n--- exit ---"