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