diff --git a/FofbTool/Operation.py b/FofbTool/Operation.py index 3893fa6e18f10c90c5368c3a010a1cc492e0ead6..883daeb5610dc5dd02b733ad31bd5828de79470d 100644 --- a/FofbTool/Operation.py +++ b/FofbTool/Operation.py @@ -194,3 +194,204 @@ def ack_combpm(cellnodename): time.sleep(1) prx["combpm_reset_error"] = False +################################################################################################### +# OPERATIONS ON BPM ELECTRONICS +################################################################################################### + +# Some local constants +ADDR_CCCFG=0 # Register address of Libera Electron +ADDR_FAICFG=0x2000 # Register address of Libera Electron + +def electron_init_fa(bpmlist): + """ + Configure FA register of Libera Electron + + PARAMETERS + ---------- + bpmlist: list of (bpmid, bpmpath) + ID to apply and path of BPM tango device + + RETURNS + ------- + success: boolean + True on success + """ + # Init BPMs, put for each the ID number + # Cannot do that with group + logger.info("Initialize BPMs") + for bpmid, bpmpath in bpmlist: + logger.debug("Initialize BPM {}".format(bpmpath)) + pbpm = tango.DeviceProxy(bpmpath) + try: + pbpm.ping() + except tango.ConnectionFailed: + logger.error("Failed to connect to {}".format(bpmpath)) + return False + + + # Configure : bpmid, tframe, mgtpower, mgtlb, bfrclr + pbpm.command_inout("WriteFAData", [ADDR_CCCFG, 4, 5, bpmid, 6000, 0, 0, 6000]) + # Ack rise + pbpm.command_inout("WriteFAData", [ADDR_FAICFG, 4, 1, 9]) + # Ack fall + pbpm.command_inout("WriteFAData", [ADDR_FAICFG, 4, 1, 8]) + + return True + + + +def electron_start_next_trigger(bpmlist): + """ + Prepare Libera Electron to start on next trigger + + PARAMETERS + ---------- + bpmlist: list of str + List of Tango paths to Libera devices + + RETURNS + ------- + success: boolean + True on success + """ + logger.info("Prepare Libera Electron to start at next trigger") + + bpms = tango.Group('bpms') + bpms.add(bpmlist) + + r=bpms.command_inout("settimeonnexttrigger") + for _r in r: + if _r.has_failed(): + logger.error("Failed to apply command SetTimeOnNextTrigger on bpm {}".format(_r.dev_name())) + return False + + # Write start, tframelim=zero, no debug data + r=bpms.command_inout("WriteFAData", [ADDR_FAICFG, 4, 1, 8]) + for _r in r: + if _r.has_failed(): + logger.error("Failed to apply command WriteFAData on bpm {}".format(_r.dev_name())) + return False + + # Write Enable ITech FAI + r=bpms.command_inout("WriteFAData", [ADDR_FAICFG+4, 4, 1,1]) + for _r in r: + if _r.has_failed(): + logger.error("Failed to apply command WriteFAData on bpm {}".format(_r.dev_name())) + return False + + return True + +def electron_stop_com(bpmlist): + """ + Stop Libera Electron FA communication + + PARAMETERS + ---------- + bpmlist: list of str + List of Tango paths to Libera devices + + RETURNS + ------- + success: boolean + True on success + """ + logger.info("Stop Libera Electron FA communication") + + bpms = tango.Group('bpms') + bpms.add(bpmlist) + + # Write Disable ITech FAI + r=bpms.command_inout("WriteFAData", [ADDR_FAICFG+4, 4, 1, 0]) + for _r in r: + if _r.has_failed(): + logger.error("Failed to apply command WriteFAData on bpm {}".format(_r.dev_name())) + return False + + # Soft stop + r=bpms.command_inout("WriteFAData", [ADDR_FAICFG+8, 4, 1, 0]) + for _r in r: + if _r.has_failed(): + logger.error("Failed to apply command WriteFAData on bpm {}".format(_r.dev_name())) + return False + + # Reset User FAI + r=bpms.command_inout("WriteFAData", [ADDR_FAICFG, 4, 1, 0]) + for _r in r: + if _r.has_failed(): + logger.error("Failed to apply command WriteFAData on bpm {}".format(_r.dev_name())) + return False + + return True + + +def sync_all_bpm(): + """ + Synchronize all BPM electronics, Electron and Brillance Plus. + This will use the timing system (central and local board). + + """ + EVN=66 # Event number + + # Get FofbManager proxy, only for its properties + p = tango.DeviceProxy(FofbTool.Configuration.config["tangopath"]["fofb-manager"]) + + bpmlist = [n.split(':')[2] for n in p.get_property("bpmlist")['bpmlist']] + bpmidlist = [(int(n.split(':')[0]), n.split(':')[2]) for n in p.get_property("bpmlist")['bpmlist']] + + tlocal = tango.Group('tlocal') + tlocal.add([n.split(':')[2] for n in p.get_property('TimingBoardList')['TimingBoardList'] if "LOCAL" in n]) + + # Set a group of Libera Brillance Plus EVRX board, from FofbTool configuration + lbpevrx = tango.Group('lbpevrx') + lbpevrx.add(FofbTool.Configuration.config["tangopath"]["lbpevrx"]) + + tcentral = tango.DeviceProxy(FofbTool.Configuration.config["tangopath"]["timing-central"]) + + # --------------------------------------------------------------------------------------------------------------- + # Init BPMs, stop first and put for each the ID number + + electron_stop_com(bpmlist) + electron_init_fa(bpmidlist) + + # --------------------------------------------------------------------------------------------------------------- + # Write event number + + logger.info("Set Event Number on local timing board, BpmTriggerEvent") + r=tlocal.write_attribute("bpm.trigEvent", EVN) + for _r in r: + if _r.has_failed(): + logger.error("Failed to set Event Number on local timing board {}, bpm.trigEvent".format(_r.dev_name())) + return + + # --------------------------------------------------------------------------------------------------------------- + # Prepare bpm for trigger reception + + electron_start_next_trigger(bpmlist) + + logger.info("Prepare Libera Brillance Plus to start on next trigger") + r=lbpevrx.write_attribute("synchronize", 0) + for _r in r: + if _r.has_failed(): + logger.error("Failed to write synchronize on LBP EVRX {}".format(_r.dev_name())) + return + + # --------------------------------------------------------------------------------------------------------------- + # Wait 2 seconds and Fire the soft event + + time.sleep(2) + logger.info("Fire the trigger") + + tcentral.write_attribute("softEventAdress", EVN) + tcentral.firesoftevent() + + # --------------------------------------------------------------------------------------------------------------- + # Write event number back to 3 + + logger.info("Set Event Number back to 3 on local timing board, BpmTriggerEvent") + r=tlocal.write_attribute("bpm.trigEvent", 3) + for _r in r: + if _r.has_failed(): + logger.error("Failed to set Event Number on local timing board {}, bpm.trigEvent".format(_r.dev_name())) + return + + diff --git a/FofbTool/default.cfg b/FofbTool/default.cfg index 3c5243ad38bbab5e3232278973689179e23df060..6cf4e0af636eca23977339b9c0ecdf73fff24fc7 100644 --- a/FofbTool/default.cfg +++ b/FofbTool/default.cfg @@ -96,6 +96,9 @@ fofb-watcher=ans/dg/fofb-watcher fofb-command=ans/dg/fofb-command fofb-manager=ans/dg/fofb-manager bpm-manager=ans/dg/bpm-manager +lbpevrx=test/dg/lbp1 + test/fg/lbp2 +timing-central=ans/sy/central [tangopath.fofbnodes] centralnode=ans/dg/fofb-centralnode