import os import mmap import serial inputMapping = 0 outputMapping = 0 inputFile = file ( "inputs.txt" , "r+" ) size = os.path.getsize ( "inputs.txt" ) outputFile = file ( "outputs.txt" , "r+" ) outSize = os.path.getsize ( "outputs.txt" ) data = mmap.mmap ( inputFile.fileno() , size ) outputData = mmap.mmap ( outputFile.fileno() , outSize ) port = serial.Serial ( "/dev/ttyUSB0" , 9600 , timeout=0 , parity=serial.PARITY_EVEN ) print port.portstr port.write ( chr ( 1 ) ) port.write ( " Relay Control Terminal" ) number = "" mode = "" class relays: display = "" oldDisplay = "" def __init__ ( self , port ): self.mode = "" self.port = port self.numberString = "" self.number = 0 self.inputMessage = "" self.outputMessage = "" self.numbers = dict() self.numbers [ "INPUT" ] = 0 self.numbers [ "OUTPUT" ] = 0 self.watchInputHigh = False self.watchInputLow = False self.watchOutputHigh = False self.watchOutputLow = False def status ( self , inputs , outputs ): self.inputs = inputs self.outputs = outputs def processKeypad ( self ): fromSerial = self.port.read ( 1 ) if fromSerial != "": if fromSerial == 'T': self.mode = "INPUT" self.clearNumberInput() elif fromSerial == 'U': self.mode = "OUTPUT" self.clearNumberInput() elif fromSerial == 'V': self.high() elif fromSerial == 'W': self.low() elif ord ( fromSerial ) >= d ord ( fromSerial ) <= 57: self.numberString += fromSerial self.numbers [ self.mode ] = self.numberString ) if self.mode == "INPUT": self.watchInputHigh = False self.watchInputLow = False if self.mode == "OUTPUT": self.watchOutputHigh = False self.watchOutputLow = False self.updateDisplay() def high ( self ): if self.mode == "INPUT": self.inputs [ self.numbers [ "INPUT" ] ] = '1' self.inputMessage = "SET" self.watchInputHigh = True self.watchInputLow = False if self.mode == "OUTPUT": self.outputs [ self.numbers [ "OUTPUT" ] ] = '1' self.outputMessage = "SET" self.watchOutputHigh = True self.watchOutputLow = False def low ( self ): if self.mode == "INPUT": self.inputs [ self.numbers [ "INPUT" ] ] = '0' self.inputMessage = "CLEAR" self.watchInputLow = True self.watchInputHigh = False if self.mode == "OUTPUT": self.outputs [ self.numbers [ "OUTPUT" ] ] = '0' self.outputMessage = "CLEAR" self.watchOutputLow = True self.watchOutputHigh = False def watch ( self ): if self.watchInputHigh == True and self.inputs [ self.numbers [ "INPUT" ] ] == '0': self.inputMessage = "" if self.watchInputLow == True and self.inputs [ self.numbers [ "INPUT" ] ] == '1': self.inputMessage = "" if self.watchOutputHigh == True and self.outputs [ self.numbers [ "OUTPUT" ] ] == '0': self.outputMessage = "" if self.watchOutputLow == True and self.outputs [ self.numbers [ "OUTPUT" ] ] == '1': self.outputMessage = "" def clearNumberInput ( self ): self.numberString = ""; def updateDisplay ( self ): self.watch() if self.mode == "INPUT" or self.mode == "OUTPUT": self.display = " INPUT %2.2d: %1.1s %7.7s" % ( self.numbers [ "INPUT" ] , self.inputs [ self.numbers [ "INPUT" ] ] , inputMessage ) self.display += " " self.display += "OUTPUT %2.2d: %1.1s %7.7s" % ( self.numbers [ "OUTPUT" ] , self.outputs [ self.numbers [ "OUTPUT" ] ] , outputMessage ) # update the display if its changed if self.display != self.oldDisplay: self.port.write ( chr ( 1 ) + self.display ) self.oldDisplay = self.display dispatch = relays ( port ) while ( 1 ): dispatch.status ( data , outputData ) dispatch.processKeypad()