Source code for hil

#!/usr/bin/env python
"""
Hardware In Loop : load AO data,run a shot, get AI data, repeat.
upload to AWG and optionally run a capture.
data for upload is either File (host-local data file) or Rainbow, a test pattern.
assumes that clocking has been pre-assigned.

usage: hil.py [-h] [--files FILES] [--loop LOOP] [--store STORE]
              [--nchan NCHAN] [--aochan AOCHAN] [--awglen AWGLEN]
              [--post POST] [--trg TRG] [--wait_user WAIT_USER]
              uuts

acq1001 HIL demo

positional arguments:
  uuts                  uut

optional arguments:
  -h, --help            show this help message and exit
  --files FILES         list of files to load
  --loop LOOP           loop count
  --store STORE         save data when true
  --nchan NCHAN         channel count for pattern
  --aochan AOCHAN       AO channel count, if different to AI (it happens)
  --awglen AWGLEN       samples in AWG waveform
  --post POST           samples in ADC waveform
  --trg TRG             trg "int|ext rising|falling"
  --wait_user WAIT_USER
                        1: force user input each shot
"""



import sys
import acq400_hapi
from acq400_hapi import awg_data
import argparse
from future import builtins
from builtins import input

[docs]def store_file(it, rdata, nchan, nsam): fn = 'DATA/ai%04d.dat' % (it) print("store_file {}".format(fn)) with open(fn, 'wb') as f: f.write(rdata)
[docs]def run_shots(args): uut = acq400_hapi.Acq400(args.uuts[0]) acq400_hapi.cleanup.init() uut.s0.transient = 'POST=%d SOFT_TRIGGER=%d DEMUX=%d' % \ (args.post, 1 if args.trg == 'int' else 0, 1 if args.store==0 else 0) if args.aochan == 0: args.aochan = args.nchan for sx in uut.modules: uut.modules[sx].trg = '1,1,1' if args.trg == 'int' else '1,0,1' if args.files != "": work = awg_data.RunsFiles(uut, args.files.split(','), True) else: work = awg_data.RainbowGen(uut, args.aochan, args.awglen, True) store = store_file loader = work.load() for ii in range(0, args.loop): print("shot: %d" % (ii)) f = next(loader) print("Loaded %s" % (f)) uut.run_oneshot() if args.store: print("read_chan %d" % (args.post*args.nchan)) rdata = uut.read_chan(0, args.post*args.nchan) store(ii, rdata, args.nchan, args.post) if args.wait_user: input("hit return to continue")
[docs]def run_main(): parser = argparse.ArgumentParser(description='acq1001 HIL demo') parser.add_argument('--files', default="", help="list of files to load") parser.add_argument('--loop', type=int, default=1, help="loop count") parser.add_argument('--store', type=int, default=1, help="save data when true") parser.add_argument('--nchan', type=int, default=32, help='channel count for pattern') parser.add_argument('--aochan', type=int, default=0, help='AO channel count, if different to AI (it happens)') parser.add_argument('--awglen', type=int, default=2048, help='samples in AWG waveform') parser.add_argument('--post', type=int, default=100000, help='samples in ADC waveform') parser.add_argument('--trg', default="int", help='trg "int|ext rising|falling"') parser.add_argument('--wait_user', type=int, default=0, help='1: force user input each shot') parser.add_argument('uuts', nargs=1, help="uut ") run_shots(parser.parse_args())
# execution starts here if __name__ == '__main__': run_main()