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__ = "Housekeeping handler client" 00013 __author__ = "Amedeo Perazzo <perazzo@slac.stanford.edu> SLAC - GLAST I&T/Online" 00014 __date__ = ("$Date: 2004/10/06 20:50:21 $").split(' ')[1] 00015 __version__ = "$Revision: 1.3 $" 00016 __release__ = "$Name: R04-12-00 $" 00017 __credits__ = "SLAC" 00018 00019 import LATTE.copyright_SLAC 00020 import logging as log 00021 00022 import struct 00023 00024 from LATTE.client.gBits import * 00025 00026 ccsdsFmt = "!LHLL" # 14 byte header 00027 00028 # Note: HSK packet length = 116 bytes --> HSK payload = 102 bytes 00029 00030 class ccsdsPacket(object): 00031 """\brief Interface to a generic CCSDS packet 00032 00033 \param ui The raw binary representation of the packet in big-endian byte order 00034 00035 Methods: 00036 apid() return packet APID 00037 secHead() return packet secondary header bit 00038 type() return packet type bit 00039 version() return packet version 00040 seqCnt() return sequence count 00041 seqFlg() return sequence flag 00042 length() return packet length in bytes 00043 seconds() return timestamp seconds 00044 subSeconds() return timestamp sub seconds 00045 payload() return packet payload (opaque) 00046 00047 """ 00048 def __init__(self, ui): 00049 self.__ui = ui 00050 self.__decode() 00051 00052 def __decode(self): 00053 # print "ccsdspacket:decode string=%d, fmt=%d" % (len(self.__ui[0:14]), struct.calcsize(ccsdsFmt)) 00054 ( header, self.__length, self.__seconds, self.__subSeconds ) = \ 00055 struct.unpack(ccsdsFmt, self.__ui[0:14]) 00056 self.__header = ccsdsHeader(header) 00057 self.__payload = self.__ui[14:] 00058 00059 def apid(self): return self.__header.apid 00060 def secHead(self): return self.__header.secHead 00061 def type(self): return self.__header.type 00062 def version(self): return self.__header.version 00063 def seqCnt(self): return self.__header.seqCnt 00064 def seqFlg(self): return self.__header.seqFlg 00065 def length(self): return self.__length 00066 def seconds(self): return self.__seconds 00067 def subSeconds(self): return self.__subSeconds 00068 def payload(self): return self.__payload 00069 00070 00071 class ccsdsHeader(BitField): 00072 """\brief CCSDS Header bitfield definition 00073 """ 00074 cch_BF = [ 00075 ( 'apid', 0, 11 ), 00076 ( 'secHead', 11, 12 ), 00077 ( 'type', 12, 13 ), 00078 ( 'version', 13, 16 ), 00079 ( 'seqCnt', 16, 30 ), 00080 ( 'seqFlg', 30, 32 ) 00081 ] 00082 def __init__(self, ui): 00083 BitField.__init__(self, ui, self.cch_BF) 00084 00085 00086 class HskPacketBase(ccsdsPacket): 00087 def __init__(self, ui): 00088 ccsdsPacket.__init__(self, ui) 00089 self.__bitsRead = 0 00090 # print "HskPacketBase:decode string=%d, fmt=%d" % (len(self.payload()), struct.calcsize('!51H')) 00091 self.__longArray = struct.unpack('!51H', self.payload()) 00092 00093 def __readBits(self, bits): 00094 # parse out n bits from the struct. 00095 # keep a count of the bits read 00096 if bits >= 16: 00097 return self.__readBitsBig(bits) 00098 mask = ( 1 << bits ) - 1 00099 retVal = ( self.__longArray[self.__bitsRead/16] >> (self.__bitsRead%16) ) & mask 00100 self.__bitsRead += bits 00101 return retVal 00102 00103 def __readBitsBig(self, bits): 00104 # more than 16 bits. Build an n bit number. 00105 nChunk = bits/16 + ( bits%16 != 0 ) # True == 1 00106 chunk = 0 00107 br = self.__bitsRead/16 00108 for i in range(nChunk): 00109 chunk |= long(self.__longArray[br+i]) << ( 16 * (nChunk - i - 1) ) 00110 00111 mask = (long(1) << bits) - 1 00112 00113 retVal = ( chunk >> (self.__bitsRead%16) ) & mask 00114 self.__bitsRead += bits 00115 return retVal 00116 00117 def read(self): 00118 for mnem,key in self.mnemList: 00119 self.__dict__[mnem] = self.__readBits(self.bitDict[key]) 00120 00121 def packetFactory(packet): 00122 # create a hsk class from a packet and return it 00123 theShort = struct.unpack('!H', packet[0:2]) 00124 apid = theShort[0] & 0x7ff 00125 classRet = "HskPacket%03x" % apid 00126 exec('from LATTE.monitoring.HskPacket import ' + classRet) 00127 classStr = classRet + '(packet)' 00128 return eval(classStr) 00129 00130 00131 # eof