ScriptEngineConnector.py

Go to the documentation of this file.
00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2005
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__ = "VSC Proxy connector class"
00012 __author__   = "S. Tuvi <stuvi@slac.stanford.edu> SLAC - GLAST LAT I&T/Online"
00013 __date__     = "2005/09/06"
00014 __updated__  = "$Date: 2006/04/21 20:54:55 $"
00015 __version__  = "$Revision: 1.31 $"
00016 __release__  = "$Name: HEAD $"
00017 __credits__  = "SLAC"
00018 
00019 import LICOS.copyright_SLAC
00020 
00021 import VSC, CCSDS
00022 import struct
00023 import socket
00024 import logging as log
00025 
00026 
00027 from LCAT_encoder import LCAT_CmdPacketFactory
00028 
00029 from LICOS.tools.proxy.VscProxyTools        import getip
00030 from LICOS.tools.proxy.VscProxyPorts        import VscProxyPorts
00031 from LICOS.scriptEngine.seTelemetryHandler  import seTelemetryHandler
00032 from LICOS.scriptEngine.seCmdCountMon       import seCmdCountMon
00033 
00034 class ScriptEngineConnector(object):
00035   """!\brief Script Engine proxy connector class.
00036 
00037   This class creates three VSC proxies, one to the control stream to
00038   send tele-commands, one to the diagnostics proxy and one to the
00039   telemetry proxy.
00040   """
00041   AA = VSC.VscProxy.AA
00042   AB = VSC.VscProxy.AB
00043   BA = VSC.VscProxy.BA
00044   BB = VSC.VscProxy.BB
00045 
00046   BOOTFLAG_UPPERBANK  = 0x5400
00047   BOOTFLAG_LOWERBANK  = 0xA800
00048   BOOTFLAG_MNTEEPROM  = 0xC000
00049 
00050   VscCtrlPort        = 3000
00051 
00052   DownloadSiuPids = VSC.VscProxy.DownloadSiuPids
00053 
00054   def __init__(self, vscHost, diagHost=None, telemHost=None,
00055                archiver=None, cmdDebug=None, portBase=None):
00056     """!\brief ScriptEngineConnector constructor.
00057 
00058     \param vscHost   VSC host name or IP address.  Required option.
00059     \param diagHost  Diagnostics telemetry process proxy host name or IP address (Default: None)
00060     \param telemHost Telemetry proxy process host name or IP address (Default: None)
00061     \param archiver  Command archiver object (Default: None)
00062     \param cmdDebug  If set, command debugging is turned on.  (Warning, verbose output to follow)
00063     \param portBase  If set, defines the base for the VSC port mapping.  If None, uses self.VscCtrlPort
00064 
00065     Note:  When diagHost and/or telemHost is None, no diagnostic or standard
00066     telemetry will be received.
00067     """
00068     apidRangeList = ([0x000, 0xfff],)
00069     if portBase is None:
00070       portBase = self.VscCtrlPort
00071 
00072     ports = VscProxyPorts(portBase)
00073 
00074     if diagHost is not None:
00075       ip_dia = getip(diagHost)
00076       self.__diag = VSC.VscProxy.Proxy(ip_dia, ports.diagnostic())
00077       self.__diagHandler = seTelemetryHandler(apidRangeList)
00078       self.__pidsHandler  = sePidsHandler()
00079       self.__vscdRouter   = LicosTelemetryRouter(self.__pidsHandler)
00080       self.__latdRouter   = LicosTelemetryRouter(self.__diagHandler)
00081       self.__diag.vscDiagnostic(self.__vscdRouter)
00082       self.__diag.latDiagnostic(self.__latdRouter)
00083     else:
00084       self.__diagHandler = None
00085       self.__pidsHandler = None
00086 
00087     if telemHost is not None:
00088       ip_tel = getip(telemHost)
00089       self.__tele = VSC.VscProxy.Proxy(ip_tel, ports.telemetry())
00090       self.__telemHandler = seTelemetryHandler(apidRangeList)
00091       self.__vscRouter   = LicosTelemetryRouter(self.__telemHandler)
00092       self.__latRouter   = LicosTelemetryRouter(self.__telemHandler)
00093       self.__tele.vscTelemetry(self.__vscRouter)
00094       self.__tele.latTelemetry(self.__latRouter)
00095     else:
00096       self.__telemHandler = None
00097 
00098     ip_vsc = getip(vscHost)
00099     self.__ctrl = VSC.VscProxy.Controller(ip_vsc, ports.vsc())
00100     self.__archiver = archiver
00101     self.__tlmDb = None
00102 
00103     # Command count for commands sent from the ScriptEngineConnector
00104     # since the start of ScriptEngine.
00105     self.__cmdCount = 0
00106 
00107     self.__cmdDebug = cmdDebug
00108 
00109   def initCmdCountMon(self):
00110     """!\brief Initialize the command count monitor.
00111 
00112     """
00113     # Command count monitor which polls on CmdCnt0 telemetry (if it exists)
00114     self.__cmdCountMon = seCmdCountMon(self)
00115     self.__cmdCountMon.startMonitor()
00116 
00117   def getCmdCountMon(self):
00118     """!\brief Retrieve the command count monitor instance.
00119 
00120     \return seCmdCountMon instance
00121     """
00122     return self.__cmdCountMon
00123 
00124   def getCmdDebug(self):
00125     """!\brief Retrieve the command debug flag.
00126 
00127     \return Command debug flag.
00128     """
00129     return (self.__cmdDebug is not None)
00130 
00131   def getDiagHandler(self):
00132     """!\brief Retrieve the diagnostic telemetry handler.
00133 
00134     \return seTelemetryHandler instance
00135     """
00136     return self.__diagHandler
00137 
00138   def getTelemHandler(self):
00139     """!\brief Retrieve the LAT/VSC telemetry handler.
00140 
00141     \return seTelemetryHandler instance
00142     """
00143     return self.__telemHandler
00144 
00145   def getPidsHandler(self):
00146     """!\brief Retrieve the pids telemetry handler.
00147 
00148     \return sePidsHandler instance
00149     """
00150     return self.__pidsHandler
00151 
00152 
00153   def getArchiver(self):
00154     """!\brief Retrieve the command archiver object.
00155 
00156     \return A VscArchiver instance
00157     """
00158     return self.__archiver
00159 
00160   def getTlmDb(self):
00161     return self.__tlmDb
00162 
00163   def setTlmDb(self, db):
00164     self.__tlmDb = db
00165 
00166   def bootSIU(self, siuId=0, flags_hi=None, flags_lo=None):
00167     """!\brief Boot the SIU.
00168 
00169     \param siuId    SIU unit
00170     \param flags_hi SIU boot flags MSW
00171     \param flags_lo SIU boot flags LSW
00172     """
00173     if flags_hi is None:
00174       flags_hi = self.BOOTFLAG_UPPERBANK
00175     if flags_lo is None:
00176       flags_lo = self.BOOTFLAG_MNTEEPROM
00177 
00178     cmd = LCAT_CmdPacketFactory('LPBCRTOSEXEC')
00179     cmd.set_payload('LPBCLATUNIT', siuId)
00180     cmd.set_payload('LPBCPAD1',0x0)
00181     cmd.set_payload('LPBCPAD2',0x0)
00182     cmd.set_payload('LPBCSBCFLAGSHI',flags_hi)
00183     cmd.set_payload('LPBCSBCFLAGSLO',flags_lo)
00184     self.execute(cmd)
00185 
00186   def bootEPU(self, epuId=0, flags_hi=None, flags_lo=None):
00187     """!\brief Send boot telecommand to the EPU
00188 
00189     \param epuId EPU id
00190     \param flags EPU boot flags
00191     """
00192     if flags_hi is None:
00193       flags_hi = self.BOOTFLAG_UPPERBANK
00194     if flags_lo is None:
00195       flags_lo = self.BOOTFLAG_MNTEEPROM
00196 
00197     cmd = LCAT_CmdPacketFactory('LPBCRTOSEXEC')
00198     cmd.set_payload('LPBCLATUNIT',epuId+1)
00199     cmd.set_payload('LPBCPAD1',0x0)
00200     cmd.set_payload('LPBCPAD2',0x0)
00201     cmd.set_payload('LPBCSBCFLAGSHI',flags_hi)
00202     cmd.set_payload('LPBCSBCFLAGSLO',flags_lo)
00203     self.execute(cmd)
00204 
00205   def resetSIU(self, siuId=0):
00206     """!\brief Initiate a warm reboot of the SIU
00207 
00208     \param siuId SIU unit
00209     """
00210     cmd = LCAT_CmdPacketFactory('LPBCRESET')
00211     cmd.set_payload('LPBCLATUNIT', siuId)
00212     cmd.set_payload('LPBCPAD1',0x0)
00213     cmd.set_payload('LPBCPAD2',0x0)
00214     cmd.set_payload('LPBCPRIFLAGSHI', 0)
00215     cmd.set_payload('LPBCPRIFLAGSLO', 0)
00216     self.execute(cmd)
00217 
00218   def resetEPU(self, epuId=0):
00219     """!\brief Initiate a warm reboot of the EPU
00220 
00221     \param epuId EPU id
00222     """
00223     cmd = LCAT_CmdPacketFactory('LPBCRESET')
00224     cmd.set_payload('LPBCLATUNIT', epuId+1)
00225     cmd.set_payload('LPBCPAD1',0x0)
00226     cmd.set_payload('LPBCPAD2',0x0)
00227     cmd.set_payload('LPBCPRIFLAGSHI', 0)
00228     cmd.set_payload('LPBCPRIFLAGSLO', 0)
00229     self.execute(cmd)
00230 
00231   def mainFeedOn(self, siuId=0, pduId=0, mfPri=1, dabPri=1, dabRed=0, ppsRed=0, ppsInt=0, ssrRed=0, gbmRed=0):
00232     """!\brief Turn on the main feed.
00233 
00234     The default parameter values turn on the PDU and GASU at the same time.
00235 
00236     To turn on the PDU only:
00237      pduId = PDU id,
00238      mfPri = 1
00239      dabPri = 0
00240      dabRed = 0
00241 
00242     To turn on the primary GASU (after turning on the PDU):
00243      pduId = PDU id,
00244      mfPri = 1
00245      dabPri = 1
00246      dabRed = 0
00247 
00248     To turn on the redundant GASU (after turning on the PDU):
00249      pduId = PDU id,
00250      mfPri = 1
00251      dabPri = 0
00252      dabRed = 1
00253 
00254     \param siuId  SIU unit
00255     \param pduId  PDU unit
00256     \param mfPRi  Primary main-feed selection
00257     \param dabPri Primary DAB selection
00258     \param dabRed Redundant DAB selection
00259     \param ppsRed Redundant PPS selection
00260     \param ppsInt PPS selection
00261     """
00262     cmd = LCAT_CmdPacketFactory('LIMMAINFEEDON')
00263     cmd.set_payload('LIMSIUPAD0', 0)
00264     cmd.set_payload('LIMSIUID', siuId)
00265     cmd.set_payload('LIMSIUSSRRED', ssrRed)
00266     cmd.set_payload('LIMSIUGBMRED', gbmRed)
00267     cmd.set_payload('LIMSIUPPSRED', ppsRed)
00268     cmd.set_payload('LIMSIUPPSINT', ppsInt)
00269     cmd.set_payload('LIMSIUPAD1', 0)
00270     cmd.set_payload('LIMSIUMFPRI', mfPri)
00271     if pduId == 0:
00272       cmd.set_payload('LIMSIUPDU0', 1)
00273       cmd.set_payload('LIMSIUPDU1', 0)
00274     elif pduId == 1:
00275       cmd.set_payload('LIMSIUPDU0', 0)
00276       cmd.set_payload('LIMSIUPDU1', 1)
00277     else:
00278       cmd.set_payload('LIMSIUPDU0', 0)
00279       cmd.set_payload('LIMSIUPDU1', 0)
00280     cmd.set_payload('LIMSIUDABPRI', dabPri)
00281     cmd.set_payload('LIMSIUDABRED', dabRed)
00282     self.executeTeleCmd(cmd)
00283 
00284 
00285   def powerOnEpuOnly(self, epuId=0, pduId=0):
00286     """!\brief Power on the EPU only
00287 
00288     \param epuId EPU id
00289     \param pduId PDU id
00290     """
00291     self.setPowerEpuOnly(epuId, pduId, powerOn=1)
00292 
00293   def powerOffEpuOnly(self, epuId=0, pduId=0):
00294     """!\brief Power off the EPU only
00295 
00296     \param epuId EPU id
00297     \param pduId PDU id
00298     """
00299     self.setPowerEpuOnly(epuId, pduId, powerOn=0)
00300 
00301   def setPowerEpuOnly(self, epuId, pduId, powerOn):
00302     if powerOn:
00303       cmd = LCAT_CmdPacketFactory('LIMPOWERON')
00304     else:
00305       cmd = LCAT_CmdPacketFactory('LIMPOWEROFF')
00306     for i in range(16):
00307       cmd.set_payload('LIMPWRTEMSEL%02d' % i, 0)
00308       cmd.set_payload('LIMPWRTEMPDU%02d' % i, 0)
00309       cmd.set_payload('LIMPWRTEMCAL%02d' % i, 0)
00310       cmd.set_payload('LIMPWRTEMTKR%02d' % i, 0)
00311     if epuId == 0:
00312       cmd.set_payload('LIMPWREPUSEL02',0)
00313       cmd.set_payload('LIMPWREPUSEL01',0)
00314       cmd.set_payload('LIMPWREPUSEL00',1)
00315     elif epuId == 1:
00316       cmd.set_payload('LIMPWREPUSEL02',0)
00317       cmd.set_payload('LIMPWREPUSEL01',1)
00318       cmd.set_payload('LIMPWREPUSEL00',0)
00319     else:
00320       cmd.set_payload('LIMPWREPUSEL02',1)
00321       cmd.set_payload('LIMPWREPUSEL01',0)
00322       cmd.set_payload('LIMPWREPUSEL00',0)
00323     cmd.set_payload('LIMPWREPUPDU02',pduId)
00324     cmd.set_payload('LIMPWREPUPDU01',pduId)
00325     cmd.set_payload('LIMPWREPUPDU00',pduId)
00326     cmd.set_payload('LIMPWRACDSEL',0)
00327     cmd.set_payload('LIMPWRACDPDU',0)
00328     cmd.set_payload('LIMPWRACDSUPRED',0)
00329     for i in range(12):
00330       cmd.set_payload('LIMPWRACDFREE%02d' % i, 0)
00331     self.executeTeleCmd(cmd)
00332 
00333   def powerOnTemOnly(self, temId, pduId=0):
00334     self.setPowerTemOnly(temId, pduId, powerOn=1)
00335 
00336   def powerOffTemOnly(self, temId, pduId=0):
00337     self.setPowerTemOnly(temId, pduId, powerOn=0)
00338 
00339   def setPowerTemOnly(self, temId, pduId, powerOn):
00340     if powerOn:
00341       cmd = LCAT_CmdPacketFactory('LIMPOWERON')
00342     else:
00343       cmd = LCAT_CmdPacketFactory('LIMPOWEROFF')
00344     for i in range(16):
00345       if i == temId:
00346         power = 1
00347       else:
00348         power = 0
00349       cmd.set_payload('LIMPWRTEMSEL%02d' % i, power)
00350       cmd.set_payload('LIMPWRTEMPDU%02d' % i, pduId)
00351       cmd.set_payload('LIMPWRTEMCAL%02d' % i, 0)
00352       cmd.set_payload('LIMPWRTEMTKR%02d' % i, 0)
00353     for i in range(3):
00354       cmd.set_payload('LIMPWREPUSEL%02d' % i, 0)
00355       cmd.set_payload('LIMPWREPUPDU%02d' % i ,0)
00356     cmd.set_payload('LIMPWRACDSEL',0)
00357     cmd.set_payload('LIMPWRACDPDU',0)
00358     cmd.set_payload('LIMPWRACDSUPRED',0)
00359     for i in range(12):
00360       cmd.set_payload('LIMPWRACDFREE%02d' % i, 0)
00361     self.executeTeleCmd(cmd)
00362 
00363   def powerOnCalOnly(self, temId):
00364     self.setPowerCalOnly(temId, powerOn=1)
00365 
00366   def powerOffCalOnly(self, temId):
00367     self.setPowerCalOnly(temId, powerOn=0)
00368 
00369   def setPowerCalOnly(self, temId, powerOn):
00370     if powerOn:
00371       cmd = LCAT_CmdPacketFactory('LIMPOWERON')
00372     else:
00373       cmd = LCAT_CmdPacketFactory('LIMPOWEROFF')
00374     for i in range(16):
00375       if i == temId:
00376         power = 1
00377       else:
00378         power = 0
00379       cmd.set_payload('LIMPWRTEMSEL%02d' % i, 0)
00380       cmd.set_payload('LIMPWRTEMPDU%02d' % i, 0)
00381       cmd.set_payload('LIMPWRTEMCAL%02d' % i, power)
00382       cmd.set_payload('LIMPWRTEMTKR%02d' % i, 0)
00383     for i in range(3):
00384       cmd.set_payload('LIMPWREPUSEL%02d' % i, 0)
00385       cmd.set_payload('LIMPWREPUPDU%02d' % i ,0)
00386     cmd.set_payload('LIMPWRACDSEL',0)
00387     cmd.set_payload('LIMPWRACDPDU',0)
00388     cmd.set_payload('LIMPWRACDSUPRED',0)
00389     for i in range(12):
00390       cmd.set_payload('LIMPWRACDFREE%02d' % i, 0)
00391     self.executeTeleCmd(cmd)
00392 
00393   def setBiasVoltageCal(self, temId, biasVoltage):
00394     cmd = LCAT_CmdPacketFactory('LIMBIASCAL')
00395     for i in range(16):
00396       if i == temId:
00397         valid   = 1
00398         calBias = biasVoltage
00399       else:
00400         valid   = 0
00401         calBias = 0
00402       cmd.set_payload('LIMCALVALID%02d' % i, valid)
00403       cmd.set_payload('LIMCALBIAS%02d' % i, calBias)
00404     self.executeTeleCmd(cmd)
00405 
00406   def powerOnTkrOnly(self, temId):
00407     self.setPowerTkrOnly(temId, powerOn=1)
00408 
00409   def powerOffTkrOnly(self, temId):
00410     self.setPowerTkrOnly(temId, powerOn=0)
00411 
00412   def setPowerTkrOnly(self, temId, powerOn):
00413     if powerOn:
00414       cmd = LCAT_CmdPacketFactory('LIMPOWERON')
00415     else:
00416       cmd = LCAT_CmdPacketFactory('LIMPOWEROFF')
00417     for i in range(16):
00418       if i == temId:
00419         power = 1
00420       else:
00421         power = 0
00422       cmd.set_payload('LIMPWRTEMSEL%02d' % i, 0)
00423       cmd.set_payload('LIMPWRTEMPDU%02d' % i, 0)
00424       cmd.set_payload('LIMPWRTEMCAL%02d' % i, 0)
00425       cmd.set_payload('LIMPWRTEMTKR%02d' % i, power)
00426     for i in range(3):
00427       cmd.set_payload('LIMPWREPUSEL%02d' % i, 0)
00428       cmd.set_payload('LIMPWREPUPDU%02d' % i ,0)
00429     cmd.set_payload('LIMPWRACDSEL',0)
00430     cmd.set_payload('LIMPWRACDPDU',0)
00431     cmd.set_payload('LIMPWRACDSUPRED',0)
00432     for i in range(12):
00433       cmd.set_payload('LIMPWRACDFREE%02d' % i, 0)
00434     self.executeTeleCmd(cmd)
00435 
00436   def setBiasVoltageTkr(self, temId, biasVoltage):
00437     cmd = LCAT_CmdPacketFactory('LIMBIASTKR')
00438     for i in range(16):
00439       if i == temId:
00440         valid   = 1
00441         tkrBias = biasVoltage
00442       else:
00443         valid   = 0
00444         tkrBias = 0
00445       cmd.set_payload('LIMTKRVALID%02d' % i, valid)
00446       cmd.set_payload('LIMTKRBIAS%02d' % i, tkrBias)
00447     self.executeTeleCmd(cmd)
00448 
00449   def powerOnAemOnly(self, pduId=0, supRed=0):
00450     self.setPowerAemOnly(pduId, supRed, powerOn=1)
00451 
00452   def powerOffAemOnly(self, pduId=0, supRed=0):
00453     self.setPowerAemOnly(pduId, supRed, powerOn=0)
00454 
00455   def setPowerAemOnly(self, pduId, supRed, powerOn):
00456     if powerOn:
00457       cmd = LCAT_CmdPacketFactory('LIMPOWERON')
00458     else:
00459       cmd = LCAT_CmdPacketFactory('LIMPOWEROFF')
00460     for i in range(16):
00461       cmd.set_payload('LIMPWRTEMSEL%02d' % i, 0)
00462       cmd.set_payload('LIMPWRTEMPDU%02d' % i, 0)
00463       cmd.set_payload('LIMPWRTEMCAL%02d' % i, 0)
00464       cmd.set_payload('LIMPWRTEMTKR%02d' % i, 0)
00465     for i in range(3):
00466       cmd.set_payload('LIMPWREPUSEL%02d' % i, 0)
00467       cmd.set_payload('LIMPWREPUPDU%02d' % i ,0)
00468     cmd.set_payload('LIMPWRACDSEL', 1)
00469     cmd.set_payload('LIMPWRACDPDU', pduId)
00470     cmd.set_payload('LIMPWRACDSUPRED', supRed)
00471     for i in range(12):
00472       cmd.set_payload('LIMPWRACDFREE%02d' % i, 0)
00473     self.executeTeleCmd(cmd)
00474 
00475   def powerOnFreeBoardOnly(self, freeId):
00476     self.setPowerFreeBoardOnly(freeId, powerOn=1)
00477 
00478   def powerOffFreeBoardOnly(self, freeId):
00479     self.setPowerFreeBoardOnly(freeId, powerOn=0)
00480 
00481   def setPowerFreeBoardOnly(self, freeId, powerOn):
00482     if powerOn:
00483       cmd = LCAT_CmdPacketFactory('LIMPOWERON')
00484     else:
00485       cmd = LCAT_CmdPacketFactory('LIMPOWEROFF')
00486     for i in range(16):
00487       cmd.set_payload('LIMPWRTEMSEL%02d' % i, 0)
00488       cmd.set_payload('LIMPWRTEMPDU%02d' % i, 0)
00489       cmd.set_payload('LIMPWRTEMCAL%02d' % i, 0)
00490       cmd.set_payload('LIMPWRTEMTKR%02d' % i, 0)
00491     for i in range(3):
00492       cmd.set_payload('LIMPWREPUSEL%02d' % i, 0)
00493       cmd.set_payload('LIMPWREPUPDU%02d' % i ,0)
00494     cmd.set_payload('LIMPWRACDSEL', 0)
00495     cmd.set_payload('LIMPWRACDPDU', 0)
00496     cmd.set_payload('LIMPWRACDSUPRED', 0)
00497     for i in range(12):
00498       if i == freeId:
00499         power = 1
00500       else:
00501         power = 0
00502       cmd.set_payload('LIMPWRACDFREE%02d' % i, power)
00503     self.executeTeleCmd(cmd)
00504 
00505   def setBiasVoltageAcd(self, freeId, saaBiasVoltage, hvBiasVoltage):
00506     cmd = LCAT_CmdPacketFactory('LIMBIASACD')
00507     for i in range(12):
00508       if i == freeId:
00509         valid   = 1
00510         saaBias = saaBiasVoltage
00511         hvBias  = hvBiasVoltage
00512       else:
00513         valid   = 0
00514         saaBias = 0
00515         hvBias  = 0
00516       cmd.set_payload('LIMARCSAAVALID%02d' % i, valid)
00517       cmd.set_payload('LIMARCSAABIAS%02d'  % i, saaBias)
00518       cmd.set_payload('LIMARCHVVALID%02d'  % i, valid)
00519       cmd.set_payload('LIMARCHVBIAS%02d'   % i, hvBias)
00520     self.executeTeleCmd(cmd)
00521 
00522   # This version only works with post B0-6-2 libraries -ST 02/16/06
00523   def setBiasVoltageAcdNew(self, freeId, saaBiasVoltage, hvBiasVoltage, hv1bs, hv2bs, priGasu=1):
00524     """!\brief Set ACD bias voltages for free board.
00525 
00526     \param freeId         Free board id
00527     \param saaBiasVoltage SAA voltage in counts
00528     \param hvBiasVoltage  HVBS voltage in counts
00529     \param hv1bs          Enable HV1
00530     \param hv2bs          Enable HV2
00531     \param priGasu        Primary GASU flag to determine the veto enables
00532     """
00533     cmd = LCAT_CmdPacketFactory('LIMBIASACD')
00534     for i in range(12):
00535       if i == freeId:
00536         valid   = 1
00537         saaBias = saaBiasVoltage
00538         hvBias  = hvBiasVoltage
00539         hv1nbl  = hv1bs
00540         hv2nbl  = hv2bs
00541       else:
00542         valid   = 0
00543         saaBias = 0
00544         hvBias  = 0
00545         hv1nbl  = hv1bs
00546         hv2nbl  = hv2bs
00547 
00548       if priGasu:
00549         vetoena = 1
00550         vetoenb = 0
00551       else:
00552         vetoena = 0
00553         vetoenb = 1
00554 
00555       cmd.set_payload('LIMARCSAAVALID%02d' % i, valid)
00556       cmd.set_payload('LIMARCSAABIAS%02d'  % i, saaBias)
00557       cmd.set_payload('LIMARCHVVALID%02d'  % i, valid)
00558       cmd.set_payload('LIMARCHVBIAS%02d'   % i, hvBias)
00559       cmd.set_payload('LIMARCVETOENA%02d'  % i, vetoena)
00560       cmd.set_payload('LIMARCVETOENB%02d'  % i, vetoenb)
00561       cmd.set_payload('LIMARCHV1BS%02d'    % i, hv1nbl)
00562       cmd.set_payload('LIMARCHV2BS%02d'    % i, hv2nbl)
00563     self.executeTeleCmd(cmd)
00564 
00565   def start(self, time=0):
00566     """!\brief Start the scheduler.
00567 
00568     \param time Time
00569     """
00570     start = VSC.VscProxy.Scheduler(VSC.VscProxy.Start, time)
00571     self.__ctrl.execute(start)
00572 
00573   def stop(self):
00574     """!\brief Stop the scheduler.
00575 
00576     """
00577     stop = VSC.VscProxy.Scheduler(VSC.VscProxy.Stop)
00578     self.__ctrl.execute(stop)
00579 
00580   def getCmdTuple(self, cmd):
00581     """!\brief Retrieve the command tuple.
00582 
00583     \param cmd Command object
00584 
00585     \return A tuple containing (cmdName, payloadDict)
00586     """
00587     payloadDict = {}
00588     for payload in cmd.get_payload_list():
00589       value = cmd.get_payload(payload)
00590       payloadDict[payload] = value
00591     cmdTuple = (cmd.name, payloadDict)
00592     return cmdTuple
00593 
00594   def logCmd(self, cmdTuple):
00595     """!\brief Log the command and its payloads.
00596 
00597     \param cmdTuple Command tuple generated from the getCmdTuple method.
00598     """
00599     (cmdName, payloadDict) = cmdTuple
00600     log.debug("%s(" % cmdName)
00601     payloads = payloadDict.keys()
00602     payloads.sort()
00603     for payload in payloads:
00604       log.debug("   %s=0x%x" % (payload, payloadDict[payload]))
00605     log.debug(")")
00606 
00607   def execute(self, cmd):
00608     """!\brief Send the command to the VSC.
00609 
00610     \param cmd Command object
00611 
00612     \return Encoded tele-command packet
00613     """
00614     if self.__cmdDebug is not None:
00615       self.logCmd(self.getCmdTuple(cmd))
00616     packet = cmd.encode_vsc()
00617     if self.__archiver is not None:
00618       self.__archiver.send(packet)
00619     self.__ctrl.execute(packet)
00620     return packet
00621 
00622   def executeTeleCmd(self, cmd):
00623     """!\brief Send the command to the VSC and increment command counter.
00624 
00625     \param cmd Command object
00626 
00627     \return Encoded tele-command packet
00628     """
00629     self.__cmdCount+=1
00630     return self.execute(cmd)
00631 
00632   def m7(self, starttime, endtime):
00633     """!\brief Send the magic seven.
00634 
00635     """
00636     att1 = VSC.VscCcsds.Attitude(160000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00637     att2 = VSC.VscCcsds.Attitude(360000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00638     att3 = VSC.VscCcsds.Attitude(560000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00639     att4 = VSC.VscCcsds.Attitude(760000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00640     att5 = VSC.VscCcsds.Attitude(960000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00641     data = VSC.VscCcsds.Data    (800000, 1., 2., 3., 1., 2., 3.,
00642                                  VSC.VscCcsds.Data.Idle, 99, 0)
00643     tone = VSC.VscCcsds.TimeTone(True)
00644     for timebase in range(starttime, endtime):
00645       self.__ctrl.schedule(timebase, att1, att2, att3, att4, att5, data, tone);
00646 
00647   def m7default(self):
00648     """!\brief Send the default magic seven.
00649 
00650     """
00651     att1 = VSC.VscCcsds.Attitude(160000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00652     att2 = VSC.VscCcsds.Attitude(360000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00653     att3 = VSC.VscCcsds.Attitude(560000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00654     att4 = VSC.VscCcsds.Attitude(760000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00655     att5 = VSC.VscCcsds.Attitude(960000, 1., 2., 3., 4., 10.0, 11.0, 12.0)
00656     data = VSC.VscCcsds.Data    (800000, 1., 2., 3., 1., 2., 3.,
00657                                  VSC.VscCcsds.Data.Idle, 99, 0)
00658     tone = VSC.VscCcsds.TimeTone(True)
00659     self.__ctrl.schedule(att1, att2, att3, att4, att5, data, tone);
00660 
00661   def m7off(self):
00662     """!\brief Send a blank schedule() to turn off magic seven.
00663     """
00664     self.__ctrl.schedule()
00665 
00666   def siuSelect(self, path):
00667     """!\brief Select SIU.
00668 
00669     \param path SIU path
00670     """
00671     cmd = VSC.VscProxy.SiuInterface(path)
00672     self.__ctrl.execute(cmd)
00673 
00674   def daqSelect(self, path):
00675     """!\brief Select DAQ.
00676 
00677     \param path DAQ path
00678     """
00679     cmd = VSC.VscProxy.DaqInterface(path)
00680     self.__ctrl.execute(cmd)
00681 
00682   def ssr(self, enable):
00683     """!\brief Enable or disable SSR.
00684 
00685     \param enable Boolean enable/disable flag
00686     """
00687     if enable:
00688       enableFlag = VSC.VscProxy.Enable
00689     else:
00690       enableFlag = VSC.VscProxy.Disable
00691     cmd = VSC.VscProxy.SsrInterface(enableFlag)
00692     self.__ctrl.execute(cmd)
00693 
00694   def toggle(self, lines, values):
00695     """!\brief Toggle lines.
00696 
00697     \param lines  Lines
00698     \param values Values
00699     """
00700     cmd = VSC.VscProxy.ToggleLines(lines, values)
00701     self.__ctrl.execute(cmd)
00702 
00703   def pids(self):
00704     """!\brief Download SIU pids.
00705 
00706     """
00707     cmd = VSC.VscProxy.Download(VSC.VscProxy.DownloadSiuPids)
00708     self.__ctrl.execute(cmd)
00709 
00710   def reset(self):
00711     """!\brief Reset the VSC proxy.
00712 
00713     """
00714     cmd = VSC.VscProxy.Reset()
00715     self.__ctrl.execute(cmd)
00716 
00717   def grb(self):
00718     """!\brief grb.
00719 
00720     """
00721     cmd = VSC.VscProxy.Grb()
00722     self.__ctrl.execute(cmd)
00723 
00724   def monitor(self, state):
00725     """!\brief monitor method.
00726 
00727     monitor the VSC telemetry on state (state)
00728     """
00729     cmd = VSC.VscProxy.Monitor(state)
00730     self.__ctrl.execute(cmd)
00731 
00732   def getCmdCount(self):
00733     """!\brief Retrieve number of commands sent to the VSC
00734     since the start of the ScriptEngine.
00735 
00736     \return Command count since the start of the ScriptEngine
00737     """
00738     return self.__cmdCount
00739 
00740   def getController(self):
00741     """!\brief Return the VSC controller instance
00742 
00743     \return VSC.VscProxy.Controller instance
00744     """
00745     return self.__ctrl
00746 
00747 
00748 class LicosTelemetryRouter(VSC.VscRouting.TelemetryRouter):
00749   """!\brief Telemetry router class.
00750 
00751   """
00752   def __init__(self, handler):
00753     """!\brief LicosTelemetryRouter constructor.
00754 
00755     """
00756     VSC.VscRouting.TelemetryRouter.__init__(self)
00757     self.insert(handler)
00758 
00759   def allocate(self):
00760     """!\brief Virtual method called by the VSC to allocate memory for the Telemetry object.
00761 
00762     """
00763     self.__packet = CCSDS.Ccsds.Telemetry(0, 0, 0)
00764     return self.__packet
00765 
00766   def catchall(self, ccsds):
00767     """!\brief If an apid is not handled this method is called.
00768 
00769     \param ccsds Raw packet
00770     """
00771     #log.debug("LicosTelemetryRouter.catchAll no handler found for apid 0x%x" % \
00772     #      (ccsds.apid())
00773     pass
00774 
00775 class LicosScienceRouter(VSC.VscRouting.ScienceRouter):
00776   """!\brief Science router class.
00777 
00778   """
00779   def __init__(self, handler):
00780     """!\brief LicosScienceRouter constructor.
00781 
00782     """
00783     VSC.VscRouting.ScienceRouter.__init__(self)
00784     self.insert(handler)
00785 
00786   def allocate(self):
00787     """!\brief Virtual method called by the VSC to allocate memory for the Telemetry object.
00788 
00789     """
00790     self.__packet = CCSDS.Ccsds.Science(0, 0, 0)
00791     return self.__packet
00792 
00793   def catchall(self, ccsds):
00794     """!\brief If an apid is not handled this method is called.
00795 
00796     \param ccsds Raw packet
00797     """
00798     log.debug("LicosScienceRouter.catchall: SSR event apid 0x%x length %d" %(ccsds.apid(), ccsds.length()))
00799 
00800 class sePidsHandler(seTelemetryHandler):
00801   def __init__(self):
00802     seTelemetryHandler.__init__(self, [(ScriptEngineConnector.DownloadSiuPids,
00803                                        ScriptEngineConnector.DownloadSiuPids)])
00804     self.__pids = 0
00805 
00806   def process(self, telemetry):
00807     (pad, tid, pids) = struct.unpack('!HII', telemetry.payload())
00808     log.debug("VscPidsHandler at seconds 0x%x useconds 0x%x tid 0x%x pids 0x%x" \
00809           % (telemetry.secs(), telemetry.usecs(), tid, pids))
00810     self.__pids = pids
00811     seTelemetryHandler.process(self, telemetry)
00812 
00813   def getPID5(self):
00814     # PID value should be inverted
00815     return ~self.__pids & 0x1
00816 
00817   def getPID6(self):
00818     # PID value should be inverted
00819     return ~(self.__pids >> 1) & 0x1

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