AlarmObjects.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 #                               Copyright 2006
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 #
00010 
00011 __facility__ = "Online"
00012 __abstract__ = "Classes for determining alarm states"
00013 __author__   = "J. Panetta <panetta@SLAC.Stanford.edu> SLAC - GLAST LAT I&T/Online"
00014 __date__     = "12/29/2005" # Created
00015 __updated__  = ("$Date: 2006/04/28 01:20:18 $").split(' ')[1]
00016 __version__  = "$Revision: 1.4 $"
00017 __release__  = "$Name: HEAD $"
00018 __credits__  = "SLAC"
00019 
00020 import LICOS.copyright_SLAC
00021 
00022 from qt import *
00023 
00024 from LICOS.tools.alarm.AlarmStates   import AlarmedItem, AlarmState
00025 
00026 import LICOS.tools.alarm.LEDwidget   as LEDwidget
00027 from LICOS.lib.currValTable.CurrValClient   import CurrValClient
00028 
00029 
00030 class QLV_AlarmedItem(QListViewItem, AlarmedItem):
00031   icons = { AlarmState.InLimits   : LEDwidget.LEDpixmap(LEDwidget.green),
00032             AlarmState.Unknown    : LEDwidget.LEDpixmap(LEDwidget.white),
00033             AlarmState.NoLimit    : LEDwidget.LEDpixmap(LEDwidget.black),
00034             AlarmState.LoYel      : LEDwidget.LEDpixmap(LEDwidget.yellow),
00035             AlarmState.HiYel      : LEDwidget.LEDpixmap(LEDwidget.yellow),
00036             AlarmState.LoRed      : LEDwidget.LEDpixmap(LEDwidget.red),
00037             AlarmState.HiRed      : LEDwidget.LEDpixmap(LEDwidget.red),
00038             AlarmState.DscYel     : LEDwidget.LEDpixmap(LEDwidget.yellow),
00039             AlarmState.DscRed     : LEDwidget.LEDpixmap(LEDwidget.red),
00040 #            AlarmState.Disabled   : LEDwidget.LEDpixmap(LEDwidget.blue),
00041             }
00042   messageBoxStates = { AlarmState.InLimits   : QMessageBox.Information,
00043                        AlarmState.Unknown    : QMessageBox.Information,
00044                        AlarmState.NoLimit    : QMessageBox.Information,
00045                        AlarmState.LoYel      : QMessageBox.Warning,
00046                        AlarmState.HiYel      : QMessageBox.Warning,
00047                        AlarmState.LoRed      : QMessageBox.Critical,
00048                        AlarmState.HiRed      : QMessageBox.Critical,
00049                        AlarmState.DscYel     : QMessageBox.Warning,
00050                        AlarmState.DscRed     : QMessageBox.Critical,
00051 #                       AlarmState.Disabled   : QMessageBox.Information,
00052                        }
00053   raiseAlarmStates = [ AlarmState.LoYel,
00054                        AlarmState.HiYel,
00055                        AlarmState.LoRed,
00056                        AlarmState.HiRed,
00057                        AlarmState.DscYel,
00058                        AlarmState.DscRed,
00059                        ]
00060 
00061 
00062   def __init__(self, gui, parent=None, text=None, state=None):
00063     QListViewItem.__init__(self, parent, text)
00064     AlarmedItem.__init__(self, parent, state)
00065     self.__cv = None
00066     self.__gui = gui
00067     self.__name = text
00068     self.setPixmap(0, self.icons[self.state().stateEnum()] )
00069 
00070   def setState(self, state, forceUpdate = False):
00071     """!\brief Set the state of the current object
00072 
00073     \param state  Either an integer or an AlarmState object
00074     """
00075     curState = self.state()
00076     super(QLV_AlarmedItem, self).setState( state, forceUpdate )
00077     newState = self.state()
00078     self.setRawValue()
00079     self.setEngValue()
00080     
00081     if not self.isEnabled():
00082       self.setPixmap(0, LEDwidget.LEDpixmap(LEDwidget.blue))
00083     else:
00084       self.setPixmap(0, self.icons[self.state().stateEnum()])
00085       
00086       if self.state().stateEnum() in self.raiseAlarmStates and \
00087            newState != curState :
00088         if self.__cv is not None and self.__gui.popAlarms():
00089           self.raiseAlarm()
00090 
00091   def update(self, state):
00092     """!\brief Update my state with whatever the state should be
00093 
00094     \param state  The state
00095     """
00096     self.setState(state)
00097     pass
00098 
00099   def recalculate(self):
00100     """!\brief Recalculate this items state based on its children
00101 
00102     """
00103     self.setState( self.childStateSum() )
00104 
00105   def cv(self):
00106     return self.__cv
00107 
00108   def tlmDb(self):
00109     return self.__gui.tlmDb()
00110 
00111   def setCV(self, cv):
00112     self.__cv = cv
00113 
00114   def showInfo(self):
00115     self.__iw = QLV_InfoWidget(self)
00116     self.__iw.show()
00117 
00118   def showLimits(self):
00119     self.__iw = QLV_LimitsWidget(self)
00120     self.__iw.show()
00121 
00122   def expandChildren(self, expand=True):
00123     # Expand all Children of this item
00124     self.setOpen(expand)
00125     self.iterateChildren( self.__class__.expandChildren, expand)
00126 
00127   def setDescription(self, description):
00128     self.setText(3, description)
00129 
00130   def setRawValue(self):
00131     if self.cv() is not None:
00132       text ='0x%06x' %self.cv().rawValue()
00133       self.setText(1,text)
00134 
00135   def setEngValue(self):
00136     if self.cv() is not None:
00137       mnemObj = self.tlmDb().mnem(self.cv().name)
00138       egu = mnemObj.conversion().egu(self.cv().rawValue())
00139       text = mnemObj.conversion().tostring(egu)
00140 #      try:
00141 #        text = '%.2f' %egu
00142 #      except:
00143 #        text = '%s' %egu
00144       self.setText(2,text)
00145 
00146   def raiseAlarm(self):
00147     title = "%s alarm from Telemetry point %s" % ( self.state().state(), str(self.text(0)) )
00148 
00149     stateColor = self.icons[self.state().stateEnum()].color()
00150     message  = ""
00151 
00152     message += "%s has raised a %s alarm.<br><br>" % \
00153                ( str(self.text(0)), self.state().state())
00154     if self.__cv is not None:
00155       mnemObj = self.tlmDb().mnem(self.__cv.name)
00156       egu = mnemObj.conversion().egu( self.__cv.rawValue() )
00157       if egu is None:
00158         message += "EGU failed conversion<br>"
00159       else:
00160         message += "EGU value = %.2f<br>" % egu
00161 
00162       message += "Raw value = 0x%x<br>" % self.__cv.rawValue()
00163       if mnemObj.limit() is not None:
00164         message += "Limit Definition = %s<br>" % str(mnemObj.limit())
00165 
00166     mb = QMessageBox( title,
00167                       message,
00168                       self.messageBoxStates[self.state().stateEnum()],
00169                       QMessageBox.Ok,
00170                       QMessageBox.NoButton,
00171                       QMessageBox.NoButton,
00172                       self.__gui,
00173                       None,
00174                       False )
00175     mb.show()
00176 
00177 
00178   def name(self):
00179     return self.__name
00180 
00181 class QLV_InfoWidget(QWidget):
00182   def __init__(self, alarmedItem, parent=None, name=None, fl=0):
00183     QWidget.__init__(self, parent, name, fl)
00184 
00185     self.layout = QGridLayout(self, 1,1,0,6)
00186 
00187     self.nameLbl   = QLabel(alarmedItem.text(0), self)
00188     self.stateLbl  = QLabel(alarmedItem.state().state(), self)
00189     self.nameLbl.setAlignment(Qt.AlignHCenter)
00190 
00191     self.stateLbl.setAlignment(Qt.AlignHCenter)
00192     stateColor = alarmedItem.icons[alarmedItem.state().stateEnum()].color()
00193     self.stateLbl.setPaletteForegroundColor(QColor(stateColor))
00194 
00195     self.layout.addWidget( self.nameLbl, 0, 0 )
00196     self.layout.addWidget( self.stateLbl, 1, 0 )
00197 
00198     if alarmedItem.cv() is not None:
00199       mnemObj = alarmedItem.tlmDb().mnem(alarmedItem.cv().name)
00200       egu     = mnemObj.conversion().egu(alarmedItem.cv().rawValue())
00201 
00202       try:
00203         msg = "Raw: 0x%06x    EGU: %.2f" % (alarmedItem.cv().rawValue(), egu)
00204       except:
00205         msg = "Raw: 0x%06x    EGU: %s" % (alarmedItem.cv().rawValue(), egu)
00206       self.valueLbl = QLabel(str(msg), self)
00207       self.valueLbl.setAlignment(Qt.AlignHCenter)
00208       self.layout.addWidget( self.valueLbl, 2, 0 )
00209 
00210 class QLV_LimitsWidget(QWidget):
00211   def __init__(self, alarmedItem, parent=None, name=None, fl=0):
00212     QWidget.__init__(self, parent, name, fl)
00213 
00214     self.setCaption(QString("Limit Information"))
00215     self.layout = QGridLayout(self, 1,1,0,6)
00216 
00217     self.nameLbl   = QLabel(alarmedItem.text(0), self)
00218     self.nameLbl.setAlignment(Qt.AlignHCenter)
00219 
00220 
00221     self.layout.addWidget( self.nameLbl, 0, 0 )
00222 
00223     try:
00224       mnemObj = alarmedItem.tlmDb().mnem(alarmedItem.cv().name)
00225       msg = mnemObj.limit()
00226     except:
00227       msg = "No Limits"
00228     self.valueLbl = QLabel(str(msg), self)
00229     self.valueLbl.setAlignment(Qt.AlignHCenter)
00230     self.layout.addWidget( self.valueLbl, 2, 0 )
00231 
00232 
00233 class AlarmClient(CurrValClient):
00234   def __init__(self, host, port, gui, mnemList):
00235 
00236     CurrValClient.__init__(self, host, port, mnemList)
00237     self.__gui = gui
00238     self.__updateCounter = 0
00239     # self.registerAll()  # moved to AlarmHandler.configure()
00240 
00241   def update(self, cv):
00242     self.__updateCounter += 1
00243 
00244     guiBridge = self.__gui.guiBridge()
00245 
00246     mnemObj = self.__gui.tlmDb().mnem(cv.name)
00247     egu     = mnemObj.conversion().egu(cv.rawValue())
00248     limit   = mnemObj.limit()
00249     try:
00250       guiBridge.execGUImethodNR( self.__gui,
00251                                  self.__gui.alarmItems()[cv.name].setCV,
00252                                  cv )
00253       if limit is not None:
00254         lc = limit.check(egu)
00255       else:
00256         lc = AlarmState.NoLimit
00257       guiBridge.execGUImethodNR( self.__gui,
00258                                  self.__gui.alarmItems()[cv.name].update,
00259                                  lc )
00260     except:
00261       print 'AlarmClient.update2 no alarmItem:',cv.name
00262 
00263 
00264   def reply(self, cv):
00265     pass
00266 
00267   def getUpdateCount(self):
00268     return self.__updateCounter
00269 
00270 if __name__ == '__main__':
00271   pass
00272 

Generated on Thu Apr 27 20:52:41 2006 for LICOS L02-01-00 by doxygen 1.4.6-NO