Skip to content
Snippets Groups Projects
Commit 8b8d4d34 authored by BRONES Romain's avatar BRONES Romain
Browse files

feat: Add Operations to sync Libera devices

* This synchronize the Libera Electron and Libera Brillance Plus
parent 9a038de6
Branches
Tags
No related merge requests found
Pipeline #3710 failed
......@@ -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
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment