diff --git a/commands.py b/commands.py index 8a97dc1..372478b 100644 --- a/commands.py +++ b/commands.py @@ -30,6 +30,7 @@ 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 +from nicos_sinq.frappy_sinq.devices import applyAliasConfig home = expanduser('~') if home not in sys.path: @@ -68,8 +69,9 @@ def all_info(all_cfg): def frappy_start(service, cfg=None): if service not in SERVICES: raise ValueError('unknown service %s' % service) - frappy_config = session.devices['frappy_config'] - frappy_config.remove_aliases() + frappy_config = session.devices.get('frappy_config') + # if frappy_config(): + # frappy_config.remove_aliases() if cfg == '': seaconn = session.devices.get('seaconn') if seaconn and seaconn._attached_secnode: @@ -108,7 +110,10 @@ def frappy_start(service, cfg=None): if cfg is not None: cleanup_defunct() CreateAllDevices() - frappy_config.set_envlist() + if frappy_config: + frappy_config.set_envlist() + else: + applyAliasConfig() if startnode and cfg == '': startnode.disable() return all_cfg diff --git a/devices.py b/devices.py index e113c20..8e06745 100644 --- a/devices.py +++ b/devices.py @@ -31,7 +31,7 @@ import os from os.path import expanduser from nicos import config, session -from nicos.core import Override, Param, Moveable, status +from nicos.core import Override, Param, Moveable, status, UsageError from nicos.devices.secop import SecNodeDevice from nicos.core import Device, anytype, listof from nicos.utils.comparestrings import compare @@ -87,12 +87,15 @@ class FrappyConfig(Device): 'rotation_z': Param( 'config for sample rotation', type=anytype, default={'alias': 'stickrot', 'envlist': False}), + 'stick_rotation_alias': Param( + 'alias to assign stick rotation', type=str, settable=True, default=''), 'nodes': Param( 'list of names of potential SEC nodes', type=listof(str), default=[]), } meanings = list(parameters) meanings.remove('nodes') + meanings.remove('assign_stick_rotation') def remove_aliases(self): for meaning in self.meanings: @@ -107,12 +110,25 @@ class FrappyConfig(Device): session.configured_devices.pop(aliasname, None) session.dynamic_devices.pop(aliasname, None) + def get_se_aliases(self): + result = {} + for meaning in self.meanings: + info = getattr(self, meaning) + aliasnames = info['alias'] + if isinstance(aliasname, str): + aliasnames = [aliasnames] + for aliasname in aliasnames: + aliasdev = session.devices.get(aliasname) + if aliasdev: + result[aliasname] = aliasdev + def set_envlist(self): """create aliases for SECoP devices depending on their meaning """ - self.remove_aliases() + previous_aliases = self.get_se_aliases() + # self.remove_aliases() nodedevs = filter(None, [session.devices.get(devname) for devname in self.nodes]) sample_devices = {} @@ -157,11 +173,15 @@ class FrappyConfig(Device): continue if dev: for aliasname in aliasnames: - 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 = previous_aliases.pop(aliasname, None) + if aliasdev: + session.log.debug('change alias %r -> %r', aliasname, devname) + else: + session.log.debug('create alias %r -> %r', aliasname, devname) + devcfg = ('nicos.core.DeviceAlias', {}) + aliasdev = session.createDevice(aliasname, recreate=True, explicit=True) aliasdev.alias = devname aliasname = aliasnames[0] if devname not in devset and envlistflag: @@ -175,6 +195,11 @@ class FrappyConfig(Device): for aliasname in aliasnames: newenv.pop(aliasname, None) + for aliasname in previous_aliases: + session.destroyDevice(aliasname) + session.configured_devices.pop(aliasname, None) + session.dynamic_devices.pop(aliasname, None) + applyAliasConfig() # for other aliases if set(newenv) != set(session.experiment.envlist): session.experiment.setEnvironment(list(newenv))