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

HskPacketDecoder.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__ = "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

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