diff --git a/commands.py b/commands.py index 4c6f025..67c76a4 100644 --- a/commands.py +++ b/commands.py @@ -26,6 +26,7 @@ from glob import glob from configparser import ConfigParser from nicos import session, config +from nicos.core import status from nicos.utils import printTable from nicos.commands import helparglist, usercommand from nicos.commands.basic import AddSetup, CreateAllDevices, CreateDevice @@ -98,17 +99,16 @@ def frappy_start(**services): cfginfo = services.get(service) if cfginfo is None: if not secnode: - continue + continue cfginfo = secnode() or '' - all_cfg[service] = cfginfo else: if cfginfo: new_cfg.append((service, secnode, cfginfo)) else: remove_cfg.append(secnode) - all_cfg[service] = cfginfo if secnode: secnode('') + all_cfg[service] = secnode.get_info() # check cfg is not used twice for cfg in cfginfo.split(','): @@ -126,6 +126,7 @@ def frappy_start(**services): AddSetup('frappy_' + service) secnode = session.devices[nodename] secnode(cfginfo) + all_cfg[service] = secnode.get_info() CreateDevice(nodename) cleanup_defunct() CreateAllDevices() diff --git a/devices.py b/devices.py index b177e7d..d7d7ec5 100644 --- a/devices.py +++ b/devices.py @@ -133,13 +133,8 @@ class FrappyConfig(Device): meaning_name, importance = meaning sample_devices.setdefault(meaning_name, []).append((importance, devname)) - envlist = list(session.experiment.envlist) - prev_env_alias = {} # dict [devname] of aliasname of previous aliases in envlist - for devname in envlist: - dev = session.device.get(devname) - if isinstance(dev, DeviceAlias): - prev_env_alias[devname] = dev.alias - newenv = {} + newenv = {} # to be added to envlist (dict [devname] of aliasname) + to_remove = set() # items to be removed from previous envlist, if present for meaning in self.meanings: info = getattr(self, meaning) aliasnames = info.get('alias') @@ -162,26 +157,23 @@ class FrappyConfig(Device): session.dynamic_devices[aliasname] = 'frappy' # assign to frappy setup aliasdev = previous_aliases.pop(aliasname, None) if aliasdev: - session.log.debug('change alias %r -> %r', aliasname, devname) + if aliasdev.alias != devname: + session.log.debug('change alias %r -> %r', aliasname, devname) else: session.log.debug('create alias %r -> %r', aliasname, devname) aliasdev = session.createDevice(aliasname, recreate=True, explicit=True) aliasdev.alias = devname # only the first item of aliasnames is added to the envlist aliasname = aliasnames[0] - if devname in envlist: - envlist.remove(devname) - else: - prev_alias = prev_env_alias[devname] - if prev_alias in envlist: - envlist.remove(prev_alias) + to_remove.add(devname) + to_remove.add(aliasname) if devname not in newenv and info.get('envlist', True): # example: when 'temperature' and 'temperature_regulation' are the # same device, the first one is kept newenv[devname] = aliasname break else: - envlist = [k for k in envlist if k not in aliasnames] + to_remove.union(aliasnames) for aliasname in previous_aliases: session.destroyDevice(aliasname) @@ -190,10 +182,14 @@ class FrappyConfig(Device): applyAliasConfig() # for other aliases - envlist.extend(newenv.values()) - if set(envlist) != set(session.experiment.envlist): + envlist = [k for k in session.experiment.envlist if k not in to_remove] + list(newenv.values()) + if envlist != session.experiment.envlist: + removed = set(session.experiment.envlist).difference(envlist) session.experiment.setEnvironment(envlist) - session.log.info('changed environment to: %s', ', '.join(session.experiment.envlist)) + if removed: + session.log.info('removed %s from environment', ', '.join(removed)) + if newenv: + session.log.info('added %s to environment', ', '.join(newenv.values())) class FrappyNode(SecNodeDevice, Moveable): @@ -313,3 +309,12 @@ class FrappyNode(SecNodeDevice, Moveable): if self._cache: self._cache.put(self, 'value', cfg) self._setROParam('target', cfg) + + def get_info(self): + result = self.doRead() or '' + code, text = self.status() + if code == status.OK: + return result + if (code, text) == (status.ERROR, 'reconnecting'): + return '%s (frappy not running)' % result + return '%s (%s)' % (result, text)