move set_se_list to frappy_config.set_envlist

This commit is contained in:
2022-05-02 09:38:36 +02:00
parent c974edede9
commit aaaca072e4
3 changed files with 84 additions and 89 deletions

View File

@ -26,11 +26,10 @@ from glob import glob
from configparser import ConfigParser
from nicos import session, config
from nicos.core import DeviceAlias, Moveable
from nicos.utils import printTable
from nicos.commands import helparglist, usercommand
from nicos.commands.basic import AddSetup, CreateAllDevices, CreateDevice
from nicos.devices.secop import get_attaching_devices, SecopDevice
from nicos.devices.secop import get_attaching_devices
home = expanduser('~')
if home not in sys.path:
@ -88,94 +87,11 @@ def applyAliasConfig():
break
def remove_se_aliases():
frappy_config = session.getDevice('frappy_config')
configured = {}
for meaning in frappy_config.meanings:
info = getattr(frappy_config, meaning)
aliasname = info['alias']
aliasdev = session.devices.get(aliasname)
if aliasdev:
session.destroyDevice(aliasname)
session.configured_devices.pop(aliasname, None)
session.dynamic_devices.pop(aliasname, None)
@usercommand
def set_se_list():
"""create aliases for SECoP devices
depending on their meaning
"""
remove_se_aliases()
frappy_config = session.getDevice('frappy_config')
nodedevs = filter(None, [session.devices.get(devname) for devname in frappy_config.nodes])
sample_devices = {}
for nodedev in nodedevs:
secnode = nodedev._secnode
if not secnode:
continue
for devname, (_, desc) in nodedev.setup_info.items():
secop_module = desc['secop_module']
meaning = secnode.modules[secop_module]['properties'].get('meaning')
if meaning:
meaning_name, importance = meaning
sample_devices.setdefault(meaning_name, []).append((importance, devname))
devset = set()
newenv = {e: None for e in session.experiment.envlist} # use dict instead of set because of order
drivables = {}
for meaning in frappy_config.meanings:
info = getattr(frappy_config, meaning)
aliasname = info['alias']
envlistflag = info.get('envlist', True)
aliascfg = info.get('targets', {})
importance_list = sample_devices.get(meaning, [])
importance_list.extend([(nr, nam) for nam, nr in aliascfg.items() if nam in session.devices])
importance_list = sorted(importance_list, reverse=True)
session.log.debug('%s: %r', meaning, importance_list)
prefix, _, postfix = meaning.partition('_')
if postfix == 'drivable':
# append the previously collected drivables in the group to the importance_list
group = drivables.get(prefix, {})
for key in 'regulation', '':
if key in group:
importance_list.append((None, group[key]))
for _, devname, in importance_list:
dev = session.devices.get(devname)
if isinstance(dev, Moveable):
drivables.setdefault(prefix, {})[postfix] = devname
elif postfix == 'drivable':
# marked as xxx_drivable, but not really drivable: skip
continue
if dev:
session.log.debug('create alias %r pointing to %r', aliasname, devname)
devcfg = ('nicos.core.DeviceAlias', {})
session.configured_devices[aliasname] = devcfg
session.dynamic_devices[aliasname] = 'frappy'
aliasdev = session.createDevice(aliasname, recreate=True, explicit=True)
aliasdev.alias = devname
if devname not in devset and envlistflag:
# take only the first one
devset.add(devname)
newenv[aliasname] = None
else:
newenv.pop(aliasname, None)
break
else:
newenv.pop(aliasname, None)
applyAliasConfig() # for other aliases
if set(newenv) != set(session.experiment.envlist):
session.experiment.setEnvironment(list(newenv))
session.log.info('changed environment to: %s', ', '.join(session.experiment.envlist))
def frappy_start(service, cfg=None):
if service not in SERVICES:
raise ValueError('unknown service %s' % service)
remove_se_aliases()
frappy_config = session.devices['frappy_config']
frappy_config.remove_aliases()
if cfg == '':
seaconn = session.devices.get('seaconn')
if seaconn and seaconn._attached_secnode:
@ -214,7 +130,7 @@ def frappy_start(service, cfg=None):
if cfg is not None:
cleanup_defunct()
CreateAllDevices()
set_se_list()
frappy_config.set_envlist()
if startnode and cfg == '':
startnode.disable()
return all_cfg

