Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

excApp.py

00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2004
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 
00010 __facility__ = "Online"
00011 __abstract__ = "Application for testing handling of exceptions"
00012 __author__   = "R. Claus <Claus@SLAC.Stanford.edu> SLAC - GLAST LAT I&T/Online"
00013 __date__     = "August 20, 2004"        # Created
00014 __version__  = "$Revision: 1.1 $"
00015 __release__  = "$Name: R04-12-00 $"
00016 __credits__  = "SLAC"
00017 
00018 import LATTE.copyright_SLAC
00019 
00020 from qt import qApp
00021 
00022 import            threading
00023 import logging as log
00024 
00025 from   LATTE.runcontrol.rcTransitions  import rcTransitions
00026 from   LATTE.runcontrol.ArgumentImpl   import ArgumentImpl
00027 
00028 from support.SimpleGasuExample   import *
00029 from support.MiniGLTExample      import *
00030 
00031 
00032 #  This class puts up a GUI for inputting a value of some sort.  It is used by
00033 #  the userApplication example to get the number of self triggers to take.
00034 class userArgument(ArgumentImpl):
00035   "GUI for getting the user to input some sort of value."
00036   def __init__(self, parent = None, name = None, modal = 0, fl = 0):
00037     ArgumentImpl.__init__(self, parent, name, modal, fl)
00038     self.__value = 0
00039 
00040   def OKButtonClicked(self):
00041     self.__value = int(self.ArgumentList.text().latin1())
00042     self.close()
00043 
00044   def CancelButtonClicked(self):
00045     self.__value = None
00046     self.close()
00047 
00048   def getValue(self, caption):
00049     #self.setCaption(caption)
00050     self.ArgLabel.setText(qApp.translate("Argument", caption, None))
00051     self.show()
00052     self.exec_loop()
00053     return self.__value
00054 
00055   def getValueExc(self, caption):
00056     raise Exception, "Exception taken during a GUI operation"
00057 
00058 class userArgText(object):
00059   "Text user interface for getting the user to input some sort of value"
00060   def __init__(self):
00061     pass
00062 
00063   def getValue(self, caption):
00064     return int(raw_input("%s: " % (caption)))
00065 
00066 
00067 #  Null application implementation.
00068 class userApplication(rcTransitions):
00069   "Implmentation class for Null application"
00070   def __init__(self, rc, userId, debug):
00071     rcTransitions.__init__(self, rc, userId, debug)
00072     self.__eventSem    = threading.Semaphore(0)
00073     self.__cmdSynchSem = threading.Semaphore(0)
00074 
00075   def getName(self):
00076     return __name__
00077 
00078   def setup(self):
00079     log.debug("userApplication.setup()")
00080 
00081     if self.rc is None:
00082       self.__arg = userArgText()
00083     else:
00084       self.__arg = self.rc.createGUI(userArgument, self.rc, self.getName(), 1)
00085 
00086     caption = "Select when to take an exception:\n  0 = GUI\n  1 = Setup\n  2 = StartRun\n  3 = StopRun\n  4 = Stop\n  5 = Teardown\n  6 = Pause\n  7 = Resume\n  8 = CmdSynch\n  9 = Process"
00087     if self.rc is None:
00088       self.__state = self.__arg.getValue(caption)
00089     else:
00090       self.__state = self.rc.execGUImethod(self.__arg.getValue, caption)
00091 
00092     if self.__state == 0:
00093       crud = self.rc.execGUImethod(self.__arg.getValueExc, "Exception test")
00094       return False                      # To reject the transition
00095 
00096     if self.__state == 1:
00097       raise Exception, "Exception taken during SETUP transition"
00098 
00099     # Two choices for the trigger, GEM and MiniGLT
00100     if self.lat.existsGEM():
00101       self.trigger( SimpleGasuExample() )
00102     else:
00103       self.trigger( MiniGLTExample() )
00104 
00105     # A state transition can be rejected by not returning None
00106     return None
00107 
00108   def startRun(self):
00109     log.debug("userApplication.startRun()")
00110 
00111     if self.__state == 2:
00112       raise Exception, "Exception taken during STARTRUN transition"
00113 
00114     self.__cmdSynchQuit = False
00115 
00116     # A state transition can be rejected by not returning None
00117     return None
00118 
00119   def stopRun(self):
00120     log.debug("userApplication.stopRun()")
00121 
00122     self.__cmdSynchQuit = True
00123     self.__eventSem.release()
00124 
00125     # Set the test completion status value
00126     self.setCompletionStatus(self.COMPL_STATUS_PASSED)
00127 
00128     if self.__state == 3:
00129       raise Exception, "Exception taken during STOPRUN transition"
00130 
00131     # The STOP_RUN transition can not be rejected
00132 
00133   def stop(self):
00134     log.debug("userApplication.stop()")
00135 
00136     if self.__state == 4:
00137       raise Exception, "Exception taken during STOP transition"
00138 
00139     return self.stopRun()
00140 
00141   def teardown(self):
00142     log.debug("userApplication.teardown()")
00143 
00144     if self.__state == 5:
00145       raise Exception, "Exception taken during TEARDOWN transition"
00146 
00147   def pause(self):
00148     log.debug("userApplication.pause()")
00149 
00150     if self.__state == 6:
00151       raise Exception, "Exception taken during PAUSE transition"
00152 
00153   def resume(self):
00154     log.debug("userApplication.resume()")
00155 
00156     if self.__state == 7:
00157       raise Exception, "Exception taken during RESUME transition"
00158 
00159     # Issue self trigger to make up for the one that was lost during PAUSE
00160     self.trigger().solicit()
00161 
00162   def process(self, (status, buffer)):
00163     "Method called back for each data event taken"
00164 
00165     if self.__state == 8:  log.debug("userApplication.process()")
00166 
00167     if self.__state == 9:
00168       raise Exception, "Exception taken during process()"
00169 
00170     # Get next event triggered
00171     self.__eventSem.release()
00172 
00173   def commandSynch(self):
00174     log.debug("userApplication.commandSynch()")
00175 
00176     trigger  = self.trigger()
00177     eventSem = self.__eventSem
00178 
00179     # Drain the semaphore release count
00180     # Handles the case when the stop run release collided with a trigger release
00181     while eventSem.acquire(0):  pass
00182 
00183     # Wait for START_RUN to enable triggers
00184     trigger.waitForMaskEnable()
00185 
00186     cnt = 0
00187     while not self.__cmdSynchQuit:
00188       if cnt == 5 and self.__state == 8:
00189         raise Exception, "Exception taken during commandSynch()"
00190       trigger.solicit()                 # Issue an internal trigger
00191       eventSem.acquire()                # Wait for the event to be processed
00192       cnt += 1
00193 
00194     # Indicate we're done
00195     self.sync()
00196 
00197   def wait(self):
00198     self.__cmdSynchSem.acquire()
00199 
00200   def sync(self):
00201     if __name__ == "__main__" or self.isRunFromSuite():
00202       self.__cmdSynchSem.release()
00203 
00204 
00205 # Standalone mode:
00206 if __name__ == "__main__":
00207   import os
00208   import logging as log
00209   log.basicConfig()
00210   log.getLogger("").setLevel(log.DEBUG)
00211   ua = userApplication(None, 321, 0)
00212   prefs = {'datasave': 1, 'datadir':os.path.join(os.environ['ONLINE_ROOT'],'temp')}
00213   ua.setPrefs(prefs)
00214   ua.rcSetup(os.path.join(os.environ['ONLINE_ROOT'], 'repos/simpleTemSchema.xml'))
00215   ua.rcStartRun()
00216   ua.wait()
00217   ua.rcStopRun()
00218   ua.rcTeardown()
00219 
00220 # History:
00221 #     $Log: excApp.py,v $
00222 #     Revision 1.1  2004/08/23 21:04:24  claus
00223 #     Test exception handling.
00224 #
00225 #

Generated on Fri Jul 21 13:26:27 2006 for LATTE R04-12-00 by doxygen 1.4.3