diff --git a/FofbTool/Configuration.py b/FofbTool/Configuration.py old mode 100755 new mode 100644 index 0b67c3c05785570ae04983d149986082ce490c54..4ee6d4e4759afe1600d53b0dd1e3e16f37e7eea5 --- a/FofbTool/Configuration.py +++ b/FofbTool/Configuration.py @@ -25,7 +25,7 @@ logger = logging.getLogger("FofbTool") config = configparser.ConfigParser() # Try to load default -defconfpath = os.path.abspath(os.path.join(os.path.dirname(__spec__.origin), "../Configurations/default.cfg")) +defconfpath = os.path.abspath(os.path.join(os.path.dirname(__spec__.origin), "default.cfg")) if len(config.read(defconfpath)) < 1: logger.warning("Default configuration file not found: {}".format(defconfpath)) diff --git a/FofbTool/DeviceAttributeConfiguration.py b/FofbTool/DeviceAttributeConfiguration.py old mode 100755 new mode 100644 diff --git a/FofbTool/Operation.py b/FofbTool/Operation.py old mode 100755 new mode 100644 diff --git a/Configurations/default.cfg b/FofbTool/default.cfg similarity index 100% rename from Configurations/default.cfg rename to FofbTool/default.cfg diff --git a/FofbTool/operation.py b/FofbTool/operation.py deleted file mode 100755 index 359d5f508ac02e03290f1c46281c6af423f842f4..0000000000000000000000000000000000000000 --- a/FofbTool/operation.py +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env python - -import tango -import logging -import argparse -import numpy as np -import time - - -# Get the module logger -logger = logging.getLogger("FofbTool") - -################################################################################################### -# TANGO DEVICE PROXIES -################################################################################################### - -cellnode_subscribers = [ tango.DeviceProxy("ans/dg/fofb-cellnode-{}".format(cell)) for cell in ("C01", "C06", "C09", "C14") ] - -centralnode_subscriber = tango.DeviceProxy("ans/dg/fofb-centralnode") - -bpmmanager = tango.DeviceProxy("ans/dg/bpm-manager") - -fofbcommand = tango.DeviceProxy("ans/dg/fofb-command") - - -################################################################################################### -# OPERATION FUNCTIONS -################################################################################################### - -def cellnode_stop_ccn(cnp): - logger.info("Stopping CCN on {}".format(cnp.name())) - cnp["ccnpack0_control"] = False - cnp["ccnunpack0_control"] = False - -def cellnode_start_ccn(cnp): - logger.info("Starting CCN on {}".format(cnp.name())) - cnp["ccneth0_reset"] = 0x60000001 # impossible to write 0xE0000001 - cnp["ccneth0_gt_reset"] = 1 - cnp["ccneth0_gt_reset"] = 0 - cnp["ccneth0_reset"] = 0 - cnp["ccnpack0_control"] = True - cnp["ccnunpack0_control"] = True - -def cellnode_ack_ccn(snp): - logger.info("Ack CCN error on {}".format(cnp.name())) - cnp["ccnpack0_reset_error"] = True - cnp["ccnunpack0_reset_error"] = True - cnp["ccnpack0_reset_error"] = False - cnp["ccnunpack0_reset_error"] = False - -def centralnode_stop_ccn(cnp): - logger.info("Stopping CCN on {}".format(cnp.name())) - for n in range(4): - cnp["ccnpack{}_control".format(n)] = False - cnp["ccnunpack{}_control".format(n)] = False - -def centralnode_start_ccn(cnp): - logger.info("Starting CCN on {}".format(cnp.name())) - for n in range(4): - cnp["ccneth{}_reset".format(n)] = 0x60000001 # impossible to write 0xE0000001 - cnp["ccneth{}_gt_reset".format(n)] = 1 - cnp["ccneth{}_gt_reset".format(n)] = 0 - cnp["ccneth{}_reset".format(n)] = 0 - cnp["ccnpack{}_control".format(n)] = True - cnp["ccnunpack{}_control".format(n)] = True - cnp["ccnpack{}_reset_error".format(n)] = True - cnp["ccnunpack{}_reset_error".format(n)] = True - cnp["ccnpack{}_reset_error".format(n)] = False - cnp["ccnunpack{}_reset_error".format(n)] = False - -def cellnode_configure_ccn(cnp, nbpm=None, npsc=100): - """ - Configure the ComCellNode block. - - PARAMETERS - ---------- - nbpm: - Number of BPM allowed by the filter, hence the number of expected BPM packets. - If None, auto detect the number from the combpm_filter_table attribute. - npsc: - Number of total PSC, hence the number of expected PSC packets. - - """ - - if nbpm is None: - # Get number of BPM activated in the filter - nbpm = int((cnp["combpm_filter_table"].value == 0x80).sum()) - logger.debug("{} bpm allowed in the filter on {}".format(nbpm, cnp.name())) - - maclen = 10*nbpm+10 - logger.debug("Configure packeter framesize (mac length) to {}".format(maclen)) - cnp["ccnpack0_framesize"] = maclen - - logger.debug("Configure packeter npackets to {}".format(nbpm-1)) - cnp["ccnpack0_npackets"] = nbpm-1 - - maclen = npsc*6+10 - logger.debug("Configure unpacketer framesize (mac length) to {}".format(maclen)) - cnp["ccnunpack0_framesize"] = maclen - - logger.info("Configuration of CCN done on {}.".format(cnp.name())) - -def centralnode_configure_ccn(cnp, nbpm=[30,30,30,32], npsc=100): - """ - Configure the ComCellNode block. - - PARAMETERS - ---------- - nbpm: list(int) - Number of BPM packet received on each interface. - npsc: - Number of total PSC, hence the number of expected PSC packets. - - """ - - for n in range(4): - - maclen = npsc*6+10 - logger.debug("Configure packeter {} framesize (mac length) to {}".format(n, maclen)) - cnp["ccnpack{}_framesize".format(n)] = maclen - - logger.debug("Configure packeter {} npackets to {}".format(n, npsc-1)) - cnp["ccnpack{}_npackets".format(n)] = npsc-1 - - maclen = 10*nbpm[n]+10 - logger.debug("Configure unpacketer {} framesize (mac length) to {}".format(n, maclen)) - cnp["ccnunpack{}_framesize".format(n)] = maclen - - logger.info("Configuration of CCN done on {}.".format(cnp.name())) - - -def cellnode_stop_combpm(cnp): - logger.info("Stopping ComBpm on {}".format(cnp.name())) - cnp["combpm_reset"] = 1 - cnp["combpm_gt_control"] = 0x5 - -def cellnode_start_combpm(cnp): - logger.info("Starting ComBpm on {}".format(cnp.name())) - cnp["combpm_reset"] = 0 - cnp["combpm_gt_control"] = 0x1 - cnp["combpm_reset_error"] = True - cnp["combpm_reset_error"] = False - -def cellnode_configure_combpm(cnp): - - # Filter list depends on the cellnode - filterlist = { - "C01":np.array(list(range(1,23))+list(range(115,123))), - "C06":np.array(range(23,53)), - "C09":np.array(range(53,83)), - "C14":np.array(range(83,115)), - } - - for k in filterlist.keys(): - if k in cnp.name(): - logger.debug("Activate BPMs {} in the filter for {}".format(filterlist[k], cnp.name())) - f = cnp["combpm_filter_table"].value - f[:] = 0 - f[np.array(filterlist[k])] = 0x80 - cnp["combpm_filter_table"] = f - - logger.info("Configuration of ComBpm done on {}.".format(cnp.name())) - -def cellnode_configure_comcorr(cnp, enable=True): - - pscidlist = { - 'C01':[50,100,49,99,255,255,255,255,2,52,1,51,255,255,255,255,56,6,3,53,4,54,5,55,10,60,7,57,8,58,9,59], - 'C06':[12,62,11,61,255,255,255,255,14,64,13,63,255,255,255,255,68,18,15,65,16,66,17,67,22,72,19,69,20,70,21,71], - 'C09':[24,74,23,73,255,255,255,255,26,76,25,75,255,255,255,255,80,30,27,77,28,78,29,79,34,84,31,81,32,82,33,83], - 'C14':[36,86,35,85,37,87,38,88,40,90,39,89,255,255,255,255,94,44,41,91,42,92,43,93,48,98,45,95,46,96,47,97] - } - - for k in pscidlist.keys(): - if k in cnp.name(): - logger.debug("Set PSCIDs {} in the filter for {}".format(pscidlist[k], cnp.name())) - f= cnp["comcorr_line_id"].value - f[:] = pscidlist[k] - f[:] = f+ 0x10000*bool(enable) - logger.debug("Set comcorr_line_id {} for {}".format(f, cnp.name())) - cnp["comcorr_line_id"] = f - - logger.info("Configuration of ComCorr done on {}.".format(cnp.name())) - -def centralnode_configure_corr(cnp): - - # Legacy - cnp["corr_k1a_x"]=256 - cnp["corr_k1b_x"]=0 - cnp["corr_k1ic_x"]=64 - cnp["corr_k1d_x"]=16300 - - cnp["corr_k1a_y"]=256 - cnp["corr_k1b_y"]=0 - cnp["corr_k1ic_y"]=64 - cnp["corr_k1d_y"]=16300 - - # Unitary - cnp["corr_k2a_x"]=128 - cnp["corr_k2b_x"]=0 - cnp["corr_k2ic_x"]=8192 - cnp["corr_k2d_x"]=0 - - cnp["corr_k2a_y"]=128 - cnp["corr_k2b_y"]=0 - cnp["corr_k2ic_y"]=8192 - cnp["corr_k2d_y"]=0 - - f= cnp["corr_pscid"].value - f[0:100] = range(1,101) - cnp["corr_pscid"] = f - - logger.info("Configuration of Corr done on {}.".format(cnp.name())) - -def fofbcommand_writeref(what='current'): - if what=="current": - fofbcommand["x_ref_orbit"] = (bpmmanager.xmeanorbit*1e6).astype(int) - fofbcommand["y_ref_orbit"] = (bpmmanager.zmeanorbit*1e6).astype(int) - - if what=="oldref": - fofbcommand["x_ref_orbit"] = (bpmmanager.xreforbit*1e6).astype(int) - fofbcommand["y_ref_orbit"] = (bpmmanager.zreforbit*1e6).astype(int) - - if what=="zeros": - fofbcommand["x_ref_orbit"] = np.zeros(122, dtype=int) - fofbcommand["y_ref_orbit"] = np.zeros(122, dtype=int) - -def fofbcommand_writemat(filename='respmat.npy'): - - fofbcommand["x_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), np.load(filename)[50:], np.zeros((50,5))]).astype(int) - fofbcommand["y_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), np.load(filename)[:50], np.zeros((50,5))]).astype(int) diff --git a/README.adoc b/README.adoc index 347e2e1c1dbf1a941196ef90e8e1a41b0cfba32e..36a1153451dfac763c4f2e6302ebbdad05ffde01 100644 --- a/README.adoc +++ b/README.adoc @@ -1,6 +1,18 @@ -= FofbTool script += FofbTool Module + +This python module provides functions to deal with the Fofb MTCA platform. +It connects to the OPCUAProxy tango devices. + +The module is packaged in sections +* FofbTool.Configuration: For application configuration +* FofbTool.Operation: Function to perform operation (start, stop...) +* FofbTool.DeviceAttributeConfiguration: contains functions to apply tango attribute configuration + +There is also a Command Line Interface bin/FofbTool written in python. + +To deploy on the RCM, move into dir and execute install_rcm.sh. + -This expert script helps to configure, stop and start the communication between the FofbNodes. = Basic usages @@ -15,12 +27,12 @@ Then apply the default configuration on FPGA blocks: * ComCellNode (Expected packets, correct MAC size...) * ComBPM (BPM ID filter Filter for each CellNode...) * ComCorr (Default PSCID on output...) -* Corr (Default correction filter...) IMPORTANT: This do not configure Orbit Reference or Inv Response Matrix. This do not start the FOFB, only the communication. -WARNING: PSC will receive frames upon start. Better stop the FOFB beforehand. +WARNING: PSC will receive frames upon start. Better stop the FOFB beforehand. The CLI won't let you do that. + [%collapsible%open] diff --git a/FofbTool/CommandLineInterface.py b/bin/FofbTool similarity index 100% rename from FofbTool/CommandLineInterface.py rename to bin/FofbTool diff --git a/install_rcm.sh b/install_rcm.sh new file mode 100755 index 0000000000000000000000000000000000000000..76018c9fe1d57f9c5707501b4d7a9d4ffc44e764 --- /dev/null +++ b/install_rcm.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +echo "Deploy module and CLI in RCM environment" + +# Copy Python module +ipath=/home/operateur/.local/lib/python3.6/site-packages/FofbTool +mkdir -p $ipath +cp FofbTool/*.py $ipath/ -rvf + +# Copy bin CLI +cp bin/FofbTool ~/bin/ -vf + +# Put exec rights +chmod +x ~/bin/FofbTool