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 __facility__ = "Online"
00011 __abstract__ = "GLAST LAT Housekeeping server infrastructure"
00012 __author__ = "Jim Panetta <panetta@slac.stanford.edu> SLAC - GLAST I&T"
00013 __date__ = "07/28/04"
00014 __version__ = "$Revision: 1.2 $"
00015 __release__ = "$Name: R04-12-00 $"
00016 __credits__ = "SLAC"
00017
00018 import LATTE.copyright_SLAC
00019 import logging
00020 from LATTE.client.gException import LATInterfaceException
00021
00022 class RegisterInterface(object):
00023 """Represents a LAT housekeeping register for reading.
00024 """
00025 def __init__(self, node, name):
00026 """\brief RegisterReader constructor
00027
00028 \param node: a gNode (like GAEQ)
00029 \param name: a name (like env_free_1la)
00030 """
00031
00032 self.__readOnly = False
00033 try:
00034 node.regs.has_key(name)
00035 except AttributeError, e:
00036 self.__node = None
00037 else:
00038 self.__node = node
00039 if node.regs[name].isReadOnly():
00040 self.__readOnly = True
00041
00042 self.__name = name
00043 self.__lastReadValue = None
00044 self.__log = logging.getLogger()
00045
00046 def name(self): return self.__name
00047
00048 def read(self, cachedValue=False):
00049 """\brief read method
00050
00051 \return the raw value in the register or None
00052 """
00053 if cachedValue:
00054 return self.__lastReadValue
00055
00056 if self.__node:
00057 try:
00058 self.__lastReadValue = self.__node.regs[self.__name].get(bypass=1)
00059 except LATInterfaceException, e:
00060 self.__lastReadValue=None
00061 print e
00062 self.__log.error(e)
00063 else:
00064 self.__log.debug("There is no register %s to read.", self.__name)
00065
00066 return self.__lastReadValue
00067
00068 def write(self, value):
00069 """
00070 writes to the register
00071 """
00072 if self.__readOnly:
00073 self.log.error("Cannot write to a Read Only Register (%s)",
00074 self.name)
00075 if self.__node:
00076 try:
00077 self.__node.regs[self.__name].set(value,bypass=1)
00078 except LATInterfaceException, e:
00079 #print e
00080 self.__log.error(e)
00081 else:
00082 # If we are running headless, I'll just put this
00083 # in the cached value variable
00084 self.__log.debug("There is no register %s to write 0x%x to.",
00085 self.name, value)
00086 self.__lastReadValue=value
00087
00088
00089 class NodeRegisterList(object):
00090 """
00091 """
00092 def __init__(self, node):
00093 self.__node = node
00094
00095 self.__regMap = {}
00096 for regKey in node.regs.keys():
00097 self.__regMap[regKey] = RegisterInterface( node, regKey )
00098
00099 def map(self):
00100 return self.__regMap
00101
00102
00103 class AEQHskRegMap:
00104 """
00105 """
00106 regMap = {
00107 "env_free_1la" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00108 "env_free_1rb" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00109 "env_free_2la" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00110 "env_free_2lb" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00111 "env_free_2ra" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00112 "env_free_2rb" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00113 "env_free_3la" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00114 "env_free_3rb" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00115 "env_free_4la" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00116 "env_free_4lb" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00117 "env_free_4ra" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00118 "env_free_4rb" : [ "Vdd", "Temperature", "HV1", "HV2" ],
00119 "env_daq" : [ "FreeI", "Temperature", "HVI", "DAQV" ]
00120 }
00121 def __init__(self):
00122 pass
00123
00124 def decodeRegister(self, key, regValue):
00125 """
00126 decode an AEM register. Each 16 bit section looks like:
00127 MBZ[3] Timeout[1] Val[12]
00128
00129 \return a map of parsed values
00130 """
00131 keyList = self.regMap[key]
00132 retMap = {}
00133 if ( regValue >> 63 ) & 0x1: # not ready
00134 for i in range(4):
00135 retMap[keyList[i]] = None
00136 else:
00137 for i in range(4):
00138 word = ( regValue >> (16*i) ) & 0xffff
00139 timeout = word >> 15 & 0x1
00140 if timeout:
00141 value = None
00142 else:
00143 value = word & 0x7fff
00144 retMap[keyList[i]] = value
00145 return retMap
00146
00147
00148
00149