HP3562A/state_decoder.py

changeset 14
07e2cbf140df
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HP3562A/state_decoder.py	Tue Dec 18 00:23:10 2007 +0100
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+"""
+state_decoder
+=============
+
+Module for decoding the internal state of the HP3562A DSA, using the
+GPIB command "DSBN" (Dump State BiNary).
+
+This file can be exectued as a python script. Use '-h' for more informations. 
+"""
+from HP3562A import format_header, decode_float, decode_string, decode_header
+
+from HP3562A.enum_types import *
+
+HEADER = [("Measurement mode", EMEAS, 'h', 2),
+          ("Measurement 1", EMTYP, 'h', 2),
+          ("Measurement 2", EMTYP, 'h', 2),
+          ("Window type", EWINTYP, 'h', 2),
+          ("Force/Expon window 1", EFEXPW, 'h', 2),
+          ("Force/Expon window 2", EFEXPW, 'h', 2),
+          ("Average type", EAVGTYP, 'h', 2),
+          ("Overlap percentage", int, 'h', 2),
+          ("Number of averages", int, 'h', 2),
+          ("Sweep # of averages", int, 'h', 2),
+          ("Trigger type", ETRGTYP, 'h', 2),
+          ("Trigger slope", ETRGSLP, 'h', 2),
+          ("Preview type", EPRVTYP, 'h', 2),
+          ("Sample type", ESMPTYP, 'h', 2),
+          ("Range units chan 1", ERNGUNT, 'h', 2),
+          ("Range units chan 2", ERNGUNT, 'h', 2),
+          ("Range type 1", ERNGTYP, 'h', 2),
+          ("Range type 2", ERNGTYP, 'h', 2),
+          ("Input coupling 1", EINCPL, 'h', 2),
+          ("Input coupling 2", EINCPL, 'h', 2),
+          ("Source type", ESRCTYP, 'h', 2),
+          ("Chirp percent", int, 'h', 2),
+          ("Burst percent", int, 'h', 2),
+          ("Sweep direction", ESWPDIR, 'h', 2),
+          ("Sweep mode", ESWPMOD, 'h', 2),
+          ("Ext sample freq untis", EXAXIS, 'h', 2),
+          ("Bandwidth units", EXAXIS, 'h', 2),
+          ("Log span index", int, 'h', 2),
+          ("Log start index", int, 'h', 2),
+          ("Sweep rate units", EXAXIS, 'h', 2),
+          ("Auto gain ref chan", EDEMODCH, 'h', 2),
+          ("Demod channels", EDEMODCH, 'h', 2),
+          ("Demod type chan 1", EDEMOD, 'h', 2),
+          ("Demod type chan 2", EDEMOD, 'h', 2),
+          ("Source level units", EXAXIS, 'h', 2),
+          ("Source offset units", EXAXIS, 'h', 2),
+          ("Trigger level units", EXAXIS, 'h', 2),
+          ("Capt/thru length units", EXAXIS, 'h', 2),
+          ("EU label 1", str, 's', 6),
+          ("EU label 2", str, 's', 6),
+          ("Auto carrier on/off", bool, 'h', 2),
+          ("Time average on/off", bool, 'h', 2),
+          ("Auto/fixed resolution", bool, 'h', 2),
+          ("Auto gain on/off", bool, 'h', 2),
+          ("Auto/fixed integrate",bool, 'h', 2),
+          ("Fast average on/off", bool, 'h', 2),
+          ("Overload reject on/off", bool, 'h', 2),
+          ("Chan 1 float/ground", bool, 'h', 2),
+          ("Chan 2 float/ground", bool, 'h', 2),
+          ("Time throughput on/off", bool, 'h', 2),
+          ("Demodulation on/off", bool, 'h', 2),
+          ("EU/volts chan 1", bool, 'h', 2),
+          ("EU/volts chan 2", bool, 'h', 2),
+          ("Manual/auto arm", bool, 'h', 2),
+          ("Demod preview on/off", bool, 'h', 2),
+          ("Delete freq on/off", bool, 'h', 2),
+          ("Lin res Fstart pegged", bool, 'h', 2),
+          ("Swept Fstart pegged", bool, 'h', 2),
+          ("Force length chan 1", decode_float, None, 4),
+          ("Force length chan 2", decode_float, None, 4),
+          ("Expon time constant 1", decode_float, None, 4),
+          ("Expon time constant 2", decode_float, None, 4),
+          ("Sweep time", decode_float, None, 4),
+          ("Sweep rate", decode_float, None, 4),
+          ("Sweep resolution", decode_float, None, 4),
+          ("Sweep integrate time", decode_float, None, 4),
+          ("Auto gain level", decode_float, None, 4),
+          ("Auto gain limit", decode_float, None, 4),
+          ("Source level", decode_float, None, 4),
+          ("EU value chan 1", decode_float, None, 4),
+          ("EU value chan 2", decode_float, None, 4),
+          ("Trigger delay chan 1", decode_float, None, 4),
+          ("Trigger delay chan 2", decode_float, None, 4),
+          ("Integrate var thresh", decode_float, None, 4),
+          ("Capt/thru length", decode_float, None, 4),
+          ("Frequency span", decode_float, None, 4),
+          ("Time record length", decode_float, None, 4),
+          ("Frequency resolution", decode_float, None, 4),
+          ("Time resolution", decode_float, None, 4),
+          ("External sample rate", decode_float, None, 4),
+          ("Sample rate (actual)", decode_float, None, 4),
+          ("Range channel 1", decode_float, None, 4),
+          ("Range channel 2", decode_float, None, 4),
+          ("Preview time", decode_float, None, 4),
+          ("Trigger level", decode_float, None, 4),
+          ("Source dc offset", decode_float, None, 4),
+          ("Fixed sine frequency", decode_float, None, 8),
+          ("Start frequency", decode_float, None, 8),
+          ("Center frequency", decode_float, None, 8),
+          ("Sweep start", decode_float, None, 8),
+          ("Sweep end", decode_float, None, 8),
+          ("Carrier frequency", decode_float, None, 8),
+          ]
+          
+def decode_state(data):
+    """
+    Decode the data (as generated by the HP3562A DSA in response to a
+    "DSBN" command), and returns a dict (header)
+
+    header is the dictionnary of the header of the dumped data block,
+    """
+    header, idx = decode_header(data, HEADER)
+    return header
+    
+
+def main():
+    import sys
+    import optparse
+    opt = optparse.OptionParser("A simple tool for tracing a dumped trace")
+    opt.add_option('-f', '--filename', default=None,
+                   dest='filename',
+                   help='Output filename. If not set, read from stdin')
+    opt.add_option('-m', '--mode', default='binary',
+                   dest='mode',
+                   help='Dumping mode (may be "binary" [default], "ascii" or "ansi")',
+                   )
+    
+    options, argv = opt.parse_args(sys.argv)
+
+
+    if options.filename is None:
+        print "Can't deal stdin for now..."
+        sys.exit(1)
+    #try:
+    if 1:
+        header = decode_state(open(options.filename, 'rb').read())
+    else:
+    #except Exception, e:
+        print "ERROR: can't read %s an interpret it as a HP3562 trace"%options.filename
+        print e
+        sys.exit(1)
+
+    print format_header(header, HEADER, 100)
+    
+if __name__ == "__main__":
+    main()
+          

mercurial