View File

@ -35,6 +35,7 @@ from nicos.core import Override, Param, Moveable, status
from nicos.devices.secop import SecNodeDevice
from nicos.core import Device, anytype, listof
from nicos.utils.comparestrings import compare
from nicos_sinq.frappy_sinq.commands import applyAliasConfig
from servicemanager import FrappyManager
@ -72,6 +73,84 @@ class FrappyConfig(Device):
meanings = list(parameters)
meanings.remove('nodes')
def remove_aliases(self):
for meaning in self.meanings:
info = getattr(self, meaning)
aliasname = info['alias']
aliasdev = session.devices.get(aliasname)
if aliasdev:
session.destroyDevice(aliasname)
session.configured_devices.pop(aliasname, None)
session.dynamic_devices.pop(aliasname, None)
def set_envlist(self):
"""create aliases for SECoP devices
depending on their meaning
"""
self.remove_aliases()
nodedevs = filter(None, [session.devices.get(devname) for devname in self.nodes])
sample_devices = {}
for nodedev in nodedevs:
secnode = nodedev._secnode
if not secnode:
continue
for devname, (_, desc) in nodedev.setup_info.items():
secop_module = desc['secop_module']
meaning = secnode.modules[secop_module]['properties'].get('meaning')
if meaning:
meaning_name, importance = meaning
sample_devices.setdefault(meaning_name, []).append((importance, devname))
devset = set()
newenv = {e: None for e in session.experiment.envlist} # use dict instead of set because of order
drivables = {}
for meaning in self.meanings:
info = getattr(self, meaning)
aliasname = info['alias']
envlistflag = info.get('envlist', True)
aliascfg = info.get('targets', {})
importance_list = sample_devices.get(meaning, [])
importance_list.extend([(nr, nam) for nam, nr in aliascfg.items() if nam in session.devices])
importance_list = sorted(importance_list, reverse=True)
session.log.debug('%s: %r', meaning, importance_list)
prefix, _, postfix = meaning.partition('_')
if postfix == 'drivable':
# append the previously collected drivables in the group to the importance_list
group = drivables.get(prefix, {})
for key in 'regulation', '':
if key in group:
importance_list.append((None, group[key]))
for _, devname, in importance_list:
dev = session.devices.get(devname)
if isinstance(dev, Moveable):
drivables.setdefault(prefix, {})[postfix] = devname
elif postfix == 'drivable':
# marked as xxx_drivable, but not really drivable: skip
continue
if dev:
session.log.debug('create alias %r pointing to %r', aliasname, devname)
devcfg = ('nicos.core.DeviceAlias', {})
session.configured_devices[aliasname] = devcfg
session.dynamic_devices[aliasname] = 'frappy'
aliasdev = session.createDevice(aliasname, recreate=True, explicit=True)
aliasdev.alias = devname
if devname not in devset and envlistflag:
# take only the first one
devset.add(devname)
newenv[aliasname] = None
else:
newenv.pop(aliasname, None)
break
else:
newenv.pop(aliasname, None)
applyAliasConfig() # for other aliases
if set(newenv) != set(session.experiment.envlist):
session.experiment.setEnvironment(list(newenv))
session.log.info('changed environment to: %s', ', '.join(session.experiment.envlist))
class FrappyNode(SecNodeDevice, Moveable):
"""SEC node device

View File

@ -55,5 +55,5 @@ printinfo(" frappy_stick('') # remove stick")
printinfo(" frappy_main('') # remove main SE apparatus")
printinfo(" frappy_main() # show the current SE configuration")
printinfo("=======================================================================================")
set_se_list()
frappy_config.set_envlist()
'''