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__ = "Housekeeping trending tester module" 00012 __author__ = "J. Panetta <panetta@SLAC.Stanford.edu> SLAC - GLAST LAT I&T/Online" 00013 __date__ = "7/20/2004" 00014 __version__ = "$Revision: 1.3 $" 00015 __credits__ = "SLAC" 00016 00017 00018 import LATTE.copyright_SLAC 00019 00020 import os, sys 00021 import xml.dom.minidom as minidom 00022 from LATTE.client.gOptions import Options 00023 from LATTE.database.gSchemaConfig import getChildNodes 00024 00025 class HskPacketWriter(object): 00026 def __init__(self, codeFile=sys.stdout, sqlFile=sys.stdout): 00027 self.__name = None 00028 self.__apid = None 00029 self.__length = None 00030 self.__brief = None 00031 self.__descr = None 00032 self.__payload = [] 00033 self.codeFile = codeFile 00034 self.sqlFile = sqlFile 00035 pass 00036 00037 def dump(self): 00038 prefix = ' ' 00039 # print "HSK telemetry packet: " 00040 # print "%sHeader:" % ( prefix ) 00041 # print "%s%sapid = 0x%04x" % ( prefix, prefix, self.apid() ) 00042 # print "%s%slength = 0x%04x" % ( prefix, prefix, self.length() ) 00043 # print "%s%sbrief = %s" % ( prefix, prefix, self.brief() ) 00044 # print "%s%sdescr = %s" % ( prefix, prefix, self.descr() ) 00045 # print "%sPayload: " % ( prefix ) 00046 # print self.payload() 00047 # print "" 00048 00049 def writeCode(self): 00050 className = "HskPacket%03x" % self.apid() 00051 t = ' ' 00052 00053 msg = "" 00054 msg += "class %s(HskPacket):\n" % className 00055 # insert readList here. 00056 msg += t + "mnemList = [\n" 00057 for tag,bitkey,brief in self.payload(): 00058 msg += t + t + '(\'' + tag + '\', \'' + bitkey + '\'),\n' 00059 msg += t + t + "]\n" 00060 00061 msg += t + "def __init__(self, ui):\n" 00062 msg += t + t + "HskPacket.__init__(self, ui)\n" 00063 msg += t + t + "self.name = \"%s\"\n" % self.name() 00064 msg += t + t + "self.brief = \"%s\"\n" % self.brief() 00065 msg += t + t + "self.descr = \"%s\"\n" % self.descr() 00066 msg += t + t + "self.read()\n" 00067 print >> self.codeFile, msg 00068 print >> self.codeFile, "" 00069 00070 def writeSQL(self): 00071 for tag,bitkey,brief in self.payload(): 00072 msg = '' 00073 msg += 'INSERT ignore INTO tlmfields (MNEM,DESCRIP) VALUES' 00074 msg += '(\'' + tag + '\', \'' + brief + '\');' 00075 print >> self.sqlFile, msg 00076 00077 def name(self, a=None): 00078 if a is not None: 00079 self.__name = str(a) 00080 return self.__name 00081 00082 def apid(self, a=None): 00083 if a is not None: 00084 self.__apid = int(a) 00085 return self.__apid 00086 00087 def length(self, a=None): 00088 if a is not None: 00089 self.__length = int(a)/8 00090 return self.__length 00091 00092 def brief(self, a=None): 00093 if a is not None: 00094 self.__brief = a 00095 return self.__brief 00096 00097 def descr(self, a=None): 00098 if a is not None: 00099 self.__descr = a 00100 return self.__descr 00101 00102 def payload(self): 00103 return self.__payload 00104 00105 def addPayload(self, item): 00106 self.__payload.append(item) 00107 00108 00109 00110 def readCATH(fileName, codeFile, sqlFile): 00111 fn = "readCATH" 00112 curDir = os.getcwd() 00113 mainFilePath = os.path.dirname(fileName) 00114 mainFileName = os.path.basename(fileName) 00115 if mainFilePath != '': os.chdir(mainFilePath) 00116 try: 00117 doc = minidom.parse(mainFileName) 00118 except Exception, e: 00119 os.chdir(curDir) 00120 raise e 00121 00122 comments = [] 00123 for n in doc.childNodes: 00124 if n.nodeType == minidom.Node.COMMENT_NODE: 00125 comments.append(n.data) 00126 00127 for n in getChildNodes(doc.documentElement): 00128 if n.nodeType == minidom.Node.ELEMENT_NODE: 00129 tagName = n.tagName.lower() 00130 if tagName == "tlm_pkt": 00131 processTlmPkt(n, codeFile, sqlFile) 00132 if tagName == "tlm_fld": 00133 processTlmFld(n, codeFile) 00134 00135 def processTlmFld(node, codeFile): 00136 nodeID = node.getAttribute('id') 00137 t = ' ' 00138 for n in getChildNodes(node): 00139 tagName = n.tagName.lower() 00140 if tagName == 'length': 00141 length = n.firstChild.data.strip() 00142 00143 msg = t + t + '\'' + nodeID + '\': ' + length + ',' 00144 print >> codeFile, msg 00145 00146 def processTlmPkt(node, codeFile, sqlFile): 00147 nodeID = node.getAttribute('id') 00148 packetCode = HskPacketWriter(codeFile, sqlFile) 00149 packetCode.name(nodeID) 00150 for n in getChildNodes(node): 00151 tagName = n.tagName.lower() 00152 if tagName == 'apid': 00153 apid = n.firstChild.data.strip() 00154 packetCode.apid(apid) 00155 elif tagName == 'length': 00156 length = n.firstChild.data.strip() 00157 packetCode.length(length) 00158 elif tagName == 'brief': 00159 brief = n.firstChild.data.strip() 00160 packetCode.brief(brief) 00161 elif tagName == 'descr': 00162 descr = n.firstChild.data.strip() 00163 packetCode.descr(descr) 00164 elif tagName == 'tlm_payload': 00165 processTlmPayload(n, packetCode) 00166 else: 00167 pass 00168 packetCode.writeSQL() 00169 packetCode.writeCode() 00170 00171 def processTlmPayload(node, packetCode): 00172 for n in getChildNodes(node): 00173 tagName = n.tagName.lower() 00174 if tagName == 'tlm_itos': 00175 processTlmITOS(n, packetCode) 00176 else: 00177 pass 00178 00179 def processTlmITOS(node, packetCode): 00180 for n in getChildNodes(node): 00181 tagName = n.tagName.lower() 00182 if tagName == 'tlm_mne': 00183 processMnemonic(n, packetCode) 00184 else: 00185 raise KeyError, 'unrecognized node= ', tagName 00186 00187 def processMnemonic(node, packetCode): 00188 nodeID = str(node.getAttribute('id')) 00189 nodeField = str(node.getAttribute('tlm_fld')) 00190 for n in getChildNodes(node): 00191 tagName = n.tagName.lower() 00192 if tagName == 'brief': 00193 brief = n.firstChild.data.strip() 00194 else: 00195 pass 00196 packetCode.addPayload( (nodeID, nodeField, brief) ) 00197 00198 00199 00200 00201 def startHeader(codeFile): 00202 t = ' ' 00203 msg = '' 00204 msg += "from LATTE.monitoring.HskPacketDecoder import HskPacketBase\n" 00205 msg += "\n" 00206 msg += "class HskPacket(HskPacketBase):\n" 00207 msg += t + 'bitDict = {' 00208 print >> codeFile, msg 00209 00210 00211 def endHeader(codeFile): 00212 t = ' ' 00213 msg = '' 00214 msg += t + '}\n' 00215 msg += t + "def __init__(self, ui):\n" 00216 msg += t + t + "HskPacketBase.__init__(self, ui)\n" 00217 print >> codeFile, msg 00218 # print >> codeFile, "\n" 00219 00220 if __name__ == '__main__': 00221 00222 # Options, first list mandatory, second list optional 00223 options = Options(['field','packet'], 00224 []) 00225 try: 00226 options.parse() 00227 except Exception, msg: 00228 # options.usage(usage()) 00229 raise Exception, msg 00230 00231 field = options.field 00232 packet = options.packet 00233 00234 online = os.environ['ONLINE_ROOT'] 00235 00236 codeFile = open(os.path.join(online, 'LATTE/monitoring/HskPacket.py'), 'w') 00237 sqlFile = open(os.path.join(online, 'LATTE/monitoring/HskSql.sql'), 'w') 00238 00239 print >> sqlFile, "__version__ = $Revision: 1.3 $" 00240 print >> sqlFile, "use itosdb;" 00241 00242 startHeader(codeFile) 00243 readCATH(field, codeFile, sqlFile) 00244 endHeader(codeFile) 00245 readCATH(packet, codeFile, sqlFile) 00246 00247 00248