00001
00002
00003
00004
00005
00006
00007
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"
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
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
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
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
00141
00142
00143
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
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