diff --git a/commands.py b/commands.py index f94b3fc..081a186 100644 --- a/commands.py +++ b/commands.py @@ -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 diff --git a/devices.py b/devices.py index dc9b318..62767dc 100644 --- a/devices.py +++ b/devices.py @@ -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 diff --git a/setups/frappy.py b/setups/frappy.py index d98ba76..5f680b9 100644 --- a/setups/frappy.py +++ b/setups/frappy.py @@ -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() '''