TelemetryProxy.py

Go to the documentation of this file.
00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2005
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__ = "Telemetry Proxy class"
00012 __author__   = "S. Tuvi <stuvi@slac.stanford.edu> SLAC - GLAST LAT I&T/Online"
00013 __date__     = "2005/09/06"
00014 __updated__  = "$Date: 2006/04/25 17:22:01 $"
00015 __version__  = "$Revision: 1.19 $"
00016 __release__  = "$Name: HEAD $"
00017 __credits__  = "SLAC"
00018 
00019 import LICOS.copyright_SLAC
00020 
00021 import os
00022 import sys
00023 import time
00024 from ConfigParser import ConfigParser
00025 
00026 import VSC
00027 import CCSDS
00028 
00029 from LICOS.util.gOptions             import Options
00030 from LICOS.tools.proxy.VscProxyPorts import VscProxyPorts
00031 from LICOS.tools.proxy.VscProxyTools import getip, VscProxyLogger
00032 
00033 class VscTelemetryRouter(VSC.VscRouting.TelemetryRouter):
00034   def __init__(self, streamList):
00035     VSC.VscRouting.TelemetryRouter.__init__(self)
00036     self.__packet = CCSDS.Ccsds.Telemetry(0, 0, 0)
00037     self.__streamList = streamList
00038     if len(self.__streamList) == 0:
00039       raise "cannot have empty stream list"
00040     self.__counter = 0
00041 
00042   def allocate(self):
00043     return self.__packet
00044 
00045   def catchall(self, ccsds):
00046     self.__counter += 1
00047     for stream in self.__streamList:
00048       stream.send_nothrow(ccsds)
00049 
00050   def packets(self):
00051     return self.__counter
00052 
00053 
00054 class TelemetryProxy(VSC.VscProxy.Proxy):
00055   """!\brief Stand alone telemetry proxy
00056 
00057   Standalone telemetry proxy provides several features:
00058   1: Pass through VSC.VscCcsds packets to a script engine connection.
00059   2: Pass through VSC.VscCcsds packets to the CVT
00060   3: Archiving of raw CCSDS stream to an ISOC archiver
00061   """
00062   def __init__(self, ip_vsc, config, noarchiver):
00063     ports = VscProxyPorts(config.getint('vsc', 'proxyPortBase'))
00064     VSC.VscProxy.Proxy.__init__(self, ip_vsc, ports.vsc())
00065 
00066     # create the pass through handlers to ScriptEngine
00067     self.__vscScriptSender = VSC.VscNetwork.TelemetrySender()
00068     self.__latScriptSender = VSC.VscNetwork.TelemetrySender()
00069     # connect plumbing for ScriptEngine pass through
00070     print "Creating ScriptEngine passthrough on port %d" % ports.telemetry()
00071     self.__connector = VSC.VscProxy.RequestRouter(ports.telemetry())
00072     self.__connector.handle(self.__vscScriptSender, VSC.VscProxy.VscTelemetry)
00073     self.__connector.handle(self.__latScriptSender, VSC.VscProxy.LatTelemetry)
00074     self.__connector.start()
00075 
00076     # create the pass through handlers to CVT
00077     self.__vscCvtSender    = VSC.VscNetwork.TelemetrySender()
00078     self.__latCvtSender    = VSC.VscNetwork.TelemetrySender()
00079     # connect plumbing for CVT pass through
00080     print "Creating CVT connector on port %d" % ports.cvt()
00081     self.__cvtConnector = VSC.VscProxy.RequestRouter(ports.cvt())
00082     self.__cvtConnector.handle(self.__vscCvtSender, VSC.VscProxy.VscTelemetry)
00083     self.__cvtConnector.handle(self.__latCvtSender, VSC.VscProxy.LatTelemetry)
00084     self.__cvtConnector.start()
00085 
00086     # create the pass through handlers to telemetry monitor
00087     self.__vscMonSender    = VSC.VscNetwork.TelemetrySender()
00088     self.__latMonSender    = VSC.VscNetwork.TelemetrySender()
00089     print "Creating monitor passthrough on port %d" % ports.telemMon()
00090     self.__monConnector = VSC.VscProxy.RequestRouter(ports.telemMon())
00091     self.__monConnector.handle(self.__vscMonSender, VSC.VscProxy.VscTelemetry)
00092     self.__monConnector.handle(self.__latMonSender, VSC.VscProxy.LatTelemetry)
00093     self.__monConnector.start()
00094 
00095     vscStreams = [self.__vscScriptSender, self.__vscCvtSender, self.__vscMonSender]
00096     latStreams = [self.__latScriptSender, self.__latCvtSender, self.__latMonSender]
00097 
00098     if noarchiver is False:
00099       # Import here if archiving is enabled otherwise Windows will complain -ST
00100       from LICOS.tools.proxy.VscArchivers  import VscArchiver
00101       archive_path = config.get('paths','archive_path')
00102       granularity  = config.getint('ccsds_archivers', 'granularity')
00103       self.__archiver = VscArchiver(apIdGrp = "HSK",
00104                                     path = archive_path,
00105                                     granularity = granularity)
00106       vscStreams.append(self.__archiver)
00107       latStreams.append(self.__archiver)
00108 
00109     self.vscRouter = VscTelemetryRouter(vscStreams)
00110     self.latRouter = VscTelemetryRouter(latStreams)
00111     self.vscTelemetry(self.vscRouter)
00112     self.latTelemetry(self.latRouter)
00113 
00114 
00115 if __name__ == '__main__':
00116   options = Options(['vscip', 'config'], [], ['logtime', 'noarchiver'])
00117   try:
00118     options.parse()
00119   except Exception, msg:
00120     options.usage(str(msg))
00121     sys.exit()
00122 
00123   if options.logtime is not None:
00124     sys.stdout = VscProxyLogger('telemetry proxy: ')
00125     sys.stderr = sys.stdout
00126 
00127   vscip = getip(options.vscip)
00128   config = ConfigParser()
00129   config.read(options.config)
00130   dumpInterval = config.getint('vsc', 'dumpInterval')
00131   noarchiver = (options.noarchiver is not None)
00132   proxy = TelemetryProxy(vscip, config, noarchiver)
00133 
00134   while True:
00135     time.sleep(dumpInterval)
00136     print 'received %d VSC packets' %proxy.vscRouter.packets()
00137     print 'received %d LAT packets' %proxy.latRouter.packets()
00138     sys.stdout.flush()

Generated on Thu Apr 27 20:52:43 2006 for LICOS L02-01-00 by doxygen 1.4.6-NO