# -*- coding: cp1252 -*- ''' Created on 24.11.2011 @author: sth2mt ''' import time import threading import thread from ctypes import pythonapi, py_object, c_char import FertigungsTest.GUI.Display as Display import FertigungsTest.Hardware.StartSchalter as StartSchalter import FertigungsTest.Hardware.BedienTasten as Key_Evn import FertigungsTest.Hardware.LtInterface as LtInterface # LedTst # exit def kill(thread,iStopTimeout,tid): if thread: thread.printf ("kill iStopTimeout=%d"%iStopTimeout) time.sleep(iStopTimeout) #nach 30s hart beenden if thread.isAlive(): res = pythonapi.PyThreadState_SetAsyncExc(tid,py_object(SystemExit)) if res == 0: raise ValueError("nonexistent thread id (%s)" % thread._Thread_name) elif res > 1: pythonapi.PyThreadState_SetAsyncExc(tid,0) raise SystemError("PyThreadState_SetAsyncExc failed") else : thread.printf ("kill Thread %s" % thread._Thread_name) thread.errorcode=900 thread.isTimeout=True thread.__del__() else: thread.printf ( "kill %s not allive" % thread._Thread_name) else: print "kill: no handle" class Prueffunktionen(threading.Thread): ''' classdocs ''' def __init__(self, O_Parser,O_Serializer,param=None): ''' Constructor ''' self._Thread_name = "LedTst" self.stout = False self.printf( "Constructor %s" % self._Thread_name) threading.Thread.__init__(self) super(Prueffunktionen,self).__init__() self._EventStop = threading.Event() self.iStopTimeout = 3 # Stop Timeout bis zum Kill self.iTimeout = 60 # Timeout bis Abbruch self.errorcode=900 # Fehlercode vorbelegen, Wenn Ok wird zurueckgesetzt self.isTimeout=False self.Leuchtdauer = 4 #in s self.O_XmlParser = O_Parser self.O_XML_Cmd = O_Serializer self.O_Display = Display.Treiber() self.O_Startschalter = StartSchalter.Treiber() self.O_Key_Evn = Key_Evn.Treiber() self.O_LT = LtInterface.Treiber() self.O_Display.setHeadlines("diagnosis tools","LEDs") self.O_Display.paintDisplay() pass def __del__(self): ''' Destructor ''' if self.errorcode==0: sAbruchGrund="OK" else: sAbruchGrund="NOK" self.printf( "Destructor %s" % self._Thread_name) # Belegung der Prueffunktion im Parseer objekt loeschen -> Freigabe self.printf( "Timeout %i, self._EventStop.isSet() %i"%(self.isTimeout,self._EventStop.isSet())) # Display bedienen if (self.isTimeout | self._EventStop.isSet()): #Abbruch der Funktion -> Fehler anzeigen if self._EventStop.isSet(): sAbruchGrund="Abort" self.O_Display.setAction(sAbruchGrund,"","") else: #Timeout der Funktion -> Fehler anzeigen sAbruchGrund="Timeout" self.O_Display.setAction(sAbruchGrund,"","") self.O_Display.setOKNOK(0) self.O_Display.clrSelect() print "%s"%self.O_XML_Cmd.BuildRueckgabewert(self._Thread_name,"%s %s"%(self._Thread_name,sAbruchGrund),None,self.errorcode,None) self.O_Display.paintDisplay() del(self.O_LT) del(self.O_Key_Evn) del(self.O_Startschalter) del(self.O_Display) self.O_XmlParser.AktivePrueffunktion=None pass def stop(self): # Thread normal beenden self.printf("stop") if self.isAlive(): self._EventStop.set() # Kill-thread falls dieser thread sich nicht nach 30s beendet for tid, tobj in threading._active.items(): if tobj is self: thread.start_new_thread(kill,(self,self.iStopTimeout,tid)) #print "stop Ende" pass def run(self): # Ablauf starten self.printf("Ablauf starten") print "%s"%self.O_XML_Cmd.BuildTimeout(self.iTimeout,self._Thread_name) print "%s"%self.O_XML_Cmd.BuildPrintMainText("LED's pruefen") # Watchdogtimer anstarten -> beendet Thread anch timeout for tid, tobj in threading._active.items(): if tobj is self: thread.start_new_thread(kill,(self,self.iTimeout-self.iStopTimeout-1,tid)) self.Ablauf() self.printf("Nach Ablauf") self.__del__() pass def stopped(self): return self._EventStop.isSet() def Ablauf(self): self.printf("Test LED's") self.O_Display.ResetLastError() self.O_Display.setFortschritt(1) print "%s"%self.O_XML_Cmd.BuildProgressbar(1) self.O_Display.setActionLP("Look_at_LEDs and_confirm_with gui_buttons") #self.O_Display.setAction("Auf LED schauen", "und mit richtiger","Taste best\xc3\xa4tigen") self.O_Display.setSelectMiddle("start") # Warten auf Betätigung Button "Start der Prüfung self.O_Key_Evn.Wait(self.O_Key_Evn.KEY_A, self.O_Key_Evn.KEY_RELEASED) self.O_Display.clrSelect() self.O_Display.setFortschritt(5) self.printf( ("merker %d prozent %d"%(5,5))) print "%s"%self.O_XML_Cmd.BuildProgressbar(5) time.sleep(1.0) if self.TstWhiteLED(): time.sleep(1.0) self.O_Key_Evn.ReadTasten() self.TstColorLED() self.O_Display.clrSelect() if self.errorcode==0: # Led's OK self.O_Display.setOKNOK(1) else: self.O_Display.setOKNOK(0) self.O_Display.setFortschritt(90) self.printf( ("merker %d prozent %d"%(90,90))) print "%s"%self.O_XML_Cmd.BuildProgressbar(90) if self.errorcode==0: # Startschalter OK self.O_Display.setSelectLP("Confirm with_to ol_switch") #self.O_Display.setSelectLeft("Weiter ") #self.O_Display.setSelectMiddle("mit Start") #self.O_Display.setSelectRight("schalter") #Ergebnis bestaetigen self.O_Startschalter.Wait(True,self.stopped) # Bildschirm zuruecksetzen auf Default self.O_Display.BuildDefaultScreen() self.O_Display.setFortschritt(100) self.printf( ("merker %d prozent %d"%(100,100))) print "%s"%self.O_XML_Cmd.BuildProgressbar(100) self.printf("LED's Pr\xc3\xbcfung -> Ende") pass def TstWhiteLED(self): self.O_Display.setActionLP("Thigtening position illumination_?") #self.O_Display.setAction("Schraubstellen-", "LED","?") # Zufalls Reihenfolge aus Systemzeit in sec ermittel Tastenfolge = [self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_A,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_A,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_A,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_A] char = [Tastenfolge[ord(time.strftime("%S")[1])-48]] #Zufallszahl zwischen 1 und 10 erzeugen for i in range (0,Tastenfolge.count(char[0])): Tastenfolge.remove(char[0])# gezogenes Zeichen aus Liste entfernen da nur einmal verwendet werden darf char.append(Tastenfolge[ord(time.strftime("%S")[0])-48]) #Zufallszahl zwischen 0 und 6 erzeugen for i in range (0,Tastenfolge.count(char[1])): Tastenfolge.remove(char[1])# gezogenes Zeichen aus Liste entfernen da nur einmal verwendet werden darf char.append(Tastenfolge[0]) self.printf(char) for i in range (0,1,1): if self.stopped(): self.errorcode=901 return self.printf(char[i]) self.O_Display.setFortschritt(10+(i*13)) print "%s"%self.O_XML_Cmd.BuildProgressbar(10+(i*13)) self.O_Display.clrSelect() if char[i] == self.O_Key_Evn.KEY_RIGHT: self.dimming(self.Leuchtdauer) if char[i] == self.O_Key_Evn.KEY_LEFT: self.flashing(self.Leuchtdauer) if char[i] == self.O_Key_Evn.KEY_A: self.an(self.Leuchtdauer) self.O_Display.setSelectKey(self.O_Key_Evn.KEY_A, "/ on \\",self.O_Display.sColorBlack,self.O_Display.sColorWhite) self.O_Display.setSelectKey(self.O_Key_Evn.KEY_LEFT, "<-flash",self.O_Display.sColorBlack,self.O_Display.sColorGrey) self.O_Display.setSelectKey(self.O_Key_Evn.KEY_RIGHT, "sweep->",self.O_Display.sColorBlack,self.O_Display.sColorLightGrey) Taste=self.O_Key_Evn.Wait(self.O_Key_Evn.KEY_A|self.O_Key_Evn.KEY_LEFT|self.O_Key_Evn.KEY_RIGHT, self.O_Key_Evn.KEY_PRESS) self.printf( ("%s.Ablauf Taste =0x%x char[%i]=0x%x"%(self._Thread_name, Taste,i,char[i]))) if Taste != char[i]: self.printf( ("%s.Ablauf error=%d "%(self._Thread_name, self.errorcode))) self.errorcode=902 return False #Abbruch else: self.errorcode = 0 self.O_Display.setFortschritt(10+(3*13)) print "%s"%self.O_XML_Cmd.BuildProgressbar(10+(3*13)) return True def TstColorLED(self): self.O_Display.setActionLP("color_of LED_?") #self.O_Display.setAction("", "LED","Farbe ?") # Zufalls Reihenfolge aus Systemzeit in sec ermittel Tastenfolge = [self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_A,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_A,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_LEFT,self.O_Key_Evn.KEY_A,self.O_Key_Evn.KEY_RIGHT,self.O_Key_Evn.KEY_A] char = [Tastenfolge[ord(time.strftime("%S")[1])-48]] #Zufallszahl zwischen 1 und 10 erzeugen for i in range (0,Tastenfolge.count(char[0])): Tastenfolge.remove(char[0])# gezogenes Zeichen aus Liste entfernen da nur einmal verwendet werden darf char.append(Tastenfolge[ord(time.strftime("%S")[0])-48]) #Zufallszahl zwischen 0 und 6 erzeugen for i in range (0,Tastenfolge.count(char[1])): Tastenfolge.remove(char[1])# gezogenes Zeichen aus Liste entfernen da nur einmal verwendet werden darf char.append(Tastenfolge[0]) self.printf(char) for i in range (0,3,1): if self.stopped(): self.errorcode=903 return self.printf(char[i]) self.O_Display.setFortschritt(50+(i*13)) print "%s"%self.O_XML_Cmd.BuildProgressbar(50+(i*13)) self.O_Display.clrSelect() if char[i] == self.O_Key_Evn.KEY_RIGHT: self.O_LT.SetLEDBlue(255) if char[i] == self.O_Key_Evn.KEY_LEFT: self.O_LT.SetLEDGreen(255) if char[i] == self.O_Key_Evn.KEY_A: self.O_LT.SetLEDRed(255) time.sleep(2.0) self.O_Display.setSelectKey(self.O_Key_Evn.KEY_A, "red",None,self.O_Display.sColorRed) self.O_Display.setSelectKey(self.O_Key_Evn.KEY_LEFT, "<-green",None,self.O_Display.sColorGreen) self.O_Display.setSelectKey(self.O_Key_Evn.KEY_RIGHT, "blue->",None,self.O_Display.sColorLightBlue) Taste=self.O_Key_Evn.Wait(self.O_Key_Evn.KEY_A|self.O_Key_Evn.KEY_LEFT|self.O_Key_Evn.KEY_RIGHT, self.O_Key_Evn.KEY_PRESS) self.O_LT.SetLEDRGB(0, 0, 0) self.printf( ("%s.Ablauf Taste =0x%x char[%i]=0x%x"%(self._Thread_name, Taste,i,char[i]))) if Taste != char[i]: self.printf( ("%s.Ablauf error=%d "%(self._Thread_name, self.errorcode))) self.errorcode=904 return False #Abbruch else: self.errorcode = 0 return True def dimming(self,dauer): cycletime = 1 nmal=int(dauer/cycletime) while 0 < nmal: self.O_LT.LEDSoftBlink(cycletime) nmal=nmal-1 pass def an(self,dauer,LEDNr=0): self.O_LT.SetLED(255) time.sleep(dauer) self.O_LT.SetLED(0) pass def flashing(self,dauer,LEDNr=0): cycletime = 0.25 nmal=int(dauer/cycletime) while 0 < nmal: self.O_LT.SetLED(255) time.sleep(cycletime/100) self.O_LT.SetLED(0) time.sleep(cycletime/100*99) nmal=nmal-1 pass def printf(self,string): if self.stout: print string pass def TestMenue(self,O_Paint): if O_Paint: O_Paint.SetTestText(["Startschalter bet\xc3\xa4tigen"]) O_Paint.Update() Input = ' ' while Input!= "z": Input=O_Paint.TestfunktionsEingabe() O_Paint.Update() O_Paint.Update() O_Paint.ClearTestText() return Input pass pass