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__ = "Commanding" 00013 __author__ = "Amedeo Perazzo <perazzo@slac.stanford.edu> SLAC - GLAST I&T/Online" 00014 __date__ = ("$Date: 2004/09/11 00:52:01 $").split(' ')[1] 00015 __version__ = "$Revision: 2.3 $" 00016 __release__ = "$Name: R04-12-00 $" 00017 __credits__ = "SLAC" 00018 00019 import LATTE.copyright_SLAC 00020 00021 import struct 00022 00023 def packstring(arg, type): 00024 strlen = len(arg) 00025 strpad = 4-(strlen&0x3) 00026 fmt = '!HH%ds%dx' %(strlen, strpad) 00027 return struct.pack(fmt, strlen+strpad, type, arg) 00028 00029 class Command: 00030 __Function = 0 00031 __Handler = 1 00032 __Payload = 2 00033 __Value = 3 00034 __Input = 4 00035 00036 def __init__(self, functionname, *arguments): 00037 self.__packet = None 00038 self.__payloadfmts = [] 00039 00040 cmd = packstring(functionname, Command.__Function) 00041 for arg in arguments: 00042 if isinstance(arg, str): 00043 if arg[0] == '!': 00044 cmd += packstring(arg[1:], Command.__Payload) 00045 self.__payloadfmts.append(arg[1:]) 00046 elif arg[0] == '>': 00047 cmd += packstring(arg[1:], Command.__Input) 00048 else: 00049 cmd += packstring(arg, Command.__Handler) 00050 elif isinstance(arg, int) or isinstance(arg, long): 00051 cmd += struct.pack('!HHI', 4, Command.__Value, arg) 00052 else: 00053 raise Exception, "*** gCommand: cannot handle type %s" \ 00054 %(arg.__class__.__name__) 00055 self.__packet = struct.pack('!I', len(cmd)) + cmd 00056 00057 def packet(self): 00058 return self.__packet 00059 00060 def payloadfmts(self): 00061 return self.__payloadfmts