including a config file and overriding some properties is
helpful when we do not want to modify the original config
but run it with sligthly different properties.
this involves some redesign a.o.:
- modules are collected in a dict instead of a list in
order for 'override' to find the related module
- checking for duplicates happens in the Collector
Do not warn when included file does not end with '_cfg.py',
as this may be intentional, in case a file is only used
via 'include' and not as cfg file alone.
+ remove unused method Collector.append
+ complain with specific error message when Node is not given
Change-Id: Id568f04d6d84622ef2547412eb6f288fcebf986f
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36357
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- instead to show first current 'value' and 'status', and then
the changes, show changes only - this way updates appear
in the expected order
- for this SecopClient.register_callback needs a 'callimmediately'
argument
Change-Id: I3e91c2c15bca7fee2eba3b1bf1dd27313da3ae29
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36291
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
a property declared in a base class may be overriden
with a parameter in a subclass. this is already allowed.
if then, in the subsubclass it is overridden by a bare value,
it fails.
Patchset 1: add a test for this
Patchset 4: add the fix
Change-Id: Ia5a26076a9ee98439932643a03878342d56f8396
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35932
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
The test for method names 'read_<param>' and 'write_<param>'
without a defined parameter is simplified. We do not check
anymore method names from base classes. Base classes
inheriting from HasAccessible are checked anyway at the
place they are defined.
+ add a test for it
+ move some tests to a new file test_all_modules.py, as
test_modules.py is getting too long
+ fix missing doc string (frappy.simulation.SimDrivable.stop)
Change-Id: Id8a9afe5c977ae3b1371bd40c6da52be2fc79eb9
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35503
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This is meant to replace change 33375.
Optional commands and parameters may be declared with the argument
optional=True. In principle, optional commands are not really needed
to be declared, but doing so is nice for documentation reasons
and for inherited accessible properties.
Optional parameters and commands can not be used and are not
exported als long as they are not overridden in subclasses.
- add a test for this
+ fix an issue with checking for methods like read_<param> without
<param> being a parameter
Change-Id: Ide5021127a02778e7f2f7162555ec8826f1471cb
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35495
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Add a new custom module property 'original_id' indicating
the equipment_id the modules originally belongs to.
This property is only given, when distinct from the equipment_id
of the SEC node.
It happens when multiple config files are given, for all modules
but the ones given in the first file, and for routed modules,
when multiple nodes are routed or own modules are given.
+ fix an issue in router: additional modules were ignore in case
of a single node.
+ small cosmetic changes in config.py reducing IDE complains
Change-Id: If846c47a06158629cef807d22b91f69e4f416563
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35396
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
In the previous code, the equipment_id was overridden by the
server name when the interface argument was given over
the commandline. This was leftover from the previous config
file format, where the config files not neccessarly needed
an equipment_id.
Change-Id: I2fc248372a7d2f61cc0690804268d6d066a0a9fa
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35391
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
The options given in the node configuration may be used
for both SecNode (equipment_id) and Dispatcher (when the
frappy.protocol.router.Router is used as dispatcher).
It is correct that both remove the options known to them.
Change-Id: I2a34073e4e5490dcf8db577d9cb74788c0cb657b
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34989
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Under some condition (no general config file) it's possible that the
piddir and logdir as well are lists of pathes which creates some errors
during the server start
This problems occurs at least in NICOS test suite where no general
config file is defined.
Change-Id: I94c5db927923834c1546dbc34e2490b07b0bf111
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34952
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Jens Krueger <jens.krueger@tum.de>
overwriting defaults before init() had no effect, as the values were
replaced there.
Now, only unset defaults are updated, keeping the overrides.
Also fix unconditionally taking the values from environment variables.
Change-Id: Idf1c5e2338403e061d20c11ed9c4803d535eb188
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34304
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
installing a custom logger was not possible, since the RemoteLogHandler
was not installed.
Additionally, search for the RemoteLogHandler recursively upwards, since
not all loggers copy their Hanlders to their children.
Change-Id: If3e19966d9289cacd926648582e9718b7eab279c
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34288
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
change error class on reading parameters in SEA from HardwareError
to ReadFailed. This is in most cases more appropriate.
TODO: find errors in SEA that should be should be HardwareErrors
and a mechanism to indicate this
+ for errors related to disabled modules use the DISABLED status
Change-Id: I0342a34185a66dcf874c6ca034b7cefc98bf9c8a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34022
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- fix a bug then TcpServer can not start dye to address in use
- report errors when restarting interfaces
- increase timeout. the timeout for waiting all interfaces
starting up must be higher than a potential successful
startup of TcpServer, which is currently ~ 10 sec
(might be reduced, but at both places)
Change-Id: I88b967c4baff79fdf94f4c849dd713d2cba6fabc
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/33985
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
the main error was a suppressed update when the value does not
change, but the readerror gets None
this error was the reason for strange behaviour in frappy.proxy
while finding the cause, other improvements were done:
- nodeStateChange: add 'activating' to the possible online states
- improve status handling in proxy
Change-Id: I2a1873065ab051bdba2200f50e6ad09ae55e168e
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/33901
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- implement a 'handleError' callback
- SecopClient.handleError is registered as a callback and by default
logs errors up to a limited number of times
- the cache is customized to return an item indicating an undefined value,
helping to avoid follow up errors.
+ frappy.errors: cosmetic fix
+ frappy.client: cosmetic changes
Change-Id: I4614e1d27c7aea3a1a722176c6be55f8563597cd
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/33429
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- for the case when the remote module name does not match,
'read', 'change' and 'do' does not work
- a proxy to an IO class has enablePoll == False, but it needs
a triggerPoll for modules relying on it to work
- a proxy on a communicator module has a status even when the
remote does not - this needs 2 fixes
Change-Id: Icd44da4c2984f27ce7147dec633739f9176012ec
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/33168
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
for the use case where a parameter is a selection of discrete
float parameters
declaring a parameter as FloatEnumParam will create effectively
two parameters, one with datatype FloatRange and another with
datatype Enum, influencing each other automatically.
in a later change StructParam should be moved from
frappy/structparam.py to frappy/extparams.py
Change-Id: Ica3fd8dcaf6e9439e8178390f220dec15e52cc86
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32975
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Transported values in a change must be converted first.
As this is only relevant for the exotic "scaled" and "blob"
datatypes, this was not detected yet.
- add tests
- suppress warning PytestUnhandledThreadExceptionWarning in tests
+ change import_value methods to raise no other exceptions than
WrongTypeError and RangeError
+ simplify Command.do: as import_value already raises the
appropriate error, no more try/except is needed
Change-Id: I299e511468dc0fcecff4c20cf8a917da38b70786
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32743
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- StringIO.writeline sends a command and does not expect a reply
- StringIO.multicomm and BytesIO.multicomm is improved in order
to insert individual delays in between lines and individual
noreply flags
+ fix a bug in tutorial_t_control
+ improve readability of frappy.lib.classdoc.indent_description
Change-Id: I9dea113e19147684ec41aca5267a79816bbf202c
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32267
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
latexpdf fails with error message "Too deply nested".
We want to avoid reducing the nesting level of doc strings
in frappy.lib.classdoc (less nice output) or a level of
nesting in method doc strings.
- latex removed from Jenkinsfile
- added support for rst2pdf
Change-Id: Ieb3355ef506e636e7e43a726c68327e3b1154469
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32406
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Split module handling code from the dispatcher.
The new class for managing Modules is called SecNode.
* change logging to no longer need a reference to modobj
* modules get a reference to the secnode obj instead of the
dispatcher
* intermediate usage fixes for frappy_psi/sea
Change-Id: Ifee4bb47aa7a4508bb4a47c9a5873b7e2d5faf67
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32249
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
previously, the signal handler would ignore SIGINTs and SIGTERMs during
server startup, so if there would be e.g. non-respoinding hardware, the
program could not be exited until a timeout occured.
For now, the default signal handler will be called. Later, we should
consider cleaning up the partial started modules.
Change-Id: I5bb802b5d996bb03dfa2679c1497e298fde1dd17
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32247
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
An attached property may be defined with mandatory=False.
In this case, when no value or an empty string is given,
<modobj>.<attached_mod> must return None after initialisation.
+ remove 'dispatcher' level from the logger hierarchy on modules
Change-Id: Icee3ae3f9142cd7a910c579ae1ffaa35f93cee03
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32187
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
For the case when the readback of a parameter does not reflect the
change immediately.
May also be used on Writable.target or Drivable.target with a short
BUSY period.
+ bug fix in an error message in frappy.datatypes.IntRange
Change-Id: I5e1c871629f9e3940ae80f35cb6307f404202b4a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31981
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
in SecopClient.disconnect joinng the reconnect thread may take
up to 10 s, because of the time.sleep(10) call in the reconnect
thread.
change the _shutdown attribute from bool to an Event, and
use Event.wait instead of time.sleep
Change-Id: Icea6a14ad73df0b3d26ef45806f4c05e6bf18492
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32137
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
in the previous version FloatRange(max=100) was neither working
properly nor complaining, because the maxval=None default was
overriding the value for max.
possible fixes:
- raise an error when min/max used as argument (confusing for
the programmer, as it is a property)
- allow both versions minval/maxval and min/max (more code)
- use min/max and a pylint directive here (the only thing to
take care is not to use the min/max builtin in __init__)
this change uses the last option for the fix
Change-Id: Iff0e0c4d0d7b165003bdeffa67a93a1cd7f29eea
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31982
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
reading back the target does not work properly, because
a) the readback value might be delayed
b) there is no command to read back the target, SETP?1
is returning the working setpoint, which might be distinct
in case of a ramp
Change-Id: I0da2dbfc1a8ddbecbae6d0456ff64e008bc56336
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31983
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- when driving a module with <module>(<target>),
keyboard interrupt should send stop()
- make sure keyboard interrupt does not only stop
the current driving, but also skips other code
on the same command line
Change-Id: Ib4d2c4111dc0f23bf07385065766fb9b4a611454
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31926
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
restarting the phytron motor without prior stop leads
to funny behaviour.
- send stop before restart
- stop motor when moving but status not busy
- restart when motor drives the wrong way
+ better status text when stopping
Change-Id: I82cd59297b3c79a354a4eeb5ba03fc65bedf755f
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31929
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
for host name without port, None was used for the port
leading to a confusing error message
- do not call parse_host_port with None as defaultport argument
- improve error message when connection fails
+ fix an error in last line of parse_ipv6_host_and_port
+ fix some issues breaking PEP 8 rules
Change-Id: I437360be96449c164f0080e3c60f1685825d4780
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31911
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- in SEA, it is not guaranteed that the is_running state is set
before the run command returns. as a consequence, we have to
wait in SeaDrivable.write_target for is_running being set
- syncio has always to be reconnected after asynio
Change-Id: Ia46cff11de86868ce0627faaf6f776282bd7a8f4
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31631
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
adds a generic solution for creating parameters with struct datatype
with their members linked to individual parameters.
main use case: ctrlpars
read_*/write_* methods are either created for the main (structed)
parameter based on the corresponding methods of the individual
parameters or the methods for the individual parameters are created
based on the methods of the main parameter
+ disable pylint use-dict-literal
Change-Id: I7f1d9fb3d3b2226b548c2999bbfebe2ba5ac285e
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31405
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
add module which scans a connection and registers new devices depending
on the answer.
* change module initialization to demand-based
* move code from server to dispatcher
- remove intermediate step in Attached __get__
TODO:
factor out dispatcher (regards to playground)
discuss factoring out of module creation code from server AND
dispatcher
Change-Id: I7af959b99a84c291c526aac067a4e2bf3cd741d4
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31470
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
previously, no cleanup would be performed, SIGINTs being catched above
the server.run() function
+ signal handler for SIGINT, SIGTERM
* put serve_forever in its own thread, to be able to call shutdown() on
the server
Change-Id: Ia5c021f3d6fd60ff2b9012c10e30715f93104977
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31340
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Add and call shutdownModule function, in order to allow modules to clean
up.
use shutdownModule instead of shutdown to avoid confusion with
severs/dispatchers shutdown and to make it consistent with initModule
etc.
Try to resolve module dependencies
Change-Id: I2a091bf74ecadc2395fcdf92c599f1c49eb120f5
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31339
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Change 31280 introduced an error where an import was overridden, which
leads python to consider it a local variable, preventing access to the
systemd import. (TODO: a better way to handle the systemd import?)
Fixes: #4732
Change-Id: I5188a8737392bd8befcdfa9af044a21be9af908a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31386
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
our version of systemd installed does not accept
a string as argument for systemd.daemon.notify
anyway, whether systemd notifications are sent or not
should not depend only on the presence of a package,
but should be configurable.
Change-Id: I466d1ed2b969301a287dd532ab4d0743a74045fa
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31280
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
compatible used sys.float_info.min (smallest representable positive
float) instead of -sys.float_info.max.
so FloatRanges -500,10 and -10,10 were two-way compatible
Since it is correctly set in __init__, no need for the guard here
Change-Id: If693fa69a8b2de1aa52ce702bd282a84a8f4c55a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31056
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
frappy_psi.convergence.HasConvergence:
- no need to inherit HasStates (should be independent)
- trigger current state then tolerance or settling_time is changed
frappy_psi.mercury:
- improve readback checks
- fix interplay with HasControlledBy
- fix interplay with HasConvergence
Change-Id: I6efedbe6bbfba5a66ddd22ac441ebf38af11eda6
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31047
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- in order to work properly, readonly=True in limit parameters
has to be set before creating the write_* method
- more explicit: Use e.g. target_max=Limit()
- fix an error in the loop over the base classes when creating
the check_* method
- more concise error message when a limit is violated
+ fix an error in playground when using persistent parameters
Change-Id: Ibd557b55d6c0d9a2612cda4460b16e3c70e1bc9e
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31017
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Basic parsing and writing of python config files.
Does not preserve comments, can't transform the
old format to the new one.
This is just so the executable that is delivered
actually does something with the new config files.
Change-Id: I4bb8310e1af7a05f90dd426dfa629080583aff66
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30935
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
- simplify parsing/formatting of LakeShore commands
-> allow 'g' as enum format
- HasIO: check missing io later
- ls370res.ResChannel: get io for channels from switcher
- rwhandler.CommonWriteHandler: return value in write method
- frappy_psi.channelswitcher: fix the case when default channel does not exist
Change-Id: I28dd94cdf922cde307b870d4ffdfc64664c3423b
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30949
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
%d accepts floats and other things, so manual fixes are needed after
conversion.
After flynt -ll 2000 --aggressive, each was manually checked if the
casts with int() are needed.
Two statements are still missing in ls370res
Change-Id: I2651ddbe60695aa19582882a97d0f71bcb05c1ef
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30901
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
- treat validation errors of the result of write_ and read_ messages
properly
- add info about the called read_* and write_ methods to the error
message, in case the error is not raised in the outmost method
- as subsequent errors in poll functions are logged only once, log an
info when a poll function succeeds again
- remove DiscouragedConversion error
Change-Id: Ib66e001cc95de8225751a1464a92594c369ceb3f
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30788
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
* add optional parameter for ValueType: validator
used for checking, if a value meets a criteria (e.g. is dict)
+ InternalParameter, which is not exported and can hold any python value
Change-Id: If39a7a4a8019f2aa1a930e42cbef4fca59163b78
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30787
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
- include all secop errors from spec
- add doc strings
- make conversion to and from error report nicer
- move all error classes to frappy.errors
- rename errors clashing with built-in errors
Change-Id: I4d882173b020cd4baf862c5891375b691e67e24a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30721
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- check for <param>_min and <param>_max
- customized checks with check_<param> method
the inherited customized check functions are all called in
a sequence, with the possibilty to return True to quit earlier,
no need to use super calls here
Change-Id: I903081abbbad2586c1e8237e303abaa3683ac419
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30632
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
'Done' was introduced in order to suppress unneccessary
duplicate updates. However, since super calls on access methods are
allowed, it is not nice when such a method returns Done, as this
is not automagically replaced by the current parameter value.
As a consequence:
- using Done is discouraged, but not (yet) removed in all code
- the 'omit_unchanged_within' property is moved from Module to an
internal Parameter property 'update_unchanged'
- its default is moved from a SEC node property to generalConfig
- the 'update_unchanged' parameter property may be set to
'never' for parameters where duplicate updates make no sense
- this property might be set to 'always', for measurements, where
even unchanged values taken from HW should be transmitted
Change-Id: I2847c983ca09c2c4098e402edd08d0c96c3913f4
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30672
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- use Datatype.format_value to convert all values
- frappy.client.ProxyClient: use CacheItem instead of 3-tuple
- CacheItem has built in formatting
- adapt gui to use it instead of stopgap
As it is now easy to convert to string including values, it may
be better to move the unit in the modulewidget into the value field.
This would simplyfy the code.
Change-Id: I5c06da4a24706fcbc83ebcbf8c0ea6a8eb6d7890
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30680
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
allow to define default settings on the IO class:
- a default 'port' may be given for tcp
- defaults like 'baudrate' or 'parity' might be given
for serial connections
this avoids explicit settings in the config file in case
the settings can not be changed or have a typical value
other than the defaults in serial.Serial
Change-Id: I990f47d63e785f8cc48c4af197944a8eebe91fb4
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30555
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- proxy: remote parameter status should overddide datatype from
ProxyModule.status
- ppms: create PpmsDrivable instead of importing from
(PpmsBase, Drivable). Order matters for status parameter!
- update cfg files
Change-Id: If8fc263cffb903d8b3c1a93a089dcac3597d13a0
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30512
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
json values were not converted properly, resulting in integers
instead of enums at the client side
+ add log.debug in rx thread
Change-Id: Ifc3c3b28540eb6a516d77387a3f83711f34b7480
add tutorial for Berlin hands-on workshop
+ improve the documentation (hints for structure welcome)
+ remove 'optional' parameter property
(is not yet used - should not appear in doc)
+ added test property in frappy_demo.cryo alters Parameter class
('test' property appears in Parameter doc)
Change-Id: I3ea08f955a92f72451fd23a5ff00d1185c7fb00e
- watch is now a command, not a module method
- finish watching with ctrl-C
- watching an io module logs communication
- add bin/frappy-cli to start interactive client
+ remove sorted function from StructOf.format_value
Change-Id: I7dd707473e4534f2d39c5d6afc533c2d872380f8
- fixed this for 'read', 'change' and 'do' message
+ fix an error in frappy.client.SecopClient closing the connection
when the identifier is None
fixes: #4672
Change-Id: Iaba0f9ed86b6eb6ef7588403ba640ded552dded6
use mro for status code inheritance
- as a consequence, the decorator class 'StatusCode' is now a
decorator function 'status_code'. snake case is anyway more
common for decorators.
- adapt tests
+ fix an error message
Change-Id: Ib409b963c51e0fe807397ff1d73d77d0147b8580
fast_interval might be 0, indicating to poll as fast as possible
- this should not throw a zero division error
Change-Id: I26e18f5a656c943b906c6ffff65361e1fcf16d50
A value given in config overrides values read from the persistent data file.
To let the loaded parameter have precedence, configure a default only.
The write_<param> method of a persistent parameter is now always called
on startup.
- add tests for persistent behaviour
+ simplify Modules.writeInitParams: remove started_callback argument
Change-Id: I08b49de52e9d9a2ed0918018eb2fe538141a4f5e
- make 'value' a Parameter property instead of an attribute
- use 'value' instead of 'default' property for setting
the initial value in the config file
- removal of initwrite parameter property
this change is the basis of a better implementation
for change 30041 (PersistentParam property 'override_cfg')
Change-Id: I2b82bdd54c2dacb87dcd2b3472004d2f0a730cf0
After 29724, the change in frappy_demo/modules.py from 30183 which was
made to run 'make demo' without errors can be reverted.
Change-Id: I00a6f512304a3159c10e44aef670ac0edd4703d7
* Add python config for test and demo server
* Remove old configs
* Fix issue with slow start of test server
Change-Id: If0e576f4e4dda8b03489fdbb79b209dfcdca29ff
- use Datatype.validate for converting and checking limits
(used also in properties)
- Datatype.__call__ converts and validates, but without checking
limits (used in setter)
- Datatype.validate may be used to add missing optional struct elements
from previous value (used in Dispatcher._setParameterValue)
- remove problematic range check
+ use shorter formula for converting float to int in ScaledInteger
(leftover from python2 compatibility)
+ improve error messages (strip very long repr(value))
Change-Id: Ib85736fe558ec3370ebce4e1c43f957e3bb0497c
The text part of the error report contains the original error
class - convert it to the frappy error class, if possible.
This makes the error messages on the client nicer, as the
error class would be duplicated in the error message on the
client side.
Change-Id: If2e0c3eb15ac2dd1b80a851ff42e4076557a325d
values return from read_* methods should be converted
from string to float on float parameters
+ fix some wording
Change-Id: Ic80010c6fbe3eef23483ff69c8a43e25afb8bb6a
- Change Configuration format to be python-based.
- move config logic to frappy/config.py
- Add first py-config: cryo_cfg.py
- Adapt test to new expected config format
Change-Id: Iaec484e0e1e21ebbb1e5c74b53be6231329ddf71
With the current implementation, we run into a deadlock with the lock
from the state machine interfering with the accessLock on the module.
We can not wait for the state machine to finish while having the
accessLock locked by write_target. As a consequence, when restarting
the state machine we should not wait, but remember the state function
to call and postpone the restart after the cleanup has finished.
For this, we want to know the status before calling the state function.
- create HasState mixin, using doPoll for driving the machine
- StatusCode decorator for assigning a status to a state function
- remove the state machines 'threaded' option
- 'Retry' is now a unique value instead of a class. The retry period
is determined by the (fast) poll interval.
- return 'Finish' instead of None for finishing the machine. returning
None for state function is now an error, as this might happen
easily inadvertently.
Change-Id: Icb31367442f10e98be69af3e05a84f12ce5cc966
- use python 3.9 (3.9 bullseyse)
- add latex-fonts-extra to fix missing tgtermes.sty
- in bullseye python3-pytango has been renamend to python3-tango
(https://packages.debian.org/stable/python/python3-tango)
Change-Id: I06c8d8e432644f657057d14bbe754f28e2c10dd4
- SECoP modules are accessible as objects in the main python module
- parameters are accessed as attributes of these objects
- __repr__ is used for listing all parameters
- __call__ is used for 'change target and wait until no more busy'
typically used from a python interpreter or in a jupyter notebook
Change-Id: Idb55684eeff6d1262e5d1517a3ff934f1c1bf208
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28980
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- repeated errors on poller are only once logged (per poll
function / read_* method)
- during exception handling, silent=True on a SECoP error indicates
that the error is already logged
+ fix the name of HardwareError
+ add test for consistency of SECoPErrors
+ catch socket.timeout in AsynTcp
Change-Id: I9df6c775cc19553b22a4d6e39591092adf7ff9a1
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28139
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
in secop.proxy the callers modules method announceUpdate is
called from an other thread while the accessLock is locked,
creating a deadlock. solve this by creating an other lock
'updateLock' for the update.
+ add status parameter even to non-Readable proxy modules,
in order to indicate a failed connection
+ fix an error in secop_psi/softcal.py
Change-Id: Iae7c6d5a74001150a47aa9dc99209c15d972cd5e
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28130
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- safe_current: current limit for unlimited move
- move_limit: max. angle to move with high current > safe_current
- direct axis parameter access is not exported by default
- support for home switch
- allow use without encoder
- automatic reset for motors in a configuration, where the motor
current is deliberatly low for a limited torque
- improved error message on driving failures
Change-Id: I25f8516905a2c4c3cda09d091d5a43004ec6dc6f
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28029
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This valve needs 8 turns to open. As the encoder forgets
the number if turns on power cycle, a home switch is
mounte, which engages during the last turn when closing.
The final close position is determined by closing the valve
with a defined motor current/torque.
+ fix an issue in StateMachine.start: the first cycle
must be called after the new state is assigned
Change-Id: I34cd05d10d97b043f9e3126310943b74ee727382
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28030
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
When several poller threads are using the same io, the resposivity
of client requests is reduced, as every thread first finishes
its pending communication requests, before it is the turn of the
request thread. This is solved by using one common poller thread
for all modules sharing the same communicator.
+ fix an issue with overriding a property with a parameter, as
this is the case for pollperiod (cfg was applied to property
instead of overriding parameter)
+ separate setFastPoll arguments into flag and fast interval
+ fix missing announceUpdate call when read function fails
+ fix mechanism for triggering polls after an io connection
reconnected again.
Change-Id: I1115a61fae3de80d18416e61f40b52a0eebb637c
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28021
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- write method may be used internally on a readonly parameter
+ add IDLE, WARN, BUSY and ERROR to secop.core
+ secop.datatype.EnumType: allow 'self' as member name
+ secop.lib.statemachine: log Restart and Stop exceptions only on debug level
+ secop_psi.ccu4.CCU4: explicit conversion to float
+ secop.proxy: remove superfluos and erroneous make_secop_error
Change-Id: I2f13d31ceacd2bde65eab64f8eae4225556c18f5
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27963
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- Attached checks now for proper base class
- fixes an error in Attached: attached saved in attachedModules
dict instead on the Attached object (which sits on the class!)
+ fix: in testonly mode errors must be logged before returning
+ fix: use repr of exception in poll to check for repeated errors
Change-Id: I141fa107fed48e58b55ddf1e071987656c0f618f
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27913
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- remove secop.poller and basic poller
- regular polls for 'important' parameters done by method doPoll
- all other parameters are polled slower (slowInterval) and
with lower priority (only one at a time when main poll is due)
- nopoll decorator for read_* to disable poll
- enablePoll attribute (default True) for disabling polling a module
- fast polls may be implemented by means of a statemachine
- configurable slow poll interval
+ allow a Parameter to override a Property (parameter
Readable.pollinterval overrides Module.pollinterval)
Change-Id: Ib1b3453041a233678b7c4b4add22ac399670e447
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27832
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
a quite simple, but powerful state machine
There is not need to subclass StateMachine, but use an instance
of it. The code typically lives on methods of an other class.
Features:
- store any variables (except already defined attributes) on the state
- actions handle the conditions to stay or initiate a transition
by calling the state machines goto method
- a state machine might run endlessly or finish in a None action.
- it may be started or restarted
- a cleanup function for handling exceptions and for stop or restart
- support for time dependent features
Change-Id: I86b86ed1f25d04e305237edb99206912b068aedf
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27593
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
A common problematic practice is, to declare the value parameter
with the same FloatRange than the target. Because of measurement
errors, a value might be near, but outside the limit.
In order to avoid this, we force the programmer to declare a
bigger range for the value than for the target, or to
explicitly disable this check on a module property.
It is also fine to declare the value without limits.
This behavior may be disabled via command line option or in the
general config file. For simplicity, FloatRanges inside data
structures are not considered.
+ above command line option is also used to disable the error
handling on a string to float conversion
+ log appropriate error message for string to float conversion
Change-Id: Ib78ea1fb7c821442bf5847030573c8c27822dea5
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27574
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
a read method should not reply on the automatic conversion
of the return value from string to a number.
- transitional solution with generalConfig.lazy_numer_validation
+ changing slighly generalInit mechanism: for above feature
generalConfig.init is not required to be called (i.e. when
used on the client side)
Change-Id: Ibecce1a45669273c105932acdc0908de55bfd1b9
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27516
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
modules with a couple of parameters with similar read_* or
write_* methods may handle them by generic methods wrapped
with decorators ReadHandler / WriteHandler
The trinamic driver is included in this change for demonstrating
how it works.
In a further step, the special handling for the iohandler stuff can
be moved away from secop.server and secop.params, using this feature.
+ fix problem on startup of trinamic driver (needs MultiEvent.queue)
+ some other small fixes
+ apply recommended functools.wraps for wrapping
Change-Id: Ibfeff9209f53c47194628463466cee28366e17ac
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27460
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- bin/secop-server options -v and -q applied to console logger only
- level for logfile taken from general config
- option for automatic deletion of old logfiles
- added 'comlog' level (between debug and info)
This allows to run the servers by default with 'comlog' level on
the logfiles, which helps a lot for analyzing very rare communication
errors in retrospect.
to avoid spamming of the normal log files, comlog data is stored
separately, one file per communicator
+ redesign of remote logging (no more need of LoggerAdapter)
Change-Id: Ie156a202b1e7304e50bbe830901bc75872f6ffe2
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27427
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
fix 2 problems:
- in case the window is smaller than the pollinterval, isAtTarget might be False
for up to the timeout delay
- in case the history is shorter than the window, and the ramp is fast enough to miss
any points during ramp, isAtTarget is True before the window time is reached.
This happens because the history is reset on write_target
+ do not wait when target is not changed (by more than precision)
tested!
Change-Id: Ia4ff4378fe91fa93be50168b2883a20b49ebfb6a
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27159
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
- fix CommandType.__repr__
- secop/modules.py: command properties are allowed to be configured:
- section 2: remove comment and rename
- section 3: all accessible properties should be checked
- command description should be inherited also when taken from docstring
- move test for command inheritance to test_modules.py
- added tests to check for valid properties of commands
Change-Id: Ic7795e305048625558e415ece099e6824df6e2c4
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/27135
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Correct inheritance has to follow the MRO, not only consider
the direct base classes.
Patchset 3: changed only tests, indicating that we need to change the code
Following patchsets include a major change in params.py and
modules.py. The parameter properties for inheritance, corresponding
mainly to the constructor arguments have to be stored separately
from the property values including inherited stuff.
Change-Id: Ibcbccb6abcc22e7e2d91df8f70ef64226684d8cc
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/26805
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
- nodestatechange callback must appear after the online attribute
is changed
- IntRange: move range validation outside of try except
- fixes on some error names
- well defined error message 'no such class' in secop.lib.get_class
- try again 4 times when starting Tcp Server on EADDRINUSE
- fix error handling
Change-Id: I4eee9b79ea8173936b9f5193b87e006ac8fca827
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/26171
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- wrong unit for 'ramp'
- disable Setposition for TemperatureController
- write_target should return the new target
- AnalogInput should not crash initialisation if reading the unit fails
- convert super(...) calls to py3 style super()
- use proper exception chaining
- NamedDigital*put: mapping may already be a dict.
Change-Id: I03ce5f29581dcb3b33466771e7a8b8dd4b1e2bdb
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/25960
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Tested-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Config errors are collected first, and raised after processing
all modules. This is more user friendly.
+ remove redundant check for predefined accessibles in modules.py
+ fixed error handling for exporting parameters in params.py
+ fixed handling of bare attributes overwriting properties
+ fixed race condition in writeInitParams
Change-Id: I894bda291ab85ccec3d771c4903393c808af0a2a
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/25128
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- a new wrapper for a read function is not only to be created when
the a new read method is in the class dict, but also when
it is inherited, but not yet wrapped
- a handler must not be ignored, when a write method is inherited
- a proxy class must not call checkProperties
+ remove trailing spaces in tutorial_helevel.rst
Change-Id: I16024c14232ea200db91a1bc07ec23326219ab68
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/25093
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- removed secop/metaclass.py
- moved code from ModuleMeta to modules.HasAccessibles.__init_subclass__
- reworked properties:
assignment obj.property = value now always allowed
- reworked Parameters and Command to be true descriptors
- Command must now be solely used as decorator
- renamed 'usercommand' to 'Command'
- command methods no longer start with 'do_'
- reworked mechanism to determine accessible order:
the attribute paramOrder, if given, determines order of accessibles
+ fixed some issues makeing the IDE more happy
+ simplified code for StatusType and added a test for it
Change-Id: I8045cf38ee6f4d4862428272df0b12a7c8abaca7
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/25049
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- flatten hierarchy (some links do not work when using folders)
- add a tutorial for programming a simple driver
- clean description using inspect.cleandoc
+ fix a bug with 'unit' pseudo property in a Parameter used as override
Change-Id: I31ddba5d516d1ee5e785e28fbd79fca44ed23f5e
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/25000
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
New Syntax:
- define properties and parameters as class attributes directly
instead of items in class attribute dicts
- define commands with decorator @usercommand(...)
- old syntax is still supported for now
still to do (with decreasing priority):
- turn parameters into descriptors (vs. creating getters/setters)
- migrate all existing code to new syntax
- get rid of or reduce code in metaclasses using __set_name__ and
__init_subclass__ instead, including a fix for allowing py < 3.6
Change-Id: Id47e0f89c506f50c40fa518b01822c6e5bbf4e98
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/24991
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
- when applying overrides with reorder=True, take ctr from Override,
else copy from the cloned Accesible. This did not work properly
- reworked:
- replaced CountedObj class by object_counter
- accessibles created by a copy or by applying Overrides
do not need fresh counted values
- adjusted tests
Change-Id: Id2fcf1ab1295aa1ea80ea81ae8cd02d36f86e969
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/24926
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
with handlers, a parameter from the cfg file which is not the
first of parameters with the same handler were not written.
fix: write_<param> method is called for all parameters in
<module>.writeDict even if there is no poll entry.
with this fix, when a parameter has the property initwrite=True,
the write_<param> method is called even when <param>
is not polled and even when <module>.pollerClass is None
Change-Id: I9b397deb5b20709fc4fa7c860c85b251a204c7f6
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/23995
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
2020-09-29 07:52:59 +02:00
393 changed files with 11719 additions and 26757 deletions
Node('example_NA.psi.ch','A demo system showing how to connect network analysers',interface='tcp://5000')
Mod('ZVLNode','frappy_psi.network_analysers.ZVL.ZVLNode.ZVLNode','ZVL Network Analyser',analyser_ip=Param('169.254.150.182'))# must be connected on the same ethernet network
Each pulse ``block`` consists of first a pulse with parameters pulse_width (microseconds), pulse_height (amplitude; for the SCOUT, percentage of max), and phase_cycle, and then a delay with parameter delay_time (microseconds).\
\
Please use the custom commands, ``generate_pulse``, ``scan_sequence``, and ``scan_sequences``. There exist example scripts in your NICOS install location/nicos_sinq/tnmr/example_scripts.\
Durations are in microseconds, excepting post_acquisition_time (ms), and frequencies are in MHz.\
'
Node('example_TNMR.psi.ch','The NMR system running the Scout and controlled with TNMR',interface='tcp://5000')
'The NMR system running the Scout and controlled with TNMR. Also contains a uniaxial cell (Razorbill RP100), a network analyser (ZVL), and a capacitance reader (for more direct measurements of the strain cell\'s status) (TSSOP16 with Arduino Nano V3)',
Mod('ZVLNode','frappy_psi.network_analysers.ZVL.ZVLNode.ZVLNode','ZVL Network Analyser',analyser_ip=Param('129.129.156.201'))# must be connected on the same ethernet network
{"path":"control","type":"enum","enum":{"auto_power":1,"manual_power":0,"controlled_T":2},"readonly":false,"cmd":"befilter control","description":"recommended mode: auto_power, use coolpower or holdpower depending on T"},
{"path":"cool_threshold","type":"float","readonly":false,"cmd":"befilter cool_threshold","description":"switch to coolpower above this value","visibility":3},
{"path":"hold_threshold","type":"float","readonly":false,"cmd":"befilter hold_threshold","description":"switch to holdpower below this value","visibility":3},
{"path":"power","type":"float"},
{"path":"filter","type":"none","kids":5},
{"path":"filter/period","type":"float","readonly":false,"cmd":"befilter filter/period","description":"oszillation period / sec"},
{"path":"filter/amplitude","type":"float","readonly":false,"cmd":"befilter filter/amplitude","description":"oszillation amplitude / K (+/-)"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"tbl_tt_set_prop","type":"text","readonly":false,"cmd":"table tbl_tt_set_prop","description":"enter value pair separated with colon T1:par1 T2:par2 ..."},
{"path":"tbl_tt_set_integ","type":"text","readonly":false,"cmd":"table tbl_tt_set_integ","description":"enter value pair separated with colon T1:par1 T2:par2 ..."}]}}
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"current/maxheater","type":"text","readonly":false,"cmd":"tt current/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"current/linearpower","type":"float","readonly":false,"cmd":"tt current/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"current/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"current/maxpower","type":"float","readonly":false,"cmd":"tt current/maxpower","description":"maximum power [W]"},
{"path":"current/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"ctrl/prop_o","type":"float","readonly":false,"cmd":"nv ctrl/prop_o","description":"prop [sec/mbar] when opening. above 4 mbar a 10 times lower value is used"},
{"path":"ctrl/prop_c","type":"float","readonly":false,"cmd":"nv ctrl/prop_c","description":"prop [sec/mbar] when closing. above 4 mbar a 10 times lower value is used"},
{"path":"ctrl/deriv_o","type":"float","readonly":false,"cmd":"nv ctrl/deriv_o","description":"convergence target time [sec] when opening"},
{"path":"ctrl/deriv_c","type":"float","readonly":false,"cmd":"nv ctrl/deriv_c","description":"convergence target time [sec] when closing"},
{"path":"ctrl/minpulse_o","type":"float","readonly":false,"cmd":"nv ctrl/minpulse_o","description":"minimum close pulse [sec]"},
{"path":"ctrl/minpulse_c","type":"float","readonly":false,"cmd":"nv ctrl/minpulse_c","description":"standard close pulse [sec]"},
{"path":"ctrl/hystpulse_o","type":"float","readonly":false,"cmd":"nv ctrl/hystpulse_o","description":"motor pulse to overcome hysteresis when opening"},
{"path":"ctrl/hystpulse_c","type":"float","readonly":false,"cmd":"nv ctrl/hystpulse_c","description":"motor pulse to overcome hysteresis when closing"},
{"path":"ctrl/openpulse","type":"float","readonly":false,"cmd":"nv ctrl/openpulse","description":"time to open from completely closed to a significant opening"},
{"path":"eco_t_lim","type":"float","readonly":false,"cmd":"hepump eco_t_lim","description":"switch off eco mode when T_set < eco_t_lim and T < eco_t_lim * 2"},
{"path":"prop","type":"float","readonly":false,"cmd":"warmup prop","description":"smaller means more sensitive. a change of 'prop' on input -> a change of 100 % or a factor 10 on output"},
{"path":"int","type":"float","readonly":false,"cmd":"warmup int","description":"integration time (sec)"},
{"path":"outmin","type":"float","readonly":false,"cmd":"warmup outmin","description":"output for maximal decrease of input var."},
{"path":"outmax","type":"float","readonly":false,"cmd":"warmup outmax","description":"output for maximal increase of input var."},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"current/maxheater","type":"text","readonly":false,"cmd":"tt current/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"current/linearpower","type":"float","readonly":false,"cmd":"tt current/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"current/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"current/maxpower","type":"float","readonly":false,"cmd":"tt current/maxpower","description":"maximum power [W]"},
{"path":"current/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"prop","type":"float","readonly":false,"cmd":"warmup prop","description":"smaller means more sensitive. a change of 'prop' on input -> a change of 100 % or a factor 10 on output"},
{"path":"int","type":"float","readonly":false,"cmd":"warmup int","description":"integration time (sec)"},
{"path":"outmin","type":"float","readonly":false,"cmd":"warmup outmin","description":"output for maximal decrease of input var."},
{"path":"outmax","type":"float","readonly":false,"cmd":"warmup outmax","description":"output for maximal increase of input var."},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"tt set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"tt set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"tt set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"control","type":"enum","enum":{"off":0,"sample":6,"mix":5,"samplehtr":8},"readonly":false,"cmd":"ts control","description":"click off to reload list"},
{"path":"autoheater/wlp0","type":"float","readonly":false,"cmd":"ts autoheater/wlp0","description":"weak link base temperature (used for auto heater)"},
{"path":"autoheater/wlp1","type":"float","readonly":false,"cmd":"ts autoheater/wlp1","description":"weak link temperature at 1 uW (used for auto heater)"},
{"path":"autoheater/wlp2","type":"float","readonly":false,"cmd":"ts autoheater/wlp2","description":"weak link temperature at 10 uW (used for auto heater)"},
{"path":"autoheater/wlp3","type":"float","readonly":false,"cmd":"ts autoheater/wlp3","description":"weak link temperature at 100 uW (used for auto heater)"},
{"path":"autoheater/wlp4","type":"float","readonly":false,"cmd":"ts autoheater/wlp4","description":"weak link temperature at 1 mW (used for auto heater)"},
{"path":"autoheater/mxp0","type":"float","readonly":false,"cmd":"ts autoheater/mxp0","description":"weak link base temperature (used for auto heater)"},
{"path":"autoheater/mxp1","type":"float","readonly":false,"cmd":"ts autoheater/mxp1","description":"mix.ch. temperature at 1 uW (used for auto heater)"},
{"path":"autoheater/mxp2","type":"float","readonly":false,"cmd":"ts autoheater/mxp2","description":"mix.ch. temperature at 10 uW (used for auto heater)"},
{"path":"autoheater/mxp3","type":"float","readonly":false,"cmd":"ts autoheater/mxp3","description":"mix.ch. temperature at 100 uW (used for auto heater)"},
{"path":"autoheater/mxp4","type":"float","readonly":false,"cmd":"ts autoheater/mxp4","description":"mix.ch. temperature at 1 mW (used for auto heater)"},
{"path":"autoheater/switchdown","type":"float","readonly":false,"cmd":"ts autoheater/switchdown","description":"percentage for auto heater switch down"},
{"path":"autoheater/switchup","type":"float","readonly":false,"cmd":"ts autoheater/switchup","description":"when the calculated power is above this percentage, use higher range"},
{"path":"autoprop","type":"bool","readonly":false,"cmd":"ts autoprop","description":"change prop value depending on actual power","kids":2},
{"path":"autoprop/prop","type":"float","readonly":false,"cmd":"ts autoprop/prop","description":"prop value (maximum prop value when autheater is on)"},
{"path":"autoprop/integ","type":"float","readonly":false,"cmd":"ts autoprop/integ","description":"integral value [sec], deriv is set to 0 on change"},
{"path":"auto/condenseflow","type":"float","readonly":false,"cmd":"ts auto/condenseflow","description":"VTI flow for condensing and min. flow for cooling"},
{"path":"auto/circulateflow","type":"float","readonly":false,"cmd":"ts auto/circulateflow","description":"VTI flow for circulating (may be changed during circulation)"},
{"path":"sample/pause","type":"int","readonly":false,"cmd":"treg sample/pause","description":"pause time [sec] after channel change"},
{"path":"sample/filter","type":"int","readonly":false,"cmd":"treg sample/filter","description":"filter average time [sec]"},
{"path":"sample/dwell","type":"int","readonly":false,"cmd":"treg sample/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"mix/pause","type":"int","readonly":false,"cmd":"treg mix/pause","description":"pause time [sec] after channel change"},
{"path":"mix/filter","type":"int","readonly":false,"cmd":"treg mix/filter","description":"filter average time [sec]"},
{"path":"mix/dwell","type":"int","readonly":false,"cmd":"treg mix/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"samplehtr/autorange","type":"bool","readonly":false,"cmd":"treg samplehtr/autorange","description":"autorange (common for all channels)"},
{"path":"samplehtr/range","type":"text","readonly":false,"cmd":"treg samplehtr/range","description":"resistance range in Ohm"},
{"path":"samplehtr/range_num","type":"int"},
{"path":"samplehtr/excitation","type":"text","readonly":false,"cmd":"treg samplehtr/excitation","description":"excitation with unit, i.e. 2uV or 3pA"},
{"path":"samplehtr/pause","type":"int","readonly":false,"cmd":"treg samplehtr/pause","description":"pause time [sec] after channel change"},
{"path":"samplehtr/filter","type":"int","readonly":false,"cmd":"treg samplehtr/filter","description":"filter average time [sec]"},
{"path":"samplehtr/dwell","type":"int","readonly":false,"cmd":"treg samplehtr/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"treg set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"treg set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"treg set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"sorb/pause","type":"int","readonly":false,"cmd":"tmon sorb/pause","description":"pause time [sec] after channel change"},
{"path":"sorb/filter","type":"int","readonly":false,"cmd":"tmon sorb/filter","description":"filter average time [sec]"},
{"path":"sorb/dwell","type":"int","readonly":false,"cmd":"tmon sorb/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"onek/pause","type":"int","readonly":false,"cmd":"tmon onek/pause","description":"pause time [sec] after channel change"},
{"path":"onek/filter","type":"int","readonly":false,"cmd":"tmon onek/filter","description":"filter average time [sec]"},
{"path":"onek/dwell","type":"int","readonly":false,"cmd":"tmon onek/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"stillt/pause","type":"int","readonly":false,"cmd":"tmon stillt/pause","description":"pause time [sec] after channel change"},
{"path":"stillt/filter","type":"int","readonly":false,"cmd":"tmon stillt/filter","description":"filter average time [sec]"},
{"path":"stillt/dwell","type":"int","readonly":false,"cmd":"tmon stillt/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"sample/pause","type":"int","readonly":false,"cmd":"tmon sample/pause","description":"pause time [sec] after channel change"},
{"path":"sample/filter","type":"int","readonly":false,"cmd":"tmon sample/filter","description":"filter average time [sec]"},
{"path":"sample/dwell","type":"int","readonly":false,"cmd":"tmon sample/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"samplehtr/autorange","type":"bool","readonly":false,"cmd":"tmon samplehtr/autorange","description":"autorange (common for all channels)"},
{"path":"samplehtr/range","type":"text","readonly":false,"cmd":"tmon samplehtr/range","description":"resistance range in Ohm"},
{"path":"samplehtr/range_num","type":"int"},
{"path":"samplehtr/excitation","type":"text","readonly":false,"cmd":"tmon samplehtr/excitation","description":"excitation with unit, i.e. 2uV or 3pA"},
{"path":"samplehtr/pause","type":"int","readonly":false,"cmd":"tmon samplehtr/pause","description":"pause time [sec] after channel change"},
{"path":"samplehtr/filter","type":"int","readonly":false,"cmd":"tmon samplehtr/filter","description":"filter average time [sec]"},
{"path":"samplehtr/dwell","type":"int","readonly":false,"cmd":"tmon samplehtr/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"mix/pause","type":"int","readonly":false,"cmd":"tmon mix/pause","description":"pause time [sec] after channel change"},
{"path":"mix/filter","type":"int","readonly":false,"cmd":"tmon mix/filter","description":"filter average time [sec]"},
{"path":"mix/dwell","type":"int","readonly":false,"cmd":"tmon mix/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"prop","type":"float","readonly":false,"cmd":"sorb prop","description":"smaller means more sensitive. a change of 'prop' on input -> a change of 100 % or a factor 10 on output"},
{"path":"int","type":"float","readonly":false,"cmd":"sorb int","description":"integration time (sec)"},
{"path":"outmin","type":"float","readonly":false,"cmd":"sorb outmin","description":"output for maximal decrease of input var."},
{"path":"outmax","type":"float","readonly":false,"cmd":"sorb outmax","description":"output for maximal increase of input var."},
{"path":"control","type":"enum","enum":{"off":0,"sample":6,"mix":5,"samplehtr":8},"readonly":false,"cmd":"ts control","description":"click off to reload list"},
{"path":"autoheater/wlp0","type":"float","readonly":false,"cmd":"ts autoheater/wlp0","description":"weak link base temperature (used for auto heater)"},
{"path":"autoheater/wlp1","type":"float","readonly":false,"cmd":"ts autoheater/wlp1","description":"weak link temperature at 1 uW (used for auto heater)"},
{"path":"autoheater/wlp2","type":"float","readonly":false,"cmd":"ts autoheater/wlp2","description":"weak link temperature at 10 uW (used for auto heater)"},
{"path":"autoheater/wlp3","type":"float","readonly":false,"cmd":"ts autoheater/wlp3","description":"weak link temperature at 100 uW (used for auto heater)"},
{"path":"autoheater/wlp4","type":"float","readonly":false,"cmd":"ts autoheater/wlp4","description":"weak link temperature at 1 mW (used for auto heater)"},
{"path":"autoheater/mxp0","type":"float","readonly":false,"cmd":"ts autoheater/mxp0","description":"weak link base temperature (used for auto heater)"},
{"path":"autoheater/mxp1","type":"float","readonly":false,"cmd":"ts autoheater/mxp1","description":"mix.ch. temperature at 1 uW (used for auto heater)"},
{"path":"autoheater/mxp2","type":"float","readonly":false,"cmd":"ts autoheater/mxp2","description":"mix.ch. temperature at 10 uW (used for auto heater)"},
{"path":"autoheater/mxp3","type":"float","readonly":false,"cmd":"ts autoheater/mxp3","description":"mix.ch. temperature at 100 uW (used for auto heater)"},
{"path":"autoheater/mxp4","type":"float","readonly":false,"cmd":"ts autoheater/mxp4","description":"mix.ch. temperature at 1 mW (used for auto heater)"},
{"path":"autoheater/switchdown","type":"float","readonly":false,"cmd":"ts autoheater/switchdown","description":"percentage for auto heater switch down"},
{"path":"autoheater/switchup","type":"float","readonly":false,"cmd":"ts autoheater/switchup","description":"when the calculated power is above this percentage, use higher range"},
{"path":"autoprop","type":"bool","readonly":false,"cmd":"ts autoprop","description":"change prop value depending on actual power","kids":2},
{"path":"autoprop/prop","type":"float","readonly":false,"cmd":"ts autoprop/prop","description":"prop value (maximum prop value when autheater is on)"},
{"path":"autoprop/integ","type":"float","readonly":false,"cmd":"ts autoprop/integ","description":"integral value [sec], deriv is set to 0 on change"},
{"path":"auto/condenseflow","type":"float","readonly":false,"cmd":"ts auto/condenseflow","description":"VTI flow for condensing and min. flow for cooling"},
{"path":"auto/circulateflow","type":"float","readonly":false,"cmd":"ts auto/circulateflow","description":"VTI flow for circulating (may be changed during circulation)"},
{"path":"sample/pause","type":"int","readonly":false,"cmd":"treg sample/pause","description":"pause time [sec] after channel change"},
{"path":"sample/filter","type":"int","readonly":false,"cmd":"treg sample/filter","description":"filter average time [sec]"},
{"path":"sample/dwell","type":"int","readonly":false,"cmd":"treg sample/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"mix/pause","type":"int","readonly":false,"cmd":"treg mix/pause","description":"pause time [sec] after channel change"},
{"path":"mix/filter","type":"int","readonly":false,"cmd":"treg mix/filter","description":"filter average time [sec]"},
{"path":"mix/dwell","type":"int","readonly":false,"cmd":"treg mix/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"samplehtr/autorange","type":"bool","readonly":false,"cmd":"treg samplehtr/autorange","description":"autorange (common for all channels)"},
{"path":"samplehtr/range","type":"text","readonly":false,"cmd":"treg samplehtr/range","description":"resistance range in Ohm"},
{"path":"samplehtr/range_num","type":"int"},
{"path":"samplehtr/excitation","type":"text","readonly":false,"cmd":"treg samplehtr/excitation","description":"excitation with unit, i.e. 2uV or 3pA"},
{"path":"samplehtr/pause","type":"int","readonly":false,"cmd":"treg samplehtr/pause","description":"pause time [sec] after channel change"},
{"path":"samplehtr/filter","type":"int","readonly":false,"cmd":"treg samplehtr/filter","description":"filter average time [sec]"},
{"path":"samplehtr/dwell","type":"int","readonly":false,"cmd":"treg samplehtr/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"set/maxheater","type":"text","readonly":false,"cmd":"treg set/maxheater","description":"maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path":"set/linearpower","type":"float","readonly":false,"cmd":"treg set/linearpower","description":"when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path":"set/maxpowerlim","type":"float","description":"the maximum power limit (before any booster or converter)"},
{"path":"set/maxpower","type":"float","readonly":false,"cmd":"treg set/maxpower","description":"maximum power [W]"},
{"path":"set/maxcurrent","type":"float","description":"the maximum current before any booster or converter"},
{"path":"sorb/pause","type":"int","readonly":false,"cmd":"tmon sorb/pause","description":"pause time [sec] after channel change"},
{"path":"sorb/filter","type":"int","readonly":false,"cmd":"tmon sorb/filter","description":"filter average time [sec]"},
{"path":"sorb/dwell","type":"int","readonly":false,"cmd":"tmon sorb/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"onek/pause","type":"int","readonly":false,"cmd":"tmon onek/pause","description":"pause time [sec] after channel change"},
{"path":"onek/filter","type":"int","readonly":false,"cmd":"tmon onek/filter","description":"filter average time [sec]"},
{"path":"onek/dwell","type":"int","readonly":false,"cmd":"tmon onek/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"stillt/pause","type":"int","readonly":false,"cmd":"tmon stillt/pause","description":"pause time [sec] after channel change"},
{"path":"stillt/filter","type":"int","readonly":false,"cmd":"tmon stillt/filter","description":"filter average time [sec]"},
{"path":"stillt/dwell","type":"int","readonly":false,"cmd":"tmon stillt/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"sample/pause","type":"int","readonly":false,"cmd":"tmon sample/pause","description":"pause time [sec] after channel change"},
{"path":"sample/filter","type":"int","readonly":false,"cmd":"tmon sample/filter","description":"filter average time [sec]"},
{"path":"sample/dwell","type":"int","readonly":false,"cmd":"tmon sample/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"samplehtr/autorange","type":"bool","readonly":false,"cmd":"tmon samplehtr/autorange","description":"autorange (common for all channels)"},
{"path":"samplehtr/range","type":"text","readonly":false,"cmd":"tmon samplehtr/range","description":"resistance range in Ohm"},
{"path":"samplehtr/range_num","type":"int"},
{"path":"samplehtr/excitation","type":"text","readonly":false,"cmd":"tmon samplehtr/excitation","description":"excitation with unit, i.e. 2uV or 3pA"},
{"path":"samplehtr/pause","type":"int","readonly":false,"cmd":"tmon samplehtr/pause","description":"pause time [sec] after channel change"},
{"path":"samplehtr/filter","type":"int","readonly":false,"cmd":"tmon samplehtr/filter","description":"filter average time [sec]"},
{"path":"samplehtr/dwell","type":"int","readonly":false,"cmd":"tmon samplehtr/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"mix/pause","type":"int","readonly":false,"cmd":"tmon mix/pause","description":"pause time [sec] after channel change"},
{"path":"mix/filter","type":"int","readonly":false,"cmd":"tmon mix/filter","description":"filter average time [sec]"},
{"path":"mix/dwell","type":"int","readonly":false,"cmd":"tmon mix/dwell","description":"dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path":"prop","type":"float","readonly":false,"cmd":"sorb prop","description":"smaller means more sensitive. a change of 'prop' on input -> a change of 100 % or a factor 10 on output"},
{"path":"int","type":"float","readonly":false,"cmd":"sorb int","description":"integration time (sec)"},
{"path":"outmin","type":"float","readonly":false,"cmd":"sorb outmin","description":"output for maximal decrease of input var."},
{"path":"outmax","type":"float","readonly":false,"cmd":"sorb outmax","description":"output for maximal increase of input var."},
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.