예제 #1
0
def tune_if(snap_hosts, fpgfile=None, target_rms=TARGET_RMS):
    """
    Function to tune the IF
    """
    logger = logger_defaults.getModuleLogger(__name__)
    logger.info("IF tuner entered")

    assert type(snap_hosts) == list

    if type(snap_hosts[0]) == str:
        snaps_dict = {
            snap: ata_snap_fengine.AtaSnapFengine(
                snap, transport=casperfpga.KatcpTransport)
            for snap in snap_hosts
        }
    elif type(snap_hosts[0]) == ata_snap_fenging.AtaSnapFengine:
        snaps_dict = {snap.hostname: snap for snap in snap_hosts}

    if not fpgfile:
        fpgfile = FPGFILE

    for feng in snaps_dict.values():
        feng.fpga.get_system_information(fpgfile)

    snap_names = list(snaps_dict.keys())

    if_tab = ATA_SNAP_IF[ATA_SNAP_IF.snap_hostname.isin(snap_names)]
    ant_ch = if_tab.values[:, 1:].flatten()
    logger.info("Tuning: %s" % if_tab.snap_hostname)
    logger.info("Attemp chans: %s" % ant_ch)

    prev_attn = np.array([START_ATTN] * len(ant_ch))

    for i in range(3):
        prev_attn[prev_attn > MAX_ATT] = MAX_ATT
        prev_attn[prev_attn < MIN_ATT] = MIN_ATT
        _setatten(ant_ch, prev_attn)
        rms = []
        for snap_name in list(if_tab.snap_hostname.values):
            snap = snaps_dict[snap_name]

            set_device_lock(snap_name)
            x, y = snap.adc_get_samples()
            release_device_lock(snap_name)

            rms.append(x.std())
            rms.append(y.std())

        rms = np.array(rms)
        d_attn = 20 * np.log10(rms / target_rms)
        prev_attn = round50th(prev_attn + d_attn)
    logger.info("IF tuner ended")
예제 #2
0
def init_snaps(snap_list, load_system_information=False):
    logger = logger_defaults.getModuleLogger(__name__)
    logger.info("Initialising snaps: %s" % snap_list)
    snaps = []

    for snap_name in snap_list:
        if snap_name.startswith("frb-snap"):
            snaps.append(
                ata_snap_fengine.AtaSnapFengine(
                    snap_name, transport=casperfpga.KatcpTransport))
        elif snap_name.startswith("rfsoc"):
            pipeline_id = int(snap_name[-1])
            snaps.append(
                ata_rfsoc_fengine.AtaRfsocFengine(snap_name,
                                                  pipeline_id=pipeline_id - 1))

    if load_system_information:
        get_system_information(snaps)

    return snaps
예제 #3
0
def init_snaps(snap_list, get_system_information=False):
    logger = logger_defaults.getModuleLogger(__name__)
    logger.info("Initialising snaps: %s" % snap_list)
    snaps = [
        ata_snap_fengine.AtaSnapFengine(snap,
                                        transport=casperfpga.KatcpTransport)
        for snap in snap_list
    ]

    if get_system_information:
        if type(get_system_information) == bool:
            from .snap_config import get_ata_cfg
            ata_cfg = get_ata_cfg()
            fpg_file = ata_cfg['SNAPFPG']
        elif type(get_system_information) == str:
            fpg_file = get_system_information

        for snap in snaps:
            snap.fpga.get_system_information(fpg_file)

    return snaps
예제 #4
0
from ata_snap import ata_snap_fengine
import casperfpga

n = [1, 2, 3, 4, 6, 8, 9, 10, 11, 12]
n = [5, 7]
hosts = ['frb-snap%i-pi' % i for i in n]
fengs = [
    ata_snap_fengine.AtaSnapFengine(host, transport=casperfpga.KatcpTransport)
    for host in hosts
]

for feng in fengs:
    feng.fpga.get_system_information(
        "/home/obsuser/src/ata_snap/snap_adc5g_feng_rpi/outputs/snap_adc5g_feng_rpi_2020-10-29_1727.fpg"
    )
    feng.fpga.write_int('sync_sel', 1)
예제 #5
0
# user flags
with open(args.configfile, 'r') as fh:
    config = yaml.load(fh, Loader=yaml.SafeLoader)

config['acclen'] = args.acclen or config['acclen']
config['spectrometer_dest'] = args.specdest or config['spectrometer_dest']
config['dest_port'] = args.dest_port or config['dest_port']

if args.usetapcp:
    transport = casperfpga.TapcpTransport
else:
    transport = casperfpga.KatcpTransport

logger.info("Connecting to %s" % args.host)
feng = ata_snap_fengine.AtaSnapFengine(args.host,
                                       transport=transport,
                                       feng_id=args.feng_id)

if not args.skipprog:
    logger.info("Programming %s with %s" % (args.host, args.fpgfile))
    feng.program(args.fpgfile)
else:
    logger.info("Skipping programming because the --skipprog flag was used")
    # If we're not programming we need to load the FPG information
    feng.fpga.get_system_information(args.fpgfile)

# Disable ethernet output before doing anything
feng.eth_enable_output(False)

