move set_se_list to frappy_config.set_envlist
This commit is contained in:
92
commands.py
92
commands.py
@ -26,11 +26,10 @@ from glob import glob
|
|||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
|
|
||||||
from nicos import session, config
|
from nicos import session, config
|
||||||
from nicos.core import DeviceAlias, Moveable
|
|
||||||
from nicos.utils import printTable
|
from nicos.utils import printTable
|
||||||
from nicos.commands import helparglist, usercommand
|
from nicos.commands import helparglist, usercommand
|
||||||
from nicos.commands.basic import AddSetup, CreateAllDevices, CreateDevice
|
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('~')
|
home = expanduser('~')
|
||||||
if home not in sys.path:
|
if home not in sys.path:
|
||||||
@ -88,94 +87,11 @@ def applyAliasConfig():
|
|||||||
break
|
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):
|
def frappy_start(service, cfg=None):
|
||||||
if service not in SERVICES:
|
if service not in SERVICES:
|
||||||
raise ValueError('unknown service %s' % service)
|
raise ValueError('unknown service %s' % service)
|
||||||
remove_se_aliases()
|
frappy_config = session.devices['frappy_config']
|
||||||
|
frappy_config.remove_aliases()
|
||||||
if cfg == '':
|
if cfg == '':
|
||||||
seaconn = session.devices.get('seaconn')
|
seaconn = session.devices.get('seaconn')
|
||||||
if seaconn and seaconn._attached_secnode:
|
if seaconn and seaconn._attached_secnode:
|
||||||
@ -214,7 +130,7 @@ def frappy_start(service, cfg=None):
|
|||||||
if cfg is not None:
|
if cfg is not None:
|
||||||
cleanup_defunct()
|
cleanup_defunct()
|
||||||
CreateAllDevices()
|
CreateAllDevices()
|
||||||
set_se_list()
|
frappy_config.set_envlist()
|
||||||
if startnode and cfg == '':
|
if startnode and cfg == '':
|
||||||
startnode.disable()
|
startnode.disable()
|
||||||
return all_cfg
|
return all_cfg
|
||||||
|
79
devices.py
79
devices.py
@ -35,6 +35,7 @@ from nicos.core import Override, Param, Moveable, status
|
|||||||
from nicos.devices.secop import SecNodeDevice
|
from nicos.devices.secop import SecNodeDevice
|
||||||
from nicos.core import Device, anytype, listof
|
from nicos.core import Device, anytype, listof
|
||||||
from nicos.utils.comparestrings import compare
|
from nicos.utils.comparestrings import compare
|
||||||
|
from nicos_sinq.frappy_sinq.commands import applyAliasConfig
|
||||||
from servicemanager import FrappyManager
|
from servicemanager import FrappyManager
|
||||||
|
|
||||||
|
|
||||||
@ -72,6 +73,84 @@ class FrappyConfig(Device):
|
|||||||
meanings = list(parameters)
|
meanings = list(parameters)
|
||||||
meanings.remove('nodes')
|
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):
|
class FrappyNode(SecNodeDevice, Moveable):
|
||||||
"""SEC node device
|
"""SEC node device
|
||||||
|
@ -55,5 +55,5 @@ printinfo(" frappy_stick('') # remove stick")
|
|||||||
printinfo(" frappy_main('') # remove main SE apparatus")
|
printinfo(" frappy_main('') # remove main SE apparatus")
|
||||||
printinfo(" frappy_main() # show the current SE configuration")
|
printinfo(" frappy_main() # show the current SE configuration")
|
||||||
printinfo("=======================================================================================")
|
printinfo("=======================================================================================")
|
||||||
set_se_list()
|
frappy_config.set_envlist()
|
||||||
'''
|
'''
|
||||||
|
Reference in New Issue
Block a user