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

gPlumber.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 
00011 __facility__ = "Online"
00012 __abstract__ = "Power and LCB initialization (plumbing) class"
00013 __author__  = "A. Perazzo <perazzo@slac.stanford.edu> SLAC - GLAST LAT I&T/Online"
00014 __date__     = ("$Date: 2005/09/23 01:44:13 $").split(' ')[1]
00015 __version__ = "$Revision: 2.13 $"
00016 __release__  = "$Name: R04-12-00 $"
00017 __credits__ = "SLAC"
00018 
00019 import LATTE.copyright_SLAC
00020 import logging
00021 import gFabrics
00022 import gLCB
00023 
00024 import LATTE.client.gException as gException
00025 
00026 class Plumber(object):
00027   __lcbred  = 8
00028   __lcbbit  = 9
00029   __lcbiclk = 10
00030   __lcboclk = 11
00031 
00032   __cmdtem = 0
00033   __cmdgem = 16
00034   __cmdaem = 17
00035   __cmdebm = 18
00036   __cmdpdu = 19
00037   __cmdsiu = 24
00038   __cmdepu = 27
00039 
00040   __evtgem = 0
00041   __evttem = 1
00042   __evtaem = 17
00043   __evtsiu = 18
00044   __evtepu = 21
00045 
00046   __siumfs = 0
00047   __siupd0 = 1
00048   __siupd1 = 2
00049   __siuda0 = 3
00050   __siuda1 = 4
00051 
00052   __ocsmsglevel  = 0x0f
00053   __ocsverbose   = 0x10
00054   __ocsinitforce = 0x20
00055   __ocsinitxbrd  = 0x40
00056   __ocsusexbrd   = 0x80
00057 
00058   def __init__(self, lat, xbrd):
00059     self.__ocsopts=0
00060     self.__pwrmask=0
00061     self.__lcbmask=0
00062 
00063     self.__cmdmask=0
00064     self.__pdumask=0
00065     self.__secmask=0
00066     self.__evtmask=0
00067 
00068     integer = True
00069     self.__lat = lat
00070     self.__lcb = lat.LCB
00071 
00072     ignore_missing_nodes = self.__lcb.getFlag('IgnoreMissingNodes', integer)
00073     if ignore_missing_nodes:
00074       self.__evtmset=0
00075       self.__cmdmset=0
00076     else:
00077       self.__evtmset=0xffffffffL
00078       self.__cmdmset=0xffffffffL
00079 
00080     self.__lcbmask = self.__lcb.getFlag('BoardId', integer)
00081     if self.__lcb.getFlag('UseRedundant', integer):
00082       self.__lcbmask |= 1<<Plumber.__lcbred
00083     if self.__lcb.getFlag('UseBitWide', integer):
00084       self.__lcbmask |= 1<<Plumber.__lcbbit
00085     if self.__lcb.getFlag('UseTrailingIclock', integer):
00086       self.__lcbmask |= 1<<Plumber.__lcbiclk
00087     if self.__lcb.getFlag('UseTrailingOclock', integer):
00088       self.__lcbmask |= 1<<Plumber.__lcboclk
00089 
00090     if xbrd is not None:
00091       self.__ocsopts |= Plumber.__ocsinitxbrd
00092       if xbrd.GLT is not None:
00093         self.__ocsopts |= Plumber.__ocsusexbrd
00094 
00095     if lat.existsGEM():
00096       self.__setcmd(lat.GEM, Plumber.__cmdgem)
00097       self.__setevt(lat.GEM, Plumber.__evtgem)
00098 
00099     if lat.existsAEM():
00100       self.__setcmd(lat.AEM, Plumber.__cmdaem)
00101       self.__setevt(lat.AEM, Plumber.__evtaem)
00102       if lat.AEM.getFlag('UsePdu1', integer):
00103         self.__pdumask |= (1<<(Plumber.__cmdaem))
00104       if lat.AEM.getFlag('UseRedundantConv', integer):
00105         self.__secmask |= (1<<(Plumber.__cmdaem))
00106 
00107     if lat.existsEBM():
00108       self.__setcmd(lat.EBM, Plumber.__cmdebm)
00109 
00110     for pdu in lat.PDU.values():
00111       self.__setcmd(pdu, Plumber.__cmdpdu+pdu.id())
00112 
00113     for tem in lat.TEM.values():
00114       self.__setcmd(tem, Plumber.__cmdtem+tem.id())
00115       self.__setevt(tem, Plumber.__evttem+tem.id())
00116       if tem.getFlag('UsePdu1', integer):
00117         self.__pdumask |= (1<<(Plumber.__cmdtem+tem.id()))
00118 
00119     for siu in lat.SIU.values():
00120       self.__setcmd(siu, Plumber.__cmdsiu+siu.id())
00121       self.__setevt(siu, Plumber.__evtsiu+siu.id())
00122       if siu.getFlag('UseSecMainFeed', integer):
00123         self.__pwrmask |= 1<<Plumber.__siumfs
00124       if siu.getFlag('PowerPdu0', integer):
00125         self.__pwrmask |= 1<<Plumber.__siupd0
00126       if siu.getFlag('PowerPdu1', integer):
00127         self.__pwrmask |= 1<<Plumber.__siupd1
00128       if siu.getFlag('PowerPrimDab', integer):
00129         self.__pwrmask |= 1<<Plumber.__siuda0
00130       if siu.getFlag('PowerSecDab', integer):
00131         self.__pwrmask |= 1<<Plumber.__siuda1
00132       break
00133 
00134     for epu in lat.EPU.values():
00135       self.__setcmd(epu, Plumber.__cmdepu+epu.id())
00136       self.__setevt(epu, Plumber.__evtepu+epu.id())
00137       if epu.getFlag('UsePdu1', integer):
00138         self.__pdumask |= 1<<(Plumber.__cmdepu+epu.id())
00139       if epu.getFlag('UseRedundantConv', integer):
00140         self.__secmask |= 1<<(Plumber.__cmdepu+epu.id())
00141 
00142     # Backward comp with schemas with no SIUs/EPUs: add SIU0 to EBM dest mask
00143     if len(lat.SIU.items()) == 0 and len(lat.EPU.items()) == 0:
00144       self.__evtmset |= 1<<(Plumber.__evtsiu+1)
00145       self.__evtmask |= 1<<(Plumber.__evtsiu+1)
00146 
00147   def __setcmd(self, node, position):
00148     flag = node.getFlag('CmdrspFabric')
00149     if flag == 'On':
00150       self.__cmdmset |= 1<<position
00151       self.__cmdmask |= 1<<position
00152     elif flag == 'Off':
00153       self.__cmdmset |= 1<<position
00154     elif flag == 'Ignore':
00155       pass
00156     else:
00157       raise RuntimeError, "Node %s has invalid CmdrspFabric flag %s" \
00158             %(node.__class__.__name__, flag)
00159 
00160   def __setevt(self, node, position):
00161     flag = node.getFlag('EventFabric')
00162     if flag == 'On':
00163       self.__evtmset |= 1<<position
00164       self.__evtmask |= 1<<position
00165     elif flag == 'Off':
00166       self.__evtmset |= 1<<position
00167     elif flag == 'Ignore':
00168       pass
00169     else:
00170       raise RuntimeError, "Node %s has invalid EventFabric flag %s" \
00171             %(node.__class__.__name__, flag)
00172 
00173   def __init_ocs(self, fswmsglevel, ocsverbose, force):
00174     self.__ocsopts &= ~Plumber.__ocsmsglevel
00175     self.__ocsopts |= (fswmsglevel & Plumber.__ocsmsglevel)
00176     if ocsverbose:
00177       self.__ocsopts |= Plumber.__ocsverbose
00178     else:
00179       self.__ocsopts &= ~Plumber.__ocsverbose
00180     if force:
00181       logging.info('forcing fabric initialization')
00182       self.__ocsopts |= Plumber.__ocsinitforce
00183     else:
00184       self.__ocsopts &= ~Plumber.__ocsinitforce
00185     rsp = self.__lcb.cmdrsp('init_ocs', self.__ocsopts)
00186     if rsp.status() & 0x3:
00187       raise gException.LATInterfaceException(rsp.status())
00188 
00189   def __init_oes(self):
00190     rsp = self.__lcb.cmdrsp('init_oes', self.__ocsopts)
00191     if rsp.status() & 0x3:
00192       raise gException.LATInterfaceException(rsp.status())
00193 
00194   def __init_power(self):
00195     rsp = self.__lcb.cmdrsp('init_power', self.__pwrmask)
00196     if rsp.status() & 0x3:
00197       raise gException.LATInterfaceException(rsp.status())
00198 
00199   def __start_lcb(self):
00200     status = self.__lcb.start(self.__lcbmask)
00201     timeout = None
00202     if status == gException.LATInterfaceStatus.status('LCBD_NOCLK'):
00203       logging.error('waiting for the 20 MHz clock')
00204       timeout = 60
00205     elif status & 0x3:
00206       raise gException.LATInterfaceException(status)
00207     status = self.__lcb.start_wait(self.__lcbmask, timeout)
00208     if status & 0x3:
00209       raise gException.LATInterfaceException(status)
00210     logging.info('LCB state is now %s' %(gLCB.GLCB.State[self.__lcb.state()]))
00211 
00212   def __switch_lcb(self):
00213     state = self.__lcb.switch(self.__lcbmask)
00214     timeout = None
00215     if state == gLCB.GLCB.Offline:
00216       logging.error('waiting for the 20 MHz clock')
00217       timeout = 60
00218       state = self.__lcb.switch_wait(timeout)
00219     logging.info('LCB state is now %s' %(gLCB.GLCB.State[state]))
00220 
00221   def __setInternal1PPS(self, cru):
00222     internal1PPS = cru.getFlag('EnableInternal1PPS', integer=True)
00223     cruConfig = cru.configuration
00224     if cruConfig & 0x1 == 0x1 and internal1PPS == 0:
00225       cruConfig &= 0xFFFE
00226       cru.configuration = cruConfig
00227     elif cruConfig & 0x1 == 0x0 and internal1PPS == 1:
00228       cruConfig |= 0x1
00229       cru.configuration = cruConfig
00230       logging.info("Enabling internal 1-PPS")
00231 
00232   def initialize(self, fswmsglevel, ocsverbose, force, commander=True):
00233     self.__init_ocs(fswmsglevel, ocsverbose, force)
00234     state = self.__lcb.state()
00235     if state == gLCB.GLCB.Uninitialized:
00236       logging.info('LCB state is uninitialized, will load LCB')
00237       self.__init_power()
00238       self.__start_lcb()
00239     else:
00240       logging.info('LCB state is initialized, checking for clock')
00241       self.__switch_lcb()      
00242     self.__init_oes()
00243     if commander:
00244       fabrics = gFabrics.Fabrics(self.__lcb)
00245       fabrics.init_cmdrsp(self.__cmdmask, self.__cmdmset,
00246                           self.__pdumask, self.__secmask)
00247       fabrics.init_event(self.__evtmask, self.__evtmset)
00248       if self.__lat.existsCRU():
00249         self.__setInternal1PPS(self.__lat.CRU)
00250 

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