00001
00002
00003
00004
00005
00006
00007
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
00104
00105 self.__cmdCount = 0
00106
00107 self.__cmdDebug = cmdDebug
00108
00109 def initCmdCountMon(self):
00110 """!\brief Initialize the command count monitor.
00111
00112 """
00113
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
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
00772
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
00815 return ~self.__pids & 0x1
00816
00817 def getPID6(self):
00818
00819 return ~(self.__pids >> 1) & 0x1