# ##################################################### # Simple Python Terminal # Interface class # # Copyright 2010 - myBitBox.com # License granted for non-commercial use # # ##################################################### #!/usr/bin/python import sys, os, serial, threading #from time import gmtime, strftime import pyterm import time from Tkinter import * import tkSimpleDialog class SerialTerminal: def __init__(self, parent=None,output_handle=None): if os.name == 'nt': # This is for a USB serial port in winblows (COMX) serialPort = 1 elif os.name == 'posix': # This is for a USB serial port in Linux serialPort = "/dev/ttyUSB0" self.className = "TestTerminal" self.READY = 0 self.DEBUG_CODE = 0 """ System variables """ if os.name == 'nt': self.badkeys = [17,18,17,18,92,91,16,8] # CTRL, ALT, WIN, SHIFT, BACKSPACE self.enterkey=13 self.backspace = 22 elif os.name == 'posix': self.badkeys = [64,37,105,108,8] # CTRL, ALT, WIN, SHIFT, BACKSPACE self.enterkey=36 self.backspace = 22 """ Make the terminal output """ if output_handle != None: self.window = output_handle #self.output("Attached window!\n") else: self.window = '' return self.localformat = 0 self.window.format(self.localformat) """ Open the Serial Port """ if os.name == 'nt': try: # The COM port is X, so try and open COM(X-1) self.serial = serial.Serial((serialPort-1), 38400, timeout=0.7) self.output_raw("Success opening serial port: COM%s" % serialPort) except: self.output("Failed to open serial port: COM%s" % serialPort) return elif os.name == 'posix': try: #self.serial = serial.Serial(serialPort, 9600, timeout=0.7) self.serial = serial.Serial(serialPort, 38400, timeout=0.7) self.output_raw("Success opening serial port: %s" % serialPort) except: self.output("Failed to open serial port: %s" % serialPort) return """ Make the hardware instance and attach the serial port and output console """ self.terminal_command = '' # Everything is up and running. self.READY = 1 self.printheader() self.printhelp() self.window.prompt() def __del__(self): return def close(self): return def exitprogram(self): if(self.READY==0): return self.serial.close() #self.window.exit() sys.stdout.write("** Terminal Exit **\n") sys.exit(0) def output(self,msg,doreturn=True,rawoutput=False): if self.window != '': self.consoleOutput(msg) else: sys.stdout.write(msg) def output_raw(self,msg): self.consoleOutput(msg,rawoutput=True) def resultOutput(self,sometext,doreturn=True,rawoutput=False): self.window.format(2) self.window.addline(sometext) self.window.format(self.localformat) return def errorOutput(self,sometext,doreturn=True,rawoutput=False): self.window.format(1) self.window.addline(sometext) self.window.format(self.localformat) return def consoleOutput(self,sometext,doreturn=True,rawoutput=False): if rawoutput == True: self.window.addline_raw(sometext) else: self.window.addline(sometext) return def hitkey(self,event): #print ("%s:%d"%(event.keysym,event.keycode)) #ignore CTRL and ALT, etc if event.keycode in self.badkeys: return if event.keycode == self.enterkey: self.run(self.terminal_command) self.terminal_command = '' elif event.keycode == self.backspace and len(self.terminal_command)>0: self.terminal_command = self.terminal_command[:-1] #elif len(event.keysym) == 1: # this gets rid of the multi-letter characters 'Down','Backslash',etc else: self.terminal_command += event.keysym return def printheader(self): self.output_raw("") self.output_raw("~~~~ THIS IS CONSIDERED BETA ~~~~~") self.output_raw("") def printhelp(self): self.output_raw("") self.output_raw("Commands") self.output_raw("============================") self.output_raw("help \t= Help") self.output_raw("exit \t= Quit") self.output_raw("clear \t= Clear Terminal") self.output_raw("dummy \t= Dummy Command") self.output_raw("Hit enter after the command to run") self.output_raw("") def prompt(self, prompt, title="Enter value"): return tkSimpleDialog.askstring(title = title, prompt = prompt) def run(self, command): #print "got command: %s"%command #if command == '': return if command == 'dummy': input = self.prompt("Input number:") try: target = int(input) except: self.output("Input not an integer, defaulting to 0") target = 0 self.output(("Dummy command: %s" % target)) self.resultOutput("Dummy result") self.errorOutput("Dummy error") elif command.upper() == 'Q' or command.upper() == "EXIT" or command.upper() == "QUIT": self.exitprogram() elif command.upper() == 'H' or command.upper() == "HELP": self.printhelp() self.window.prompt() elif command == 'clear': self.window.clear() self.window.header() self.window.prompt() self.terminal_command ='' else: self.window.addline(("Unknown Command: '%s'"%command)) self.window.text.focus() return ########################################################## # Main program init ########################################################## if __name__ == "__main__": root = Tk() win = pyterm.TerminalGUI() term = SerialTerminal(output_handle=win) if term.READY == 1: root.bind('', term.hitkey) root.mainloop() sys.stdout.write("** System Exit **\n")