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

gAEM.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__ = "GLAST ACD functional block hierarchy"
00013 __author__  = "Selim Tuvi <stuvi@slac.stanford.edu> SLAC - GLAST LAT I&T/Online"
00014 __date__     = ("$Date: 2005/12/21 01:07:55 $").split(' ')[1]
00015 __version__ = "$Revision: 2.17 $"
00016 __release__  = "$Name: R04-12-00 $"
00017 __credits__ = "SLAC"
00018 
00019 import LATTE.copyright_SLAC
00020 
00021 import time
00022 import gDb
00023 import gAttr
00024 import LATTE.client.gRegister as gRegister
00025 import LATTE.client.gException as gException
00026 
00027 class GAEM(gDb.Gdb):
00028   """\brief ACD Common Controller.
00029 
00030   Has GAEM specific registers and dataless commands.
00031 
00032   Valid Registers:
00033   - \c configuration
00034   - \c common_status
00035   - \c freeboard_status
00036   - \c command_response
00037   - \c trgseq
00038   - \c power_status
00039   - \c address
00040   - \c timeout
00041   - \c relocation
00042   - \c response_timeout
00043   - \c power_up
00044   - \c power_down
00045   - \c trigger_statistics
00046 
00047   Dataless Commands:
00048   - \c cmd_reset
00049 
00050   """
00051   __attrs = [
00052     gAttr.GattrReg('configuration',       0, 4),
00053     gAttr.GattrReg('common_status',       1, 4),
00054     gAttr.GattrReg('freeboard_status',    2, 4),
00055     gAttr.GattrReg('command_response',    3, 4),
00056     gAttr.GattrReg('trgseq',              4, 4),
00057     gAttr.GattrReg('power_status',        5, 4),
00058     gAttr.GattrReg('address',             6, 4),
00059     gAttr.GattrReg('timeout',             7, 4),
00060     gAttr.GattrReg('relocation',          8, 4),
00061     gAttr.GattrReg('response_timeout',    9, 4),
00062     gAttr.GattrReg('power_up',           10, 4),
00063     gAttr.GattrReg('power_down',         11, 4),
00064     gAttr.GattrReg('trigger_statistics', 12, 4),
00065     gAttr.GattrDlc('cmd_reset',           1, 0),
00066     ]
00067 
00068   def __init__(self, client, parent):
00069     """\brief Initialize valid registers as Gattrs.
00070 
00071     Assign default values to members
00072     """
00073     self.ARC = gDb.Children(self, GARC)
00074     self.AEQ = None
00075     flags = {'CmdrspFabric'    : 'On',
00076              'EventFabric'     : 'On',
00077              'UsePdu1'         : False,
00078              'UseRedundantConv': False}
00079     gDb.Gdb.__init__(self, client, parent, 0, self.__attrs, None, flags)
00080 
00081   def read(self, reg):
00082     return self.cmdrsp('AEM_read', gDb.Lem.ADDR_AEM, reg, '!I')
00083 
00084   def load(self, reg, value):
00085     return self.cmdrsp('AEM_load', gDb.Lem.ADDR_AEM, reg, value)
00086 
00087   def send(self, cmd):
00088     return self.cmdrsp('AEM_cmd', gDb.Lem.ADDR_AEM, cmd)
00089 
00090   def downARC(self, arcId):
00091     """\brief Navigate to the GARC indicated by \a childId
00092 
00093     \param  childId The id of the child GARC
00094 
00095     \return         A GARC object instance
00096     """
00097     return self.ARC.down(arcId)
00098 
00099   def allARC(self):
00100     """\brief Navigate to the broadcast GARC
00101 
00102     \return The broadcast GARC object instance
00103     """
00104     return self.ARC.all()
00105 
00106   def existsARC(self, arcId):
00107     """\brief Check if the GARC instance with the id
00108     \a arcId exists in the schema.
00109 
00110     \param  arcId ACD readout controller id
00111 
00112     \return       1 if it exists, 0 if it doesn't.
00113     """
00114     return self.ARC.exists(arcId)
00115 
00116   def downAEQ(self):
00117     """\brief Navigate to the GAEQ
00118 
00119     \return The GAEQ object instance
00120     """
00121     return self.AEQ
00122 
00123   def existsAEQ(self):
00124     """\brief Check if the GAEQ instance exists in the schema.
00125 
00126     \return  1 if it exists, 0 if it doesn't.
00127     """
00128     return self.AEQ != None
00129 
00130 ## private:
00131   def __removeARC(self, arcId):
00132     self.ARC.remove(arcId)
00133 
00134   def __addARC(self, arcId):
00135     return self.ARC.add(arcId)
00136 
00137   def __removeAEQ(self):
00138     self.AEQ = None
00139 
00140   def __addAEQ(self):
00141     self.AEQ = GAEQ(self.client(), self)
00142     return self.AEQ
00143 
00144 class GAEQ(gDb.Gdb):
00145   """\brief ACD Environmental Monitors.
00146 
00147   Has GAEQ specific registers and dataless commands.
00148 
00149   Valid Registers:
00150   - \c env_free_1la
00151   - \c env_free_1rb
00152   - \c env_free_2la
00153   - \c env_free_2lb
00154   - \c env_free_2ra
00155   - \c env_free_2rb
00156   - \c env_free_3la
00157   - \c env_free_3rb
00158   - \c env_free_4la
00159   - \c env_free_4lb
00160   - \c env_free_4ra
00161   - \c env_free_4rb
00162   - \c env_daq
00163 
00164     Pseudo registers:
00165   - \c env_vdd_xxx
00166   - \c env_temp_xxx
00167   - \c env_hv1_xxx
00168   - \c env_hv2_xxx
00169   - \c env_dac_digital_3_3i
00170   - \c env_dac_temp
00171   - \c env_dac_hv_i
00172   - \c env_dac_v
00173 
00174   """
00175   __attrs = [
00176     # Registers
00177     gAttr.GattrReg('env_free_1la',       0, 8),
00178     gAttr.GattrReg('env_free_1rb',       1, 8),
00179     gAttr.GattrReg('env_free_2la',       2, 8),
00180     gAttr.GattrReg('env_free_2lb',       3, 8),
00181     gAttr.GattrReg('env_free_2ra',       4, 8),
00182     gAttr.GattrReg('env_free_2rb',       5, 8),
00183     gAttr.GattrReg('env_free_3la',       6, 8),
00184     gAttr.GattrReg('env_free_3rb',       7, 8),
00185     gAttr.GattrReg('env_free_4la',       8, 8),
00186     gAttr.GattrReg('env_free_4lb',       9, 8),
00187     gAttr.GattrReg('env_free_4ra',      10, 8),
00188     gAttr.GattrReg('env_free_4rb',      11, 8),
00189     gAttr.GattrReg('env_daq',           12, 8),
00190     ]
00191   __STALE_TMO = 1.0     # Timeout in seconds before considering adcs value stale
00192   __GAEQ_ENV_VDD_1LA = 20
00193   __ADCS_BASE = 20
00194 
00195   i = __ADCS_BASE
00196   for env in ('1la','1rb','2la','2lb','2ra','2rb',
00197               '3la','3rb','4la','4lb','4ra','4rb'):
00198     __attrs.append(gAttr.GattrReg('env_vdd_'+env, i, 2))
00199     i+=1
00200     __attrs.append(gAttr.GattrReg('env_temp_'+env, i, 2))
00201     i+=1
00202     __attrs.append(gAttr.GattrReg('env_hv1_'+env, i, 2))
00203     i+=1
00204     __attrs.append(gAttr.GattrReg('env_hv2_'+env, i, 2))
00205     i+=1
00206   __attrs.append(gAttr.GattrReg('env_dac_digital_3_3i', 68, 2))
00207   __attrs.append(gAttr.GattrReg('env_dac_temp', 69, 2))
00208   __attrs.append(gAttr.GattrReg('env_dac_hv_i', 70, 2))
00209   __attrs.append(gAttr.GattrReg('env_dac_v', 71, 2))
00210 
00211   def __init__(self, client, parent):
00212     """\brief Initialize valid registers as Gattrs.
00213 
00214     Assign default values to members
00215     """
00216     self.__envs = 13*[(None, 0)]      # [gRegister.Register, time.time()]
00217     gDb.Gdb.__init__(self, client, parent, 0, self.__attrs)
00218 
00219   def read(self, reg):
00220     if reg < GAEQ.__ADCS_BASE:
00221       rsp = self.cmdrsp('AEM_ENV_read', gDb.Lem.ADDR_AEM, reg, '!I', '!I')
00222       timestamp = rsp.timestamp()
00223       status    = rsp.status()
00224       payloads  = (rsp.payloads()[1], rsp.payloads()[0])
00225       return gRegister.Register(timestamp, status, payloads, 'II')
00226     else:
00227       return self.__fetchReg(reg)
00228 
00229   def load(self, reg, value):
00230     return self.cmdrsp('AEM_ENV_load', gDb.Lem.ADDR_AEM, reg, value)
00231 
00232   def __fetchReg(self, reg):
00233     mux   = (reg - GAEQ.__ADCS_BASE) / 4
00234     which = (reg - GAEQ.__ADCS_BASE) % 4
00235     now = time.time()
00236     (rsp, rt) = self.__envs[mux]
00237     if ((rsp is None) or (now - rt) > GAEQ.__STALE_TMO):
00238       rsp = self.cmdrsp('AEM_ENV_acquire', gDb.Lem.ADDR_AEM, mux, '!I', '!I')
00239       notready = (rsp.payloads()[0]>>31) & 1
00240       tmo = ((rsp.payloads()[0]>>28) & 1) | ((rsp.payloads()[0]>>12) & 1) |\
00241             ((rsp.payloads()[1]>>28) & 1) | ((rsp.payloads()[1]>>12) & 1)
00242       if notready:
00243         status = gException.LATInterfaceStatus.status('OCS_BDADC')
00244         raise gException.LATInterfaceException(status)
00245       if tmo:
00246         status = gException.LATInterfaceStatus.status('OCS_TMOADC')
00247         raise gException.LATInterfaceException(status)
00248       self.__envs[mux] = (rsp, now)
00249     timestamp = rsp.timestamp()
00250     status    = rsp.status()
00251     payload   = rsp.payloads()[0] << 32 | rsp.payloads()[1]
00252     value     = int((payload >> (16 * which)) & 0xfff)
00253     payloads  = [value]
00254     return gRegister.Register(timestamp, status, payloads, 'H')
00255 
00256 class GARC(gDb.Gdb):
00257   """\brief ACD Readout Controller.
00258 
00259   Has GARC specific registers and dataless commands.
00260 
00261   Valid Registers:
00262   - function block 0
00263     - \c veto_delay
00264     - \c hvbs
00265     - \c saa
00266     - \c use_hv_normal
00267     - \c use_hv_saa
00268     - \c hold_delay
00269     - \c veto_width
00270     - \c hitmap_width
00271     - \c hitmap_deadtime
00272   - function block 1
00273     - \c look_at_me
00274     - \c hitmap_delay
00275     - \c pha_en_0
00276     - \c veto_en_0
00277     - \c hld_en_0
00278     - \c pha_en_1
00279     - \c veto_en_1
00280     - \c hld_en_1
00281     - \c max_pha
00282   - function block 2
00283     - \c mode
00284     - \c status
00285     - \c last_cmd
00286     - \c diagnostic
00287     - \c cmd_reject
00288     - \c free_id
00289     - \c garc_version
00290   - function block 3
00291     - \c pha_threshold_0
00292     - \c pha_threshold_1
00293     - \c pha_threshold_2
00294     - \c pha_threshold_3
00295     - \c pha_threshold_4
00296     - \c pha_threshold_5
00297     - \c pha_threshold_6
00298   - function block 4
00299     - \c pha_threshold_7
00300     - \c pha_threshold_8
00301     - \c pha_threshold_9
00302     - \c pha_threshold_10
00303     - \c pha_threshold_11
00304     - \c pha_threshold_12
00305     - \c pha_threshold_13
00306   - function block 5
00307     - \c pha_threshold_14
00308     - \c pha_threshold_15
00309     - \c pha_threshold_16
00310     - \c pha_threshold_17
00311     - \c adc_tacq
00312 
00313   Dataless Commands
00314   - \c cmd_reset
00315   - \c cmd_calstrobe
00316   - \c cmd_set_hvbs
00317   - \c cmd_set_hvsaa
00318 
00319   """
00320   __attrs = [
00321     # Registers
00322     # function block 0
00323     gAttr.GattrReg('veto_delay',         2, 2),
00324     gAttr.GattrReg('hvbs',               8, 2),
00325     gAttr.GattrReg('saa',                9, 2),
00326     gAttr.GattrReg('use_hv_normal',     10, 2),
00327     gAttr.GattrReg('use_hv_saa',        11, 2),
00328     gAttr.GattrReg('hold_delay',        12, 2),
00329     gAttr.GattrReg('veto_width',        13, 2),
00330     gAttr.GattrReg('hitmap_width',      14, 2),
00331     gAttr.GattrReg('hitmap_deadtime',   15, 2),
00332     # function block 1
00333     gAttr.GattrReg('look_at_me',        20, 2),
00334     gAttr.GattrReg('hitmap_delay',      24, 2),
00335     gAttr.GattrReg('pha_en_0',          25, 2),
00336     gAttr.GattrReg('veto_en_0',         26, 2),
00337     gAttr.GattrReg('pha_en_1',          28, 2),
00338     gAttr.GattrReg('veto_en_1',         29, 2),
00339     gAttr.GattrReg('max_pha',           31, 2),
00340     # function block 2
00341     gAttr.GattrReg('mode',              40, 2),
00342     gAttr.GattrReg('status',            41, 2),
00343     gAttr.GattrReg('last_cmd',          42, 2),
00344     gAttr.GattrReg('diagnostic',        43, 2),
00345     gAttr.GattrReg('cmd_reject',        44, 2),
00346     gAttr.GattrReg('free_id',           45, 2),
00347     gAttr.GattrReg('garc_version',      46, 2),
00348     # function block 3
00349     gAttr.GattrReg('pha_threshold_0',   56, 2),
00350     gAttr.GattrReg('pha_threshold_1',   57, 2),
00351     gAttr.GattrReg('pha_threshold_2',   58, 2),
00352     gAttr.GattrReg('pha_threshold_3',   59, 2),
00353     gAttr.GattrReg('pha_threshold_4',   60, 2),
00354     gAttr.GattrReg('pha_threshold_5',   61, 2),
00355     gAttr.GattrReg('pha_threshold_6',   62, 2),
00356     # function block 4
00357     gAttr.GattrReg('pha_threshold_7',   72, 2),
00358     gAttr.GattrReg('pha_threshold_8',   73, 2),
00359     gAttr.GattrReg('pha_threshold_9',   74, 2),
00360     gAttr.GattrReg('pha_threshold_10',  75, 2),
00361     gAttr.GattrReg('pha_threshold_11',  76, 2),
00362     gAttr.GattrReg('pha_threshold_12',  77, 2),
00363     gAttr.GattrReg('pha_threshold_13',  78, 2),
00364     # function block 5
00365     gAttr.GattrReg('pha_threshold_14',  88, 2),
00366     gAttr.GattrReg('pha_threshold_15',  89, 2),
00367     gAttr.GattrReg('pha_threshold_16',  90, 2),
00368     gAttr.GattrReg('pha_threshold_17',  91, 2),
00369     gAttr.GattrReg('adc_tacq',          92, 2),
00370     # Dataless Commands
00371     gAttr.GattrDlc('cmd_reset',          1, 0),
00372     gAttr.GattrDlc('cmd_calstrobe',      3, 0),
00373     gAttr.GattrDlc('cmd_set_hvbs',      10, 0),
00374     gAttr.GattrDlc('cmd_set_hvsaa',     11, 0)
00375     ]
00376 
00377   def __init__(self, client, parent, id):
00378     """\brief Initialize valid registers as Gattrs.
00379 
00380     Assign default values to members
00381     """
00382     if id < gDb.Lem.NARCS:
00383       addr = id
00384     elif id == gDb.Children.BCASTID:
00385       addr = gDb.Lem.ARCBCAST
00386     else:
00387       raise KeyError("*** gAEM: GARC id %d is invalid" %(id))
00388     self.AFE = gDb.Children(self, GAFE)
00389     gDb.Gdb.__init__(self, client, parent, id, self.__attrs, addr)
00390 
00391   def read(self, reg):
00392     return self.cmdrsp('ARC_read', gDb.Lem.ADDR_AEM, self.addr(), reg, '!I')
00393 
00394   def load(self, reg, value):
00395     return self.cmdrsp('ARC_load', gDb.Lem.ADDR_AEM, self.addr(), reg, value)
00396 
00397   def send(self, cmd):
00398     return self.cmdrsp('ARC_cmd', gDb.Lem.ADDR_AEM, self.addr(), cmd)
00399 
00400   def downAFE(self, afeId):
00401     """\brief Navigate to the GAFE indicated by \a childId
00402 
00403     \param  childId The id of the child GAFE
00404 
00405     \return         A GAFE object instance
00406     """
00407     return self.AFE.down(afeId)
00408 
00409   def allAFE(self):
00410     """\brief Navigate to the broadcast GAFE
00411 
00412     \return The broadcast GAFE object instance
00413     """
00414     return self.AFE.all()
00415 
00416   def existsAFE(self, afeId):
00417     """\brief Check if the GAFE instance with the id
00418     \a afeId exists in the schema.
00419 
00420     \param  afeId ACD readout controller id
00421 
00422     \return       1 if it exists, 0 if it doesn't.
00423     """
00424     return self.AFE.exists(afeId)
00425 
00426 ## private:
00427   def __removeAFE(self, afeId):
00428     self.AFE.remove(afeId)
00429 
00430   def __addAFE(self, afeId):
00431     return self.AFE.add(afeId)
00432 
00433 
00434 class GAFE(gDb.Gdb):
00435   """\brief ACD Front-End Controller.
00436 
00437   Has GAFE specific registers and dataless commands.
00438 
00439   Valid Registers:
00440   - \c configuration
00441   - \c veto_dac
00442   - \c hld_dac
00443   - \c veto_vernier
00444   - \c bias_dac
00445   - \c tci_dac
00446   - \c vers_addr
00447   - \c write_ctr
00448   - \c reject_ctr
00449   - \c loop_ctr
00450   - \c chip_addr
00451 
00452   """
00453   __attrs = [
00454     # Registers
00455     gAttr.GattrReg('configuration',  0, 2),
00456     gAttr.GattrReg('veto_dac',       1, 2),
00457     gAttr.GattrReg('veto_vernier',   2, 2),
00458     gAttr.GattrReg('hld_dac',        3, 2),
00459     gAttr.GattrReg('bias_dac',       4, 2),
00460     gAttr.GattrReg('tci_dac',        5, 2),
00461     gAttr.GattrReg('vers_addr',      6, 2),
00462     gAttr.GattrReg('write_ctr',      7, 2),
00463     gAttr.GattrReg('reject_ctr',     8, 2),
00464     gAttr.GattrReg('loop_ctr',       9, 2),
00465     gAttr.GattrReg('chip_addr',     10, 2)
00466     ]
00467 
00468   def __init__(self, client, parent, id):
00469     """\brief Initialize valid registers as Gattrs.
00470 
00471     """
00472     if id < gDb.Lem.NAFES:
00473       addr = id
00474     elif id == gDb.Children.BCASTID:
00475       addr = gDb.Lem.AFEBCAST
00476     else:
00477       raise KeyError("*** gAEM: GAFE id %d is invalid" %(id))
00478     gDb.Gdb.__init__(self, client, parent, id, self.__attrs, addr)
00479 
00480   def read(self, reg):
00481     return self.cmdrsp('AFE_read', gDb.Lem.ADDR_AEM, self.up().addr(), self.addr(), reg, '!I')
00482 
00483   def load(self, reg, value):
00484     return self.cmdrsp('AFE_load', gDb.Lem.ADDR_AEM, self.up().addr(), self.addr(), reg, value)
00485 
00486   def send(self, cmd):
00487     return self.cmdrsp('AFE_cmd', gDb.Lem.ADDR_AEM, self.up().addr(), self.addr(), cmd)
00488 

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