feng.set_accumulation_length(config['acclen'])
예제 #6
0
        conn = ThreadPoolExecutor(max_workers=self.nsnap)
        while True:
            t = time.time()
            snaps_res = conn.map(self.get_bp_thread, self.fengs, 
                    repeat(self.defs))
            self.snaps_res = {host:data for host,data in
                    zip(self.hosts,snaps_res)}
            time.sleep(1)

LOs = pd.unique(ATA_SNAP_TAB.LO)
cfreq_thread = cfreqThread(LOs)
cfreq_thread.daemon = True
cfreq_thread.start()


fengs = [ata_snap_fengine.AtaSnapFengine(snap, 
    transport=casperfpga.KatcpTransport) 
        for snap in snaps]
for feng in fengs:
    feng.fpga.get_system_information(ATA_CFG['SNAPFPG'])

snap_thread = SnapThread(fengs)
snap_thread.daemon = True
snap_thread.start()

# give the thread sometime to pull data
time.sleep(10)
snaps_res = snap_thread.snaps_res

FIGS = {}
for snap in fengs:
    fig = make_subplots(rows=1, cols=2, 
예제 #7
0
def run(host, fpgfile, configfile,
        sync=False,
        mansync=False,
        tvg=False,
        feng_id=0,
        dest_port=None,
        skipprog=False,
        usetapcp=False,
        eth_spec=False,
        eth_volt=False,
        acclen=None,
        specdest=None
        ):
    logger = logging.getLogger(__file__)
    logger.setLevel(logging.INFO)
    handler = logging.StreamHandler(sys.stdout)
    handler.setLevel(logging.INFO)
    logger.addHandler(handler)

    assert not (eth_spec and eth_volt), "Can't use both --eth_spec and --eth_volt options!"

    # Load configuration file and override parameters with
    # user flags
    with open(configfile, 'r') as fh:
        config = yaml.load(fh, Loader=yaml.SafeLoader)

    config['acclen'] = acclen or config['acclen']
    config['spectrometer_dest'] = specdest or config['spectrometer_dest']
    config['dest_port'] = dest_port or config['dest_port']

    if usetapcp:
        transport = casperfpga.TapcpTransport
    else:
        transport = casperfpga.KatcpTransport

    logger.info("Connecting to %s" % host)
    feng = ata_snap_fengine.AtaSnapFengine(host,
            transport=transport,
            feng_id=feng_id)

    if not skipprog:
        logger.info("Programming %s with %s" % (host, fpgfile))
        feng.program(fpgfile)
    else:
        logger.info("Skipping programming because the --skipprog flag was used")
        # If we're not programming we need to load the FPG information
        feng.fpga.get_system_information(fpgfile)

    # Disable ethernet output before doing anything
    feng.eth_enable_output(False)

    feng.set_accumulation_length(config['acclen'])

    # Use the same coefficients for both polarizations
    feng.eq_load_coeffs(0, config['coeffs'])
    feng.eq_load_coeffs(1, config['coeffs'])

    feng.eq_load_test_vectors(0, list(range(feng.n_chans_f)))
    feng.eq_load_test_vectors(1, list(range(feng.n_chans_f)))
    feng.eq_test_vector_mode(enable=tvg)
    feng.spec_test_vector_mode(enable=tvg)

    # Configure arp table
    for ip, mac in config['arp'].items():
        print ("Configuring ip: %s with mac: %x" %(ip, mac))
        for ethn, eth in enumerate(feng.fpga.gbes):
            eth.set_single_arp_entry(ip, mac)

    voltage_config = config.get('voltage_output', None)
    n_interfaces = voltage_config.get('n_interfaces', feng.n_interfaces)
    for i in range(n_interfaces):
        ip = config["interfaces"][feng.fpga.host][i]
        mac = config["arp"][ip]
        port = 10000
        eth = feng.fpga.gbes['eth%i_core' %i]
        eth.configure_core(mac, ip, port)

    if eth_spec:
        feng.spec_set_destination(config['spectrometer_dest'])

    if voltage_config is not None:
        n_chans = voltage_config['n_chans']
        start_chan = voltage_config['start_chan']
        dests = voltage_config['dests']
        logger.info('Voltage output sending channels %d to %d' % (start_chan, start_chan+n_chans-1))
        logger.info('Destination IPs: %s' %dests)
        logger.info('Using %d interfaces' % n_interfaces)
        feng.select_output_channels(start_chan, n_chans, dests, n_interfaces=n_interfaces)

    feng.eth_set_dest_port(config['dest_port'])

    if eth_spec:
        feng.eth_set_mode('spectra')
        feng.fpga.write_int('corr_feng_id', feng_id)
    elif eth_volt:
        feng.eth_set_mode('voltage')

    if sync:
        if not mansync:
            feng.sync_wait_for_pps()
        feng.sync_arm(manual_trigger=mansync)

    # Reset ethernet cores prior to enabling
    feng.eth_reset()
    if eth_spec or eth_volt:
        logger.info('Enabling Ethernet output')
        feng.eth_enable_output(True)
    else:
        logger.info('Not enabling Ethernet output, since neither voltage or spectrometer 10GbE output flags were set.')

    logger.info("Initialization complete!")