Compare commits
59 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 89d9e184bc | |||
| 423366a5c5 | |||
| d06b552526 | |||
| 4f1834105b | |||
| 84f70f8204 | |||
| 771e0fdce7 | |||
| 2189323983 | |||
| cbb857f439 | |||
| d30bb11bc1 | |||
| 0869f8b5d9 | |||
| 173ef914d7 | |||
|
|
cb99a73935 | ||
| 666cefb6a6 | |||
| 4e260decb4 | |||
| 163e0194b1 | |||
| 81dd4aad23 | |||
| 62da0bd55e | |||
| a5f6047b75 | |||
| 3cec0ea357 | |||
| 3c41e7cf0c | |||
| 2dcf8f0cc3 | |||
| 24d76e4d2d | |||
| 5bd6eeff98 | |||
| 57e6a73599 | |||
| 5d2e4aeedd | |||
| 0e9216629b | |||
| b978489695 | |||
| 0642ab7d09 | |||
| 7b08743a3f | |||
| 062341ab8a | |||
| 2c01121ccc | |||
| 03359d5b15 | |||
| 9b56a6fb95 | |||
| 15cefee221 | |||
| 9e489d8cfd | |||
| b97eff8afb | |||
| aa40e0255b | |||
| 15a839bf6c | |||
| 91dde94e24 | |||
| ee56a23d0b | |||
| f5ac31f25f | |||
| a54a4054d9 | |||
| da56f6da6d | |||
| 04b5c1921b | |||
| 45fd71077c | |||
| 0edda9f5c8 | |||
| 0f39271ff1 | |||
| 093b27804c | |||
| b945dd94ec | |||
| 6195bfb6e5 | |||
| d4e2b12016 | |||
| 0e059c644c | |||
| 03d4ffb0bc | |||
| ed983d36ae | |||
| c2473d9e51 | |||
| fedfe3a278 | |||
| 0f1538c156 | |||
| c73390195d | |||
| 56fec16247 |
101
devices.py
101
devices.py
@@ -27,12 +27,10 @@ connected to a SEC node
|
||||
"""
|
||||
|
||||
import threading
|
||||
import socket
|
||||
import json
|
||||
from nicos import config, session
|
||||
from nicos.core import Override, Param, Moveable, status, POLLER, SIMULATION, DeviceAlias, \
|
||||
Device, anytype, listof, MASTER
|
||||
from nicos.devices.secop.devices import SecNodeDevice, SecopDevice, DefunctDevice
|
||||
from nicos.devices.secop.devices import SecNodeDevice
|
||||
from nicos.core.utils import createThread
|
||||
from nicos.utils.comparestrings import compare
|
||||
from nicos.devices.secop.devices import get_attaching_devices
|
||||
@@ -40,8 +38,6 @@ from nicos.commands.basic import AddSetup, CreateAllDevices, CreateDevice
|
||||
from nicos.utils import loggers
|
||||
from servicemanager import FrappyManager, SeaManager, Reconnect, Keep
|
||||
|
||||
|
||||
SECOP_UDP_PORT = 10767
|
||||
SERVICES = FrappyManager.services
|
||||
|
||||
|
||||
@@ -117,21 +113,6 @@ def get_frappy_config():
|
||||
return None
|
||||
|
||||
|
||||
def send_other_udp(uri, instrument, device=None):
|
||||
"""inform the feeder about the start of a frappy server"""
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||
msg = {
|
||||
'SECoP': 'for_other_node',
|
||||
'uri': uri,
|
||||
'instrument': instrument,
|
||||
}
|
||||
if device:
|
||||
msg['device'] = device
|
||||
msg = json.dumps(msg, ensure_ascii=False, separators=(',', ':')).encode('utf-8')
|
||||
sock.sendto(msg, ('255.255.255.255', SECOP_UDP_PORT))
|
||||
|
||||
|
||||
class FrappyConfig(Device):
|
||||
# respect the order: e.g. temperature_regulation must be after temperature
|
||||
# because it will not be added to envlist when temperature is the same device
|
||||
@@ -182,17 +163,8 @@ class FrappyConfig(Device):
|
||||
before_check = before_change = prev_shown = None
|
||||
cnt = 0
|
||||
self._back_to_normal = None
|
||||
current_exp = id(session.experiment.propinfo)
|
||||
exp_changed = False
|
||||
envlist = []
|
||||
while not self._shutdown_event.wait(1):
|
||||
busy = session.daemon_device._controller.status >= 0
|
||||
if id(session.experiment.propinfo) != current_exp:
|
||||
# NewExperiment or FinishExperiment was called
|
||||
current_exp = id(session.experiment.propinfo)
|
||||
exp_changed = True
|
||||
elif not exp_changed:
|
||||
envlist = session.experiment.envlist
|
||||
if self._restarting or (busy and cnt < 10):
|
||||
# do not check while restarting and check only every 10 sec when busy
|
||||
cnt += 1
|
||||
@@ -206,17 +178,6 @@ class FrappyConfig(Device):
|
||||
self._back_to_normal = None
|
||||
cnt = 0
|
||||
need_change, changes, fm = to_consider = self.to_consider()
|
||||
if exp_changed:
|
||||
exp_changed = False
|
||||
needed = set(self.needed_envalias()[0])
|
||||
if needed == needed.intersection(envlist) and not session.experiment.envlist:
|
||||
# restore envlist from previous experiment, as it was cleared by New/FinishExperiment
|
||||
session.experiment.setEnvironment(envlist)
|
||||
session.log.info('keep environment from previous experiment: %s', ', '.join(envlist))
|
||||
continue
|
||||
# trigger output of proposed SE change
|
||||
prev_shown = None
|
||||
need_change = True
|
||||
if fm.state == before_change:
|
||||
continue
|
||||
if not need_change:
|
||||
@@ -366,25 +327,9 @@ class FrappyConfig(Device):
|
||||
CreateDevice(nodename)
|
||||
cleanup_defunct()
|
||||
CreateAllDevices()
|
||||
fm = FrappyManager()
|
||||
ins = config.instrument
|
||||
fm.get_server_state(ins, new_cfg)
|
||||
recorders = {}
|
||||
for service, secnode in secnodes.items():
|
||||
if services.get(service) and secnode:
|
||||
cfg = fm.frappy_cfgs.get(service)
|
||||
seacfg = fm.frappy2sea.get(cfg)
|
||||
if secnode() and not seacfg:
|
||||
if cfg:
|
||||
recorders[service] = f'localhost:{fm.info[ins].get(service, 0)}/{cfg}'
|
||||
else:
|
||||
recorders[service] = secnode.uri
|
||||
secnode._secnode.connect()
|
||||
if recorders:
|
||||
try:
|
||||
fm.sea.sea_recorder(ins, recorders)
|
||||
except Exception as e:
|
||||
session.log.warning('error in command sea_recorder %r', e)
|
||||
self.set_envalias()
|
||||
for secnode in remove_cfg:
|
||||
secnode.disable()
|
||||
@@ -403,7 +348,7 @@ class FrappyConfig(Device):
|
||||
- frappy('restart') # restart all frappy servers
|
||||
- frappy('reconnect') # reconnect to running frappy servers
|
||||
"""
|
||||
self._back_to_normal = None # reset 'back to normal' mechanism
|
||||
self._back_to_normal = None # reset 'back to normal' machanism
|
||||
stickarg = stick
|
||||
|
||||
need_change, changes, fm = to_consider = self.to_consider()
|
||||
@@ -652,6 +597,8 @@ class FrappyConfig(Device):
|
||||
to_remove = to_remove.difference(addedenv)
|
||||
prevenv = [k for k in session.experiment.envlist if k not in to_remove]
|
||||
envlist = prevenv + [k for k in addedenv if k not in prevenv]
|
||||
if set(envlist) == set(prevenv):
|
||||
envlist = None
|
||||
|
||||
predef_changes = []
|
||||
for aliasname, cfg in predef_aliases:
|
||||
@@ -662,7 +609,7 @@ class FrappyConfig(Device):
|
||||
|
||||
def check_envalias(self):
|
||||
envlist, new_aliases, predef_aliases = self.needed_envalias()
|
||||
if set(envlist) != set(session.experiment.envlist):
|
||||
if envlist:
|
||||
return f"envlist should be {', '.join(envlist)}"
|
||||
anew = [k for k, v in new_aliases.items() if v is not None]
|
||||
removed = set(new_aliases).difference(anew)
|
||||
@@ -670,7 +617,7 @@ class FrappyConfig(Device):
|
||||
if anew:
|
||||
return f"aliases {', '.join(anew)} should change"
|
||||
if removed:
|
||||
return f"aliases {', '.join(removed)} should be removed"
|
||||
return f"aliases {', '.join(anew)} should be removed"
|
||||
return None
|
||||
|
||||
def set_envalias(self):
|
||||
@@ -682,15 +629,9 @@ class FrappyConfig(Device):
|
||||
if new_aliases or predef_aliases:
|
||||
for aliasname, devname in new_aliases.items():
|
||||
if devname is None:
|
||||
aliasdev = session.devices.get(aliasname)
|
||||
if aliasdev:
|
||||
aliastarget = session.devices.get(aliasdev.alias)
|
||||
if isinstance(aliastarget, (SecopDevice, DefunctDevice)):
|
||||
session.destroyDevice(aliasname)
|
||||
session.configured_devices.pop(aliasname, None)
|
||||
session.dynamic_devices.pop(aliasname, None)
|
||||
elif aliastarget:
|
||||
session.log.info('frappy_setup does not remove %s', aliasname)
|
||||
else:
|
||||
dev = session.devices.get(devname)
|
||||
devcfg = ('nicos.core.DeviceAlias', {})
|
||||
@@ -719,19 +660,15 @@ class FrappyConfig(Device):
|
||||
|
||||
applyAliasConfig() # for other aliases
|
||||
|
||||
prev = set(session.experiment.envlist)
|
||||
remove = ', '.join(prev.difference(envlist))
|
||||
if envlist is not None:
|
||||
prev = session.experiment.envlist
|
||||
removed = set(prev).difference(envlist)
|
||||
session.experiment.setEnvironment(envlist)
|
||||
show = []
|
||||
keep = ', '.join(d for d in envlist if d in prev)
|
||||
if keep:
|
||||
show.append(f'keep {keep}')
|
||||
add = ', '.join(d for d in envlist if d not in prev)
|
||||
if add:
|
||||
show.append(f'add {add}')
|
||||
if remove:
|
||||
show.append(f'remove {remove}')
|
||||
session.log.info('environment: %s', '; '.join(show))
|
||||
if removed:
|
||||
session.log.info('removed %s from environment', ', '.join(removed))
|
||||
added = set(envlist).difference(prev)
|
||||
if added:
|
||||
session.log.info('added %s to environment', ', '.join(added))
|
||||
|
||||
|
||||
class FrappyNode(SecNodeDevice, Moveable):
|
||||
@@ -750,13 +687,7 @@ class FrappyNode(SecNodeDevice, Moveable):
|
||||
"set to 'general' if all parameters should appear in the datafile header",
|
||||
type=str, default='', settable=True),
|
||||
'quiet_init': Param('flag to set loglevel to error while initializing',
|
||||
type=bool, default=True, settable=True),
|
||||
# duplicate from SecNodeDevice. needed for the case where the code for
|
||||
# the SecNodeDevcice is not up to date, but the setup is already new
|
||||
# does not yet have the i
|
||||
'general_stop_whitelist': Param('module names to accept general stop',
|
||||
type=listof(str), prefercache=False,
|
||||
default=[], userparam=False),
|
||||
type=bool, default=True, settable=True)
|
||||
}
|
||||
|
||||
_cfgvalue = None
|
||||
@@ -899,10 +830,8 @@ class FrappyNode(SecNodeDevice, Moveable):
|
||||
if available_cfg is not None:
|
||||
raise ValueError('use "frappy_list()" to get a list of valid frappy configurations')
|
||||
uri = 'localhost:%d' % info[self.service]
|
||||
send_other_udp(uri, config.instrument, device=cfg)
|
||||
else:
|
||||
uri = cfg
|
||||
send_other_udp(uri, config.instrument)
|
||||
if uri != self.uri:
|
||||
self._disconnect(keeptarget=True)
|
||||
if uri:
|
||||
|
||||
@@ -7,6 +7,5 @@ devices = {
|
||||
device('nicos_sinq.frappy_sinq.devices.FrappyNode',
|
||||
description='main SEC node', unit='', async_only=True,
|
||||
prefix=environ.get('SE_PREFIX', 'se_'), auto_create=True, service='main',
|
||||
general_stop_whitelist=['om', 'stickrot'],
|
||||
),
|
||||
}
|
||||
|
||||
26
setups/ppms.py
Normal file
26
setups/ppms.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from os import environ
|
||||
description = 'frappy main setup'
|
||||
group = 'optional'
|
||||
|
||||
devices = {
|
||||
'se_main':
|
||||
device('nicos_sinq.frappy_sinq.devices.FrappyNode',
|
||||
uri='pc12694:5000',
|
||||
description='main SEC node', unit='',
|
||||
prefix=environ.get('SE_PREFIX', ''), auto_create=True, service='main',
|
||||
),
|
||||
'timestamp': device('nicos_linse.common.lab.Timestamp', description='time, a dummy detector'),
|
||||
}
|
||||
|
||||
startupcode = '''
|
||||
printinfo("=======================================================================================")
|
||||
printinfo("Welcome to the NICOS frappy secnode setup for PPMS!")
|
||||
printinfo(" ")
|
||||
printinfo("Usage:")
|
||||
printinfo(" frappy(stick='<stick cfg>') # change sample-stick configuration")
|
||||
printinfo(" frappy(addons='<addon1 cfg>,<addon2 cfg> ...') # change SE addons")
|
||||
printinfo(" frappy(stick=None) # remove stick")
|
||||
printinfo(" frappy(addons=None) # remove addons")
|
||||
printinfo("=======================================================================================")
|
||||
SetDetectors(timestamp)
|
||||
'''
|
||||
9
setups/timestamp.py
Normal file
9
setups/timestamp.py
Normal file
@@ -0,0 +1,9 @@
|
||||
description = 'timestamp dummy detector for offline measurements'
|
||||
group = 'optional'
|
||||
|
||||
devices = {
|
||||
'timestamp': device('nicos_linse.common.lab.Timestamp', description='time, a dummy detector'),
|
||||
}
|
||||
|
||||
startupcode = 'SetDetectors(timestamp)'
|
||||
|
||||
Reference in New Issue
Block a user