# -*- coding: cp1252 -*- ''' Created on 18.06.2011 @author: sth2mt ''' import time import threading import thread from ctypes import pythonapi,py_object import FertigungsTest.Hardware.BedienTasten as Key_Evn import FertigungsTest.Hardware.StartSchalter as StartSchalter import FertigungsTest.GUI.Display as Display # PxlTst # 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=1100 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 ''' threading.Thread.__init__(self) super(Prueffunktionen,self).__init__() self._EventStop = threading.Event() self.iStopTimeout = 3 # Stop Timeout bis zum Kill self.iTimeout = 120 # Pruefende Timeout bis zum Kill self.errorcode=1100 # Fehlercode vorbelegen, Wenn Ok wird zurueckgesetzt self._Thread_name = "PxlTst" self.stout = False self.errorcode = 0 self.isTimeout=False self.O_XmlParser = O_Parser self.O_XML_Cmd = O_Serializer self.O_Key_Evn = Key_Evn.Treiber() self.O_Display = Display.Treiber() self.O_Startschalter = StartSchalter.Treiber() self.printf("Displaytest auf Pixelfehler") self.O_Display.setHeadlines("diagnosis tools","display") 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_Key_Evn) del(self.O_Display) del(self.O_Startschalter) # Belegung der Prueffunktion im Parseer objekt loeschen -> Freigabe 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("Display auf Pixelfehler 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.O_Display.ResetLastError() print "%s"%self.O_XML_Cmd.BuildProgressbar(1) self.O_Display.setFortschritt(1) self.O_Display.setActionLP("Watch_out_for colored_pixel interference_!") #self.O_Display.setAction("Auf farbige", "Bildpunkte","achten!") 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() # Alle roten Pixel einschalten, andere Farben aus #if (self.TestGrundFarbe(0x0,0xf8,23)!=0): # return self.errorcode # Alle blauen Pixel einschalten, andere Farben aus #if (self.TestGrundFarbe(0x1f,0x00,46)!=0): # return self.errorcode # Alle gruenen Pixel einschalten, andere Farben aus #if (self.TestGrundFarbe(0xe0,0x07,67)!=0): # return self.errorcode # Alle Pixel ausschalten, schwarz if (self.TestGrundFarbe(0x00,0x00,40)!=0): return self.errorcode # Alle Pixel einschalten, weiss if (self.TestGrundFarbe(0xff,0xff,70)!=0): return self.errorcode self.O_Display.setFortschritt(90) print "%s"%self.O_XML_Cmd.BuildProgressbar(90) self.errorcode=0 # Ok self.O_Display.setOKNOK(1) #self.O_Display.setAction("","","") 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") #self.O_Display.paintDisplay() #Ergebnis bestaetigen self.O_Startschalter.Wait(True,self.stopped) # Bildschirm zuruecksetzen auf Default self.O_Display.BuildDefaultScreen() self.O_Display.setFortschritt(100) print "%s"%self.O_XML_Cmd.BuildProgressbar(100) self.printf("Bedienelemente Test -> Ende") def TestGrundFarbe(self,cFarbe1,cFarbe2,iFortschritt): # Pixel xy einschalten, weiss self.O_Display.WriteFrameBuffer(cFarbe1,cFarbe2,0, 320*240) self.O_Display.CloseFrameBuffer() time.sleep(4) self.O_Display.O_DisplayDB.ftestMode(False) self.O_Display.O_DisplayDB.ftestMode(True) self.O_Display.setHeadlines("diagnosis tools","display") self.O_Display.setFortschritt(iFortschritt) print "%s"%self.O_XML_Cmd.BuildProgressbar(iFortschritt) self.O_Display.setActionLP("Visible_pixel errors_in basic_color_?") #self.O_Display.setAction("Pixelfehler", "in Grundfarbe", "vorhanden ?") self.O_Display.clrSelect() self.O_Display.setSelectKey(self.O_Key_Evn.KEY_LEFT, "Yes") self.O_Display.setSelectKey(self.O_Key_Evn.KEY_RIGHT, "No") Key=self.O_Key_Evn.Wait((self.O_Key_Evn.KEY_LEFT|self.O_Key_Evn.KEY_RIGHT), self.O_Key_Evn.KEY_RELEASED) self.O_Display.clrSelect() if (Key==self.O_Key_Evn.KEY_LEFT): # "Ja" self.printf("TestGrundfarbe: Pixelfehler mit Ja beantwortet !") self.O_Display.SaveLastActionOnError() self.errorcode=1100 print "%s"%self.O_XML_Cmd.BuildProgressbar(100) self.O_Display.setOKNOK(not self.errorcode) return self.errorcode self.errorcode = 0 return self.errorcode pass def printf(self,string): if self.stout: print string pass pass pass